From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 14 Jan 2008 20:51:43 -0000 Subject: [Cluster-devel] conga ./conga.spec.in.in luci/site/luci/Extens ... Message-ID: <20080114205143.28658.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: rmccabe at sourceware.org 2008-01-14 20:51:42 Modified files: . : conga.spec.in.in luci/site/luci/Extensions: cluster_adapters.py LuciDB.py luci/cluster : busy_wait-macro Log message: Fix bz239387 (RFE: add timeouts for actions that can leave cluster unreachable) Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/conga.spec.in.in.diff?cvsroot=cluster&r1=1.91&r2=1.92 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.277&r2=1.278 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciDB.py.diff?cvsroot=cluster&r1=1.7&r2=1.8 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/busy_wait-macro.diff?cvsroot=cluster&r1=1.1&r2=1.2 --- conga/conga.spec.in.in 2008/01/03 16:27:48 1.91 +++ conga/conga.spec.in.in 2008/01/14 20:51:42 1.92 @@ -302,6 +302,7 @@ - Fixed bz253727 (RFE: graphical view should be default in partiton tables view) - Fixed bz337041 (Add option to not fail-back service) - Fixed bz264161 (RFE: support setting the "__independent_subtree" attribute on cluster resources) +- Fixed bz239387 (RFE: add timeouts for actions that can leave cluster unreachable) * Mon Aug 27 2007 Ryan McCabe 0.10.0-6 - Fixed bz253783 --- conga/luci/site/luci/Extensions/cluster_adapters.py 2008/01/02 21:00:32 1.277 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2008/01/14 20:51:42 1.278 @@ -40,7 +40,7 @@ batch_status, extract_module_status from LuciDB import manageCluster, createClusterSystems, \ - setNodeStatus, getStorageNode, getClusterFlags, \ + setNodeStatus, getStorageNode, getClusterFlags, del_node_flag, \ getClusterNode, buildClusterCreateFlags, getClusterDBObj, \ resolve_nodename, set_node_flag, getRicciAgent, \ CLUSTER_NODE_NEED_AUTH @@ -1102,6 +1102,30 @@ request.RESPONSE.redirect('%s?pagetype=%s&clustername=%s&tab=2&busyfirst=true' \ % (baseurl, CLUSTER_CONFIG, clustername)) +def validate_stop_waiting(self, request): + fvar = GetReqVars(request, [ 'clustername', 'node', 'batchid', 'refreshurl' ]) + + batchid = fvar['batchid'] + node = fvar['node'] + clustername = fvar['clustername'] + + if node is None: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VSW0: no node name given') + + if clustername is None: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VSW1: no cluster name was given') + + if node and clustername: + try: + del_node_flag(self, clustername, node, batchid) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VSW2: [%s %s %s] %r %s' \ + % (node, clustername, batchid, e, str(e))) + request.RESPONSE.redirect(fvar['refreshurl']) + def process_cluster_conf_editor(self, req): if req.has_key('clustername'): clustername = req['clustername'].strip() or None @@ -1181,6 +1205,7 @@ 57: deleteFenceDevice, 58: validateNodeFenceConfig, 60: validate_xvm_key_dist, + 61: validate_stop_waiting, 80: process_cluster_conf_editor, 1001: validate_clusvc_async } @@ -1524,6 +1549,7 @@ isBusy = False redirect_message = False nodereports = list() + report_index = 0 fvar = GetReqVars(req, [ 'clustername', 'URL' ]) busy_map['nodereports'] = nodereports @@ -1571,13 +1597,21 @@ # If complete, report status and remove flag. for item in items: + node_report = {} tasktype = item[1].getProperty(TASKTYPE) if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB3: task type for %s = %s' \ % (item[0], tasktype)) + + ricci = item[0].split('____')[0] + + node_report['node'] = ricci + node_report['tasktype'] = tasktype + node_report['clustername'] = cluname + node_report['report_index'] = report_index + report_index += 1 if tasktype == CLUSTER_ADD or tasktype == NODE_ADD: - node_report = {} node_report['isnodecreation'] = True # Default value node_report['iserror'] = False @@ -1585,14 +1619,13 @@ batch_xml = None # This removes the 'flag' suffix - ricci = item[0].split('____') if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB4: using rc host %s for item %s' \ - % (ricci[0], item[0])) + % (ricci, item[0])) try: - rc = RicciCommunicator(ricci[0]) + rc = RicciCommunicator(ricci) if not rc: rc = None if LUCI_DEBUG_MODE is True: @@ -1615,12 +1648,14 @@ luci_log.debug_verbose('ICB8: failed to get batch_id from %s: %r %s' % (item[0], e, str(e))) if batch_id is not None: + node_report['batchid'] = batch_id try: batch_xml = rc.batch_report(batch_id) if batch_xml is not None: if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB9: batch_xml for %s from batch_report is not None -- getting batch status' % batch_id) (creation_status, total) = batch_status(batch_xml) + try: if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB10: batch status returned (%d,%d)' % (creation_status, total)) @@ -1669,7 +1704,7 @@ # an error was encountered if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB17: %s: CS %d for %s' \ - % (cluname, creation_status, ricci[0])) + % (cluname, creation_status, ricci)) if creation_status == RICCI_CONNECT_FAILURE: laststatus = item[1].getProperty(LAST_STATUS) @@ -1737,8 +1772,8 @@ try: if del_db_obj is True: if LUCI_DEBUG_MODE is True: - luci_log.debug_verbose('ICB19: %s node creation failed for %s: %d: deleting DB entry' % (cluname, ricci[0], creation_status)) - clusterfolder.manage_delObjects([ricci[0]]) + luci_log.debug_verbose('ICB19: %s node creation failed for %s: %d: deleting DB entry' % (cluname, ricci, creation_status)) + clusterfolder.manage_delObjects([ricci]) clusterfolder.manage_delObjects([item[0]]) except Exception, e: if LUCI_DEBUG_MODE is True: @@ -1764,8 +1799,8 @@ % (item[0], e, str(e))) continue else: - busy_map['busy'] = 'true' isBusy = True + busy_map['busy'] = 'true' node_report['statusmessage'] = 'Node still being created' node_report['statusindex'] = creation_status nodereports.append(node_report) @@ -1783,13 +1818,11 @@ luci_log.debug_verbose('ICB23: last_status err: %s %d: %r %s' % (item[0], creation_status, e, str(e))) continue else: - node_report = {} node_report['isnodecreation'] = False # This removes the 'flag' suffix - ricci = item[0].split('____') try: - rc = RicciCommunicator(ricci[0]) + rc = RicciCommunicator(ricci) except Exception, e: rc = None finished = -1 @@ -1797,7 +1830,7 @@ if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('ICB24: ricci error: %s: %r %s' \ - % (ricci[0], e, str(e))) + % (ricci, e, str(e))) if rc is not None: batch_num = item[1].getProperty(BATCH_ID) @@ -1825,9 +1858,8 @@ % (item[0], e, str(e))) busy_map['busy'] = None else: - node_report = {} - busy_map['busy'] = 'true' isBusy = True + busy_map['busy'] = 'true' node_report['desc'] = item[1].getProperty(FLAG_DESC) nodereports.append(node_report) --- conga/luci/site/luci/Extensions/LuciDB.py 2007/08/20 16:31:13 1.7 +++ conga/luci/site/luci/Extensions/LuciDB.py 2008/01/14 20:51:42 1.8 @@ -84,6 +84,38 @@ luci_log.debug_verbose('clearNodeStatus0: %r %s' \ % (e, str(e))) +def del_node_flag(self, cluname, agent, batchid=None): + path = str('%s%s' % (CLUSTER_FOLDER_PATH, cluname)) + objname = '%s____flag' % agent + + try: + flag_obj = self.restrictedTraverse(str('%s/%s' % (path, objname))) + clusterfolder = self.restrictedTraverse(path) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('DNF0: %s/%s: %s %r %s' \ + % (path, objname, flag_obj[0], e, str(e))) + return False + + if batchid: + try: + bid = flag_obj.getProperty(BATCH_ID) + if bid != batchid: + raise Exception, 'mismatch: got %s, wanted %s' % (bid, batchid) + except Exception, e1: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('DNF1: unable to find flag with bid: %s for %s/%s: %r %s' % (batchid, path, objname, e1, str(e1))) + return False + + try: + clusterfolder.manage_delObjects([objname]) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('DNF2: %s/%s: %r %s' \ + % (path, objname, e, str(e))) + return False + return True + def set_node_flag(self, cluname, agent, batchid, task, desc): path = str('%s%s' % (CLUSTER_FOLDER_PATH, cluname)) batch_id = str(batchid) @@ -99,8 +131,8 @@ flag.manage_addProperty(TASKTYPE, task, 'string') flag.manage_addProperty(FLAG_DESC, desc, 'string') except Exception, e: - errmsg = 'SNF0: error creating flag (%s,%s,%s) at %s: %s' \ - % (batch_id, task, desc, objpath, str(e)) + errmsg = 'Error creating flag (bid: %s task: %s desc: %s) at %s: %s' \ + % (batch_id, task, desc, objpath, str(e)) if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('SNF0: %r %s' % (e, errmsg)) raise Exception, errmsg --- conga/luci/cluster/busy_wait-macro 2007/11/19 18:22:48 1.1 +++ conga/luci/cluster/busy_wait-macro 2008/01/14 20:51:42 1.2 @@ -1,62 +1,70 @@
- - - - +

Please be patient - this cluster's configuration is being modified.

- +

+ + + +
+ + +

+
+ + -
-
-

Please be patient - this cluster's configuration is being modified.

-
- -
+ tal:condition="python:nodereport.get('iserror') == True"> + +

-

+
- + +

+ +
- + + + -

+ + [cluster software installed] + - + + [cluster node rebooted] - + + [cluster node configured] + -

- -
- - - - - - - [cluster software installed] - - - - [cluster node rebooted] - - - - [cluster node configured] - - - - [cluster node joined cluster] - + + [cluster node joined cluster]
-
+ + +
+
+ + + + + + Stop waiting for this job to complete +
+
+
+