diff -ur a/luci/cluster/fence-macros b/luci/cluster/fence-macros --- a/luci/cluster/fence-macros 2011-06-14 15:14:26.000000000 -0400 +++ b/luci/cluster/fence-macros 2011-06-14 15:14:48.000000000 -0400 @@ -234,6 +234,10 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" /> </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_vmware_soap'"> + <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware-soap" /> + </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_bladecenter'"> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-bladecenter" /> </tal:block> @@ -357,7 +361,7 @@ <option name="fence_bullpap" value="fence_bullpap">Bull PAP</option> <option name="fence_xvm" value="fence_xvm">Virtual Machine Fencing</option> <option name="fence_scsi" value="fence_scsi">SCSI Fencing</option> - <option name="fence_vmware" value="fence_vmware">VMware Fencing</option> + <option name="fence_vmware_soap" value="fence_vmware_soap">VMware Fencing</option> <option name="fence_lpar" value="fence_lpar">LPAR Fencing</option> <option name="fence_cisco_mds" value="fence_cisco_mds">Cisco MDS</option> <option name="fence_cisco_ucs" value="fence_cisco_ucs">Cisco UCS</option> @@ -386,7 +390,7 @@ <option name="fence_ipmilan" value="fence_ipmilan">IPMI Lan</option> <option name="fence_xvm" value="fence_xvm">Virtual Machine Fencing</option> <option name="fence_scsi" value="fence_scsi">SCSI Fencing</option> - <option name="fence_vmware" value="fence_vmware">VMware Fencing</option> + <option name="fence_vmware_soap" value="fence_vmware_soap">VMware Fencing</option> <option name="fence_lpar" value="fence_lpar">LPAR Fencing</option> <option name="fence_cisco_mds" value="fence_cisco_mds">Cisco MDS</option> <option name="fence_cisco_ucs" value="fence_cisco_ucs">Cisco UCS</option> @@ -1342,6 +1346,102 @@ </div> </div> +<div metal:define-macro="fence-form-vmware-soap" + tal:attributes="id cur_fencedev/name | nothing"> + + <div id="fence_vmware_soap" class="fencedev"> + <table> + <tr> + <td><strong class="cluster">Fence Type</strong></td> + <td>VMware (SOAP interface)</td> + </tr> + <tr> + <td>Name</td> + <td> + <input name="name" type="text" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/name | nothing" /> + </td> + </tr> + <tr> + <td>Hostname</td> + <td> + <input name="ipaddr" type="text" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/ipaddr | nothing" /> + </td> + </tr> + <tr> + <td>IP port (optional)</td> + <td> + <input name="ipport" type="text" class="text" + tal:attributes="value cur_fencedev/ipport | nothing" /> + </td> + </tr> + <tr> + <td>Login</td> + <td> + <input name="login" type="text" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/login | nothing" /> + </td> + </tr> + <tr> + <td>Password</td> + <td> + <input name="passwd" type="password" autocomplete="off" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/passwd | nothing" /> + </td> + </tr> + <tr> + <td> + <span title="Full path to a script to generate fence password">Password Script (optional)</span> + </td> + <td> + <input type="text" name="passwd_script" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/passwd_script | nothing" /> + </td> + </tr> + <tr> + <td>Use SSL connections</td> + <td> + <input tal:condition="exists:cur_fencedev" + type="checkbox" name="ssl" + tal:attributes=" + checked python:(cur_fencedev and cur_fencedev.has_key('ssl') and (cur_fencedev['ssl'] == '1' or cur_fencedev['ssl'].lower() == 'true')) and 'checked' or ''" /> + <input tal:condition="not:exists:cur_fencedev" + type="checkbox" name="ssl" /> + </td> + </tr> + <tr> + <td>Power wait (seconds)</td> + <td> + <input type="text" name="power_wait" + tal:attributes=" + disabled cur_fencedev/isShared | nothing; + value cur_fencedev/power_wait | nothing" /> + </td> + </tr> + </table> + + <tal:block tal:condition="exists: cur_fencedev"> + <input type="hidden" name="existing_device" value="1" /> + <input type="hidden" name="orig_name" + tal:attributes="value cur_fencedev/name | nothing" /> + </tal:block> + + <input type="hidden" name="sharable" value="1" /> + <input type="hidden" name="fence_type" value="fence_vmware_soap" /> + </div> +</div> + <div metal:define-macro="fence-form-vmware" tal:attributes="id cur_fencedev/name | nothing"> @@ -2461,6 +2561,7 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-scsi" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-lpar" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" /> + <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware-soap" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ifmib" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-cisco_mds" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-cisco_ucs" /> @@ -2483,6 +2584,7 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-form-scsi" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-lpar" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware" /> + <tal:block metal:use-macro="here/fence-macros/macros/fence-form-vmware-soap" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-ifmib" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-cisco_mds" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-form-cisco_ucs" /> @@ -2606,6 +2708,53 @@ </div> </div> +<div metal:define-macro="fence-instance-form-vmware-soap" + tal:omit-tag="exists: cur_fence_dev_id"> + <div id="fence_vmware_soap_instance" name="fence_vmware_soap" class="fencedev_instance" + tal:omit-tag="exists: cur_fence_dev_id"> + <table> + <tr> + <td>Virtual machine name</td> + <td> + <input name="port" type="text" + tal:attributes=" + value cur_instance/port | nothing" /> + </td> + </tr> + <tr> + <td>Virtual machine UUID</td> + <td> + <input name="uuid" type="text" + tal:attributes=" + value cur_instance/uuid | nothing" /> + </td> + </tr> + <tr><td colspan="2"> + <div class="hbSubmit"> + <tal:block tal:condition="exists:cur_fence_instance_id"> + <input type="button" name="remove_fence" + value="Remove this instance" + tal:attributes="onclick python: 'del_fence_instance(\'' + cur_fence_instance_id + '\')'" /> + </tal:block> + <tal:block tal:condition="not:exists:cur_fence_instance_id"> + <input type="button" name="remove_fence" + value="Remove this instance" /> + </tal:block> + </div> + </td></tr> + </table> + + <input type="hidden" name="option" tal:condition="exists:cur_instance" + tal:attributes="value cur_instance/option |nothing" /> + <input type="hidden" name="fence_type" value="fence_vmware_soap" /> + <input type="hidden" name="fence_instance" value="1" /> + <input tal:condition="exists: cur_instance" + type="hidden" name="existing_instance" value="1" /> + <input type="hidden" name="parent_fencedev" + tal:attributes="value cur_fence_dev_id | nothing" /> + </div> +</div> + <div metal:define-macro="fence-instance-form-vmware" tal:omit-tag="exists: cur_fence_dev_id"> <div id="fence_vmware_instance" name="fence_vmware" class="fencedev_instance" @@ -3260,6 +3409,8 @@ <tal:block metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware" /> <tal:block + metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware-soap" /> + <tal:block metal:use-macro="here/fence-macros/macros/fence-instance-form-wti" /> <tal:block metal:use-macro="here/fence-macros/macros/fence-instance-form-brocade" /> @@ -3343,6 +3494,11 @@ metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware" /> </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_vmware_soap'"> + <tal:block + metal:use-macro="here/fence-macros/macros/fence-instance-form-vmware-soap" /> + </tal:block> + <tal:block tal:condition="python: cur_fence_type == 'fence_bullpap'"> <tal:block metal:use-macro="here/fence-macros/macros/fence-instance-form-bullpap" /> diff -ur a/luci/cluster/validate_fence.js b/luci/cluster/validate_fence.js --- a/luci/cluster/validate_fence.js 2011-06-14 15:14:26.000000000 -0400 +++ b/luci/cluster/validate_fence.js 2011-06-14 15:14:48.000000000 -0400 @@ -22,6 +22,7 @@ fence_inst_validator['xvm'] = [ 'domain' ]; fence_inst_validator['lpar'] = [ 'partition', 'managed' ]; fence_inst_validator['vmware'] = [ 'port' ]; +fence_inst_validator['vmware_soap'] = [ ]; fence_inst_validator['cisco_mds'] = [ 'port' ]; fence_inst_validator['ifmib'] = [ 'port' ]; fence_inst_validator['cisco_ucs'] = [ 'port' ]; @@ -54,6 +55,7 @@ fence_validator['cisco_ucs'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; fence_validator['rhevm'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; fence_validator['vmware'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script', 'vmlogin' ]; +fence_validator['vmware_soap'] = [ 'ipaddr', 'login', 'passwd', 'passwd_script' ]; fence_validator['xvm'] = []; function validate_field_str(form, form_elem) { @@ -139,6 +141,7 @@ field_validator['cserver'] = validate_field_str; field_validator['device'] = validate_field_str; field_validator['port'] = validate_field_str; +field_validator['uuid'] = validate_field_str; field_validator['passwd_script'] = validate_field_noop; field_validator['vmpasswd_script'] = validate_field_noop; diff -ur a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py --- a/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2011-06-14 15:14:26.000000000 -0400 +++ b/luci/site/luci/Extensions/ClusterModel/FenceDeviceAttr.py 2011-06-14 15:14:48.000000000 -0400 @@ -32,6 +32,7 @@ 'fence_rps10': 'RPS10 Serial Switch', 'fence_lpar': 'LPAR Fencing', 'fence_vmware': 'VMware Fencing', + 'fence_vmware_soap': 'VMware Fencing (SOAP interface)', 'fence_rhevm': 'RHEV-M Fencing', 'fence_cisco_mds': 'Cisco MDS', 'fence_cisco_ucs': 'Cisco UCS', @@ -54,6 +55,7 @@ 'fence_scsi': True, 'fence_lpar': True, 'fence_vmware': True, + 'fence_vmware_soap': True, 'fence_rhevm': True, 'fence_cisco_mds': True, 'fence_cisco_ucs': True, @@ -102,6 +104,7 @@ 'fence_scsi': ( 'node' ), 'fence_lpar': ( 'partition' ), 'fence_vmware': ( 'port' ), + 'fence_vmware_soap': ( 'port', 'uuid' ), 'fence_rhevm': ( 'port' ), 'fence_cisco_mds': ( 'port' ), 'fence_cisco_ucs': ( 'port' ), @@ -141,6 +144,8 @@ ( 'name', 'ipaddr', 'login', 'passwd' ), 'fence_vmware': ( 'name', 'ipaddr', 'login', 'passwd', 'vmlogin', 'vmpasswd' ), + 'fence_vmware': + ( 'name', 'ipaddr', 'login', 'passwd' ), 'fence_rhevm': ( 'name', 'ipaddr', 'login', 'passwd' ), 'fence_cisco_mds': diff -ur a/luci/site/luci/Extensions/FenceHandler.py b/luci/site/luci/Extensions/FenceHandler.py --- a/luci/site/luci/Extensions/FenceHandler.py 2011-06-14 15:14:27.000000000 -0400 +++ b/luci/site/luci/Extensions/FenceHandler.py 2011-06-14 15:14:48.000000000 -0400 @@ -673,6 +673,97 @@ errors.append(FD_PROVIDE_PASSWD) return errors +def val_vmware_soap_fd(form, fencedev): + errors = list() + + try: + ip = form['ipaddr'].strip() + if not ip: + raise Exception, 'blank' + fencedev.addAttribute('ipaddr', ip) + except Exception, e: + errors.append(FD_PROVIDE_IP) + + try: + log = form['login'].strip() + if not log: + raise Exception, 'blank' + fencedev.addAttribute('login', log) + except Exception, e: + errors.append(FD_PROVIDE_LOGIN) + + has_passwd = False + try: + pwd = form['passwd'].strip() + if not pwd: + # Allow passwords that consist of only spaces. + if not form.has_key('passwd') or form['passwd'] == '': + raise Exception, 'blank' + else: + pwd = form['passwd'] + fencedev.addAttribute('passwd', pwd) + has_passwd = True + except Exception, e: + try: + fencedev.removeAttribute('passwd') + except: + pass + + try: + pwd_script = form['passwd_script'].strip() + if not pwd_script: + raise Exception, 'blank' + fencedev.addAttribute('passwd_script', pwd_script) + has_passwd = True + except Exception, e: + try: + fencedev.removeAttribute('passwd_script') + except: + pass + + if not has_passwd: + errors.append(FD_PROVIDE_PASSWD) + + try: + ipport = form['ipport'].strip() + if ipport: + ipport = int(ipport) + if ipport < 1 or ipport & 0xffff != ipport: + raise ValueError + except (KeyError, AttributeError), e: + ipport = None + except Exception, e: + ipport = None + errors.append('An invalid value for ipport was given: "%s"' % form['ipport']) + if ipport: + fencedev.addAttribute('ipport', str(ipport)) + else: + fencedev.removeAttribute('ipport') + + use_ssl = form.has_key('ssl') and form['ssl'].lower() in ('1', 'on', 'true') + if use_ssl: + fencedev.addAttribute('ssl', '1') + else: + fencedev.removeAttribute('ssl') + + try: + power_wait = form['power_wait'].strip() + if power_wait: + power_wait = int(power_wait) + if power_wait < 0: + raise ValueError + except (KeyError, AttributeError), e: + power_wait = None + except Exception, e: + power_wait = None + errors.append('An invalid value for power_wait was given: "%s"' % form['power_wait']) + if power_wait: + fencedev.addAttribute('power_wait', str(power_wait)) + else: + fencedev.removeAttribute('power_wait') + + return errors + def val_vmware_fd(form, fencedev): errors = list() @@ -1580,6 +1671,7 @@ 'fence_cisco_mds': val_cisco_mds_fd, 'fence_ifmib': val_cisco_mds_fd, 'fence_vmware': val_vmware_fd, + 'fence_vmware_soap': val_vmware_soap_fd, 'fence_xvm': val_noop_fd, 'fence_scsi': val_noop_fd, 'fence_ilo': val_ilo_fd, @@ -1863,6 +1955,32 @@ return errors +def val_vmware_soap_fi(form, fenceinst): + errors = list() + + try: + port = form['port'].strip() + if not port: + raise Exception, 'blank' + fenceinst.addAttribute('port', port) + except Exception, e: + fenceinst.removeAttribute('port') + port = None + + try: + uuid = form['uuid'].strip() + if not uuid: + raise Exception, 'blank' + fenceinst.addAttribute('uuid', uuid) + except Exception, e: + fenceinst.removeAttribute('uuid') + uuid = None + + if not port and not uuid: + errors.append('Either port or UUID must be provided.') + + return errors + def val_vmware_fi(form, fenceinst): errors = list() @@ -1950,6 +2068,7 @@ 'fence_cisco_mds': val_cisco_mds_fi, 'fence_ifmib': val_cisco_mds_fi, 'fence_vmware': val_vmware_fi, + 'fence_vmware_soap': val_vmware_soap_fi, 'fence_ilo': val_noop_fi, 'fence_ilo_mp': val_noop_fi, 'fence_ipmilan': val_noop_fi,