Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
List overview
Download
cluster-commits
September 2010
----- 2024 -----
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
cluster-commits@lists.fedorahosted.org
11 participants
112 discussions
Start a n
N
ew thread
cluster: STABLE3 - rgmanager: Allow restart,disable recovery policy
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=51…
Commit: 51f2f313d5f2424d58bbaa7d17315d27b39dcf75 Parent: ee89729d7ee23cc6a6e79894da7e6a865d8d65f4 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Thu Sep 2 15:06:09 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Allow restart,disable recovery policy This policy allows administrators to allow rgmanager to start and monitor services where failover is not required. Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/src/daemons/rg_state.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c index a4740cb..51711f1 100644 --- a/rgmanager/src/daemons/rg_state.c +++ b/rgmanager/src/daemons/rg_state.c @@ -2219,6 +2219,13 @@ handle_recover_req(char *svcName, int *new_owner) /* Check restart counter/timer for this resource */ if (check_restart(svcName) > 0) { clear_restart(svcName); + + if (strstr(policy, "disable")) { + logt_print(LOG_NOTICE, + "Restart threshold for %s exceeded; " + "disabling\n", svcName); + return svc_disable(svcName); + } logt_print(LOG_NOTICE, "Restart threshold for %s exceeded; " "attempting to relocate\n", svcName); return handle_relocate_req(svcName, RG_START_RECOVER, -1,
1
0
0
0
cluster: STABLE3 - rgmanager: Add convalesce operation
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=ee…
Commit: ee89729d7ee23cc6a6e79894da7e6a865d8d65f4 Parent: 5b883ac49452ccdf3f8a869a7f123899cc3610a9 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Wed Sep 1 15:24:22 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Add convalesce operation This option enables the administrator to repair a partially-failed service without affecting the rest of the service. Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/include/resgroup.h | 1 + rgmanager/include/reslist.h | 1 + rgmanager/src/clulib/rg_strings.c | 1 + rgmanager/src/daemons/groups.c | 3 + rgmanager/src/daemons/restree.c | 14 ++++ rgmanager/src/daemons/rg_state.c | 119 ++++++++++++++++++++++++++++++++++++- rgmanager/src/daemons/rg_thread.c | 20 ++++++ rgmanager/src/utils/clusvcadm.c | 7 ++- 8 files changed, 162 insertions(+), 4 deletions(-) diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h index b209baf..8b3b4ba 100644 --- a/rgmanager/include/resgroup.h +++ b/rgmanager/include/resgroup.h @@ -163,6 +163,7 @@ int svc_disable(const char *svcName); int svc_fail(const char *svcName); int svc_freeze(const char *svcName); int svc_unfreeze(const char *svcName); +int svc_convalesce(const char *svcName); int svc_migrate(const char *svcName, int target); int svc_start_remote(const char *svcName, int request, uint32_t target); int svc_report_failure(const char *svcName); diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h index 78ba826..68ea032 100644 --- a/rgmanager/include/reslist.h +++ b/rgmanager/include/reslist.h @@ -131,6 +131,7 @@ int res_start(resource_node_t **tree, resource_t *res, void *ret); int res_stop(resource_node_t **tree, resource_t *res, void *ret); int res_status(resource_node_t **tree, resource_t *res, void *ret); int res_status_inquiry(resource_node_t **tree, resource_t *res, void *ret); +int res_convalesce(resource_node_t **tree, resource_t *res, void *ret); int res_condstart(resource_node_t **tree, resource_t *res, void *ret); int res_condstop(resource_node_t **tree, resource_t *res, void *ret); int res_exec(resource_node_t *node, int op, const char *arg, int depth); diff --git a/rgmanager/src/clulib/rg_strings.c b/rgmanager/src/clulib/rg_strings.c index fdb1dad..b0cd184 100644 --- a/rgmanager/src/clulib/rg_strings.c +++ b/rgmanager/src/clulib/rg_strings.c @@ -58,6 +58,7 @@ const struct string_val rg_req_strings[] = { {RG_QUERY_LOCK, "lock status inquiry"}, {RG_MIGRATE, "migrate"}, {RG_STATUS_INQUIRY, "out of band service status inquiry"}, + {RG_CONVALESCE, "convalesce"}, {RG_NONE, "none"}, {0, NULL} }; diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c index 9e85186..ec8ab63 100644 --- a/rgmanager/src/daemons/groups.c +++ b/rgmanager/src/daemons/groups.c @@ -975,6 +975,9 @@ group_op(const char *groupname, int op) case RG_CONDSTART: ret = res_condstart(&_tree, res, NULL); break; + case RG_CONVALESCE: + ret = res_convalesce(&_tree, res, NULL); + break; } pthread_rwlock_unlock(&resource_lock); diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index a717376..a5f27b8 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -1615,6 +1615,20 @@ res_condstop(resource_node_t **tree, resource_t *res, void *ret) /** + Repair/fix/convalesce all occurrences of a resource in a tree + + @param tree Tree to search for our resource. + @param res Resource to start/stop + @param ret Unused + */ +int +res_convalesce(resource_node_t **tree, resource_t *res, void *ret) +{ + return _res_op(tree, res, NULL, ret, RS_CONVALESCE); +} + + +/** Start all occurrences of a resource in a tree @param tree Tree to search for our resource. diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c index 21268b0..a4740cb 100644 --- a/rgmanager/src/daemons/rg_state.c +++ b/rgmanager/src/daemons/rg_state.c @@ -802,6 +802,92 @@ svc_start(const char *svcName, int req) /** + * Fix stuff + */ +int +svc_convalesce(const char *svcName) +{ + struct dlm_lksb lockp; + rg_state_t svcStatus; + int ret; + + if (rg_lock(svcName, &lockp) < 0) { + logt_print(LOG_ERR, "#451: Unable to obtain cluster lock: %s\n", + strerror(errno)); + return RG_EFAIL; + } + + if (get_rg_state(svcName, &svcStatus) != 0) { + rg_unlock(&lockp); + logt_print(LOG_ERR, "#461: Failed getting status for RG %s\n", + svcName); + return RG_EFAIL; + } + + switch(svcStatus.rs_state) { + case RG_STATE_STARTED: + break; + case RG_STATE_STARTING: + case RG_STATE_STOPPING: + case RG_STATE_RECOVER: + case RG_STATE_MIGRATE: + case RG_STATE_ERROR: + rg_unlock(&lockp); + return RG_EAGAIN; + default: + rg_unlock(&lockp); + return RG_EINVAL; + } + + if (svcStatus.rs_flags & RG_FLAG_FROZEN) { + rg_unlock(&lockp); + return RG_EFROZEN; + } + + if (svcStatus.rs_owner != (uint32_t)my_id()) { + rg_unlock(&lockp); + return RG_EFORWARD; + } + + if (!(svcStatus.rs_flags & RG_FLAG_PARTIAL)) { + rg_unlock(&lockp); + return RG_ERUN; + } + + rg_unlock(&lockp); + + logt_print(LOG_INFO, "Repairing %s\n", svcName); + ret = group_op(svcName, RG_CONVALESCE); + + switch(ret) { + default: + logt_print(LOG_WARNING, "Failed to repair %s\n", svcName); + /* Fail to restart a non-critical resource + * does not fail the service. */ + return RG_EFAIL; + case 0: + logt_print(LOG_INFO, "Repair of %s was successful\n", svcName); + break; + } + + /* Success - flip owner in state info */ + if (rg_lock(svcName, &lockp) < 0) { + logt_print(LOG_ERR, "#455: Unable to obtain cluster lock: %s\n", + strerror(errno)); + return RG_EFAIL; + } + + /* No need for a 'get' here since the service is still STARTED */ + svcStatus.rs_flags &= ~RG_FLAG_PARTIAL; + + set_rg_state(svcName, &svcStatus); + rg_unlock(&lockp); + + return 0; +} + + +/** * Migrate a service to another node. Relies on agent * operating synchronously */ @@ -1110,8 +1196,31 @@ svc_status(const char *svcName) } /* For running services, if the return code is 0, we're done*/ - if (svcStatus.rs_state == RG_STATE_STARTED) - return handle_started_status(svcName, ret, &svcStatus); + if (svcStatus.rs_state == RG_STATE_STARTED) { + ret = handle_started_status(svcName, ret, &svcStatus); + + if (ret & SFL_PARTIAL) { + ret &= ~SFL_PARTIAL; + svcStatus.rs_flags |= RG_FLAG_PARTIAL; + if (rg_lock(svcName, &lockp) < 0) { + logt_print(LOG_ERR, + "#481: Unable to obtain cluster lock: %s\n", + strerror(errno)); + return RG_EFAIL; + } + + if (set_rg_state(svcName, &svcStatus) != 0) { + rg_unlock(&lockp); + logt_print(LOG_ERR, + "#482: Failed setting status for RG %s\n", + svcName); + return RG_EFAIL; + } + rg_unlock(&lockp); + } + + return ret; + } return handle_migrate_status(svcName, ret, &svcStatus); } @@ -1152,9 +1261,10 @@ handle_started_status(const char *svcName, int ret, svcName); if (ret & SFL_PARTIAL) { logt_print(LOG_NOTICE, "Note: Some non-critical " - "resources are still stopped.\n"); + "resources were stopped during recovery.\n"); logt_print(LOG_NOTICE, "Run 'clusvcadm -c %s' to " "restore them to operation.\n", svcName); + return SFL_PARTIAL; } return 0; @@ -1261,6 +1371,7 @@ _svc_stop(const char *svcName, int req, int recover, uint32_t newstate) svcStatus.rs_last_owner = svcStatus.rs_owner; svcStatus.rs_owner = 0; svcStatus.rs_state = RG_STATE_STOPPED; + svcStatus.rs_flags = 0; if (set_rg_state(svcName, &svcStatus) != 0) { rg_unlock(&lockp); return RG_EFAIL; @@ -1291,6 +1402,7 @@ _svc_stop(const char *svcName, int req, int recover, uint32_t newstate) logt_print(LOG_DEBUG, "%s is clean; skipping double-stop\n", svcName); svcStatus.rs_state = newstate; + svcStatus.rs_flags = 0; if (set_rg_state(svcName, &svcStatus) != 0) { rg_unlock(&lockp); @@ -1371,6 +1483,7 @@ _svc_stop_finish(const char *svcName, int failed, uint32_t newstate) } svcStatus.rs_state = newstate; + svcStatus.rs_flags = 0; logt_print(LOG_NOTICE, "Service %s is %s\n", svcName, rg_state_str(svcStatus.rs_state)); diff --git a/rgmanager/src/daemons/rg_thread.c b/rgmanager/src/daemons/rg_thread.c index 446f2d2..72b5f96 100644 --- a/rgmanager/src/daemons/rg_thread.c +++ b/rgmanager/src/daemons/rg_thread.c @@ -277,6 +277,26 @@ resgroup_thread_main(void *arg) ret = RG_NONE; break; + case RG_CONVALESCE: + error = svc_convalesce(myname); + + if (error == 0) { + ret = RG_SUCCESS; + + pthread_mutex_lock(&my_queue_mutex); + purge_status_checks(&my_queue); + pthread_mutex_unlock(&my_queue_mutex); + } else if (error == RG_EFORWARD) { + ret = RG_NONE; + break; + } else { + /* + * Bad news. + */ + ret = RG_EFAIL; + } + break; + case RG_MIGRATE: error = svc_migrate(myname, req->rr_target); diff --git a/rgmanager/src/utils/clusvcadm.c b/rgmanager/src/utils/clusvcadm.c index 137837a..bd0723f 100644 --- a/rgmanager/src/utils/clusvcadm.c +++ b/rgmanager/src/utils/clusvcadm.c @@ -235,7 +235,7 @@ main(int argc, char **argv) const char *actionstr = NULL; cluster_member_list_t *membership; - while ((opt = getopt(argc, argv, "lSue:M:d:r:n:m:FvR:s:Z:U:qh?")) != EOF) { + while ((opt = getopt(argc, argv, "lSue:M:d:r:n:c:m:FvR:s:Z:U:qh?")) != EOF) { switch (opt) { case 'l': return do_lock(); @@ -312,6 +312,11 @@ main(int argc, char **argv) action = RG_UNFREEZE; svcname = optarg; break; + case 'c': + actionstr = "convalescing"; + action = RG_CONVALESCE; + svcname = optarg; + break; case 'q': close(STDOUT_FILENO); break;
1
0
0
0
cluster: STABLE3 - rgmanager: Mark non-critical resources disabled
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=5b…
Commit: 5b883ac49452ccdf3f8a869a7f123899cc3610a9 Parent: 35ca5c614daea853ffe49b7111b68472d4848dd3 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Mon Aug 30 13:37:38 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Mark non-critical resources disabled Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/include/resgroup.h | 1 + rgmanager/include/reslist.h | 2 + rgmanager/src/daemons/restree.c | 75 ++++++++++++++++++++++++++------------ rgmanager/src/daemons/rg_state.c | 27 +++++++++----- 4 files changed, 72 insertions(+), 33 deletions(-) diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h index 21d7ab6..b209baf 100644 --- a/rgmanager/include/resgroup.h +++ b/rgmanager/include/resgroup.h @@ -235,6 +235,7 @@ const char *rg_strerror(int val); */ #define SFL_FAILURE (1<<0) #define SFL_RECOVERABLE (1<<1) +#define SFL_PARTIAL (1<<2) //#define DEBUG #ifdef DEBUG diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h index ed22a3b..78ba826 100644 --- a/rgmanager/include/reslist.h +++ b/rgmanager/include/reslist.h @@ -29,12 +29,14 @@ the configuration */ #define RF_ENFORCE_TIMEOUTS (1<<9) /** Enforce timeouts for this node */ #define RF_NON_CRITICAL (1<<10) /** stop this resource if it fails */ +#define RF_QUIESCE (1<<11) /** don't restart this resource */ #define RES_STOPPED (0) #define RES_STARTED (1) #define RES_FAILED (2) +#define RES_DISABLED (3) #ifndef SHAREDIR #define SHAREDIR "/usr/share/rgmanager" diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index e480cc8..a717376 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -962,7 +962,8 @@ _print_resource_tree(FILE *fp, resource_node_t **tree, int level) fprintf(fp, "NON-CRITICAL "); fprintf(fp, "]"); } - fprintf(fp, " {\n"); + + fprintf(fp, " (S%d) {\n", node->rn_state); for (x = 0; node->rn_resource->r_attrs && node->rn_resource->r_attrs[x].ra_value; x++) { @@ -1153,7 +1154,8 @@ mark_nodes(resource_node_t *node, int state, int setflags, int clearflags) clearflags); } - node->rn_state = state; + if (state >= RES_STOPPED) + node->rn_state = state; node->rn_flags |= (setflags); node->rn_flags &= ~(clearflags); } @@ -1171,6 +1173,9 @@ do_status(resource_node_t *node) int has_recover = 0; time_t delta = 0, now = 0; + if (node->rn_state == RES_DISABLED) + return 0; + now = time(NULL); for (; node->rn_actions[x].ra_name; x++) { @@ -1365,6 +1370,15 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, CONDSTART and CONDSTOP are no-ops if the appropriate flag is not set. */ + if ((op == RS_CONVALESCE) && + node->rn_state == RES_DISABLED) { + printf("Node %s:%s - Convalesce\n", + node->rn_resource->r_rule->rr_type, + primary_attr_value(node->rn_resource)); + node->rn_state = RES_STOPPED; + op = RS_START; + } + if ((op == RS_CONDSTART) && (node->rn_flags & RF_NEEDSTART)) { printf("Node %s:%s - CONDSTART\n", @@ -1385,7 +1399,12 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, /* Start starts before children */ if (me && (op == RS_START)) { + if (node->rn_state == RES_DISABLED) + /* Nothing to do - children are also disabled */ + return 0; + pthread_mutex_lock(&node->rn_resource->r_mutex); + if (node->rn_flags & RF_RECONFIG && realop == RS_CONDSTART) { rv = res_exec(node, RS_RECONFIG, NULL, 0); @@ -1430,21 +1449,29 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, dependent children are failed, whether or not this node is independent or not. */ - mark_nodes(node, RES_FAILED, - RF_NEEDSTART | RF_NEEDSTOP, 0); /* If we're an independent subtree, return a flag stating that this section is recoverable apart from siblings in the resource tree. All child resources of this node must be restarted, but siblings of this node are not affected. */ - if (node->rn_flags & RF_INDEPENDENT) - return SFL_RECOVERABLE; + if (node->rn_flags & RF_INDEPENDENT) { + if (node->rn_flags & RF_NON_CRITICAL) { + mark_nodes(node, RES_FAILED, + RF_NEEDSTOP | RF_QUIESCE, 0); + return SFL_RECOVERABLE|SFL_PARTIAL; + } else { + mark_nodes(node, RES_FAILED, + RF_NEEDSTART | RF_NEEDSTOP, 0); + return SFL_RECOVERABLE; + } + } return SFL_FAILURE; } - mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP); + if (node->rn_state != RES_DISABLED) + mark_nodes(node, RES_STARTED, 0, RF_NEEDSTOP); } if (node->rn_child) { @@ -1458,14 +1485,16 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, the resource tree. */ if (op == RS_STATUS && (rv & SFL_FAILURE) && (node->rn_flags & RF_INDEPENDENT)) { - if (node->rn_flags & RF_NON_CRITICAL) + rv = SFL_RECOVERABLE; + if (node->rn_flags & RF_NON_CRITICAL) { /* if non-critical, just stop */ - mark_nodes(node, RES_FAILED, - RF_NEEDSTOP, 0); - else + mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_QUIESCE, 0); + + rv |= SFL_PARTIAL; + } else { mark_nodes(node, RES_FAILED, RF_NEEDSTOP | RF_NEEDSTART, 0); - rv = SFL_RECOVERABLE; + } } } @@ -1475,27 +1504,27 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, /* Decrease incarnations so the script knows how many *other* incarnations there are. */ pthread_mutex_lock(&node->rn_resource->r_mutex); - if (node->rn_state == RES_STARTED) { - assert(node->rn_resource->r_incarnations >= 0); - if (node->rn_resource->r_incarnations > 0) - --node->rn_resource->r_incarnations; - } node->rn_flags &= ~RF_NEEDSTOP; rv |= res_exec(node, op, NULL, 0); - if (rv != 0) { - if (node->rn_state == RES_STARTED) { - /* Fail to stop: fix incarnations */ - ++node->rn_resource->r_incarnations; - } + if (rv == 0 && (node->rn_state == RES_STARTED || + node->rn_state == RES_FAILED)) { + assert(node->rn_resource->r_incarnations >= 0); + if (node->rn_resource->r_incarnations > 0) + --node->rn_resource->r_incarnations; + } else if (node->rn_state != RES_DISABLED) { node->rn_state = RES_FAILED; pthread_mutex_unlock(&node->rn_resource->r_mutex); return SFL_FAILURE; } pthread_mutex_unlock(&node->rn_resource->r_mutex); - if (node->rn_state != RES_STOPPED) { + if (node->rn_flags & RF_QUIESCE && + node->rn_flags & RF_NON_CRITICAL) { + node->rn_flags &= ~RF_QUIESCE; + node->rn_state = RES_DISABLED; + } else { node->rn_state = RES_STOPPED; } } diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c index ee1b6eb..21268b0 100644 --- a/rgmanager/src/daemons/rg_state.c +++ b/rgmanager/src/daemons/rg_state.c @@ -1121,7 +1121,7 @@ static int handle_started_status(const char *svcName, int ret, rg_state_t __attribute__((unused)) *svcStatus) { - int newowner; + int newowner, ret2; if (ret & SFL_FAILURE) { newowner = msvc_check_cluster(svcName); @@ -1137,20 +1137,27 @@ handle_started_status(const char *svcName, int ret, logt_print(LOG_WARNING, "Some independent resources in %s failed; " "Attempting inline recovery\n", svcName); - ret = group_op(svcName, RG_CONDSTOP); - if (!(ret & SFL_FAILURE)) { - ret = group_op(svcName, RG_CONDSTART); + ret2 = group_op(svcName, RG_CONDSTOP); + if (!(ret2 & SFL_FAILURE)) { + ret2 = group_op(svcName, RG_CONDSTART); } - if (ret) { + if (ret2) { logt_print(LOG_WARNING, "Inline recovery of %s failed\n", svcName); - } else { - logt_print(LOG_NOTICE, - "Inline recovery of %s succeeded\n", - svcName); - return 0; + return ret; } + + logt_print(LOG_NOTICE, "Inline recovery of %s succeeded\n", + svcName); + if (ret & SFL_PARTIAL) { + logt_print(LOG_NOTICE, "Note: Some non-critical " + "resources are still stopped.\n"); + logt_print(LOG_NOTICE, "Run 'clusvcadm -c %s' to " + "restore them to operation.\n", svcName); + } + + return 0; } return ret;
1
0
0
0
cluster: STABLE3 - rgmanager: Present all flags in clustat output
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=35…
Commit: 35ca5c614daea853ffe49b7111b68472d4848dd3 Parent: 07619f61398738c60d6f9265f99987ba2573f581 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Wed Aug 25 14:34:59 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Present all flags in clustat output Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/src/utils/clustat.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rgmanager/src/utils/clustat.c b/rgmanager/src/utils/clustat.c index d400d32..2b47306 100644 --- a/rgmanager/src/utils/clustat.c +++ b/rgmanager/src/utils/clustat.c @@ -455,6 +455,7 @@ _txt_rg_state(rg_state_t *rs, cluster_member_list_t *members, int flags, { char owner[MAXHOSTNAMELEN+1]; char state_string[255] = ""; + char flags_string[16] = ""; char *name = rs->rs_name, *ptr; int l; @@ -484,10 +485,14 @@ _txt_rg_state(rg_state_t *rs, cluster_member_list_t *members, int flags, } /* Show a frozen service */ - if (rs->rs_flags & RG_FLAG_FROZEN) { + if (rs->rs_flags) { + rg_flags_str(flags_string, sizeof(flags_string), rs->rs_flags, + NULL); + snprintf(state_string, sizeof(state_string), - "%-*.*s[Z]", statsize-3, statsize-3, - rg_state_str(rs->rs_state)); + "%-*.*s[%s]", (int)(statsize-(2+strlen(flags_string))), + (int)(statsize-(2+strlen(flags_string))), + rg_state_str(rs->rs_state), flags_string); } else { snprintf(state_string, sizeof(state_string), "%-*.*s", statsize, statsize,
1
0
0
0
cluster: STABLE3 - rgmanager: Use rg_strings.c for flags
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=07…
Commit: 07619f61398738c60d6f9265f99987ba2573f581 Parent: 2459ceb0301b492d1d3e53a4d008e27c9328f093 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Wed Aug 25 13:50:55 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Use rg_strings.c for flags Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/src/clulib/rg_strings.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rgmanager/src/clulib/rg_strings.c b/rgmanager/src/clulib/rg_strings.c index 24ee479..fdb1dad 100644 --- a/rgmanager/src/clulib/rg_strings.c +++ b/rgmanager/src/clulib/rg_strings.c @@ -81,9 +81,15 @@ const struct string_val rg_state_strings[] = { const struct string_val rg_flags_strings[] = { {RG_FLAG_FROZEN, "frozen"}, + {RG_FLAG_PARTIAL, "partial"}, {0, NULL} }; +const struct string_val rg_flags_short[] = { + {RG_FLAG_FROZEN, "Z"}, + {RG_FLAG_PARTIAL, "P"}, + {0, NULL} +}; const struct string_val agent_ops[] = { {RS_START, "start"}, @@ -185,14 +191,18 @@ rg_flag_str(int val) const char * rg_flags_str(char *flags_string, size_t size, int val, char *separator) { + const struct string_val *table = rg_flags_strings; int i; const char *string; + if (!separator) + table = rg_flags_short; + for (i = 0; i < (sizeof(val) * 8); i++) { if ( val & (1 << i)) { - if (strlen(flags_string)) + if (strlen(flags_string) && separator) strncat(flags_string, separator, size - (strlen(flags_string) + strlen(separator) + 1)); - string = rg_search_table(rg_flags_strings, (1 << i)); + string = rg_search_table(table, (1 << i)); strncat(flags_string, string, size - (strlen(flags_string) + strlen(string) + 1)); } }
1
0
0
0
cluster: STABLE3 - rgmanager: Header cleanup
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=24…
Commit: 2459ceb0301b492d1d3e53a4d008e27c9328f093 Parent: 4d7ec682cb842d00f29af3ca3b82a6488c6a7bb3 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Wed Aug 25 13:32:19 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Header cleanup Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/include/res-ocf.h | 1 + rgmanager/include/resgroup.h | 3 +++ rgmanager/include/reslist.h | 2 +- 3 files changed, 5 insertions(+), 1 deletions(-) diff --git a/rgmanager/include/res-ocf.h b/rgmanager/include/res-ocf.h index 557e128..cc65a4d 100644 --- a/rgmanager/include/res-ocf.h +++ b/rgmanager/include/res-ocf.h @@ -48,5 +48,6 @@ #define RS_MIGRATE (13) #define RS_RECONFIG (14) #define RS_STATUS_INQUIRY (15) /** Quick status */ +#define RS_CONVALESCE (16) #endif diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h index 3afbce2..21d7ab6 100644 --- a/rgmanager/include/resgroup.h +++ b/rgmanager/include/resgroup.h @@ -106,6 +106,7 @@ extern size_t rg_state_t_version_sizes[]; #define RG_FREEZE 23 #define RG_UNFREEZE 24 #define RG_STATUS_INQUIRY 25 +#define RG_CONVALESCE 26 #define RG_NONE 999 const char *rg_req_str(int req); @@ -135,6 +136,8 @@ int handle_start_remote_req(char *svcName, int req); /* Resource group flags (for now) */ #define RG_FLAG_FROZEN (1<<0) /** Resource frozen */ +#define RG_FLAG_PARTIAL (1<<1) /** One or more non-critical + resources offline */ const char *rg_state_str(int val); const char *rg_flag_str(int val); diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h index ba47c44..ed22a3b 100644 --- a/rgmanager/include/reslist.h +++ b/rgmanager/include/reslist.h @@ -28,7 +28,7 @@ resource class if you delete it from the configuration */ #define RF_ENFORCE_TIMEOUTS (1<<9) /** Enforce timeouts for this node */ -#define RF_NON_CRITCIAL (1<<10) /** stop this resource if it fails */ +#define RF_NON_CRITICAL (1<<10) /** stop this resource if it fails */
1
0
0
0
cluster: STABLE3 - rgmanager: Add non-critical base behavior
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=4d…
Commit: 4d7ec682cb842d00f29af3ca3b82a6488c6a7bb3 Parent: 1435ea61cd9e2f02be0a081bec2ccc3cf03b064b Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Wed Aug 25 13:17:24 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Add non-critical base behavior Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/src/daemons/restree.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index 5f37716..e480cc8 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -663,6 +663,13 @@ do_load_resource(int ccsfd, char *base, curres->r_flags &= ~RF_NON_CRITICAL; } + if (curres->r_flags & RF_NON_CRITICAL) { + /* Independent subtree is implied if a + * resource is non-critical + */ + node->rn_flags |= RF_NON_CRITICAL | RF_INDEPENDENT; + } + *newnode = node; list_insert(tree, node); @@ -1451,8 +1458,13 @@ _res_op_internal(resource_node_t __attribute__ ((unused)) **tree, the resource tree. */ if (op == RS_STATUS && (rv & SFL_FAILURE) && (node->rn_flags & RF_INDEPENDENT)) { - mark_nodes(node, RES_FAILED, - RF_NEEDSTART | RF_NEEDSTOP, 0); + if (node->rn_flags & RF_NON_CRITICAL) + /* if non-critical, just stop */ + mark_nodes(node, RES_FAILED, + RF_NEEDSTOP, 0); + else + mark_nodes(node, RES_FAILED, + RF_NEEDSTOP | RF_NEEDSTART, 0); rv = SFL_RECOVERABLE; } }
1
0
0
0
cluster: STABLE3 - rgmanager: Add non-critical flag to resources
by Lon Hohberger
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=14…
Commit: 1435ea61cd9e2f02be0a081bec2ccc3cf03b064b Parent: 386cc0432b522f547f566224a1ab9c2f3ebc93d1 Author: Lon Hohberger <lhh(a)redhat.com> AuthorDate: Thu Aug 12 16:28:59 2010 -0400 Committer: Lon Hohberger <lhh(a)redhat.com> CommitterDate: Fri Sep 24 18:17:21 2010 -0400 rgmanager: Add non-critical flag to resources Signed-off-by: Lon Hohberger <lhh(a)redhat.com> --- rgmanager/include/reslist.h | 1 + rgmanager/src/daemons/restree.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletions(-) diff --git a/rgmanager/include/reslist.h b/rgmanager/include/reslist.h index 575db8a..ba47c44 100644 --- a/rgmanager/include/reslist.h +++ b/rgmanager/include/reslist.h @@ -28,6 +28,7 @@ resource class if you delete it from the configuration */ #define RF_ENFORCE_TIMEOUTS (1<<9) /** Enforce timeouts for this node */ +#define RF_NON_CRITCIAL (1<<10) /** stop this resource if it fails */ diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c index 1ae9746..5f37716 100644 --- a/rgmanager/src/daemons/restree.c +++ b/rgmanager/src/daemons/restree.c @@ -605,8 +605,11 @@ do_load_resource(int ccsfd, char *base, #else if (conf_get(tok, &ref) == 0) { #endif - if (atoi(ref) > 0 || strcasecmp(ref, "yes") == 0) + if (atoi(ref) == 1 || strcasecmp(ref, "yes") == 0) node->rn_flags |= RF_INDEPENDENT; + if (atoi(ref) == 2 || strcasecmp(ref, "non-critical") == 0) { + curres->r_flags |= RF_NON_CRITICAL; + } free(ref); } @@ -653,6 +656,13 @@ do_load_resource(int ccsfd, char *base, curres->r_refs++; + if (curres->r_refs > 1 && + (curres->r_flags & RF_NON_CRITICAL)) { + res_build_name(tok, sizeof(tok), curres); + printf("Non-critical flag for %s is being cleared due to multiple references.\n", tok); + curres->r_flags &= ~RF_NON_CRITICAL; + } + *newnode = node; list_insert(tree, node); @@ -941,6 +951,8 @@ _print_resource_tree(FILE *fp, resource_node_t **tree, int level) fprintf(fp, "DESTROY "); if (node->rn_flags & RF_ENFORCE_TIMEOUTS) fprintf(fp, "ENFORCE-TIMEOUTS "); + if (node->rn_flags & RF_NON_CRITICAL) + fprintf(fp, "NON-CRITICAL "); fprintf(fp, "]"); } fprintf(fp, " {\n");
1
0
0
0
cluster: STABLE3 - fence_cisco_ucs: New fence agent for Cisco UCS
by Marek Grác
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=38…
Commit: 386cc0432b522f547f566224a1ab9c2f3ebc93d1 Parent: ab0cd777358f9f1ab7261409e86ddac984b93046 Author: Marek 'marx' Grac <mgrac(a)redhat.com> AuthorDate: Sat Sep 25 00:07:19 2010 +0200 Committer: Marek 'marx' Grac <mgrac(a)redhat.com> CommitterDate: Sat Sep 25 00:07:19 2010 +0200 fence_cisco_ucs: New fence agent for Cisco UCS Resolves: rhbz#580492 --- fence/agents/cisco_ucs/Makefile | 7 ++ fence/agents/cisco_ucs/fence_cisco_ucs.py | 138 +++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 0 deletions(-) diff --git a/fence/agents/cisco_ucs/Makefile b/fence/agents/cisco_ucs/Makefile new file mode 100644 index 0000000..eff9945 --- /dev/null +++ b/fence/agents/cisco_ucs/Makefile @@ -0,0 +1,7 @@ +include ../../../make/defines.mk + +TARGET= fence_cisco_ucs + +MAKEMAN = 1 + +include $(OBJDIR)/make/fencebuild.mk diff --git a/fence/agents/cisco_ucs/fence_cisco_ucs.py b/fence/agents/cisco_ucs/fence_cisco_ucs.py new file mode 100755 index 0000000..07375b3 --- /dev/null +++ b/fence/agents/cisco_ucs/fence_cisco_ucs.py @@ -0,0 +1,138 @@ +#!/usr/bin/python + +import sys, re, pexpect, socket +import pycurl, StringIO +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="New Cisco UCS Agent - test release on steroids" +REDHAT_COPYRIGHT="" +BUILD_DATE="March, 2008" +#END_VERSION_GENERATION + +re_cookie = re.compile("<aaaLogin .* outCookie=\"(.*?)\"", re.IGNORECASE); +re_status = re.compile("<lsPower .*? state=\"(.*?)\"", re.IGNORECASE); +re_get_dn = re.compile(" dn=\"(.*?)\"", re.IGNORECASE) +re_get_desc = re.compile(" descr=\"(.*?)\"", re.IGNORECASE) + +def get_power_status(conn, options): + try: + res = send_command(options, "<configResolveDn cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" dn=\"org-root/ls-" + options["-n"] + "/power\"/>") + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + result = re_status.search(res) + if (result == None): + fail(EC_STATUS) + else: + status = result.group(1) + + if (status == "up"): + return "on" + else: + return "off" + +def set_power_status(conn, options): + action = { + 'on' : "up", + 'off' : "down" + }[options["-o"]] + + try: + res = send_command(options, "<configConfMos cookie=\"" + options["cookie"] + "\" inHierarchical=\"no\"><inConfigs><pair key=\"org-root/ls-" + options["-n"] + "/power\"><lsPower dn=\"org-root/ls-" + options["-n"] + "/power\" state=\"" + action + "\" status=\"modified\" /></pair></inConfigs></configConfMos>") + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + return + +def get_list(conn, options): + outlets = { } + + try: + try: + res = send_command(options, "<configResolveClass cookie=\"" + options["cookie"] + "\" inHierarchical=\"false\" classId=\"lsServer\"/>") + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + lines = res.split("<lsServer ") + for i in range(1, len(lines)): + dn = re_get_dn.search(lines[i]).group(1) + desc = re_get_desc.search(lines[i]).group(1) + outlets[dn] = (desc, None) + except AttributeError: + return { } + except IndexError: + return { } + + return outlets + +def send_command(opt, command): + ## setup correct URL + if opt.has_key("-z"): + url = "https:" + else: + url = "http:" + + url += "//" + opt["-a"] + ":" + str(opt["-u"]) + "/nuova" + + ## send command through pycurl + c = pycurl.Curl() + b = StringIO.StringIO() + c.setopt(pycurl.URL, url) + c.setopt(pycurl.HTTPHEADER, [ "Content-type: text/xml" ]) + c.setopt(pycurl.POSTFIELDS, command) + c.setopt(pycurl.WRITEFUNCTION, b.write) + c.setopt(pycurl.TIMEOUT, int(opt["-Y"])) + c.setopt(pycurl.SSL_VERIFYPEER, 0) + c.perform() + result = b.getvalue() + + if opt["log"] >= LOG_MODE_VERBOSE: + opt["debug_fh"].write(command + "\n") + opt["debug_fh"].write(result + "\n") + + return result + +def main(): + device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug", + "action", "ipaddr", "login", "passwd", "passwd_script", + "ssl", "inet4_only", "inet6_only", "ipport", "port", + "web", "separator", "power_wait", "power_timeout", + "shell_timeout" ] + + atexit.register(atexit_handler) + + options = check_input(device_opt, process_input(device_opt)) + + docs = { } + docs["shortdesc"] = "Fence agent for Cisco UCS" + docs["longdesc"] = "fence_cisco_ucs is an I/O Fencing agent which can be \ +used with Cisco UCS to fence machines." + docs["vendorurl"] = "
http://www.cisco.com
" + show_docs(options, docs) + + ### Login + res = send_command(options, "<aaaLogin inName=\"" + options["-l"] + "\" inPassword=\"" + options["-p"] + "\" />") + result = re_cookie.search(res) + if (result == None): + ## Cookie is absenting in response + fail(EC_LOGIN_DENIED) + + options["cookie"] = result.group(1); + + ## + ## Fence operations + #### + result = fence_action(None, options, set_power_status, get_power_status, get_list) + + ### Logout; we do not care about result as we will end in any case + send_command(options, "<aaaLogout inCookie=\"" + options["cookie"] + "\" />") + + sys.exit(result) + +if __name__ == "__main__": + main()
1
0
0
0
cluster: STABLE3 - fence_rhevm: New fence agent for RHEV-M REST API
by Marek Grác
24 Sep '10
24 Sep '10
Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=ab…
Commit: ab0cd777358f9f1ab7261409e86ddac984b93046 Parent: aba16879c13221c0bf97882627b16af99793ef29 Author: Marek 'marx' Grac <mgrac(a)redhat.com> AuthorDate: Fri Sep 24 22:57:20 2010 +0200 Committer: Marek 'marx' Grac <mgrac(a)redhat.com> CommitterDate: Fri Sep 24 22:57:20 2010 +0200 fence_rhevm: New fence agent for RHEV-M REST API Resolves: rhbz#595383 --- fence/agents/lib/fencing.py.py | 8 ++- fence/agents/rhevm/Makefile | 7 ++ fence/agents/rhevm/fence_rhevm.py | 145 +++++++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 1 deletions(-) diff --git a/fence/agents/lib/fencing.py.py b/fence/agents/lib/fencing.py.py index 7e9343f..da4b222 100644 --- a/fence/agents/lib/fencing.py.py +++ b/fence/agents/lib/fencing.py.py @@ -75,6 +75,10 @@ all_opt = { "getopt" : "", "help" : "", "order" : 1 }, + "web" : { + "getopt" : "", + "help" : "", + "order" : 1 }, "action" : { "getopt" : "o:", "longopt" : "action", @@ -342,7 +346,7 @@ all_opt = { "help" : "--shell-timeout <seconds> Wait X seconds for cmd prompt after issuing command", "default" : "3", "required" : "0", - "shortdesc" : "Wait X seconds for cmd promprt after issuing command", + "shortdesc" : "Wait X seconds for cmd prompt after issuing command", "order" : 200 }, "power_timeout" : { "getopt" : "g:", @@ -693,6 +697,8 @@ def check_input(device_opt, opt): options["-u"] = 22 elif options.has_key("-z"): options["-u"] = 443 + elif device_opt.count("web"): + options["-u"] = 80 else: options["-u"] = 23 diff --git a/fence/agents/rhevm/Makefile b/fence/agents/rhevm/Makefile new file mode 100644 index 0000000..21f1747 --- /dev/null +++ b/fence/agents/rhevm/Makefile @@ -0,0 +1,7 @@ +include ../../../make/defines.mk + +TARGET= fence_rhevm + +MAKEMAN = 1 + +include $(OBJDIR)/make/fencebuild.mk diff --git a/fence/agents/rhevm/fence_rhevm.py b/fence/agents/rhevm/fence_rhevm.py new file mode 100755 index 0000000..376e6e3 --- /dev/null +++ b/fence/agents/rhevm/fence_rhevm.py @@ -0,0 +1,145 @@ +#!/usr/bin/python + +import sys, re, pexpect, socket +import pycurl, StringIO +sys.path.append("@FENCEAGENTSLIBDIR@") +from fencing import * + +#BEGIN_VERSION_GENERATION +RELEASE_VERSION="New RHEV-M Agent - test release on steroids" +REDHAT_COPYRIGHT="" +BUILD_DATE="March, 2008" +#END_VERSION_GENERATION + + +re_get_id = re.compile("<vm id=\"(.*?)\"", re.IGNORECASE); +re_status = re.compile("<status>(.*?)</status>", re.IGNORECASE); +re_get_name = re.compile("<name>(.*?)</name>", re.IGNORECASE); + +def get_power_status(conn, options): + ### Obtain real ID from name + try: + res = send_command(options, "vms/?search=name%3D" + options["-n"]) + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + result = re_get_id.search(res) + if (result == None): + # Unable to obtain ID needed to access virtual machine + fail(EC_STATUS) + + options["id"] = result.group(1); + + re_status.search(res) + result = re_status.search(res) + if (result == None): + # We were able to parse ID so output is correct + # in some cases it is possible that RHEV-M output does not + # contain <status> line. We can assume machine is OFF then + return "off" + else: + status = result.group(1) + + if (status == "RUNNING"): + return "on" + else: + return "off" + +def set_power_status(conn, options): + action = { + 'on' : "start", + 'off' : "stop" + }[options["-o"]] + + url = "vms/" + options["id"] + "/" + action + try: + res = send_command(options, url, "POST") + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + return + +def get_list(conn, options): + outlets = { } + + try: + try: + res = send_command(options, "vms") + except pycurl.error, e: + sys.stderr.write(e[1] + "\n") + fail(EC_TIMED_OUT) + + lines = res.split("<vm ") + for i in range(1, len(lines)): + name = re_get_name.search(lines[i]).group(1) + outlets[name] = ("", None) + except AttributeError: + return { } + except IndexError: + return { } + + return outlets + +def send_command(opt, command, method = "GET"): + ## setup correct URL + if opt.has_key("-z"): + url = "https:" + else: + url = "http:" + + url += "//" + opt["-a"] + ":" + str(opt["-u"]) + "/rhevm-api-powershell/" + command + + ## send command through pycurl + c = pycurl.Curl() + b = StringIO.StringIO() + c.setopt(pycurl.URL, url) + c.setopt(pycurl.HTTPHEADER, [ "Content-type: application/xml", "Accept: application/xml" ]) + c.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC) + c.setopt(pycurl.USERPWD, opt["-l"] + ":" + opt["-p"]) + c.setopt(pycurl.TIMEOUT, int(opt["-Y"])) + c.setopt(pycurl.SSL_VERIFYPEER, 0) + + if (method == "POST"): + c.setopt(pycurl.POSTFIELDS, "<action />") + + c.setopt(pycurl.WRITEFUNCTION, b.write) + c.perform() + result = b.getvalue() + + if opt["log"] >= LOG_MODE_VERBOSE: + opt["debug_fh"].write(command + "\n") + opt["debug_fh"].write(result + "\n") + + return result + +def main(): + device_opt = [ "help", "version", "agent", "quiet", "verbose", "debug", + "action", "ipaddr", "login", "passwd", "passwd_script", + "ssl", "inet4_only", "inet6_only", "ipport", "port", + "web", "separator", "power_wait", "power_timeout", + "shell_timeout" ] + + atexit.register(atexit_handler) + + all_opt["power_wait"]["default"] = "1" + + options = check_input(device_opt, process_input(device_opt)) + + docs = { } + docs["shortdesc"] = "Fence agent for RHEV-M REST API" + docs["longdesc"] = "fence_rhevm is an I/O Fencing agent which can be \ +used with RHEV-M REST API to fence virtual machines." + docs["vendorurl"] = "
http://www.redhat.com
" + show_docs(options, docs) + + ## + ## Fence operations + #### + result = fence_action(None, options, set_power_status, get_power_status, get_list) + + sys.exit(result) + +if __name__ == "__main__": + main()
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
9
...
12
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
Results per page:
10
25
50
100
200