[Cluster-devel] conga/luci/site/luci/Extensions FenceHandler.p ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Fri Jan 19 21:48:23 UTC 2007
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 <method> block inside
# <node><fence>. 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 <fence> 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:
More information about the Cluster-devel
mailing list