From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 14 May 2007 18:00:17 -0000 Subject: [Cluster-devel] conga/luci/site/luci/Extensions LuciClusterAct ... Message-ID: <20070514180017.21661.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 Branch: EXPERIMENTAL Changes by: rmccabe at sourceware.org 2007-05-14 18:00:14 Modified files: luci/site/luci/Extensions: LuciClusterActions.py LuciClusterInfo.py LuciDB.py LuciSyslog.py LuciZope.py PropsObject.py ResourceHandler.py RicciQueries.py cluster_adapters.py homebase_adapters.py ricci_communicator.py system_adapters.py Log message: Next pass of cleanup and refactor Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterActions.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterInfo.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciDB.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.4&r2=1.1.2.5 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciSyslog.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.11&r2=1.11.4.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciZope.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.2&r2=1.1.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/PropsObject.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.2.8.1&r2=1.2.8.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ResourceHandler.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/RicciQueries.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.1.2.1&r2=1.1.2.2 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.255.2.3&r2=1.255.2.4 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/homebase_adapters.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.50.2.2&r2=1.50.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ricci_communicator.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.25.2.2&r2=1.25.2.3 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/system_adapters.py.diff?cvsroot=cluster&only_with_tag=EXPERIMENTAL&r1=1.2.2.1&r2=1.2.2.2 --- conga/luci/site/luci/Extensions/Attic/LuciClusterActions.py 2007/05/08 22:19:35 1.1.2.1 +++ conga/luci/site/luci/Extensions/Attic/LuciClusterActions.py 2007/05/14 18:00:14 1.1.2.2 @@ -1,7 +1,11 @@ import RicciQueries as rq -from conga_constants import CLUSTER_CONFIG +from LuciDB import set_node_flag, getRicciAgent +from LuciSyslog import get_logger +from conga_constants import CLUSTER_CONFIG, LUCI_DEBUG_MODE -def propagateClusterConfAsync(model, rc=None): +luci_log = get_logger() + +def propagateClusterConfAsync(self, model, rc=None): errors = list() messages = list() @@ -10,7 +14,8 @@ if not clustername: raise Exception, 'cluster name from model.getClusterName() is blank' except Exception, e: - luci_log.debug_verbose('PCC0: getClusterName: %r' % e) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('PCC0: getClusterName: %r' % e) errors.append('Unable to determine cluster name') return (False, { 'errors': errors, 'messages': messages }) @@ -18,19 +23,36 @@ rc = getRicciAgent(self, clustername) if not rc: - luci_log.debug_verbose('PCC1: unable to find a ricci agent for the %s cluster' % clustername) - errors.append('Unable to contact a ricci agent for cluster "%s"' % clustername) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('PCC1: no ricci agent for the %s cluster' \ + % clustername) + errors.append('Unable to contact a ricci agent for cluster "%s"' \ + % clustername) + return (False, { 'errors': errors, 'messages': messages }) + + try: + conf_str = str(model.exportModelAsString()).strip() + if not conf_str: + raise Exception, 'The new cluster configuration is blank' + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('PCC2: %r' % e) + errors.append(repr(e)) return (False, { 'errors': errors, 'messages': messages }) - batch_id, result = rq.setClusterConf(rc, str(conf_str)) + batch_id, result = rq.setClusterConf(rc, conf_str) if batch_id is None or result is None: - luci_log.debug_verbose('PCC2: setCluserConf: batchid or result is None') - errors.append('Unable to propagate the new cluster configuration for %s' % clustername) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('PCC3: batchid or result is None') + errors.append('Unable to propagate a new cluster configuration for %s' \ + % clustername) return (False, { 'errors': errors, 'messages': messages }) try: set_node_flag(self, clustername, rc.hostname(), batch_id, - CLUSTER_CONFIG, 'Adding new fence device "%s"' % retobj) + CLUSTER_CONFIG, 'Updating the cluster configuration for "%s"' % + clustername) except Exception, e: - luci_log.debug_verbose('PCC3: set_node_flag: %r' % e) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('PCC4: set_node_flag: %r' % e) return (True, { 'errors': errors, 'messages': messages, 'batchid': batch_id }) --- conga/luci/site/luci/Extensions/Attic/LuciClusterInfo.py 2007/05/08 22:19:35 1.1.2.1 +++ conga/luci/site/luci/Extensions/Attic/LuciClusterInfo.py 2007/05/14 18:00:14 1.1.2.2 @@ -2,6 +2,7 @@ import RicciQueries as rq from ricci_communicator import RicciCommunicator from FenceHandler import FENCE_OPTS +from LuciSyslog import get_logger from conga_constants import CLUNAME, CLUSTER_CONFIG, CLUSTER_DELETE, \ CLUSTER_PROCESS, CLUSTER_RESTART, CLUSTER_START, CLUSTER_STOP, \ @@ -14,6 +15,15 @@ SERVICE, SERVICE_DELETE, SERVICE_MIGRATE, SERVICE_RESTART, \ SERVICE_START, SERVICE_STOP, VM_CONFIG +luci_log = get_logger() + +def getnodes(self, model): + try: + return map(lambda x: str(x.getName()), model.getNodes()) + except Exception, e: + luci_log.debug_verbose('getnodes0: %s' % str(e)) + return [] + def getResourceInfo(model, name, res=None): if res is None: try: @@ -1469,3 +1479,14 @@ #CALL return {} + +def getClusterName(self, model): + return model.getClusterName() + +def getClusterAlias(self, model): + if not model: + return '' + alias = model.getClusterAlias() + if not alias: + return model.getClusterName() + return alias --- conga/luci/site/luci/Extensions/Attic/LuciDB.py 2007/05/14 16:02:11 1.1.2.4 +++ conga/luci/site/luci/Extensions/Attic/LuciDB.py 2007/05/14 18:00:14 1.1.2.5 @@ -2,13 +2,14 @@ import RicciQuery as rq from ricci_communicator import RicciCommunicator from LuciZope import isAdmin +from LuciSyslog import get_logger from conga_constants import CLUSTER_FOLDER_PATH, BATCH_ID, TASKTYPE, \ FLAG_DESC, CLUSTER_ADD, CLUSTER_NODE_ADDED, CLUSTER_NODE_NEED_AUTH, \ LAST_STATUS, PLONE_ROOT, STORAGE_FOLDER_PATH, CLUSTER_NODE_NOT_MEMBER, \ LUCI_DEBUG_MODE -from homebase_adapters import luci_log +luci_log = get_logger() def getClusterNode(self, nodename, clustername): try: --- conga/luci/site/luci/Extensions/LuciSyslog.py 2006/11/29 18:15:20 1.11 +++ conga/luci/site/luci/Extensions/LuciSyslog.py 2007/05/14 18:00:14 1.11.4.1 @@ -18,14 +18,20 @@ except: raise LuciSyslogError, 'unable to setup syslog functionality.' + def __del__(self): + self.close() + + def initialized(self): + return self.__init > 0 + def info(self, msg): if not self.__init: return try: syslog(LOG_INFO, msg) except: - pass #raise LuciSyslogError, 'syslog info call failed' + pass def warn(self, msg): if not self.__init: @@ -33,8 +39,8 @@ try: syslog(LOG_WARNING, msg) except: - pass #raise LuciSyslogError, 'syslog warn call failed' + pass def private(self, msg): if not self.__init: @@ -42,8 +48,8 @@ try: syslog(LOG_AUTH, msg) except: - pass #raise LuciSyslogError, 'syslog private call failed' + pass def debug_verbose(self, msg): if not LUCI_DEBUG_MODE or LUCI_DEBUG_VERBOSITY < 2 or not self.__init: @@ -73,8 +79,8 @@ try: syslog(LOG_DEBUG, msg) except: - pass #raise LuciSyslogError, 'syslog debug call failed' + pass def close(self): try: @@ -82,3 +88,9 @@ closelog() except: pass + +luci_logc = None +def get_logger(): + if luci_logc is None or luci_logc.initialized() is False: + luci_logc = LuciSyslog() + return luci_logc --- conga/luci/site/luci/Extensions/Attic/LuciZope.py 2007/05/08 22:19:35 1.1.2.2 +++ conga/luci/site/luci/Extensions/Attic/LuciZope.py 2007/05/14 18:00:14 1.1.2.3 @@ -87,3 +87,41 @@ if get_units_multiplier(units) > get_units_multiplier(p_units): units = p_units return (convert_bytes(bytes, units), units) + +def getTabs(self, req): + if not userAuthenticated(self): + return [] + + htab = { + 'Title': 'homebase', + 'Description': 'Home base for this luci server', + 'Taburl': '/luci/homebase', + 'isSelected': False + } + ctab = { + 'Title': 'cluster', + 'Description': 'Cluster configuration area', + 'Taburl': '/luci/cluster/index_html?pagetype=3', + 'isSelected': False + } + stab = { + 'Title': 'storage', + 'Description': 'Storage configuration page', + 'Taburl': '/luci/storage', + 'isSelected': False + } + + try: + baseurl = req['URL'] + if baseurl.find('cluster') > (-1): + ctab['isSelected'] = True + elif baseurl.find('storage') > (-1): + stab['isSelected'] = True + else: + htab['isSelected'] = True + except KeyError, e: + pass + except Exception, e: + htab['isSelected'] = True + + return [ htab, ctab, stab ] --- conga/luci/site/luci/Extensions/PropsObject.py 2007/05/04 19:10:24 1.2.8.1 +++ conga/luci/site/luci/Extensions/PropsObject.py 2007/05/14 18:00:14 1.2.8.2 @@ -1,7 +1,5 @@ - -from ricci_defines import * - -from Variable import Variable, parse_variable +from Variable import parse_variable +from ricci_defines import PROPS_TAG import xml import xml.dom --- conga/luci/site/luci/Extensions/Attic/ResourceHandler.py 2007/05/03 20:16:38 1.1.2.1 +++ conga/luci/site/luci/Extensions/Attic/ResourceHandler.py 2007/05/14 18:00:14 1.1.2.2 @@ -12,8 +12,10 @@ from ClusterModel.OpenLDAP import OpenLDAP from ClusterModel.LVM import LVM from ClusterModel.MySQL import MySQL +from LuciSyslog import get_logger +from conga_constants import LUCI_DEBUG_MODE -from homebase_adapters import luci_log +luci_log = get_logger() def get_fsid_list(model): obj_list = model.searchObjectTree('fs') @@ -45,7 +47,8 @@ resPtr.removeChild(res) return res - luci_log.debug_verbose('GRFE0: unable to find resource "%s"' % name) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GRFE0: unable to find resource "%s"' % name) raise KeyError, name def addIp(res, rname, form, model): @@ -57,9 +60,10 @@ raise KeyError, 'No IP address was given' res.addAttribute('address', addr) except KeyError, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addIp4: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addIp4: %s' % err) if 'monitorLink' in form: res.addAttribute('monitor_link', '1') @@ -77,9 +81,10 @@ raise Exception, 'No mount point was given for "%s"' % rname res.addAttribute('mountpoint', mountpoint) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addFs6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addFs6: %s' % err) try: device = form['device'].strip() @@ -87,9 +92,10 @@ raise Exception, 'No device was given for "%s"' % rname res.addAttribute('device', device) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addFs7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addFs7: %s' % err) try: options = form['options'].strip() @@ -102,9 +108,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addFs8: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addFs8: %s' % err) try: fstype = form['fstype'].strip() @@ -112,9 +119,10 @@ raise Exception, 'No filesystem type was given for "%s"' % rname res.addAttribute('fstype', fstype) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addFs9: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addFs9: %s' % err) try: fsid = form['fsid'].strip() @@ -153,9 +161,10 @@ raise Exception, 'No mount point was given for "%s"' % rname res.addAttribute('mountpoint', mountpoint) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addGfs5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addGfs5: %s' % err) try: device = form['device'].strip() @@ -163,9 +172,10 @@ raise Exception, 'No device was given for "%s"' % rname res.addAttribute('device', device) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addGfs6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addGfs6: %s' % err) try: options = form['options'].strip() @@ -178,9 +188,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addGfs7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addGfs7: %s' % err) try: fsid = form['fsid'].strip() @@ -209,9 +220,10 @@ raise Exception, 'No mount point was given for "%s"' % rname res.addAttribute('mountpoint', mountpoint) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsm5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsm5: %s' % err) try: host = form['host'].strip() @@ -219,9 +231,10 @@ raise Exception, 'No host server was given for "%s"' % rname res.addAttribute('host', host) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsm6 error: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsm6 error: %s' % err) try: options = form['options'].strip() @@ -234,9 +247,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsm7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsm7: %s' % err) try: exportpath = form['exportpath'].strip() @@ -244,9 +258,10 @@ raise Exception, 'No export path was given for "%s"' % rname res.addAttribute('exportpath', exportpath) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsm8: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsm8: %s' % err) try: nfstype = form['nfstype'].strip().lower() @@ -255,9 +270,10 @@ % (nfstype, rname) res.addAttribute('nfstype', nfstype) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsm9: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsm9: %s' % err) if form.has_key('forceunmount'): res.addAttribute('force_unmount', '1') @@ -275,9 +291,10 @@ raise Exception, 'No target was given for "%s"' % rname res.addAttribute('target', target) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsc5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsc5: %s' % err) try: options = form['options'].strip() @@ -290,9 +307,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addNfsc6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addNfsc6: %s' % err) if form.has_key('allow_recover'): res.addAttribute('allow_recover', '1') @@ -314,9 +332,10 @@ raise Exception, 'No path to a script file was given for this "%s"' % rname res.addAttribute('file', path) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addScr5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addScr5: %s' % err) return errors @@ -329,9 +348,10 @@ raise Exception, 'No workgroup was given for "%s"' % rname res.addAttribute('workgroup', workgroup) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addSmb5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addSmb5: %s' % err) return errors @@ -344,9 +364,10 @@ raise KeyError, 'No server root was given for "%s"' % rname res.addAttribute('server_root', server_root) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addApache5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addApache5: %s' % err) try: config_file = form['config_file'].strip() @@ -354,9 +375,10 @@ raise KeyError, 'No path to the Apache configuration file was given for "%s"' % rname res.addAttribute('config_file', config_file) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addApache6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addApache6: %s' % err) try: options = form['httpd_options'].strip() @@ -369,9 +391,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addApache7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addApache7: %s' % err) try: shutdown_wait = int(form['shutdown_wait'].strip()) @@ -379,9 +402,10 @@ except KeyError, e: res.addAttribute('shutdown_wait', '0') except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addApache7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addApache7: %s' % err) return errors @@ -394,9 +418,10 @@ raise KeyError, 'No path to the MySQL configuration file was given for "%s"' % rname res.addAttribute('config_file', config_file) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addMySQL5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addMySQL5: %s' % err) try: listen_addr = form['listen_address'].strip() @@ -404,9 +429,10 @@ raise KeyError, 'No address was given for "%s"' % rname res.addAttribute('listen_address', listen_addr) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addMySQL6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addMySQL6: %s' % err) try: options = form['mysql_options'].strip() @@ -419,9 +445,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addMySQL7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addMySQL7: %s' % err) try: shutdown_wait = int(form['shutdown_wait'].strip()) @@ -429,9 +456,10 @@ except KeyError, e: res.addAttribute('shutdown_wait', '0') except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addMySQL7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addMySQL7: %s' % err) return errors @@ -444,9 +472,10 @@ raise KeyError, 'No URL list was given for "%s"' % rname res.addAttribute('url_list', url_list) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addOpenLDAP5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addOpenLDAP5: %s' % err) try: config_file = form['config_file'].strip() @@ -454,9 +483,10 @@ raise KeyError, 'No path to the OpenLDAP configuration file was given for "%s"' % rname res.addAttribute('config_file', config_file) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addOpenLDAP6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addOpenLDAP6: %s' % err) try: options = form['slapd_options'].strip() @@ -469,9 +499,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addOpenLDAP7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addOpenLDAP7: %s' % err) try: shutdown_wait = int(form['shutdown_wait'].strip()) @@ -479,9 +510,10 @@ except KeyError, e: res.addAttribute('shutdown_wait', '0') except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addOpenLDAP7: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addOpenLDAP7: %s' % err) return errors @@ -493,9 +525,10 @@ raise KeyError, 'No postmaster user was given for "%s"' % rname res.addAttribute('postmaster_user', user) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addPostgreSQL85: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addPostgreSQL85: %s' % err) try: config_file = form['config_file'].strip() @@ -503,9 +536,10 @@ raise KeyError, 'No path to the PostgreSQL 8 configuration file was given for "%s"' % rname res.addAttribute('config_file', config_file) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addPostgreSQL86: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addPostgreSQL86: %s' % err) try: options = form['postmaster_options'].strip() @@ -518,9 +552,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addPostgreSQL87: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addPostgreSQL87: %s' % err) try: shutdown_wait = int(form['shutdown_wait'].strip()) @@ -528,9 +563,10 @@ except KeyError, e: res.addAttribute('shutdown_wait', '0') except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addPostgreSQL87: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addPostgreSQL87: %s' % err) return errors @@ -543,9 +579,10 @@ raise KeyError, 'No Tomcat user was given for "%s"' % rname res.addAttribute('tomcat_user', user) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addTomcat55: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addTomcat55: %s' % err) try: config_file = form['config_file'].strip() @@ -553,9 +590,10 @@ raise KeyError, 'No path to the Tomcat 5 configuration file was given for "%s"' % rname res.addAttribute('config_file', config_file) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addTomcat56: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addTomcat56: %s' % err) try: options = form['catalina_options'].strip() @@ -568,9 +606,10 @@ except: pass except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addTomcat57: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addTomcat57: %s' % err) try: catalina_base = form['catalina_base'].strip() @@ -578,9 +617,10 @@ raise KeyError, 'No cataliny base directory was given for "%s"' % rname res.addAttribute('catalina_base', catalina_base) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addTomcat58: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addTomcat58: %s' % err) try: shutdown_wait = int(form['shutdown_wait'].strip()) @@ -588,9 +628,10 @@ except KeyError, e: res.addAttribute('shutdown_wait', '0') except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addTomcat59: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addTomcat59: %s' % err) return errors @@ -603,9 +644,10 @@ raise KeyError, 'No volume group name was given for "%s"' % rname res.addAttribute('vg_name', vg_name) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addLVM5: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addLVM5: %s' % err) try: lv_name = form['lv_name'].strip() @@ -613,9 +655,10 @@ raise KeyError, 'No logical volume name was given for "%s"' % rname res.addAttribute('lv_name', lv_name) except Exception, e: - err = str(e) + err = repr(e) errors.append(err) - luci_log.debug_verbose('addLVM6: %s' % err) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('addLVM6: %s' % err) return errors --- conga/luci/site/luci/Extensions/Attic/RicciQueries.py 2007/05/03 20:16:38 1.1.2.1 +++ conga/luci/site/luci/Extensions/Attic/RicciQueries.py 2007/05/14 18:00:14 1.1.2.2 @@ -1,12 +1,10 @@ from xml.dom import minidom from xml.dom.Node import ELEMENT_NODE from ricci_communicator import RicciCommunicator, extract_module_status -from LuciSyslog import LuciSyslog +from LuciSyslog import get_logger +from conga_constants import LUCI_DEBUG_MODE -try: - luci_log = LuciSyslog() -except: - pass +luci_log = get_logger() def checkBatch(rc, batch_id): err_msg = 'An unknown Ricci error occurred on %s' % rc.hostname() @@ -14,10 +12,14 @@ try: batch = rc.batch_report(batch_id) if batch is None: - luci_log.debug_verbose('checkBatch0: batch id %s was not found' % batch_id) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('checkBatch0: batch id %s not found' \ + % batch_id) return (True, 'batch id %s was not found' % batch_id) except Exception, e: - luci_log.debug_verbose('checkBatch0a: %s: %s' % (rc.hostname(), str(e))) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('checkBatch1: %s: %r' \ + % (rc.hostname(), e)) return (-1, err_msg) try: @@ -26,7 +28,9 @@ err_msg = 'A Ricci error occurred on %s: %s' \ % (rc.hostname(), str(new_err_msg)) except Exception, e: - luci_log.debug_verbose('checkBatch1: %s: %s' % (rc.hostname(), str(e))) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('checkBatch2: %s: %r' \ + % (rc.hostname(), e)) return (-1, err_msg) # In progress. @@ -38,7 +42,8 @@ return (True, 'completed sucessfully') # Error - luci_log.debug_verbose('checkBatch2: %d: %s' % (code, rc.hostname())) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('checkBatch3: %d: %s' % (code, rc.hostname())) return (-1, err_msg) def addClusterNodeBatch(cluster_name, @@ -290,7 +295,8 @@ if not batch or len(batch) < 1: raise Exception, 'no batch tag was found' except Exception, e: - luci_log.debug_verbose('batchAttemptResult: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('BAR0: %r' % e) return (None, None) for i in batch: @@ -299,13 +305,15 @@ result = i.getAttribute('status') return (str(batch_number), str(result)) except Exception, e: - luci_log.debug_verbose('batchAttemptResult: %s' % str(e)) - - try: - luci_log.debug_verbose('no batch with batchid and status found in \"%s\"' % doc.toxml()) - except: - pass + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('BAR1: %s' % e) + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('BAR2: batchid, status not in \"%s\"' \ + % doc.toxml()) + except: + pass return (None, None) def getClusterStatusBatch(rc): @@ -315,21 +323,25 @@ try: cluster_tags = ricci_xml.getElementsByTagName('cluster') except Exception, e: - luci_log.debug_verbose('getClusterStatusBatch0: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCSB0: %r' % e) return None if len(cluster_tags) < 1: - luci_log.debug_verbose('getClusterStatusBatch1: %d entries - expecting 1' \ - % len(cluster_tags)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCSB1: %d entries - expecting 1' \ + % len(cluster_tags)) elif len(cluster_tags) > 1: - luci_log.debug_verbose('getClusterStatusBatch2: %d entries - expecting 1, using the first' % len(cluster_tags)) - + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCSB2: %d entries, expecting 1 use first' \ + % len(cluster_tags)) try: cluster_node = cluster_tags[0] if not cluster_node: raise Exception, 'element 0 is None' except Exception, e: - luci_log.debug_verbose('getClusterStatusBatch3: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCSB3: %r' % e) return None try: @@ -337,12 +349,13 @@ doc.appendChild(cluster_node) return doc except Exception, e: - luci_log.debug_verbose('getClusterStatusBatch4: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCSB4: %r' % e) return None def setClusterConf(rc, clusterconf, propagate=True): - if propagate == True: + if propagate is True: propg = 'true' else: propg = 'false' @@ -372,8 +385,9 @@ if not log_entries or len(log_entries) < 1: raise Exception, 'no log data is available.' except Exception, e: - luci_log.debug_verbose('Error retrieving log data from %s: %s' \ - % (rc.hostname(), str(e))) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GNL0: retrieving log data from %s: %r' \ + % (rc.hostname(), e)) return None time_now = time() @@ -524,7 +538,7 @@ else: raise Exception, op except Exception, e: - elem.setAttribute('message', 'Unknown operation: %s' % str(e)) + elem.setAttribute('message', 'Unknown operation: %r' % e) doc.appendChild(elem) return doc @@ -564,13 +578,15 @@ batch_str = '' ricci_xml = rc.batch_run(batch_str, async=False) if not ricci_xml or not ricci_xml.firstChild: - luci_log.debug_verbose('LS0: None returned') + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('LS0: None returned') return None try: service_tags = ricci_xml.getElementsByTagName('service') return service_tags except Exception, e: - luci_log.debug_verbose('LS1: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('LS1: %r' % e) return None def nodeIsVirtual(rc): @@ -578,13 +594,15 @@ ricci_xml = rc.batch_run(batch_str, async=False) if not ricci_xml or not ricci_xml.firstChild: - luci_log.debug_verbose('nodeIsVirtual0: None returned') + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('nodeIsVirtual0: None returned') return None var_tags = ricci_xml.getElementsByTagName('var') if not var_tags or len(var_tags) < 2: - luci_log.debug_verbose('nodeIsVirtual1: unexpected response %s' \ - % ricci_xml.toxml()) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('nodeIsVirtual1: unexpected response %s' \ + % ricci_xml.toxml()) return None success = False @@ -605,7 +623,8 @@ else: raise Exception, 'unexpected attribute name: %s' % name except Exception, e: - luci_log.debug_verbose('nodeIsVirtual2: error: %s' % str(e)) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('nodeIsVirtual2: error: %r' % e) if not success: return None @@ -621,7 +640,8 @@ ricci_xml = rc.batch_run(''.join(batch_list), async=False) if not ricci_xml or not ricci_xml.firstChild: - luci_log.debug_verbose('no ricci_xml in getDaemonStates') + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GDS0: no ricci_xml') return None result = extractDaemonInfo(ricci_xml.firstChild) return result @@ -710,16 +730,18 @@ if rc is None: raise Exception, 'unknown error' except Exception, e: - luci_log.debug_verbose('Ricci error while connecting to %s: %s' \ - % (system_info, str(e))) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCC0: connecting to %s: %r' \ + % (system_info, e)) return None # end workaround try: ret = rc.process_batch(batch) except Exception, e: - luci_log.debug_verbose('process_batch error for %s: %s' \ - % (system_info, str(e))) + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('GCC1: process_batch error for %s: %r' \ + % (system_info, e)) return None if not ret: --- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/05/08 22:19:35 1.255.2.3 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/05/14 18:00:14 1.255.2.4 @@ -1,8 +1,5 @@ from xml.dom import minidom import AccessControl -from conga_constants import * -import RicciQueries as rq -from ricci_communicator import RicciCommunicator, RicciError, batch_status, extract_module_status from ClusterModel.ModelBuilder import ModelBuilder from ClusterModel.FailoverDomain import FailoverDomain @@ -19,22 +16,31 @@ from ClusterModel.Method import Method from ClusterModel.GeneralError import GeneralError +import RicciQueries as rq from HelperFunctions import resolveOSType -from LuciSyslog import LuciSyslog +from LuciSyslog import get_logger from ResourceHandler import create_resource -from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice, validate_fenceinstance, FD_VAL_FAIL, FD_VAL_SUCCESS - from system_adapters import validate_svc_update - from homebase_adapters import parseHostForm from LuciZope import userAuthenticated +from LuciClusterInfo import getClusterInfo + +from conga_constants import * -from LuciDB import manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, getStorageNode, getClusterNode, delCluster, buildClusterCreateFlags, noNodeFlagsPresent, resolve_nodename, set_node_flag +from FenceHandler import validateNewFenceDevice, FENCE_OPTS, \ + validateFenceDevice, validate_fenceinstance, \ + FD_VAL_FAIL, FD_VAL_SUCCESS + +from ricci_communicator import RicciCommunicator, RicciError, \ + batch_status, extract_module_status + +from LuciDB import manageCluster, createClusterSystems, \ + havePermCreateCluster, setNodeStatus, getStorageNode, \ + getClusterNode, delCluster, buildClusterCreateFlags, \ + noNodeStatussPresent, resolve_nodename, set_node_flag, \ + getRicciAgent -try: - luci_log = LuciSyslog() -except: - pass +luci_log = get_logger() def parseClusterNodes(self, request, cluster_os): check_certs = False @@ -58,7 +64,7 @@ if clusterName is None: luci_log.debug_verbose('PCN0: no cluster name was given') - return (False, { 'errors': [ 'No cluster name was given.' ]}) + return (False, { 'errors': [ 'No cluster name was given' ]}) shared_storage = False try: @@ -111,7 +117,7 @@ try: if prev_auth: - messages.append('Host %s is already authenticated.' \ + messages.append('Host %s is already authenticated' \ % cur_host) else: rc.auth(cur_passwd) @@ -190,7 +196,7 @@ clusterName = add_cluster['name'] if len(clusterName) > 15: - errors.append('A cluster\'s name must be less than 16 characters long.') + errors.append('A cluster\'s name must be less than 16 characters long') try: cluster_os = add_cluster['cluster_os'] @@ -219,9 +225,9 @@ raise Exception, 'blank' num_lockservers = len(lockservers) if not num_lockservers in (1, 3, 5): - errors.append('You must have exactly 1, 3, or 5 GULM lock servers. You submitted %d lock servers.' % num_lockservers) + errors.append('You must have exactly 1, 3, or 5 GULM lock servers. You submitted %d lock servers' % num_lockservers) except: - errors.append('No lock servers were given.') + errors.append('No lock servers were given') if len(errors) > 0: try: @@ -326,7 +332,7 @@ if clusterName is None: luci_log.debug_verbose('VACN0: no cluster name was given') - return (False, { 'errors': [ 'No cluster name was given.' ]}) + return (False, { 'errors': [ 'No cluster name was given' ]}) if cluster_os is None: cluster_folder = None @@ -336,7 +342,7 @@ raise Exception, 'cluster DB object is missing' except Exception, e: luci_log.debug_verbose('VACN1: %s: %s' % (clusterName, str(e))) - return (False, { 'errors': [ 'The database object for %s is missing.' % clusterName ] }) + return (False, { 'errors': [ 'The database object for %s is missing' % clusterName ] }) try: cluster_os = cluster_folder.manage_getProperty('cluster_os') @@ -356,7 +362,7 @@ if cluster_os is None: luci_log.debug_verbose('Unable to determine cluster OS for %s' % clusterName) - return (False, { 'errors': [ 'Unable to determine the version of the cluster suite this cluster is running.' ] }) + return (False, { 'errors': [ 'Unable to determine the version of the cluster suite this cluster is running' ] }) shared_storage = False try: @@ -409,7 +415,7 @@ try: if prev_auth: - messages.append('Host %s is already authenticated.' \ + messages.append('Host %s is already authenticated' \ % cur_host) else: rc.auth(cur_passwd) @@ -473,7 +479,7 @@ raise Exception, 'Unable to find a ricci agent for %s' % clusterName except Exception, e: incomplete = True - errors.append('Unable to contact a ricci agent for %s.' % clusterName) + errors.append('Unable to contact a ricci agent for %s' % clusterName) luci_log.debug_verbose('VACN10: %s: %s' % (clusterName, str(e))) if incomplete or len(errors) > 0: @@ -554,14 +560,14 @@ model.setModified(True) conf_str = str(model.exportModelAsString()) if not conf_str: - raise Exception, 'Unable to save the new cluster model.' + raise Exception, 'Unable to save the new cluster model' batch_number, result = rq.setClusterConf(cluster_ricci, conf_str) if not batch_number or not result: raise Exception, 'batch or result is None' except Exception, e: incomplete = True - errors.append('Unable to save the new cluster model.') + errors.append('Unable to save the new cluster model') luci_log.debug_verbose('VACN14: %s' % str(e)) # Propagate the new cluster.conf to the existing nodes @@ -648,7 +654,7 @@ raise KeyError, 'form_xml must not be blank' except Exception, e: luci_log.debug_verbose('vSA0: no form_xml: %s' % str(e)) - return (False, {'errors': ['No resource data was supplied for this service.']}) + return (False, {'errors': ['No resource data was supplied for this service']}) try: model = request.SESSION.get('model') @@ -656,7 +662,7 @@ raise Exception, 'model is None' except Exception, e: luci_log.debug_verbose('vSA0a: %s' % str(e)) - return (False, {'errors': [ 'The cluster model is missing from the session object.' ]}) + return (False, {'errors': [ 'The cluster model is missing from the session object' ]}) try: doc = minidom.parseString(form_xml) @@ -665,7 +671,7 @@ raise except Exception, e: luci_log.debug_verbose('vSA1: error: %s' % str(e)) - return (False, {'errors': ['The resource data submitted for this service is not properly formed.']}) + return (False, {'errors': ['The resource data submitted for this service is not properly formed']}) form_hash = {} form_hash['toplevel'] = {'form': None, 'kids': [] } @@ -711,11 +717,11 @@ dummy_form['resourceName'] = dummy_form['ip_address'] except Exception, e: luci_log.debug_verbose('vSA3a: type is ip but no addr: %s' % str(e)) - return (False, {'errors': [ 'No IP address was given.' ]}) + return (False, {'errors': [ 'No IP address was given' ]}) try: if dummy_form.has_key('immutable'): - newRes = getResource(model, dummy_form['resourceName']) + newRes = model.getResourceByName(dummy_form['resourceName']) resObj = RefObject(newRes) resObj.setRef(newRes.getName()) else: @@ -754,7 +760,7 @@ service_name = request.form['svc_name'].strip() except Exception, e: luci_log.debug_verbose('vSA5: no service name: %s' % str(e)) - return (False, {'errors': [ 'No service name was given.' ]}) + return (False, {'errors': [ 'No service name was given' ]}) autostart = "1" try: @@ -785,14 +791,14 @@ try: if request.form['action'] == 'edit': if cur_service is None: - return (False, {'errors': [ 'The service %s could not be found for editing.' % service_name ]}) + return (False, {'errors': [ 'The service %s could not be found for editing' % service_name ]}) model.deleteService(service_name) elif request.form['action'] == 'add': if cur_service is not None: - return (False, {'errors': [ 'A service with the name %s already exists.' % service_name ]}) + return (False, {'errors': [ 'A service with the name %s already exists' % service_name ]}) else: luci_log.debug_verbose('vSA4a: unknown action %s' % request.form['action']) - return (False, {'errors': [ 'An unknown action was specified.' ]}) + return (False, {'errors': [ 'An unknown action was specified' ]}) except Exception, e: luci_log.debug_verbose('vSA5: no action type: %s' % str(e)) @@ -835,7 +841,7 @@ except Exception, e: luci_log.debug_verbose('vAS6a: exportModelAsString : %s' \ % str(e)) - return (False, {'errors': [ 'An error occurred while adding this service.' ]}) + return (False, {'errors': [ 'An error occurred while adding this service' ]}) rc = getRicciAgent(self, clustername) if not rc: @@ -851,7 +857,7 @@ batch_number, result = rq.setClusterConf(rc, str(conf)) if batch_number is None or result is None: luci_log.debug_verbose('vAS8: missing batch_number or result') - raise Exception, 'unable to save the new cluster configuration.' + raise Exception, 'unable to save the new cluster configuration' except Exception, e: luci_log.debug_verbose('vAS9: %s' % str(e)) return 'An error occurred while propagating the new cluster.conf: %s' % str(e) @@ -875,7 +881,7 @@ raise KeyError, 'type is blank' except Exception, e: luci_log.debug_verbose('VRA0: type is blank') - return (False, {'errors': ['No resource type was given.']}) + return (False, {'errors': ['No resource type was given']}) try: model = request.SESSION.get('model') @@ -912,7 +918,7 @@ try: gulm_ptr = model.getGULMPtr() if gulm_ptr: - return (False, {'errors': ['Multicast cannot be used with GULM locking.']}) + return (False, {'errors': ['Multicast cannot be used with GULM locking']}) except: pass @@ -946,7 +952,7 @@ addr_str = None if (addr_str is None and mcast_manual != True) or (mcast_manual == True and addr_str == model.getMcastAddr()): - errors.append('No multicast configuration changes were made.') + errors.append('No multicast configuration changes were made') return (False, {'errors': errors}) try: @@ -1044,7 +1050,7 @@ if num_heuristics < 1: raise ValueError, form['num_heuristics'] except KeyError, e: - errors.append('No number of heuristics was given.') + errors.append('No number of heuristics was given') except ValueError, e: errors.append('An invalid number of heuristics was given: %s' % str(e)) @@ -1135,20 +1141,20 @@ if not cluster_name: raise KeyError('cluname') except KeyError, e: - errors.append('No cluster name was given.') + errors.append('No cluster name was given') if len(cluster_name) > 15: - errors.append('A cluster\'s name must be less than 16 characters long.') + errors.append('A cluster\'s name must be less than 16 characters long') try: version_num = int(form['cfgver']) if version_num < old_ver: - raise ValueError, 'configuration version number must be %d or greater.' % old_ver + raise ValueError, 'configuration version number must be %d or greater' % old_ver if version_num != old_ver: # we'll increment the cluster version before propagating it. version_num -= 1 except KeyError, e: - errors.append('No cluster configuration version was given.') + errors.append('No cluster configuration version was given') except ValueError, e: errors.append('An invalid configuration version was given: %s' % str(e)) @@ -1159,7 +1165,7 @@ cp.setConfigVersion(str(version_num)) except Exception, e: luci_log.debug_verbose('unable to update general properties: %s' % str(e)) - errors.append('Unable to update the cluster configuration.') + errors.append('Unable to update the cluster configuration') try: cluster_version = form['cluster_version'].strip() @@ -1246,23 +1252,23 @@ errors = list() if model.getGULMPtr() is not None: - return (False, {'errors': [ 'GULM clusters do not support fenced.' ]}) + return (False, {'errors': [ 'GULM clusters do not support fenced' ]}) try: post_fail_delay = int(form['post_fail_delay']) if post_fail_delay < 0: - raise ValueError('post fail delay values must be 0 or greater.') + raise ValueError('post fail delay values must be 0 or greater') except KeyError, e: - errors.append('No post fail delay was given.') + errors.append('No post fail delay was given') except ValueError, e: errors.append('Invalid post fail delay: %s' % str(e)) try: post_join_delay = int(form['post_join_delay']) if post_join_delay < 0: - raise ValueError('post join delay values must be 0 or greater.') + raise ValueError('post join delay values must be 0 or greater') except KeyError, e: - errors.append('No post join delay was given.') + errors.append('No post join delay was given') except ValueError, e: errors.append('Invalid post join delay: %s' % str(e)) @@ -1284,13 +1290,13 @@ old_pf_delay = fd.getPostFailDelay() if post_join_delay == old_pj_delay and post_fail_delay == old_pf_delay: - errors.append('No fence daemon properties were changed.') + errors.append('No fence daemon properties were changed') else: fd.setPostJoinDelay(str(post_join_delay)) fd.setPostFailDelay(str(post_fail_delay)) except Exception, e: luci_log.debug_verbose('Unable to update fence daemon properties: %s' % str(e)) - errors.append('An error occurred while attempting to update fence daemon properties.') + errors.append('An error occurred while attempting to update fence daemon properties') if len(errors) > 0: return (False, {'errors': errors }) @@ -1300,7 +1306,7 @@ def validateGULMConfig(model, form): gulm_ptr = model.getGULMPtr() if not gulm_ptr: - return (False, {'errors': [ 'This cluster appears not to be using GULM locking.' ]}) + return (False, {'errors': [ 'This cluster appears not to be using GULM locking' ]}) node_list = map(lambda x: x.getName(), gulm_ptr.getChildren()) for i in map(lambda x: x.getName(), model.getNodes()): @@ -1327,7 +1333,7 @@ num_ls = len(gulm_lockservers) if not num_ls in (1, 3, 5): - return (False, {'errors': [ 'You must have exactly 1, 3, or 5 GULM lock servers. You submitted %d lock servers.' % num_ls ]}) + return (False, {'errors': [ 'You must have exactly 1, 3, or 5 GULM lock servers. You submitted %d lock servers' % num_ls ]}) model.GULM_ptr.children = gulm_lockservers return (True, {}) @@ -1341,123 +1347,110 @@ } def validateConfigCluster(self, request): - errors = list() - messages = list() - rc = None + errors = list() + messages = list() + rc = None - try: - model = request.SESSION.get('model') - if not model: - raise Exception, 'model is none' - except Exception, e: - model = None - try: - cluname = request.form['clustername'] - except: - try: - cluname = request['clustername'] - except: - luci_log.debug_verbose('VCC0a: no model, no cluster name') - return (False, {'errors': ['No cluster model was found.']}) + try: + model = LuciExtractCluModel(self, request) + except Exception, e: + luci_log.debug_verbose('VCC0a: no model, no cluster name') + return (False, {'errors': ['No cluster model was found']}) - try: - model = getModelForCluster(self, cluname) - except: - model = None + try: + if not request.form.has_key('configtype'): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VCC2: no configtype') + raise Exception, 'no config type' + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VCC2a: %r' % e) + return (False, {'errors': [ 'No configuration type was submitted' ]}) - if model is None: - luci_log.debug_verbose('VCC0: unable to get model from session') - return (False, {'errors': ['No cluster model was found.']}) - try: - if not 'configtype' in request.form: - luci_log.debug_verbose('VCC2: no configtype') - raise Exception, 'no config type' - except Exception, e: - luci_log.debug_verbose('VCC2a: %s' % str(e)) - return (False, {'errors': ['No configuration type was submitted.']}) + if not configFormValidators.has_key(request.form['configtype']): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VCC3: invalid config type: %s' \ + % request.form['configtype']) + return (False, { 'errors': [ 'An invalid configuration type was submitted' ]}) - if not request.form['configtype'] in configFormValidators: - luci_log.debug_verbose('VCC3: invalid config type: %s' % request.form['configtype']) - return (False, {'errors': ['An invalid configuration type was submitted.']}) + try: + cp = model.getClusterPtr() + except: + luci_log.debug_verbose('VCC3a: getClusterPtr failed') + return (False, {'errors': ['No cluster model was found']}) - try: - cp = model.getClusterPtr() - except: - luci_log.debug_verbose('VCC3a: getClusterPtr failed') - return (False, {'errors': ['No cluster model was found.']}) + config_validator = configFormValidators[request.form['configtype']] + ret = config_validator(model, request.form) - config_validator = configFormValidators[request.form['configtype']] - ret = config_validator(model, request.form) + retcode = ret[0] + if 'errors' in ret[1]: + errors.extend(ret[1]['errors']) - retcode = ret[0] - if 'errors' in ret[1]: - errors.extend(ret[1]['errors']) + if 'messages' in ret[1]: + messages.extend(ret[1]['messages']) - if 'messages' in ret[1]: - messages.extend(ret[1]['messages']) + if retcode is True: + try: + config_ver = int(cp.getConfigVersion()) + 1 + # always increment the configuration version + cp.setConfigVersion(str(config_ver)) + model.setModified(True) + conf_str = model.exportModelAsString() + if not conf_str: + raise Exception, 'conf_str is none' + except Exception, e: + luci_log.debug_verbose('VCC4: export model as string failed: %s' \ + % str(e)) + errors.append('Unable to store the new cluster configuration') - if retcode == True: - try: - config_ver = int(cp.getConfigVersion()) + 1 - # always increment the configuration version - cp.setConfigVersion(str(config_ver)) - model.setModified(True) - conf_str = model.exportModelAsString() - if not conf_str: - raise Exception, 'conf_str is none' - except Exception, e: - luci_log.debug_verbose('VCC4: export model as string failed: %s' \ - % str(e)) - errors.append('Unable to store the new cluster configuration') + try: + clustername = model.getClusterName() + if not clustername: + raise Exception, 'cluster name from model.getClusterName() is blank' + except Exception, e: + luci_log.debug_verbose('VCC5: error: getClusterName: %r' % e) + errors.append('Unable to determine cluster name from model') - try: - clustername = model.getClusterName() - if not clustername: - raise Exception, 'cluster name from model.getClusterName() is blank' - except Exception, e: - luci_log.debug_verbose('VCC5: error: getClusterName: %s' % str(e)) - errors.append('Unable to determine cluster name from model') + if len(errors) > 0: + return (retcode, {'errors': errors, 'messages': messages}) - if len(errors) > 0: - return (retcode, {'errors': errors, 'messages': messages}) + if not rc: + rc = getRicciAgent(self, clustername) + if not rc: + luci_log.debug_verbose('VCC6: unable to find a ricci agent for the %s cluster' % clustername) + errors.append('Unable to contact a ricci agent for cluster %s' \ + % clustername) - if not rc: - rc = getRicciAgent(self, clustername) - if not rc: - luci_log.debug_verbose('VCC6: unable to find a ricci agent for the %s cluster' % clustername) - errors.append('Unable to contact a ricci agent for cluster %s' \ - % clustername) - - if rc: - batch_id, result = rq.setClusterConf(rc, str(conf_str)) - if batch_id is None or result is None: - luci_log.debug_verbose('VCC7: setCluserConf: batchid or result is None') - errors.append('Unable to propagate the new cluster configuration for %s' \ - % clustername) - else: - try: - set_node_flag(self, clustername, rc.hostname(), batch_id, CLUSTER_CONFIG, 'Updating cluster configuration') - except: - pass + if rc: + batch_id, result = rq.setClusterConf(rc, str(conf_str)) + if batch_id is None or result is None: + luci_log.debug_verbose('VCC7: setCluserConf: batchid or result is None') + errors.append('Unable to propagate the new cluster configuration for %s' % clustername) + else: + try: + set_node_flag(self, clustername, rc.hostname(), batch_id, CLUSTER_CONFIG, 'Updating cluster configuration') + except: + pass - if len(errors) < 1: - messages.append('The cluster properties have been updated.') - else: - return (retcode, {'errors': errors, 'messages': messages}) + if len(errors) < 1: + messages.append('The cluster properties have been updated') + else: + return (retcode, {'errors': errors, 'messages': messages}) - response = request.RESPONSE - response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ - % (request['URL'], CLUSTER_CONFIG, clustername)) + response = request.RESPONSE + response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ + % (request['URL'], CLUSTER_CONFIG, clustername)) def LuciExtractCluName(self, request): cluname = None + try: - cluname = request.form['clustername'] - except Exception, e: - try: - cluname = request['clustername'] - except Exception, e: - cluname = None + if request.form.has_key('clustername'): + cluname = request.form['clustername'].strip() + if not cluname and request.has_key('clustername'): + cluname = request['clustername'].strip() + except Exception, e: + pass if not cluname: luci_log.debug_verbose('LECN0: no cluster name') @@ -1482,49 +1475,38 @@ if not model: luci_log.debug_verbose('LECM1: empty model') model = None - except Exception, e: + except Exception, e: luci_log.debug_verbose('LECM2: no model: %s' % str(e)) model = None return model -def LuciFenceAddReq(self, request): +def validateFenceAdd(self, request): + errors = list() + model = LuciExtractCluModel(self, request) + if not model: luci_log.debug_verbose('VFE0: no model') - return (False, [ 'No cluster model was found.' ]) - - ret = validateFenceAdd(request, model) - if ret[0] is not True: - return (False, { 'errors': ret[1] }) - -def validateFenceAdd(request, model): - errors = list() - messages = list() + return (False, [ 'No cluster model was found' ]) if not request.form: luci_log.debug_verbose('VFE: no form was submitted') - return (False, [ 'No form was submitted ']) + return (False, [ 'No form was submitted' ]) - ret_code, ret_msgs = validateNewFenceDevice(form, model) - if error_code != FD_VAL_SUCCESS: - if ret_msgs: - errors.extend(ret_msgs) + ret_code, ret_obj = validateNewFenceDevice(request.form, model) + if ret_code != FD_VAL_SUCCESS: + errors.extend(ret_obj) return (False, errors) - if ret_msgs: - messages.extend(ret_msgs) - return (True, ret_msgs) - - try: - conf_str = model.exportModelAsString() - if not conf_str: - raise Exception, 'conf_str is none' - except Exception, e: - luci_log.debug_verbose('VFE: export model as string failed: %s' \ - % str(e)) - errors.append('Unable to store the new cluster configuration') - response.redirect('%s?pagetype=%s&clustername=%s&fencename=%s&busyfirst=true' % (request['URL'], FENCEDEV, clustername, retobj)) + try: + conf_str = str(model.exportModelAsString()) + if not conf_str: + raise Exception, 'conf_str is none' + except Exception, e: + luci_log.debug_verbose('VFE: export model as string failed: %r' % e) + errors.append('Unable to store the new cluster configuration') + request.RESPONSE.redirect('%s?pagetype=%s&clustername=%s&fencename=%s&busyfirst=true' % (request['URL'], FENCEDEV, model.getClusterName(), ret_obj.getAttribute('name'))) def validateFenceEdit(self, request): errors = list() @@ -1544,7 +1526,7 @@ cluname = request['clustername'] except: luci_log.debug_verbose('VFE: no model, no cluster name') - return (False, {'errors': ['No cluster model was found.']}) + return (False, {'errors': ['No cluster model was found']}) try: model = getModelForCluster(self, cluname) @@ -1553,7 +1535,7 @@ if model is None: luci_log.debug_verbose('VFE: unable to get model from session') - return (False, {'errors': ['No cluster model was found.']}) + return (False, {'errors': ['No cluster model was found']}) form = None try: @@ -1626,13 +1608,13 @@ raise KeyError, 'form_xml must not be blank' except Exception, e: luci_log.debug_verbose('vNFC0: no form_xml: %s' % str(e)) - return (False, {'errors': ['No fence data was supplied.']}) + return (False, {'errors': ['No fence data was supplied']}) try: fence_level = int(request.form['fence_level'].strip()) except Exception, e: luci_log.debug_verbose('vNFC1: no fence level: %s' % str(e)) - return (False, {'errors': ['No fence level was supplied.']}) + return (False, {'errors': ['No fence level was supplied']}) try: nodename = request['nodename'] @@ -1640,7 +1622,7 @@ raise Exception, 'nodename is blank' except Exception, e: luci_log.debug_verbose('vNFC2: no nodename: %s' % str(e)) - return (False, {'errors': ['No node name was given.']}) + return (False, {'errors': ['No node name was given']}) try: clustername = request['clustername'] @@ -1648,7 +1630,7 @@ raise Exception, 'clustername is blank' except Exception, e: luci_log.debug_verbose('vNFC3: no clustername: %s' % str(e)) - return (False, {'errors': ['No cluster name was given.']}) + return (False, {'errors': ['No cluster name was given']}) try: model = request.SESSION.get('model') @@ -1663,19 +1645,19 @@ if model is None: luci_log.debug_verbose('vNFC4: unable to get model for cluster %s' % clustername) - return (False, {'errors': ['No cluster model was found.']}) + return (False, {'errors': ['No cluster model was found']}) try: doc = minidom.parseString(form_xml) except Exception, e: luci_log.debug_verbose('vNFC5: error: %s' % str(e)) - return (False, {'errors': ['The fence data submitted is not properly formed.']}) + return (False, {'errors': ['The fence data submitted is not properly formed']}) try: node = model.retrieveNodeByName(nodename) except GeneralError, e: luci_log.debug_verbose('vNFC6: unable to find node name %s in current node list' % (str(nodename), str(e))) - return (False, {'errors': ['Unable to find the cluster node %s in the node list.' % str(nodename) ]}) + return (False, {'errors': ['Unable to find the cluster node %s in the node list' % str(nodename) ]}) fence_level_num = int(fence_level) levels = node.getFenceLevels() @@ -1706,7 +1688,7 @@ luci_log.debug_verbose('vNFC6a: %s: %s' % (method_id, str(e))) return (False, {'errors': ['An error occurred while deleting fence method %s' % method_id ]}) else: - return (True, {'messages': ['No changes were made.'] }) + return (True, {'messages': ['No changes were made'] }) form_hash = {} for i in forms: @@ -1742,14 +1724,14 @@ parent = dummy_form['parent_fencedev'] except: luci_log.debug_verbose('vNFC9: no parent for instance') - return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]}) + return (False, {'errors': [ 'Unable to determine what device the current instance uses' ]}) try: form_hash[parent][1].append(dummy_form) del dummy_form['fence_instance'] except Exception, e: luci_log.debug_verbose('vNFC10: no parent for instance') - return (False, {'errors': [ 'Unable to determine what device the current instance uses.' ]}) + return (False, {'errors': [ 'Unable to determine what device the current instance uses' ]}) else: form_hash[form_id] = (dummy_form, list()) @@ -1779,7 +1761,7 @@ if not fencedev_name.strip(): raise Exception, 'no fence name' except Exception, e: - errors.append('You must provide a unique name for all fence devices.') + errors.append('You must provide a unique name for all fence devices') continue if fence_type is None: @@ -1870,7 +1852,7 @@ except Exception, e: luci_log.debug_verbose('vNFC17: exportModelAsString failed: %s' \ % str(e)) - return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]}) + return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration' ]}) rc = getRicciAgent(self, clustername) if not rc: @@ -1881,7 +1863,7 @@ batch_number, result = rq.setClusterConf(rc, conf) if batch_number is None or result is None: luci_log.debug_verbose('vNFC19: missing batch and/or result') - return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]}) + return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration' ]}) try: set_node_flag(self, clustername, ragent, str(batch_number), FENCEDEV_NODE_CONFIG, "Updating fence configuration for node \'%s\'" % nodename) @@ -1909,7 +1891,7 @@ cluname = request['clustername'] except: luci_log.debug_verbose('VFE: no model, no cluster name') - return (False, {'errors': ['No cluster model was found.']}) + return (False, {'errors': ['No cluster model was found']}) try: model = getModelForCluster(self, cluname) @@ -1918,11 +1900,11 @@ if model is None: luci_log.debug_verbose('VFE: unable to get model from session') - return (False, {'errors': ['No cluster model was found.']}) + return (False, {'errors': ['No cluster model was found']}) form = None try: - response = request.response + response = request.RESPONSE form = request.form if not form: form = None @@ -2110,7 +2092,7 @@ raise Exception, 'no model' except Exception, e: luci_log.debug_verbose('validateFdom0: no model: %s' % str(e)) - return (False, {'errors': [ 'Unable to retrieve cluster information.' ]}) + return (False, {'errors': [ 'Unable to retrieve cluster information' ]}) prioritized = False try: @@ -2138,14 +2120,14 @@ clustername = None if not clustername: - errors.append('Unable to determine this cluster\'s name.') + errors.append('Unable to determine this cluster\'s name') try: name = request.form['name'].strip() if not name: raise Exception, 'blank' except Exception, e: - errors.append('No name was given for this failover domain.') + errors.append('No name was given for this failover domain') luci_log.debug_verbose('validateFdom0: %s' % str(e)) oldname = None @@ -2158,14 +2140,14 @@ if oldname is None or oldname != name: if model.getFailoverDomainByName(name) is not None: - errors.append('A failover domain named "%s" already exists.' % name) + errors.append('A failover domain named "%s" already exists' % name) fdom = None if oldname is not None: fdom = model.getFailoverDomainByName(oldname) if fdom is None: luci_log.debug_verbose('validateFdom1: No fdom named %s exists' % oldname) - errors.append('No failover domain named "%s" exists.' % oldname) + errors.append('No failover domain named "%s" exists' % oldname) else: fdom.addAttribute('name', name) fdom.children = list() @@ -2211,7 +2193,7 @@ conf = str(model.exportModelAsString()) except Exception, e: luci_log.debug_verbose('validateFdom2: %s' % str(e)) - errors.append('Unable to update the cluster configuration.') + errors.append('Unable to update the cluster configuration') if len(errors) > 0: return (False, {'errors': errors }) @@ -2225,7 +2207,7 @@ batch_number, result = rq.setClusterConf(rc, conf) if batch_number is None or result is None: luci_log.debug_verbose('validateFdom4: missing batch and/or result') - return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration.' ]}) + return (False, {'errors': [ 'An error occurred while constructing the new cluster configuration' ]}) try: if oldname: @@ -2250,7 +2232,7 @@ raise Exception, 'blank' except Exception, e: luci_log.debug_verbose('validateVM0: no vm name: %s' % str(e)) - errors.append('No virtual machine name was given.') + errors.append('No virtual machine name was given') try: vm_path = request.form['vmpath'].strip() @@ -2258,7 +2240,7 @@ raise Exception, 'blank' except Exception, e: luci_log.debug_verbose('validateVM1: no vm path: %s' % str(e)) - errors.append('No path to the virtual machine configuration file was given.') + errors.append('No path to the virtual machine configuration file was given') autostart = 1 try: @@ -2318,7 +2300,7 @@ rmptr.removeChild(xvm) delete_vm = True except: - return (False, {'errors': ['No virtual machine service named "%s" exists.' % old_name ]}) + return (False, {'errors': ['No virtual machine service named "%s" exists' % old_name ]}) else: if isNew is True: xvm = Vm() @@ -2332,7 +2314,7 @@ if not xvm: raise Exception, 'not found' except: - return (False, {'errors': ['No virtual machine service named "%s" exists.' % old_name ]}) + return (False, {'errors': ['No virtual machine service named "%s" exists' % old_name ]}) xvm.addAttribute('name', vm_name) xvm.addAttribute('path', vm_path) @@ -2369,7 +2351,7 @@ raise Exception, 'cluster name from model.getClusterName() is blank' except Exception, e: luci_log.debug_verbose('validateVM3: %s' % str(e)) - errors.append('Unable to determine the cluster name.') + errors.append('Unable to determine the cluster name') if len(errors) > 0: return (False, {'errors': errors }) @@ -2377,12 +2359,12 @@ rc = getRicciAgent(self, clustername) if not rc: luci_log.debug_verbose('validateVM4: no ricci for %s' % clustername) - return (False, {'errors': ['Unable to contact a ricci agent for this cluster.']}) + return (False, {'errors': ['Unable to contact a ricci agent for this cluster']}) batch_number, result = rq.setClusterConf(rc, stringbuf) if batch_number is None or result is None: luci_log.debug_verbose('validateVM5: missing batch and/or result') - return (False, {'errors': [ 'Error creating virtual machine %s.' % vm_name ]}) + return (False, {'errors': [ 'Error creating virtual machine %s' % vm_name ]}) try: if delete_vm is True: @@ -2542,13 +2524,6 @@ return dummynode -def getnodes(self, model): - try: - return map(lambda x: str(x.getName()), model.getNodes()) - except Exception, e: - luci_log.debug_verbose('getnodes0: %s' % str(e)) - return [] - def createCluConfigTree(self, request, model): dummynode = {} @@ -2973,17 +2948,6 @@ return dummynode -def getClusterName(self, model): - return model.getClusterName() - -def getClusterAlias(self, model): - if not model: - return '' - alias = model.getClusterAlias() - if alias is None: - return model.getClusterName() - return alias - def getClusterURL(self, request, model): try: clustername = request.clustername @@ -2996,59 +2960,10 @@ raise Exception, 'cluster name from model is blank' except: luci_log.debug_verbose('GCURL0: unable to get cluster name') - return '.' + return '' return '/luci/cluster/index_html?pagetype=7&clustername=%s' % clustername -def getTabs(self, req): - ###XXX Make this method return only tabs current user can use - portaltabs = list() - if not userAuthenticated(self): - return portaltabs - - selectedtab = "homebase" - try: - baseurl = req['URL'] - if baseurl.find("cluster") > (-1): - selectedtab = "cluster" - elif baseurl.find("storage") > (-1): - selectedtab = "storage" - else: - selectedtab = "homebase" - except KeyError, e: - selectedtab = None - - htab = { 'Title':"homebase", - 'Description':"Home base for this luci server", - 'Taburl':"/luci/homebase"} - if selectedtab == "homebase": - htab['isSelected'] = True - else: - htab['isSelected'] = False - - - ctab = { 'Title':"cluster", - 'Description':"Cluster configuration page", - 'Taburl':"/luci/cluster/index_html?pagetype=3"} - if selectedtab == "cluster": - ctab['isSelected'] = True - else: - ctab['isSelected'] = False - - stab = { 'Title':"storage", - 'Description':"Storage configuration page", - 'Taburl':"/luci/storage"} - if selectedtab == "storage": - stab['isSelected'] = True - else: - stab['isSelected'] = False - - portaltabs.append(htab) - portaltabs.append(ctab) - portaltabs.append(stab) - - return portaltabs - def getRicciAgentForCluster(self, req): clustername = None try: @@ -3380,7 +3295,7 @@ raise Exception, 'cluname is blank' except: luci_log.debug_verbose('CTP0: no model/no cluster name') - return 'Unable to determine the cluster name.' + return 'Unable to determine the cluster name' try: model = getModelForCluster(self, cluname) except Exception, e: @@ -3402,7 +3317,7 @@ if ret is not None: redirect_page = ret else: - return 'An unknown cluster task was requested.' + return 'An unknown cluster task was requested' response = request.RESPONSE response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ @@ -3420,7 +3335,7 @@ return None objname = '%s____flag' % nodename_resolved - fnpresent = noNodeFlagsPresent(self, nodefolder, objname, nodename_resolved) + fnpresent = noNodeStatussPresent(self, nodefolder, objname, nodename_resolved) if fnpresent is None: luci_log.debug('NL1: An error occurred while checking flags for %s' \ @@ -3609,12 +3524,12 @@ rc = None try: snode = getStorageNode(self, node[1].getId()) - setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(snode, CLUSTER_NODE_NEED_AUTH) except: pass try: - setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH) + setNodeStatus(node[1], CLUSTER_NODE_NEED_AUTH) except: pass @@ -3682,13 +3597,13 @@ if not rc2.authed(): try: - setNodeFlag(node[1], CLUSTER_NODE_NEED_AUTH) + setNodeStatus(node[1], CLUSTER_NODE_NEED_AUTH) except: pass try: snode = getStorageNode(self, node[0]) - setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(snode, CLUSTER_NODE_NEED_AUTH) except: pass @@ -3784,7 +3699,7 @@ clustername = request.form['clustername'] except: luci_log.debug('NTP0: missing cluster name') - return (False, {'errors': [ 'No cluster name was given.' ]}) + return (False, {'errors': [ 'No cluster name was given' ]}) try: nodename = request['nodename'] @@ -3793,7 +3708,7 @@ nodename = request.form['nodename'] except: luci_log.debug('NTP1: missing node name') - return (False, {'errors': [ 'No node name was given.' ]}) + return (False, {'errors': [ 'No node name was given' ]}) try: task = request['task'] @@ -3802,7 +3717,7 @@ task = request.form['task'] except: luci_log.debug('NTP2: missing task') - return (False, {'errors': [ 'No node task was given.' ]}) + return (False, {'errors': [ 'No node task was given' ]}) nodename_resolved = resolve_nodename(self, clustername, nodename) @@ -3817,17 +3732,17 @@ except RicciError, e: luci_log.debug('NTP3: ricci error from %s: %s' \ % (nodename_resolved, str(e))) - return (False, {'errors': [ 'Unable to connect to the ricci agent on %s.' % nodename_resolved ]}) + return (False, {'errors': [ 'Unable to connect to the ricci agent on %s' % nodename_resolved ]}) except: luci_log.debug('NTP4: ricci error from %s: %s' \ % (nodename_resolved, str(e))) - return (False, {'errors': [ 'Unable to connect to the ricci agent on %s.' % nodename_resolved ]}) + return (False, {'errors': [ 'Unable to connect to the ricci agent on %s' % nodename_resolved ]}) cluinfo = rc.cluster_info() if not cluinfo[0] and not cluinfo[1]: luci_log.debug('NTP5: node %s not in a cluster (expected %s)' \ % (nodename_resolved, clustername)) - return (False, {'errors': [ 'Node "%s" reports it is not in a cluster.' % nodename_resolved ]}) + return (False, {'errors': [ 'Node "%s" reports it is not in a cluster' % nodename_resolved ]}) cname = clustername.lower() if cname != cluinfo[0].lower() and cname != cluinfo[1].lower(): @@ -3838,14 +3753,14 @@ rc = None try: snode = getStorageNode(self, nodename) - setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(snode, CLUSTER_NODE_NEED_AUTH) except: # we'll hit it again, and try again then pass try: cnode = getClusterNode(self, nodename, clustername) - setNodeFlag(cnode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(cnode, CLUSTER_NODE_NEED_AUTH) except: # we'll hit it again, and try again then pass @@ -3853,7 +3768,7 @@ if rc is None: luci_log.debug('NTP7: node %s is not authenticated' \ % nodename_resolved) - return (False, {'errors': [ 'Node "%s" is not authenticated.' % nodename_resolved ]}) + return (False, {'errors': [ 'Node "%s" is not authenticated' % nodename_resolved ]}) if task == NODE_LEAVE_CLUSTER: if nodeLeave(self, rc, clustername, nodename_resolved) is None: @@ -3874,7 +3789,7 @@ elif task == NODE_REBOOT: if forceNodeReboot(self, rc, clustername, nodename_resolved) is None: luci_log.debug_verbose('NTP10: nodeReboot failed') - return (False, {'errors': [ 'Node "%s" failed to reboot.' \ + return (False, {'errors': [ 'Node "%s" failed to reboot' \ % nodename_resolved ]}) response = request.RESPONSE @@ -3883,7 +3798,7 @@ elif task == NODE_FENCE: if forceNodeFence(self, clustername, nodename, nodename_resolved) is None: luci_log.debug_verbose('NTP11: nodeFencefailed') - return (False, {'errors': [ 'Fencing of node "%s" failed.' \ + return (False, {'errors': [ 'Fencing of node "%s" failed' \ % nodename_resolved]}) response = request.RESPONSE @@ -3892,7 +3807,7 @@ elif task == NODE_DELETE: if nodeDelete(self, rc, model, clustername, nodename, nodename_resolved) is None: luci_log.debug_verbose('NTP12: nodeDelete failed') - return (False, {'errors': [ 'Deletion of node "%s" from cluster "%s" failed.' % (nodename_resolved, clustername) ]}) + return (False, {'errors': [ 'Deletion of node "%s" from cluster "%s" failed' % (nodename_resolved, clustername) ]}) response = request.RESPONSE response.redirect('%s?pagetype=%s&clustername=%s&busyfirst=true' \ @@ -3941,18 +3856,18 @@ if not rc.authed(): try: snode = getStorageNode(self, nodename) - setNodeFlag(snode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(snode, CLUSTER_NODE_NEED_AUTH) except: pass if clustername: try: cnode = getClusterNode(self, nodename, clustername) - setNodeFlag(cnode, CLUSTER_NODE_NEED_AUTH) + setNodeStatus(cnode, CLUSTER_NODE_NEED_AUTH) except: pass - return 'Luci is not authenticated to node %s. Please reauthenticate first.' % nodename + return 'Luci is not authenticated to node %s. Please reauthenticate first' % nodename return rq.getNodeLogs(rc) @@ -4130,7 +4045,7 @@ node_report['statusmessage'] = '%s%s' % (RICCI_CONNECT_FAILURE_MSG, PRE_JOIN) else: node_report['statusindex'] = 0 - node_report['statusmessage'] = '%s Install is in an unknown state.' % RICCI_CONNECT_FAILURE_MSG + node_report['statusmessage'] = '%s Install is in an unknown state' % RICCI_CONNECT_FAILURE_MSG nodereports.append(node_report) continue elif creation_status == -(INSTALL_TASK): @@ -4307,7 +4222,7 @@ if name is None: luci_log.debug_verbose('delService1: no service name') - return (False, {'errors': [ '%s: no service name was provided.' % errstr ]}) + return (False, {'errors': [ '%s: no service name was provided' % errstr ]}) clustername = None try: @@ -4320,12 +4235,12 @@ if clustername is None: luci_log.debug_verbose('delService2: no cluster name for %s' % name) - return (False, {'errors': [ '%s: no cluster name was provided.' % errstr ]}) + return (False, {'errors': [ '%s: no cluster name was provided' % errstr ]}) rc = getRicciAgent(self, clustername) if not rc: luci_log.debug_verbose('delService3: unable to get ricci agent for cluster %s' % clustername) - return (False, {'errors': [ '%s: unable to find a Ricci agent for this cluster.' % errstr ]}) + return (False, {'errors': [ '%s: unable to find a Ricci agent for this cluster' % errstr ]}) try: ragent = rc.hostname() @@ -4333,7 +4248,7 @@ raise Exception, 'unable to determine the hostname of the ricci agent' except Exception, e: luci_log.debug_verbose('delService4: %s: %s' % (errstr, str(e))) - return (False, {'errors': [ '%s: unable to find a Ricci agent for this cluster.' % errstr ]}) + return (False, {'errors': [ '%s: unable to find a Ricci agent for this cluster' % errstr ]}) try: model.deleteService(name) @@ -4385,7 +4300,7 @@ if name is None: luci_log.debug_verbose('delResource1: no resource name') - return '%s: no resource name was provided.' % errstr + return '%s: no resource name was provided' % errstr clustername = None try: @@ -4398,7 +4313,7 @@ if clustername is None: luci_log.debug_verbose('delResource2: no cluster name for %s' % name) - return '%s: could not determine the cluster name.' % errstr + return '%s: could not determine the cluster name' % errstr try: ragent = rc.hostname() @@ -4406,7 +4321,7 @@ raise Exception, 'unable to determine the hostname of the ricci agent' except Exception, e: luci_log.debug_verbose('delResource3: %s: %s' % (errstr, str(e))) - return '%s: could not determine the ricci agent hostname.' % errstr + return '%s: could not determine the ricci agent hostname' % errstr resPtr = model.getResourcesPtr() resources = resPtr.getChildren() @@ -4420,7 +4335,7 @@ if not found: luci_log.debug_verbose('delResource4: cant find res %s' % name) - return '%s: the specified resource was not found.' % errstr + return '%s: the specified resource was not found' % errstr try: model.setModified(True) @@ -4482,7 +4397,7 @@ batch_number, result = rq.setClusterConf(rc, str(conf)) if batch_number is None or result is None: luci_log.debug_verbose('addResource5: missing batch_number or result') - raise Exception, 'unable to save the new cluster configuration.' + raise Exception, 'unable to save the new cluster configuration' except Exception, e: luci_log.debug_verbose('addResource6: %s' % str(e)) return 'An error occurred while propagating the new cluster.conf: %s' % str(e) @@ -4512,7 +4427,7 @@ request.SESSION.set('model', model) except Exception, e: luci_log.debug_verbose('Appending model to request failed: %r' % e) - return 'An error occurred while storing the cluster model.' + return 'An error occurred while storing the cluster model' def getModelBuilder(self, rc, isVirtualized): try: --- conga/luci/site/luci/Extensions/homebase_adapters.py 2007/05/04 19:10:24 1.50.2.2 +++ conga/luci/site/luci/Extensions/homebase_adapters.py 2007/05/14 18:00:14 1.50.2.3 @@ -2,10 +2,10 @@ STORAGE_FOLDER_PATH, CLUSTER_FOLDER_PATH from RicciQueries import getClusterConf -from LuciSyslog import LuciSyslog +from LuciSyslog import get_logger from HelperFunctions import resolveOSType -from LuciDB import delCluster, delNodeFlag, delSystem, getClusterNode, \ +from LuciDB import delCluster, clearNodeStatus, delSystem, getClusterNode, \ getClusters, getStorage, getStorageNode, \ havePermAddCluster, havePermAddUser, havePermDelUser, \ havePermEditPerms, havePermRemCluster, havePermRemStorage, \ @@ -13,7 +13,6 @@ from ricci_communicator import RicciCommunicator - # Homebase area page types HOMEBASE_ADD_USER = '1' HOMEBASE_ADD_SYSTEM = '2' @@ -24,50 +23,42 @@ HOMEBASE_ADD_CLUSTER_INITIAL = '7' HOMEBASE_AUTH = '8' -try: - luci_log = LuciSyslog() -except: - pass +luci_log = get_logger() def validateDelSystem(self, request): errors = list() messages = list() if '__SYSTEM' in request.form: - sysNames = request.form['__SYSTEM'] - for i in sysNames: - if i == '': + system_names = request.form['__SYSTEM'] + for i in system_names: + if not i: continue - dsResult = delSystem(self, i) - if dsResult: - errors.append(dsResult) + err_msg = delSystem(self, i) + if err_msg: + errors.append(err_msg) else: messages.append('Removed storage system "%s" successfully' % i) if '__CLUSTER' in request.form: - cluNames = request.form['__CLUSTER'] - for i in cluNames: - if i == '': + cluster_names = request.form['__CLUSTER'] + for i in cluster_names: + if not i: continue - dcResult = delCluster(self, i) - if dcResult: - errors.append(dcResult) + err_msg = delCluster(self, i) + if err_msg: + errors.append(err_msg) else: messages.append('Removed cluster "%s" successfully' % i) - if len(errors) > 0: - retCode = False - else: - retCode = True - - return (retCode, {'messages': messages, 'errors': errors }) + return (len(errors) < 1, { 'messages': messages, 'errors': errors }) def validateDelUser(self, request): errors = list() messages = list() - if not 'deluserId' in request.form: - return (False, {'errors': [ 'No User Id given' ] }) + if not request.form.has_key('deluserId'): + return (False, { 'errors': [ 'No User ID given' ] }) userId = request.form['deluserId'] @@ -75,61 +66,66 @@ user = self.portal_membership.getMemberById(userId) if not user: raise Exception, 'user %s does not exist' % userId - except: + except Exception, e: + luci_log.debug_verbose('VDU0: %s: %r' % (userId, e)) return (False, {'errors': [ 'No such user: "%s"' % userId ] }) for i in getClusters(self): try: - i[1].manage_delLocalRoles([userId]) - except: + i[1].manage_delLocalRoles([ userId ]) + except Exception, e: + luci_log.debug_verbose('VDU1: %s %s: %r' % (userId, i[0], e)) errors.append('Error deleting roles from cluster "%s" for user "%s"' % (i[0], userId)) for i in getStorage(self): try: - i[1].manage_delLocalRoles([userId]) - except: + i[1].manage_delLocalRoles([ userId ]) + except Exception, e: + luci_log.debug_verbose('VDU2: %s: %r' % (userId, i[0], e)) errors.append('Error deleting roles from storage system "%s" for user "%s"' % (i[0], userId)) try: - self.acl_users.userFolderDelUsers([userId]) - except: + self.acl_users.userFolderDelUsers([ userId ]) + except Exception, e: + luci_log.debug_verbose('VDU3: %s %r' % (userId, e)) errors.append('Unable to delete user "%s"' % userId) return (False, {'errors': errors }) messages.append('User "%s" has been deleted' % userId) - return (True, {'errors': errors, 'messages': messages }) + return (True, { 'errors': errors, 'messages': messages }) def validateAddUser(self, request): messages = list() - if not 'newUserName' in request.form: - return (False, { 'errors': ['No user name given'] }) - if not 'newPassword' in request.form: - return (False, { 'errors': ['No password given'] }) - if not 'newPasswordConfirm' in request.form: - return (False, {'errors': ['You didn\'t confirm the password'] }) + if not request.form.has_key('newUserName'): + return (False, { 'errors': [ 'No user name given' ] }) + if not request.form.has_key('newPassword'): + return (False, { 'errors': [ 'No password given' ] }) + if not request.form.has_key('newPasswordConfirm'): + return (False, { 'errors': [ 'You didn\'t confirm the password' ] }) - user = request.form['newUserName'] + user = request.form['newUserName'].strip() if self.portal_membership.getMemberById(user): - return (False, {'errors': ['The user "%s" already exists' % user ]}) + return (False, { 'errors': [ 'The user "%s" already exists' % user ]}) passwd = request.form['newPassword'] pwconfirm = request.form['newPasswordConfirm'] if passwd != pwconfirm: - return (False, {'errors': ['The passwords do not match']}) + return (False, { 'errors': [ 'The passwords given do not match' ]}) try: - self.portal_registration.addMember(user, passwd, properties = { 'username': user, 'password': passwd, 'confirm': passwd, 'roles': ['Member'], 'domains':[], 'email': '%s at example.com' % user }) - except: - return (False, {'errors': [ 'Unable to add new user "%s"' % user ] }) + self.portal_registration.addMember(user, passwd, properties = { 'username': user, 'password': passwd, 'confirm': passwd, 'roles': [ 'Member' ], 'domains': [], 'email': '%s@conga.example.com' % user }) + except Exception, e: + luci_log.debug_verbose('VAU0: %s: %r' % (user, e)) + return (False, { 'errors': [ 'Unable to add new user "%s"' % user ] }) if not self.portal_membership.getMemberById(user): - return (False, {'errors': [ 'Unable to add new user "%s"' % user ] }) + return (False, { 'errors': [ 'Unable to add new user "%s"' % user ] }) messages.append('Added new user "%s" successfully' % user) - return (True, {'messages': messages, 'params': { 'user': user }}) + return (True, { 'messages': messages, 'params': { 'user': user }}) def validateAddClusterInitial(self, request): errors = list() @@ -489,23 +485,14 @@ luci_log.debug_verbose('VAC1: no cluster os') errors.append('Unable to determine the version of cluster %s.' % cluster_name) - check_certs = False - try: - check_certs = 'check_certs' in request.form - except: - check_certs = False + check_certs = request.form.has_key('check_certs') + same_node_passwds = request.form.has_key('allSameCheckBox') try: pass_num = int(request.form['pass'].strip()) + 1 except: pass_num = 1 - same_node_passwds = False - try: - same_node_passwds = 'allSameCheckBox' in request.form - except: - same_node_passwds = False - add_cluster = { 'name': cluster_name, 'pass': pass_num, 'cluster_os': cluster_os, @@ -630,11 +617,7 @@ except: pass - check_certs = False - try: - check_certs = 'check_certs' in request.form - except: - check_certs = False + check_certs = request.form.has_key('check_certs') add_systems, incomplete, errors, messages = parseHostForm(request, check_certs) delete_keys = list() @@ -691,22 +674,21 @@ errors = list() username = None - if not request.form.has_key('userList'): - luci_log.debug_verbose('VP0: no user given') - errors.append('No user name was given.') - else: + if request.form.has_key('userList'): username = request.form['userList'].strip() + if not username: + return (False, { 'errors': [ 'No user name was given' ]}) + user_id = None - if username is not None: - try: - user = self.portal_membership.getMemberById(username) - if not user: - raise Exception, 'no user' - user_id = user.getUserId() - except Exception, e: - luci_log.debug_verbose('VP1: no user "%s": %s' % (username, str(e))) - errors.append('An invalid user "%s" was given.' % username) + try: + user = self.portal_membership.getMemberById(username) + if not user: + raise Exception, 'no user' + user_id = user.getUserId() + except Exception, e: + luci_log.debug_verbose('VP1: no user "%s": %r' % (username, e)) + errors.append('An invalid user "%s" was given' % username) if len(errors) > 0: return (False, { 'errors': errors }) @@ -724,7 +706,8 @@ else: i[1].manage_delLocalRoles([ user_id ]) messages.append('Removed permission for user "%s" for cluster "%s"' % (user_id, i[0])) - except: + except Exception, e: + luci_log.debug_verbose('VP2: %s %s: %r' % (user_id, i[0], e)) errors.append('Failed to remove permission for user "%s" for cluster "%s"' % (user_id, i[0])) else: for i in clusters: @@ -735,7 +718,8 @@ roles.append('View') i[1].manage_setLocalRoles(user_id, roles) messages.append('Added permission for user "%s" for cluster "%s"' % (user_id, i[0])) - except: + except Exception, e: + luci_log.debug_verbose('VP3: %s %s %r' % (user_id, i[0], e)) errors.append('Failed to add permission for user "%s" for cluster "%s"' % (user_id, i[0])) else: try: @@ -749,9 +733,11 @@ i[1].manage_delLocalRoles([ user_id ]) messages.append('Removed permission for user "%s" for cluster "%s"' % (user_id, i[0])) - except: + except Exception, e: + luci_log.debug_verbose('VP4: %s %s %r' % (user_id, i[0], e)) errors.append('Failed to remove permission for user "%s" for cluster "%s"' % (user_id, i[0])) + storage = self.restrictedTraverse('%s/systems/storage/objectItems' % PLONE_ROOT)('Folder') if not request.form.has_key('__SYSTEM'): for i in storage: @@ -807,11 +793,7 @@ except: pass - check_certs = False - try: - check_certs = 'check_certs' in request.form - except: - check_certs = False + check_certs = request.form.has_key('check_certs') system_list, incomplete, errors, messages = parseHostForm(request, check_certs) delete_keys = list() @@ -850,12 +832,12 @@ % cur_host) delete_keys.append(i) try: - delNodeFlag(self, getStorageNode(self, cur_host), CLUSTER_NODE_NEED_AUTH) + clearNodeStatus(self, getStorageNode(self, cur_host), CLUSTER_NODE_NEED_AUTH) except: pass try: - delNodeFlag(self, getClusterNode(self, cur_host, rc.cluster_info()[0]), CLUSTER_NODE_NEED_AUTH) + clearNodeStatus(self, getClusterNode(self, cur_host, rc.cluster_info()[0]), CLUSTER_NODE_NEED_AUTH) except: pass except Exception, e: --- conga/luci/site/luci/Extensions/ricci_communicator.py 2007/05/04 19:10:24 1.25.2.2 +++ conga/luci/site/luci/Extensions/ricci_communicator.py 2007/05/14 18:00:14 1.25.2.3 @@ -1,482 +1,505 @@ import xml import xml.dom from xml.dom import minidom -from LuciSyslog import LuciSyslog +from LuciSyslog import get_logger from conga_ssl import SSLSocket +from conga_constants import LUCI_DEBUG_MODE CERTS_DIR_PATH = '/var/lib/luci/var/certs/' - -try: - luci_log = LuciSyslog() -except: - pass +luci_log = get_logger() class RicciError(Exception): - pass + pass class RicciCommunicator: - def __init__(self, hostname, enforce_trust=True, port=11111): - self.__hostname = hostname - self.__port = port - - self.__timeout_init = 4 - self.__timeout_auth = 4 - self.__timeout_short = 6 - self.__timeout_long = 600 - - self.__privkey_file = '%sprivkey.pem' % CERTS_DIR_PATH - self.__cert_file = '%scacert.pem' % CERTS_DIR_PATH - - try: - self.ss = SSLSocket(self.__hostname, - self.__port, - self.__timeout_init) - if enforce_trust: - if not self.ss.trusted(): - raise RicciError, 'ricci\'s certificate is not trusted' - except Exception, e: - raise RicciError, 'Error setting up SSL for connection to %s: %s' \ - % (self.__hostname, str(e)) - except: - raise RicciError, 'Error setting up SSL for connection to %s' \ - % self.__hostname - - # receive ricci header - hello = self.__receive(self.__timeout_init) - try: - luci_log.debug_verbose('RC:init0: Received header from %s: \"%s\"' \ - % (self.__hostname, hello.toxml())) - except: - pass - - self.__authed = hello.firstChild.getAttribute('authenticated') == 'true' - self.__cluname = hello.firstChild.getAttribute('clustername') - self.__clualias = hello.firstChild.getAttribute('clusteralias') - self.__reported_hostname = hello.firstChild.getAttribute('hostname') - self.__os = hello.firstChild.getAttribute('os') - self.__dom0 = hello.firstChild.getAttribute('xen_host') == 'true' - - def hostname(self): - luci_log.debug_verbose('RC:hostname: [auth %d] reported hostname = %s' \ - % (self.__authed, self.__hostname)) - return self.__hostname - def authed(self): - luci_log.debug_verbose('RC:authed: reported authed = %d for %s' \ - % (self.__authed, self.__hostname)) - return self.__authed - def system_name(self): - luci_log.debug_verbose('RC:system_name: [auth %d] reported system_name = %s for %s' \ - % (self.__authed, self.__reported_hostname, self.__hostname)) - return self.__reported_hostname - def cluster_info(self): - luci_log.debug_verbose('RC:cluster_info: [auth %d] reported cluster_info = (%s,%s) for %s' \ - % (self.__authed, self.__cluname, self.__clualias, self.__hostname)) - return (self.__cluname, self.__clualias) - def os(self): - luci_log.debug_verbose('RC:os: [auth %d] reported os = %s for %s' \ - % (self.__authed, self.__os, self.__hostname)) - return self.__os - def dom0(self): - luci_log.debug_verbose('RC:dom0: [auth %d] reported dom0 = %s for %s' \ - % (self.__authed, self.__dom0, self.__hostname)) - return self.__dom0 - - def fingerprint(self): - return self.ss.peer_fingerprint() - - def trust(self): - return self.ss.trust() - - def untrust(self): - return self.ss.untrust() - - def trusted(self): - return self.ss.trusted() - - def auth(self, password): - if self.authed(): - luci_log.debug_verbose('RC:auth0: already authenticated to %s' \ - % self.__hostname) - return True - - # send request - doc = minidom.Document() - ricci = doc.createElement("ricci") - ricci.setAttribute("version", "1.0") - ricci.setAttribute("function", "authenticate") - ricci.setAttribute("password", password) - doc.appendChild(ricci) - self.__send(doc, self.__timeout_auth) - - # receive response - resp = self.__receive(self.__timeout_auth) - self.__authed = resp.firstChild.getAttribute('authenticated') == 'true' - - if self.__authed: - try: - self.__cluname = resp.firstChild.getAttribute('clustername') - self.__clualias = resp.firstChild.getAttribute('clusteralias') - self.__reported_hostname = resp.firstChild.getAttribute('hostname') - self.__os = resp.firstChild.getAttribute('os') - self.__dom0 = resp.firstChild.getAttribute('xen_host') == 'true' - except: - pass - luci_log.debug_verbose('RC:auth1: auth call returning %d' \ - % self.__authed) - return self.__authed - - def unauth(self): - doc = minidom.Document() - ricci = doc.createElement('ricci') - ricci.setAttribute('version', '1.0') - ricci.setAttribute('function', 'unauthenticate') - doc.appendChild(ricci) - self.__send(doc, self.__timeout_auth) - resp = self.__receive(self.__timeout_auth) - - luci_log.debug_verbose('RC:unauth0: trying to unauthenticate to %s' \ - % self.__hostname) - - try: - ret = resp.firstChild.getAttribute('success') - luci_log.debug_verbose('RC:unauth1: unauthenticate returned %s for %s' \ - % (ret, self.__hostname)) - if ret != '0': - raise Exception, 'Invalid response' - try: - self.ss.untrust() - except: - pass - except: - errstr = 'Error authenticating to host %s: %s' \ - % (self.__hostname, str(ret)) - luci_log.debug_verbose('RC:unauth2: %s' % errstr) - raise RicciError, errstr - return True - - - def process_batch(self, batch_xml, async=False): - try: - luci_log.debug_verbose('RC:PB0: [auth=%d] to %s for batch %s [async=%d]' \ - % (self.__authed, self.__hostname, batch_xml.toxml(), async)) - except: - pass - - if not self.authed(): - raise RicciError, 'not authenticated to host %s' % self.__hostname - - # construct request - doc = minidom.Document() - ricci = doc.createElement("ricci") - ricci.setAttribute("version", "1.0") - ricci.setAttribute("function", "process_batch") - async_str = None - if async: - async_str = 'true' - else: - async_str = 'false' - ricci.setAttribute("async", async_str) - doc.appendChild(ricci) - ricci.appendChild(batch_xml.cloneNode(True)) - - # send request - try: - self.__send(doc, self.__timeout_short) - except Exception, e: - luci_log.debug_verbose('RC:PB1: Error sending XML \"%s\" to host %s' \ - % (doc.toxml(), self.__hostname)) - raise RicciError, 'Error sending XML to host %s: %s' \ - % (self.__hostname, str(e)) - except: - raise RicciError, 'Error sending XML to host %s' % self.__hostname - - # receive response - doc = self.__receive(self.__timeout_long) - try: - luci_log.debug_verbose('RC:PB2: received from %s XML \"%s\"' \ - % (self.__hostname, doc.toxml())) - except: - pass + def __init__(self, hostname, enforce_trust=True, port=11111): + self.__hostname = hostname + self.__port = port + + self.__timeout_init = 4 + self.__timeout_auth = 4 + self.__timeout_short = 6 + self.__timeout_long = 600 + + self.__privkey_file = '%sprivkey.pem' % CERTS_DIR_PATH + self.__cert_file = '%scacert.pem' % CERTS_DIR_PATH + + try: + self.ss = SSLSocket(self.__hostname, + self.__port, + self.__timeout_init) + if enforce_trust: + if not self.ss.trusted(): + raise RicciError, 'ricci\'s certificate is not trusted' + except Exception, e: + raise RicciError, 'Error setting up SSL for connection to %s: %s' \ + % (self.__hostname, str(e)) + except: + raise RicciError, 'Error setting up SSL for connection to %s' \ + % self.__hostname + + # receive ricci header + hello = self.__receive(self.__timeout_init) + try: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:init0: recv header from %s: \"%s\"' \ + % (self.__hostname, hello.toxml())) + except: + pass + + self.__authed = hello.firstChild.getAttribute('authenticated') == 'true' + self.__cluname = hello.firstChild.getAttribute('clustername') + self.__clualias = hello.firstChild.getAttribute('clusteralias') + self.__reported_hostname = hello.firstChild.getAttribute('hostname') + self.__os = hello.firstChild.getAttribute('os') + self.__dom0 = hello.firstChild.getAttribute('xen_host') == 'true' + + def hostname(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:hostname: [auth %d] hostname = %s' \ + % (self.__authed, self.__hostname)) + return self.__hostname + + def authed(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:authed: reported authed = %d for %s' \ + % (self.__authed, self.__hostname)) + return self.__authed + + def system_name(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:system_name: [auth %d] system_name = %s for %s' % (self.__authed, self.__reported_hostname, self.__hostname)) + return self.__reported_hostname + + def cluster_info(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:cluster_info: [auth %d] reported cluster_info = (%s,%s) for %s' % (self.__authed, self.__cluname, self.__clualias, self.__hostname)) + return (self.__cluname, self.__clualias) + + def os(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:os: [auth %d] reported os = %s for %s' \ + % (self.__authed, self.__os, self.__hostname)) + return self.__os + + def dom0(self): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:dom0: [auth %d] dom0 = %s for %s' \ + % (self.__authed, self.__dom0, self.__hostname)) + return self.__dom0 + + def fingerprint(self): + fp = self.ss.peer_fingerprint() + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:fp: [auth %d] fp for %s = %s' \ + % (self.__authed, self.__hostname, fp)) + return fp + + def trust(self): + return self.ss.trust() + + def untrust(self): + return self.ss.untrust() + + def trusted(self): + return self.ss.trusted() + + def auth(self, password): + if self.authed(): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:auth0: already authenticated to %s' \ + % self.__hostname) + return True + + # send request + doc = minidom.Document() + ricci = doc.createElement("ricci") + ricci.setAttribute("version", "1.0") + ricci.setAttribute("function", "authenticate") + ricci.setAttribute("password", password) + doc.appendChild(ricci) + self.__send(doc, self.__timeout_auth) + + # receive response + resp = self.__receive(self.__timeout_auth) + self.__authed = resp.firstChild.getAttribute('authenticated') == 'true' + + if self.__authed: + try: + self.__cluname = resp.firstChild.getAttribute('clustername') + self.__clualias = resp.firstChild.getAttribute('clusteralias') + self.__reported_hostname = resp.firstChild.getAttribute('hostname') + self.__os = resp.firstChild.getAttribute('os') + self.__dom0 = resp.firstChild.getAttribute('xen_host') == 'true' + except: + pass + + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:auth1: auth call returning %d' \ + % self.__authed) + return self.__authed + + def unauth(self): + doc = minidom.Document() + ricci = doc.createElement('ricci') + ricci.setAttribute('version', '1.0') + ricci.setAttribute('function', 'unauthenticate') + doc.appendChild(ricci) + self.__send(doc, self.__timeout_auth) + resp = self.__receive(self.__timeout_auth) + + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:unauth0: unauthenticate %s' \ + % self.__hostname) + + try: + ret = resp.firstChild.getAttribute('success') + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:unauth1: unauthenticate %s for %s' \ + % (ret, self.__hostname)) + if ret != '0': + raise Exception, 'Invalid response' + + try: + self.ss.untrust() + except: + pass + except: + errstr = 'Error authenticating to host %s: %s' \ + % (self.__hostname, str(ret)) + + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:unauth2: %s' % errstr) + raise RicciError, errstr + return True + + + def process_batch(self, batch_xml, async=False): + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('RC:PB0: [auth=%d] to %s for batch %s [async=%d]' % (self.__authed, self.__hostname, batch_xml.toxml(), async)) + except: + pass + + if not self.authed(): + raise RicciError, 'not authenticated to host %s' % self.__hostname + + # construct request + doc = minidom.Document() + ricci = doc.createElement("ricci") + ricci.setAttribute("version", "1.0") + ricci.setAttribute("function", "process_batch") + async_str = None + if async: + async_str = 'true' + else: + async_str = 'false' + ricci.setAttribute("async", async_str) + doc.appendChild(ricci) + ricci.appendChild(batch_xml.cloneNode(True)) + + # send request + try: + self.__send(doc, self.__timeout_short) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:PB1: Error sending XML \"%s\" to host %s' % (doc.toxml(), self.__hostname)) + raise RicciError, 'Error sending XML to host %s: %s' \ + % (self.__hostname, str(e)) + except: + raise RicciError, 'Error sending XML to host %s' % self.__hostname + + # receive response + doc = self.__receive(self.__timeout_long) + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('RC:PB2: received from %s XML \"%s\"' \ + % (self.__hostname, doc.toxml())) + except: + pass - if doc.firstChild.getAttribute('success') != '0': - luci_log.debug_verbose('RC:PB3: batch command failed') - raise RicciError, 'The last ricci command to host %s failed' \ - % self.__hostname - - batch_node = None - for node in doc.firstChild.childNodes: - if node.nodeType == xml.dom.Node.ELEMENT_NODE: - if node.nodeName == 'batch': - batch_node = node.cloneNode(True) - if batch_node == None: - luci_log.debug_verbose('RC:PB4: batch node missing ') - raise RicciError, 'missing in ricci\'s response from "%s"' \ - % self.__hostname - - return batch_node - - def batch_run(self, batch_str, async=True): - try: - batch_xml_str = '%s' % batch_str - luci_log.debug_verbose('RC:BRun0: attempting batch "%s" for host "%s"' % (batch_xml_str, self.__hostname)) - batch_xml = minidom.parseString(batch_xml_str).firstChild - except Exception, e: - luci_log.debug_verbose('RC:BRun1: received invalid batch XML for %s: "%s": "%s"' % (self.__hostname, batch_xml_str, str(e))) - raise RicciError, 'batch XML is malformed' - - try: - ricci_xml = self.process_batch(batch_xml, async) - try: - luci_log.debug_verbose('RC:BRun2: received XML "%s" from host %s in response to batch command.' % (ricci_xml.toxml(), self.__hostname)) - except: - pass - except: - luci_log.debug_verbose('RC:BRun3: An error occurred while trying to process the batch job: "%s"' % batch_xml_str) - return None - - doc = minidom.Document() - doc.appendChild(ricci_xml) - return doc - - def batch_report(self, batch_id): - luci_log.debug_verbose('RC:BRep0: [auth=%d] asking for batchid# %s for host %s' % (self.__authed, batch_id, self.__hostname)) - - if not self.authed(): - raise RicciError, 'Not authenticated to host %s' % self.__hostname - - # construct request - doc = minidom.Document() - ricci = doc.createElement("ricci") - ricci.setAttribute("version", "1.0") - ricci.setAttribute("function", "batch_report") - ricci.setAttribute("batch_id", str(batch_id)) - doc.appendChild(ricci) - - # send request - self.__send(doc, self.__timeout_short) + if doc.firstChild.getAttribute('success') != '0': + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:PB3: batch command failed') + raise RicciError, 'The last ricci command to host %s failed' \ + % self.__hostname + + batch_node = None + for node in doc.firstChild.childNodes: + if node.nodeType == xml.dom.Node.ELEMENT_NODE: + if node.nodeName == 'batch': + batch_node = node.cloneNode(True) + if batch_node == None: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:PB4: batch node missing ') + raise RicciError, 'missing in ricci response from "%s"' \ + % self.__hostname + + return batch_node + + def batch_run(self, batch_str, async=True): + try: + batch_xml_str = '%s' \ + % batch_str + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BRun0: attempting batch "%s" for host "%s"' % (batch_xml_str, self.__hostname)) + batch_xml = minidom.parseString(batch_xml_str).firstChild + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BRun1: received invalid batch XML for %s: "%s": "%s"' % (self.__hostname, batch_xml_str, str(e))) + raise RicciError, 'batch XML is malformed' + + try: + ricci_xml = self.process_batch(batch_xml, async) + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('RC:BRun2: received XML "%s" from host %s in response to batch command.' % (ricci_xml.toxml(), self.__hostname)) + except: + pass + except: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BRun3: An error occurred while trying to process the batch job: "%s"' % batch_xml_str) + return None + + doc = minidom.Document() + doc.appendChild(ricci_xml) + return doc + + def batch_report(self, batch_id): + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BRep0: [auth=%d] asking for batchid# %s for host %s' % (self.__authed, batch_id, self.__hostname)) + + if not self.authed(): + raise RicciError, 'Not authenticated to host %s' % self.__hostname + + # construct request + doc = minidom.Document() + ricci = doc.createElement("ricci") + ricci.setAttribute("version", "1.0") + ricci.setAttribute("function", "batch_report") + ricci.setAttribute("batch_id", str(batch_id)) + doc.appendChild(ricci) + + # send request + self.__send(doc, self.__timeout_short) - - # receive response - doc = self.__receive(self.__timeout_short) - if doc.firstChild.getAttribute('success') == '12': - return None - if doc.firstChild.getAttribute('success') != '0': - raise RicciError, 'Error while retrieving batch report for batch #%d from host %s' % (batch_id, self.__hostname) - batch_node = None - for node in doc.firstChild.childNodes: - if node.nodeType == xml.dom.Node.ELEMENT_NODE: - if node.nodeName == 'batch': - batch_node = node.cloneNode(True) - if batch_node == None: - raise RicciError, 'Missing in ricci\'s response from host %s' % self.__hostname - return batch_node - - - - - - def __send(self, xml_doc, timeout): - buff = '%s\n' % xml_doc.toxml() - try: - self.ss.send(buff, timeout) - except Exception, e: - luci_log.debug_verbose('RC:send0: Error sending XML "%s" to %s: %s' % (buff, self.__hostname, str(e))) - raise RicciError, 'write error while sending XML to host %s' \ - % self.__hostname - except: - raise RicciError, 'write error while sending XML to host %s' \ - % self.__hostname - try: - luci_log.debug_verbose('RC:send1: Sent XML "%s" to host %s' \ - % (xml_doc.toxml(), self.__hostname)) - except: - pass - return - - def __receive(self, timeout): - doc = None - xml_in = '' - try: - xml_in = self.ss.recv(timeout) - except Exception, e: - luci_log.debug_verbose('RC:recv0: Error reading data from %s: %s' \ - % (self.__hostname, str(e))) - raise RicciError, 'Error reading data from host %s' % self.__hostname - except: - raise RicciError, 'Error reading data from host %s' % self.__hostname - luci_log.debug_verbose('RC:recv1: Received XML "%s" from host %s' \ - % (xml_in, self.__hostname)) - - try: - if doc == None: - doc = minidom.parseString(xml_in) - except Exception, e: - luci_log.debug_verbose('RC:recv2: Error parsing XML "%s" from %s' \ - % (xml_in, str(e))) - raise RicciError, 'Error parsing XML from host %s: %s' \ - % (self.__hostname, str(e)) - - if not doc or not doc.firstChild: - raise RicciError, \ - 'Error an empty response was received from host %s' \ - % self.__hostname - - try: - if doc.firstChild.nodeName != 'ricci': - luci_log.debug_verbose('RC:recv3: Expecting "ricci" got XML "%s" from %s' % (xml_in, self.__hostname)) - raise Exception, 'Expecting first XML child node to be "ricci"' - except Exception, e: - raise RicciError, 'Invalid XML ricci response from host %s' \ - % self.__hostname - - return doc - - - + + # receive response + doc = self.__receive(self.__timeout_short) + if doc.firstChild.getAttribute('success') == '12': + return None + if doc.firstChild.getAttribute('success') != '0': + raise RicciError, 'Error while retrieving batch report for batch #%d from host %s' % (batch_id, self.__hostname) + batch_node = None + for node in doc.firstChild.childNodes: + if node.nodeType == xml.dom.Node.ELEMENT_NODE: + if node.nodeName == 'batch': + batch_node = node.cloneNode(True) + if batch_node == None: + raise RicciError, 'Missing in ricci\'s response from host %s' % self.__hostname + return batch_node + + + def __send(self, xml_doc, timeout): + buff = '%s\n' % xml_doc.toxml() + try: + self.ss.send(buff, timeout) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:send0: Error sending XML "%s" to %s: %s' % (buff, self.__hostname, str(e))) + raise RicciError, 'write error while sending XML to host %s' \ + % self.__hostname + except: + raise RicciError, 'write error while sending XML to host %s' \ + % self.__hostname + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('RC:send1: Sent XML "%s" to host %s' \ + % (xml_doc.toxml(), self.__hostname)) + except: + pass + return + + def __receive(self, timeout): + doc = None + xml_in = '' + try: + xml_in = self.ss.recv(timeout) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:recv0: Error reading from %s: %s' \ + % (self.__hostname, str(e))) + raise RicciError, 'Error reading data from host %s' \ + % self.__hostname + except: + raise RicciError, 'Error reading data from host %s' \ + % self.__hostname + + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:recv1: Received XML "%s" from host %s' \ + % (xml_in, self.__hostname)) + + try: + if doc == None: + doc = minidom.parseString(xml_in) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:recv2: parsing XML "%s" from %s' \ + % (xml_in, str(e))) + raise RicciError, 'Error parsing XML from host %s: %s' \ + % (self.__hostname, str(e)) + + if not doc or not doc.firstChild: + raise RicciError, 'Error an empty response was received from host %s' % self.__hostname + + try: + if doc.firstChild.nodeName != 'ricci': + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:recv3: Expecting "ricci" got XML "%s" from %s' % (xml_in, self.__hostname)) + raise Exception, 'Expecting first XML child node to be "ricci"' + except Exception, e: + raise RicciError, 'Invalid XML ricci response from host %s' \ + % self.__hostname + return doc + def get_ricci_communicator(self, hostname, allowed_systems): - if not self.access_to_host_allowed(hostname, allowed_systems): - return None - - try: - return RicciCommunicator(hostname) - except Exception, e: - luci_log.debug_verbose('RC:GRC0: Error creating a ricci connection to %s: %s' % (hostname, str(e))) - return None + if not self.access_to_host_allowed(hostname, allowed_systems): + return None + + try: + return RicciCommunicator(hostname) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:GRC0: Error creating a ricci connection to %s: %s' % (hostname, str(e))) + return None def ricci_get_called_hostname(self, ricci): - return ricci.hostname() + return ricci.hostname() def ricci_get_reported_hostname(self, ricci): - return ricci.system_name() + return ricci.system_name() def ricci_get_os(self, ricci): - return ricci.os() + return ricci.os() def ricci_get_dom0(self, ricci): - return ricci.dom0() + return ricci.dom0() def ricci_get_cluster_info(self, ricci): - return ricci.cluster_info() + return ricci.cluster_info() def ricci_get_authenticated(self, ricci): - return ricci.authed() + return ricci.authed() def ricci_authenticate(self, ricci, password): - return ricci.auth(password) + return ricci.auth(password) def ricci_unauthenticate(self, ricci): - return ricci.unauth() - - - - - - - + return ricci.unauth() ########## helpers to process batch as returned by ricci ############# - - - - # check the status of batch # returns (int num, int total) # * total: -# total number of modules in batch +# total number of modules in batch # * num: -# if num == total: -# all modules in the batch completed successfuly -# if num > 0: -# last seq. number of module that successfuly finished -# if num < 0: -# module (-num) failed (next module won't be processed) -def batch_status(batch_xml): - if batch_xml.nodeName != 'batch': - try: - luci_log.debug_verbose('RC:BS0: Expecting an XML batch node. Got \"%s\"' \ - % batch_xml.toxml()) - except: - pass - raise RicciError, 'Not an XML batch node' - total = 0 - last = 0 - for node in batch_xml.childNodes: - if node.nodeType == xml.dom.Node.ELEMENT_NODE: - if node.nodeName == 'module': - total = total + 1 - status = node.getAttribute('status') - if status == '0': - # success - last = last + 1 - elif status == '3' or status == '4': - # failure - last = last + 1 - last = last - 2 * last - try: - luci_log.debug_verbose('RC:BS1: Returning (%d, %d) for batch_status("%s")' % (last, total, batch_xml.toxml())) - except: - luci_log.debug_verbose('RC:BS2: Returning last, total') - - return (last, total) - +# if num == total: +# all modules in the batch completed successfuly +# if num > 0: +# last seq. number of module that successfuly finished +# if num < 0: +# module (-num) failed (next module won't be processed) +def batch_status(batch_xml): + if batch_xml.nodeName != 'batch': + if LUCI_DEBUG_MODE is True: + try: + luci_log.debug_verbose('RC:BS0: Expecting an XML batch node. Got \"%s\"' % batch_xml.toxml()) + except: + pass + raise RicciError, 'Not an XML batch node' + + total = 0 + last = 0 + for node in batch_xml.childNodes: + if node.nodeType == xml.dom.Node.ELEMENT_NODE: + if node.nodeName == 'module': + total = total + 1 + status = node.getAttribute('status') + if status == '0': + # success + last = last + 1 + elif status == '3' or status == '4': + # failure + last = last + 1 + last = last - 2 * last + try: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BS1: Returning (%d, %d) for batch_status("%s")' % (last, total, batch_xml.toxml())) + except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:BS2: error %r: (last, total)' % \ + (e, last, total)) + return (last, total) # extract error_code from module's response # * module_num: -# 1-based seq. number of module to process +# 1-based seq. number of module to process # # returns (int error_code, string error_msg) # * error_code: each module defines own error codes, which are >0 -# -101 - in progress -# -102 - scheduled -# -103 - removed from schedule -# -104 - failed to execute module +# -101 - in progress +# -102 - scheduled +# -103 - removed from schedule +# -104 - failed to execute module # -# >-3 - module executed. Following codes are defined: -# -2 - API error -# -1 - undefined error occured (msg not necesarily very informative) -# 0 - no error (msg is empty string) -# >0 - predefined error has occured -# (check respective API, msg will be fully descriptive) +# >-3 - module executed. Following codes are defined: +# -2 - API error +# -1 - undefined error occured (msg not necesarily very informative) +# 0 - no error (msg is empty string) +# >0 - predefined error has occured +# (check respective API, msg will be fully descriptive) # * error_msg: error message -def extract_module_status(batch_xml, module_num=1): - if batch_xml.nodeName != 'batch': - luci_log.debug_verbose('RC:EMS0: Expecting "batch" got "%s"' % batch_xml.toxml()) - raise RicciError, 'Invalid XML node; expecting a batch node' - - c = 0 - for node in batch_xml.childNodes: - if node.nodeType == xml.dom.Node.ELEMENT_NODE: - if node.nodeName == 'module': - module_xml = node - c = c + 1 - if c == module_num: - status = module_xml.getAttribute('status') - if status == '0' or status == '4': - # module executed, dig deeper into request - for node_i in module_xml.childNodes: - if node_i.nodeType == xml.dom.Node.ELEMENT_NODE: - if node_i.nodeName == 'API_error': - return -2, 'API error' - elif node_i.nodeName == 'response': - for node_j in node_i.childNodes: - if node_j.nodeType == xml.dom.Node.ELEMENT_NODE: - if node_j.nodeName == 'function_response': - code = -11111111 - msg = 'BUG' - for var in node_j.childNodes: - if var.nodeType == xml.dom.Node.ELEMENT_NODE: - if var.nodeName == 'var': - if var.getAttribute('name') == 'success' and var.getAttribute('value') == 'true': - return 0, '' - elif var.getAttribute('name') == 'error_code': - code = int(var.getAttribute('value')) - elif var.getAttribute('name') == 'error_description': - msg = var.getAttribute('value') - return code, msg - - elif status == '1': - return -102, 'module scheduled for execution' - elif status == '2': - return -101, 'module is being executed' - elif status == '3': - return -104, 'failed to locate/execute module' - elif status == '5': - return -103, 'module removed from schedule' - - raise RicciError, 'no %dth module in the batch, or malformed response' % module_num +def extract_module_status(batch_xml, module_num=1): + if batch_xml.nodeName != 'batch': + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('RC:EMS0: Expecting "batch" got "%s"' \ + % batch_xml.toxml()) + raise RicciError, 'Invalid XML node; expecting a batch node' + + c = 0 + for node in batch_xml.childNodes: + if node.nodeType == xml.dom.Node.ELEMENT_NODE: + if node.nodeName == 'module': + module_xml = node + c = c + 1 + if c == module_num: + status = module_xml.getAttribute('status') + if status == '0' or status == '4': + # module executed, dig deeper into request + for node_i in module_xml.childNodes: + if node_i.nodeType == xml.dom.Node.ELEMENT_NODE: + if node_i.nodeName == 'API_error': + return -2, 'API error' + elif node_i.nodeName == 'response': + for node_j in node_i.childNodes: + if node_j.nodeType == xml.dom.Node.ELEMENT_NODE: + if node_j.nodeName == 'function_response': + code = -11111111 + msg = 'BUG' + for var in node_j.childNodes: + if var.nodeType == xml.dom.Node.ELEMENT_NODE: + if var.nodeName == 'var': + if var.getAttribute('name') == 'success' and var.getAttribute('value') == 'true': + return 0, '' + elif var.getAttribute('name') == 'error_code': + code = int(var.getAttribute('value')) + elif var.getAttribute('name') == 'error_description': + msg = var.getAttribute('value') + return code, msg + + elif status == '1': + return -102, 'module scheduled for execution' + elif status == '2': + return -101, 'module is being executed' + elif status == '3': + return -104, 'failed to locate/execute module' + elif status == '5': + return -103, 'module removed from schedule' + + raise RicciError, 'no %dth module in the batch, or malformed response' % module_num --- conga/luci/site/luci/Extensions/system_adapters.py 2007/05/03 20:16:38 1.2.2.1 +++ conga/luci/site/luci/Extensions/system_adapters.py 2007/05/14 18:00:14 1.2.2.2 @@ -1,12 +1,9 @@ from ricci_communicator import RicciCommunicator from RicciQueries import list_services, updateServices, svc_manage -from LuciSyslog import LuciSyslog +from LuciSyslog import get_logger from xml.dom import minidom -try: - luci_log = LuciSyslog() -except: - pass +luci_log = get_logger() def get_sys_svc_list(self, request, hostname): try: