From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 19 Jan 2007 21:48:23 -0000 Subject: [Cluster-devel] conga/luci/site/luci/Extensions FenceHandler.p ... Message-ID: <20070119214823.6232.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: conga Changes by: rmccabe at sourceware.org 2007-01-19 21:48:23 Modified files: luci/site/luci/Extensions: FenceHandler.py cluster_adapters.py Log message: use the new fence validation code to validate fence add/edit and node fence operations Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/FenceHandler.py.diff?cvsroot=cluster&r1=1.14&r2=1.15 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.206&r2=1.207 --- conga/luci/site/luci/Extensions/FenceHandler.py 2007/01/19 20:57:38 1.14 +++ conga/luci/site/luci/Extensions/FenceHandler.py 2007/01/19 21:48:23 1.15 @@ -37,7 +37,7 @@ # For every new fence added, there will be a fence instance and fence device # form needed. There will also be a populate and a validate method for each # form. The methods will need to be added to this file, and the four hash -# tables (self.fi_populate, self.fi_validate, self.fd_populate, +# tables (self.fi_populate, self.fi_validate, self.fd_populate, # self.fd_validate) must be updated. The methods will use fields in the # forms to set_text and to check. @@ -183,7 +183,7 @@ 'fence_ipmilan': ['name', 'ipaddr', 'login', 'passwd', 'lanplus', 'auth'], 'fence_drac': ['name', 'ipaddr', 'login', 'passwd'], 'fence_rsa': ['name', 'hostname', 'login', 'passwd'], - 'fence_rps10': ['name', 'device', 'port'], + 'fence_rps10': ['name', 'device', 'port'], 'fence_manual': ['name'] } @@ -205,23 +205,23 @@ try: ret = validate_fencedevice(form, model, fencedev) - if ret is None: + if len(ret) < 1: fencedevptr = model.getFenceDevicePtr() fencedevptr.addChild(fencedev) model.setModified(True) return (FD_VAL_SUCCESS, fencedev.getAttribute('name')) except Exception, e: - ret = FD_PROVIDE_AGENT + ret = [ FD_PROVIDE_AGENT ] return (FD_VAL_FAIL, ret) -def validateFenceDevice(form, model): +def validateFenceDevice(form, model): try: old_fence_name = form['orig_name'].strip() if not old_fence_name: raise Exception, 'blank' except Exception, e: - return (FD_VAL_FAIL, FD_PROVIDE_NAME) + return (FD_VAL_FAIL, [ FD_PROVIDE_NAME ]) fencedev = None try: @@ -233,15 +233,15 @@ if fencedev is None: raise Exception, 'fencedev is None' except Exception, e: - return (FD_VAL_FAIL, FD_PROVIDE_NAME) + return (FD_VAL_FAIL, [ FD_PROVIDE_NAME ]) try: ret = validate_fencedevice(form, model, fencedev, fence_edit=True) - if ret is None: + if len(ret) < 1: model.setModified(True) return (FD_VAL_SUCCESS, fencedev.getAttribute('name')) except Exception, e: - ret = FD_PROVIDE_NAME + ret = [ FD_PROVIDE_NAME ] return (FD_VAL_FAIL, ret) @@ -252,7 +252,7 @@ raise Exception, 'blank' fence_name = makeNCName(fence_name) except Exception, e: - return FD_PROVIDE_NAME + return [ FD_PROVIDE_NAME ] name_change = False if fence_edit is True: @@ -261,357 +261,385 @@ if not old_fence_name: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_NAME + return [ FD_PROVIDE_NAME ] if old_fence_name != fence_name: if check_unique_fd_name(model, fence_name) is False: - return FD_PROVIDE_NAME + return [ FD_PROVIDE_NAME ] name_change = True else: if check_unique_fd_name(model, fence_name) is False: - return FD_PROVIDE_NAME + return [ FD_PROVIDE_NAME ] try: fence_agent = form['agent'].strip() if not fence_agent: raise Exception, 'blank agent' except Exception, e: - return FD_PROVIDE_AGENT + return [ FD_PROVIDE_AGENT ] fencedev.addAttribute('name', fence_name) fencedev.addAttribute('agent', fence_agent) try: ret = FD_VALIDATE[fence_agent](form, fencedev) - if ret is None and name_change is True: + if len(ret) < 1 and name_change is True: try: model.rectifyNewFencedevicenameWithFences(old_fence_name, fence_name) except: - return FD_NEW_FAIL % fence_agent + return [ FD_NEW_FAIL % fence_agent ] return ret except: - return FD_NEW_FAIL % fence_agent + return [ FD_NEW_FAIL % fence_agent ] def val_apc_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_wti_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('passwd', pwd) - return None - + return errors + def val_brocade_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None - + return errors + def val_vixel_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('passwd', pwd) - return None - + return errors + def val_mcdata_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None - + return errors + def val_gnbd_fd(form, fencedev): + errors = list() + try: server = form['server'].strip() if not server: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_SERVER + errors.append(FD_PROVIDE_SERVER) fencedev.addAttribute('server', server) - return None - + return errors + def val_egenera_fd(form, fencedev): + errors = list() + try: cserver = form['cserver'].strip() if not cserver: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_CSERVER + errors.append(FD_PROVIDE_CSERVER) fencedev.addAttribute('cserver', cserver) - return None - + return errors + def val_sanbox2_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_bladecenter_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_bullpap_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_noop_fd(dummy, dummy): - return None + return [] # non-shared devices def val_rsa_fd(form, fencedev): + errors = list() + try: hostname = form['hostname'].strip() if not hostname: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_HOSTNAME + errors.append(FD_PROVIDE_HOSTNAME) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('hostname', hostname) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_drac_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_rps10_fd(form, fencedev): + errors = list() + try: device = form['device'].strip() if not device: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_DEVICE + errors.append(FD_PROVIDE_DEVICE) try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PORT + errors.append(FD_PROVIDE_PORT) fencedev.addAttribute('device', device) fencedev.addAttribute('port', port) - return None + return errors def val_ipmilan_fd(form, fencedev): + errors = list() + try: ip = form['ipaddr'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_IP + errors.append(FD_PROVIDE_IP) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() if not pwd: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) try: auth_type = form['auth_type'].strip().lower() @@ -620,11 +648,11 @@ elif auth_type == 'password' or auth_type == 'md5': fencedev.setAttribute('auth_type', auth_type) else: - return FD_PROVIDE_IPMILAN_AUTH + errors.append(FD_PROVIDE_IPMILAN_AUTH) except KeyError, e: fencedev.removeAttribute('auth_type') except Exception, e: - return FD_PROVIDE_IPMILAN_AUTH + errors.append(FD_PROVIDE_IPMILAN_AUTH) try: lanplus = form['lanplus'].strip().lower() @@ -638,34 +666,36 @@ fencedev.addAttribute('ipaddr', ip) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors def val_ilo_fd(form, fencedev): + errors = list() + try: hostname = form['hostname'].strip() if not hostname: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_HOSTNAME + errors.append(FD_PROVIDE_HOSTNAME) try: log = form['login'].strip() if not log: raise Exception, 'blank' except Exception, e: - return FD_PROVIDE_LOGIN + errors.append(FD_PROVIDE_LOGIN) try: pwd = form['passwd'].strip() except Exception, e: - return FD_PROVIDE_PASSWD + errors.append(FD_PROVIDE_PASSWD) fencedev.addAttribute('hostname', hostname) fencedev.addAttribute('login', log) fencedev.addAttribute('passwd', pwd) - return None + return errors -# Validation Methods for Fence Instances +# Validation Methods for Fence Instances def validate_fenceinstance(form, parent_name): try: @@ -673,33 +703,35 @@ if not fence_agent: raise Exception, 'blank' except: - return FD_PROVIDE_AGENT + return [ FD_PROVIDE_AGENT ] try: if not parent_name.strip(): - return FI_PROVIDE_PARENT + return [ FI_PROVIDE_PARENT ] except: - return FI_PROVIDE_PARENT + return [ FI_PROVIDE_PARENT ] fenceinst = Device() fenceinst.addAttribute('name', parent_name) try: ret = FI_VALIDATE[fence_agent](form, fenceinst) - if ret is not None: + if len(ret) > 0: return (FD_VAL_FAIL, ret) except Exception, e: - return (FD_VAL_FAIL, FI_NEW_FAIL % fence_agent) + return (FD_VAL_FAIL, [ FI_NEW_FAIL % fence_agent ]) return (FD_VAL_SUCCESS, fenceinst) def val_apc_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) try: switch = form['switch'].strip() @@ -709,138 +741,162 @@ except KeyError, e: # switch is optional fenceinst.removeAttribute('switch') + except Exception, e: + errors.append(FI_PROVIDE_SWITCH) fenceinst.addAttribute('port', port) - return None + return errors def val_wti_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) fenceinst.addAttribute('port', port) - return None + return errors def val_brocade_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) fenceinst.addAttribute('port', port) - return None + return errors def val_vixel_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) fenceinst.addAttribute('port', port) - return None + return errors def val_gnbd_fi(form, fenceinst): + errors = list() + try: ip = form['ipaddress'].strip() if not ip: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_IPADDRESS + errors.append(FI_PROVIDE_IPADDRESS) fenceinst.addAttribute('ipaddress', ip) - return None + return errors def val_sanbox2_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) fenceinst.addAttribute('port', port) - return None + return errors def val_bladecenter_fi(form, fenceinst): + errors = list() + try: blade = form['blade'].strip() if not blade: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_BLADE + errors.append(FI_PROVIDE_BLADE) fenceinst.addAttribute('blade', blade) - return None + return errors def val_mcdata_fi(form, fenceinst): + errors = list() + try: port = form['port'].strip() if not port: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_PORT + errors.append(FI_PROVIDE_PORT) fenceinst.addAttribute('port', port) - return None + return errors def val_egenera_fi(form, fenceinst): + errors = list() + try: lpan = form['lpan'].strip() if not lpan: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_ELPAN + errors.append(FI_PROVIDE_ELPAN) try: pserver = form['pserver'].strip() if not pserver: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_ELPAN + errors.append(FI_PROVIDE_ELPAN) fenceinst.addAttribute('lpan', lpan) fenceinst.addAttribute('pserver', pserver) - return None + return errors def val_bullpap_fi(form, fenceinst): + errors = list() + try: domain = form['domain'].strip() if not domain: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_DOMAIN + errors.append(FI_PROVIDE_DOMAIN) fenceinst.addAttribute('domain', domain) - return None + return errors def val_xvm_fi(form, fenceinst): + errors = list() + try: domain = form['domain'].strip() if not domain: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_DOMAIN + errors.append(FI_PROVIDE_DOMAIN) fenceinst.addAttribute('domain', domain) - return None + return errors def val_scsi_fi(form, fenceinst): + errors = list() + try: nodename = form['nodename'].strip() if not nodename: raise Exception, 'blank' except Exception, e: - return FI_PROVIDE_NODENAME + errors.append(FI_PROVIDE_NODENAME) fenceinst.addAttribute('nodename', nodename) - return None + return errors def val_noop_fi(dummy, dummy): - return None + return [] --- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/19 19:41:26 1.206 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/01/19 21:48:23 1.207 @@ -32,7 +32,7 @@ from Method import Method from FenceDevice import FenceDevice from Device import Device -from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice +from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice, validate_fenceinstance from GeneralError import GeneralError from homebase_adapters import manageCluster, createClusterSystems, havePermCreateCluster, setNodeFlag, delNodeFlag, userAuthenticated, getStorageNode, getClusterNode, delCluster, parseHostForm from LuciSyslog import LuciSyslog @@ -1296,13 +1296,9 @@ return (False, {'errors': ['No form was submitted']}) #fencehandler = FenceHandler() - error_code, error_string = validateNewFenceDevice(form, model) + error_code, retobj = validateNewFenceDevice(form, model) if error_code == FD_VAL_SUCCESS: - messages.append(error_string) try: - cp = model.getClusterPtr() - cp.incrementConfigVersion() - model.setModified(True) conf_str = model.exportModelAsString() if not conf_str: raise Exception, 'conf_str is none' @@ -1335,14 +1331,13 @@ else: try: set_node_flag(self, clustername, rc.hostname(), batch_id, - CLUSTER_CONFIG, 'Updating cluster configuration') + CLUSTER_CONFIG, 'Adding new fence device \"%s\"' % retobj) except: pass - response.redirect(request['URL'] + "?pagetype=" + FENCEDEV + "&clustername=" + clustername + "&fencename=" + form['name'] + '&busyfirst=true') - return (True, {'errors': errors, 'messages': messages}) + response.redirect(request['URL'] + "?pagetype=" + FENCEDEV + "&clustername=" + clustername + "&fencename=" + retobj + '&busyfirst=true') else: - errors.append(error_string) + errors.extend(retobj) return (False, {'errors': errors, 'messages': messages}) @@ -1393,19 +1388,15 @@ #entry for this fence device. # #pass form and model to validation method, then save changes if it passes. - error_code, error_string = validateFenceDevice(form, model) + error_code, retobj = validateFenceDevice(form, model) if error_code == FD_VAL_SUCCESS: - messages.append(error_string) try: - cp = model.getClusterPtr() - cp.incrementConfigVersion() - model.setModified(True) 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)) + % str(e)) errors.append('Unable to store the new cluster configuration') try: @@ -1421,28 +1412,29 @@ if not rc: luci_log.debug_verbose('VFA: unable to find a ricci agent for the %s cluster' % clustername) errors.append('Unable to contact a ricci agent for cluster %s' \ - % clustername) + % clustername) if rc: batch_id, result = setClusterConf(rc, str(conf_str)) if batch_id is None or result is None: luci_log.debug_verbose('VFA: setClusterConf: batchid or result is None') errors.append('Unable to propagate the new cluster configuration for %s' \ - % clustername) + % clustername) else: try: set_node_flag(self, clustername, rc.hostname(), batch_id, - CLUSTER_CONFIG, 'Updating cluster configuration') + CLUSTER_CONFIG, 'Updating fence device \"%s\"' % retobj) except: pass - response.redirect(request['URL'] + "?pagetype=" + FENCEDEV + "&clustername=" + clustername + "&fencename=" + request['fencename'] + '&busyfirst=true') - return (True, {'errors': errors, 'messages': messages}) + response.redirect(request['URL'] + "?pagetype=" + FENCEDEV + "&clustername=" + clustername + "&fencename=" + retobj + '&busyfirst=true') else: - errors.append(error_string) + errors.extend(retobj) return (False, {'errors': errors, 'messages': messages}) def validateNodeFenceConfig(self, request): + errors = list() + try: form_xml = request['fence_xml'] if not form_xml: @@ -1581,7 +1573,6 @@ for i in fh_keys: fencedev_name = None fencedev_unknown = False - fencedev_obj = None try: fence_form, instance_list = form_hash[i] @@ -1593,140 +1584,70 @@ fence_type = fence_form['fence_type'] if not fence_type: raise Exception, 'fence type is blank' - fence_form['agent'] = fence_type except Exception, e: luci_log.debug_verbose('vNFC12: %s %s' % (i, str(e))) fence_type = None - try: - del fence_form['fence_type'] - except: - pass - if 'existing_device' in fence_form: - del fence_form['existing_device'] - try: fencedev_name = fence_form['name'] if not fencedev_name.strip(): raise Exception, 'no fence name' except Exception, e: - return (False, {'errors': [ '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: - # An unknown device. Pull the data out of + # An unknown fence device agent. Pull the data out of # the model and persist it and all instances. # All we care about is its name. fencedev_unknown = True else: - if 'sharable' in fence_form: + if not 'sharable' in fence_form: # If it's a shared fence device that already exists, the # user could not have edited it (without playing dirty # games), so it's safe to pull the existing entry from - # the model. All we need is the device name. - del fence_form['sharable'] - else: - # An existing non-shared device; build up the device - # from scratch since the user could have edited it. - try: - old_name = fence_form['old_name'] - if not old_name: - raise Exception, 'old name is blank' - del fence_form['old_name'] - except Exception, e: - luci_log.debug_verbose('vNFC12: no old name for %s %s' \ - % (fence_form['name'], str(e))) - return (False, {'errors': [ 'Unable to determine the original name for the device now named %s' % fencedev_name ]}) - - fencedev_obj = None - fence_dev_list = model.getFenceDevices() - for fd in fence_dev_list: - if fd.getAttribute('name') == old_name: - fencedev_obj = fd - break - - if fencedev_obj is None: - luci_log.debug_verbose('vNFC14: no fence device named %s was found' % old_name) - return (False, {'errors': ['No fence device named %s was found' % old_name ] }) + # the model. All we need is the device name, and nothing + # else needs to be done here. + # + # For an existing non-shared device update the device + # in the model, since the user could have edited it. + retcode, retmsg = validateFenceDevice(fence_form, model) + if retcode != FD_VAL_SUCCESS: + errors.extend(retmsg) + continue else: - try: - model.fencedevices_ptr.removeChild(fd) - except Exception, e: - luci_log.debug_verbose('VNFC8a: %s: %s' \ - % (old_name, str(e))) - return (False, {'errors': [ 'Unable to remove old fence device %s' % old_name ]}) - - for k in fence_form.keys(): - if fence_form[k]: - fencedev_obj.addAttribute(k, str(fence_form[k])) + fencedev_name = retmsg # Add back the tags under the method block # for the fence instance instance_list.append({'name': fencedev_name }) else: # The user created a new fence device. - try: - fencedev_name = fence_form['name'] - if not fencedev_name.strip(): - raise Exception, 'no fence name' - except Exception, e: - return (False, {'errors': [ 'You must provide a unique name for all fence devices.' ]}) - - fencedev_obj = FenceDevice() - for k in fence_form.keys(): - if fence_form[k]: - fencedev_obj.addAttribute(k, str(fence_form[k])) + retcode, retmsg = validateNewFenceDevice(fence_form, model) + if retcode != FD_VAL_SUCCESS: + errors.extend(retmsg) + continue + else: + fencedev_name = retmsg # If it's not shared, we need to create an instance form # so the appropriate XML goes into the block inside # . All we need for that is the device name. if not 'sharable' in fence_form: instance_list.append({'name': fencedev_name }) - else: - del fence_form['sharable'] - - if fencedev_obj is not None: - # If a device with this name exists in the model - # already, replace it with the current object. If - # this block is not executed, we don't need to make - # any changes to the fencedevices block for this - # device - fence_dev_list = model.getFenceDevices() - for fd in fence_dev_list: - if fencedev_name == fd.getAttribute('name'): - luci_log.debug_verbose('vNFC15: fence ident %s already in use' % fencedev_name) - return (False, {'errors': ['There is already a fence device named %s' % fencedev_name ] }) - model.fencedevices_ptr.addChild(fencedev_obj) if fencedev_unknown is True: # Save any instances for this fence device. + # XXX FIX ME - instances must be saved. pass for inst in instance_list: - try: - del inst['parent_fencedev'] - except: - pass - try: - del inst['new_instance'] - except: - pass - try: - del inst['name'] - except: - pass - try: - del inst['existing_instance'] - except: - pass - - device_obj = Device() - device_obj.setAgentType(fence_type) - device_obj.addAttribute('name', fencedev_name) - for k in inst.keys(): - if inst[k]: - device_obj.addAttribute(k, str(inst[k])) - fence_method.addChild(device_obj) + retcode, retobj = validate_fenceinstance(inst, fencedev_name) + if retcode != FD_VAL_SUCCESS: + errors.extend(retobj) + continue + fence_method.addChild(retobj) if len(node.getChildren()) > 0: # There's already a block @@ -1746,9 +1667,10 @@ fence_node.addChild(fence_method) node.addChild(fence_node) + if len(errors) > 0: + return (False, {'errors': errors }) + try: - cp = model.getClusterPtr() - cp.incrementConfigVersion() model.setModified(True) conf = str(model.exportModelAsString()) if not conf: