[Cluster-devel] conga/luci cluster/form-macros cluster/resourc ...

rmccabe at sourceware.org rmccabe at sourceware.org
Fri Feb 16 02:12:47 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	conga
Branch: 	RHEL4
Changes by:	rmccabe at sourceware.org	2007-02-16 02:12:46

Modified files:
	luci/cluster   : form-macros resource-form-macros 
	                 resource_form_handlers.js 
	luci/site/luci/Extensions: ModelBuilder.py cluster_adapters.py 
Added files:
	luci/site/luci/Extensions: LVM.py Totem.py 

Log message:
	- Add support for the <totem> tag
	- Add support for the LVM resource agent
	- Fixes for the other new resource agents

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.176.2.10&r2=1.176.2.11
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource-form-macros.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.31.2.1&r2=1.31.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource_form_handlers.js.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.29.2.1&r2=1.29.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LVM.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/Totem.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ModelBuilder.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.19.2.3&r2=1.19.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.227.2.7&r2=1.227.2.8

--- conga/luci/cluster/form-macros	2007/02/14 15:06:15	1.176.2.10
+++ conga/luci/cluster/form-macros	2007/02/16 02:12:46	1.176.2.11
@@ -755,6 +755,16 @@
 
 						<tr class="systemsTable">
 							<td class="systemsTable">
+								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#send_join', 55, 65);">Maximum time to wait before sending a join message</a> (ms)
+							</td>
+							<td class="systemsTable">
+								<input type="text" size="10" name="send_join"
+									tal:attributes="value string:0" />
+							</td>
+						</tr>
+
+						<tr class="systemsTable">
+							<td class="systemsTable">
 								<a class="cluster_help" href="javascript:popup_window('/luci/doc/config_rhel5#consensus', 55, 65);">Consensus Timeout</a> (ms)
 							</td>
 							<td class="systemsTable">
@@ -4296,6 +4306,10 @@
 		<div metal:use-macro="here/resource-form-macros/macros/mysql_macro" />
 	</tal:block>
 
+	<tal:block tal:condition="python: type == 'lvm'">
+		<div metal:use-macro="here/resource-form-macros/macros/lvm_macro" />
+	</tal:block>
+
 	<tal:block tal:condition="python: type == 'postgres-8'">
 		<div metal:use-macro="here/resource-form-macros/macros/postgres-8_macro" />
 	</tal:block>
--- conga/luci/cluster/resource-form-macros	2007/02/08 15:59:20	1.31.2.1
+++ conga/luci/cluster/resource-form-macros	2007/02/16 02:12:46	1.31.2.2
@@ -122,6 +122,7 @@
 			<tal:block
 				tal:condition="python: os_version and os_version == 'rhel4'">
 				<option name="APACHE" value="APACHE">Apache</option>
+				<option name="LVM" value="LVM">LVM</option>
 				<option name="MYSQL" value="MYSQL">MySQL</option>
 				<option name="OPENLDAP" value="OPENLDAP">Open LDAP</option>
 				<option name="POSTGRES-8" value="POSTGRES-8">
@@ -143,14 +144,12 @@
 		<div metal:use-macro="here/resource-form-macros/macros/nfsc_macro" />
 		<div metal:use-macro="here/resource-form-macros/macros/smb_macro" />
 		<div metal:use-macro="here/resource-form-macros/macros/scr_macro" />
-
-		<tal:block tal:condition="python: os_version and os_version == 'rhel4'">
-			<div metal:use-macro="here/resource-form-macros/macros/apache_macro" />
-			<div metal:use-macro="here/resource-form-macros/macros/mysql_macro" />
-			<div metal:use-macro="here/resource-form-macros/macros/openldap_macro" />
-			<div metal:use-macro="here/resource-form-macros/macros/postgres-8_macro" />
-			<div metal:use-macro="here/resource-form-macros/macros/tomcat-5_macro" />
-		</tal:block>
+		<div metal:use-macro="here/resource-form-macros/macros/apache_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/mysql_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/lvm_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/openldap_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/postgres-8_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/tomcat-5_macro" />
 	</div>
 </div>
 
@@ -173,6 +172,7 @@
 			<tal:block
 				tal:condition="python: os_version and os_version == 'rhel4'">
 				<option name="APACHE" value="APACHE">Apache</option>
+				<option name="LVM" value="LVM">LVM</option>
 				<option name="MYSQL" value="MYSQL">MySQL</option>
 				<option name="OPENLDAP" value="OPENLDAP">Open LDAP</option>
 				<option name="POSTGRES-8" value="POSTGRES-8">
@@ -217,6 +217,12 @@
 		<div metal:use-macro="here/resource-form-macros/macros/nfsc_macro" />
 		<div metal:use-macro="here/resource-form-macros/macros/smb_macro" />
 		<div metal:use-macro="here/resource-form-macros/macros/scr_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/apache_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/mysql_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/lvm_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/openldap_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/postgres-8_macro" />
+		<div metal:use-macro="here/resource-form-macros/macros/tomcat-5_macro" />
 	</div>
 </div>
 
@@ -874,7 +880,7 @@
 				<input type="text" size="20" name="config_file"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/config_file | string:/var/lib/pgsql/data/postgresql.conf" />
+						value res/attrs/config_file | string:/var/lib/pgsql/data/postgresql.conf" />
 			</td>
 		</tr>
 
@@ -884,7 +890,7 @@
 				<input type="text" size="20" name="postmaster_user"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/postmaster_user | string:postgres" />
+						value res/attrs/postmaster_user | string:postgres" />
 			</td>
 		</tr>
 
@@ -894,7 +900,7 @@
 				<input type="text" size="20" name="postmaster_options"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/postmaster_options | nothing" />
+						value res/attrs/postmaster_options | nothing" />
 			</td>
 		</tr>
 
@@ -904,7 +910,7 @@
 				<input type="text" size="20" name="shutdown_wait"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/shutdown_wait | string:0" />
+						value res/attrs/shutdown_wait | string:0" />
 			</td>
 		</tr>
 	</table>
@@ -967,7 +973,7 @@
 				<input type="text" size="20" name="server_root"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/server_root | string:/etc/httpd" />
+						value res/attrs/server_root | string:/etc/httpd" />
 			</td>
 		</tr>
 
@@ -977,7 +983,7 @@
 				<input type="text" size="20" name="config_file"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/config_file | string:conf/httpd.conf" />
+						value res/attrs/config_file | string:conf/httpd.conf" />
 			</td>
 		</tr>
 
@@ -987,7 +993,7 @@
 				<input type="text" size="20" name="httpd_options"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/httpd_options | nothing" />
+						value res/attrs/httpd_options | nothing" />
 			</td>
 		</tr>
 
@@ -997,7 +1003,7 @@
 				<input type="text" size="20" name="shutdown_wait"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/shutdown_wait | string:0" />
+						value res/attrs/shutdown_wait | string:0" />
 			</td>
 		</tr>
 	</table>
@@ -1060,7 +1066,7 @@
 				<input type="text" size="20" name="config_file"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/config_file | string:/etc/openldap/slapd.conf" />
+						value res/attrs/config_file | string:/etc/openldap/slapd.conf" />
 			</td>
 		</tr>
 
@@ -1070,7 +1076,7 @@
 				<input type="text" size="20" name="url_list"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/url_list | string:ldap:///" />
+						value res/attrs/url_list | string:ldap:///" />
 			</td>
 		</tr>
 
@@ -1080,7 +1086,7 @@
 				<input type="text" size="20" name="slapd_options"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/slapd_options | nothing" />
+						value res/attrs/slapd_options | nothing" />
 			</td>
 		</tr>
 
@@ -1090,10 +1096,83 @@
 				<input type="text" size="20" name="shutdown_wait"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/shutdown_wait | string:0" />
+						value res/attrs/shutdown_wait | string:0" />
+			</td>
+		</tr>
+	</table>
+	<div metal:use-macro="here/resource-form-macros/macros/res_form_footer" />
+	</form>
+</div>
+
+<div class="rescfg" name="LVM"
+	tal:attributes="id res/name | nothing" metal:define-macro="lvm_macro">
+
+	<p class="reshdr">LVM Resource Configuration</p>
+
+	<form method="post"
+		tal:attributes="name res/parent_uuid | nothing"
+		tal:define="editDisabled resourceIsRef | nothing">
+
+	<input name="immutable" type="hidden" value="true"
+		tal:condition="editDisabled" />
+
+	<input name="edit" type="hidden" value="true"
+		tal:condition="python: ptype == '33' and True or False" />
+
+	<input name="pagetype" type="hidden"
+		tal:attributes="value python: ptype" />
+
+	<input name="global" type="hidden"
+		tal:attributes="value resourceIsRef | nothing" />
+
+	<input name="parent_uuid" type="hidden"
+		tal:attributes="value res/parent_uuid | nothing" />
+
+	<input name="uuid" type="hidden"
+		tal:attributes="value res/uuid | nothing" />
+
+	<input name="tree_level" type="hidden"
+		tal:attributes="value res/indent_ctr | string:0" />
+
+	<input name="clustername" type="hidden"
+		tal:attributes="
+			value request/clustername | request/form/clustername | nothing" />
+
+	<input name="oldname" type="hidden"
+		tal:attributes="value res/name | nothing" />
+
+	<input name="type" type="hidden" value="lvm" />
+
+	<table class="systemsTable">
+		<tr class="systemsTable">
+			<td class="systemsTable">Name</td>
+			<td class="systemsTable">
+				<input type="text" size="20" name="resourceName"
+					tal:attributes="
+						disabled python: editDisabled;
+						value res/name | nothing" />
+			</td>
+		</tr>
+		<tr class="systemsTable">
+			<td class="systemsTable">Volume Group Name</td>
+			<td class="systemsTable">
+				<input type="text" size="20" name="vg_name"
+					tal:attributes="
+						disabled python: editDisabled;
+						value res/attrs/vg_name | nothing" />
+			</td>
+		</tr>
+		<tr class="systemsTable">
+			<td class="systemsTable">Logical Volume Name</td>
+			<td class="systemsTable">
+				<input type="text" size="20" name="lv_name"
+					tal:attributes="
+						disabled python: editDisabled;
+						value res/attrs/lv_name | nothing" />
 			</td>
 		</tr>
 	</table>
+
 	<div metal:use-macro="here/resource-form-macros/macros/res_form_footer" />
 	</form>
 </div>
@@ -1153,7 +1232,7 @@
 				<input type="text" size="20" name="config_file"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/config_file | string:/etc/my.cnf" />
+						value res/attrs/config_file | string:/etc/my.cnf" />
 			</td>
 		</tr>
 
@@ -1163,7 +1242,7 @@
 				<input type="text" size="20" name="listen_address"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/listen_address | nothing" />
+						value res/attrs/listen_address | nothing" />
 			</td>
 		</tr>
 
@@ -1173,7 +1252,7 @@
 				<input type="text" size="20" name="mysqld_options"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/mysqld_options | nothing" />
+						value res/attrs/mysqld_options | nothing" />
 			</td>
 		</tr>
 
@@ -1183,7 +1262,7 @@
 				<input type="text" size="20" name="shutdown_wait"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/shutdown_wait | string:0" />
+						value res/attrs/shutdown_wait | string:0" />
 			</td>
 		</tr>
 	</table>
@@ -1246,7 +1325,7 @@
 				<input type="text" size="20" name="config_file"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/config_file | string:/etc/tomcat5/tomcat5.conf" />
+						value res/attrs/config_file | string:/etc/tomcat5/tomcat5.conf" />
 			</td>
 		</tr>
 
@@ -1256,7 +1335,7 @@
 				<input type="text" size="20" name="tomcat_user"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/tomcat_user | string:tomcat" />
+						value res/attrs/tomcat_user | string:tomcat" />
 			</td>
 		</tr>
 
@@ -1266,7 +1345,7 @@
 				<input type="text" size="20" name="catalina_options"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/catalina_options | nothing" />
+						value res/attrs/catalina_options | nothing" />
 			</td>
 		</tr>
 
@@ -1276,7 +1355,7 @@
 				<input type="text" size="20" name="catalina_base"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/catalina_base | string:/usr/share/tomcat5" />
+						value res/attrs/catalina_base | string:/usr/share/tomcat5" />
 			</td>
 		</tr>
 
@@ -1286,7 +1365,7 @@
 				<input type="text" size="20" name="shutdown_wait"
 					tal:attributes="
 						disabled python: editDisabled;
-						value res/shutdown_wait | string:30" />
+						value res/attrs/shutdown_wait | string:30" />
 			</td>
 		</tr>
 	</table>
--- conga/luci/cluster/resource_form_handlers.js	2007/02/08 15:59:20	1.29.2.1
+++ conga/luci/cluster/resource_form_handlers.js	2007/02/16 02:12:46	1.29.2.2
@@ -118,6 +118,11 @@
 	return (errors);
 }
 
+function validate_lvm(form) {
+	var errors = new Array();
+	return (errors);
+}
+
 function validate_openldap(form) {
 	var errors = new Array();
 	return (errors);
@@ -258,6 +263,7 @@
 form_validators['postgres-8'] = validate_postgres8;
 form_validators['openldap'] = validate_openldap;
 form_validators['mysql'] = validate_mysql;
+form_validators['lvm'] = validate_lvm;
 
 function check_form(form) {
 	var valfn = form_validators[form.type.value];
/cvs/cluster/conga/luci/site/luci/Extensions/LVM.py,v  -->  standard output
revision 1.1.2.1
--- conga/luci/site/luci/Extensions/LVM.py
+++ -	2007-02-16 02:12:46.864267000 +0000
@@ -0,0 +1,15 @@
+import string
+from TagObject import TagObject
+from BaseResource import BaseResource
+
+import gettext
+_ = gettext.gettext
+
+TAG_NAME = "lvm"
+RESOURCE_TYPE = _("LVM")
+
+class LVM(BaseResource):
+  def __init__(self):
+    BaseResource.__init__(self)
+    self.TAG_NAME = TAG_NAME
+    self.resource_type = RESOURCE_TYPE
/cvs/cluster/conga/luci/site/luci/Extensions/Totem.py,v  -->  standard output
revision 1.1.2.1
--- conga/luci/site/luci/Extensions/Totem.py
+++ -	2007-02-16 02:12:46.949829000 +0000
@@ -0,0 +1,9 @@
+import string
+from TagObject import TagObject
+
+TAG_NAME = "totem"
+
+class Totem(TagObject):
+  def __init__(self):
+    TagObject.__init__(self)
+    self.TAG_NAME = TAG_NAME 
--- conga/luci/site/luci/Extensions/ModelBuilder.py	2007/02/08 03:46:51	1.19.2.3
+++ conga/luci/site/luci/Extensions/ModelBuilder.py	2007/02/16 02:12:46	1.19.2.4
@@ -17,6 +17,7 @@
 from Method import Method
 from Device import Device
 from Cman import Cman
+from Totem import Totem
 from Gulm import Gulm
 from Lockserver import Lockserver
 from Ip import Ip
@@ -25,6 +26,12 @@
 from NFSExport import NFSExport
 from Fs import Fs
 from Samba import Samba
+from Apache import Apache
+from LVM import LVM
+from MySQL import MySQL
+from OpenLDAP import OpenLDAP
+from Postgres8 import Postgres8
+from Tomcat5 import Tomcat5
 from Multicast import Multicast
 from FenceDaemon import FenceDaemon
 from FenceXVMd import FenceXVMd
@@ -52,6 +59,7 @@
            'fencedevices':FenceDevices,
            'method':Method,
            'cman':Cman,
+           'totem':Totem,
            'gulm':Gulm,
            'lockserver':Lockserver,
            'rm':Rm,
@@ -65,6 +73,12 @@
            'ip':Ip,
            'fs':Fs,
            'smb':Samba,
+           'apache':Apache,
+           'lvm':LVM,
+           'mysql':MySQL,
+           'openldap':OpenLDAP,
+           'postgres-8':Postgres8,
+           'tomcat-5':Tomcat5,
            'fence_daemon':FenceDaemon,
            'multicast':Multicast,
            'clusterfs':Clusterfs,
@@ -91,6 +105,7 @@
 GULM_TAG_STR="gulm"
 MCAST_STR="multicast"
 CMAN_PTR_STR="cman"
+TOTEM_PTR_STR="totem"
 QUORUMD_PTR_STR="quorumd"
 ###-----------------------------------
 
@@ -113,6 +128,7 @@
     self.cluster_ptr = None
     self.GULM_ptr = None
     self.CMAN_ptr = None
+    self.TOTEM_ptr = None
     self.clusternodes_ptr = None
     self.failoverdomains_ptr = None
     self.fencedevices_ptr = None
@@ -219,6 +235,8 @@
         self.lock_type = GULM_TYPE
       elif parent_node.nodeName == CMAN_PTR_STR:
         self.CMAN_ptr = new_object
+      elif parent_node.nodeName == TOTEM_PTR_STR:
+        self.TOTEM_ptr = new_object
       elif parent_node.nodeName == MCAST_STR:
         self.usesMulticast = True
       elif parent_node.nodeName == FENCE_XVMD_STR:
@@ -597,6 +615,17 @@
 
     raise GeneralError('FATAL',"Couldn't find VM name %s in current list" % name)
 
+  def del_totem(self):
+    if self.TOTEM_ptr is not None:
+      self.cluster_ptr.removeChild(self.TOTEM_ptr)
+      self.TOTEM_ptr = None
+
+  def add_totem(self, obj):
+    self.del_totem()
+    if self.TOTEM_ptr is None:
+      self.cluster_ptr.addChild(obj)
+      self.TOTEM_ptr = obj
+
   def hasFenceXVM(self):
     return self.fence_xvmd_ptr is not None
 
@@ -796,6 +825,12 @@
   def getGULMPtr(self):
     return self.GULM_ptr
 
+  def getCMANPtr(self):
+    return self.CMAN_ptr
+
+  def getTotemPtr(self):
+    return self.TOTEM_ptr
+
   def getLockServer(self, name):
     children = self.GULM_ptr.getChildren()
     for child in children:
@@ -839,6 +874,8 @@
     if self.lock_type == DLM_TYPE:
       #remove <cman>
       self.cluster_ptr.removeChild(self.CMAN_ptr)
+      if self.TOTEM_ptr is not None:
+        self.del_totem()
       self.CMAN_ptr = None
 
       #add gulm tag
--- conga/luci/site/luci/Extensions/cluster_adapters.py	2007/02/13 19:50:39	1.227.2.7
+++ conga/luci/site/luci/Extensions/cluster_adapters.py	2007/02/16 02:12:46	1.227.2.8
@@ -29,11 +29,13 @@
 from FenceXVMd import FenceXVMd
 from Script import Script
 from Samba import Samba
+from LVM import LVM
 from QuorumD import QuorumD
 from Heuristic import Heuristic
 from clusterOS import resolveOSType
 from Fence import Fence
 from Method import Method
+from Totem import Totem
 from Device import Device
 from FenceHandler import validateNewFenceDevice, FENCE_OPTS, validateFenceDevice, validate_fenceinstance
 from GeneralError import GeneralError
@@ -1183,6 +1185,377 @@
 			luci_log.debug_verbose('unable to update general properties: %s' % str(e))
 			errors.append('Unable to update the cluster configuration.')
 
+	try:
+		cluster_version = form['cluster_version'].strip()
+		if cluster_version != 'rhel5':
+			raise Exception, 'not rhel5'
+	except:
+		if len(errors) > 0:
+			return (False, {'errors': errors})
+		return (True, {})
+
+#	totem = model.getTotemPtr()
+#	if totem is None:
+#		cp = model.getClusterPtr()
+#		totem = Totem()
+#		cp.addChild(totem)
+	totem = Totem()
+
+	if form.has_key('secauth'):
+		totem.addAttribute('secauth', '1')
+	else:
+		totem.addAttribute('secauth', '0')
+
+	try:
+		rrp_mode = form['rrp_mode'].strip().lower()
+		if not rrp_mode:
+			raise KeyError, 'rrp_mode'
+		if rrp_mode != 'none' and rrp_mode != 'active' and 'rrp_mode' != 'passive':
+			raise Exception, '%s is an invalid value for redundant ring protocol mode' % rrp_mode
+		totem.addAttribute('rrp_mode', str(rrp_mode))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('rrp_mode')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		net_mtu = form['net_mtu'].strip()
+		if not net_mtu:
+			raise KeyError, 'net_mtu'
+		net_mtu = int(net_mtu)
+		if net_mtu < 1:
+			raise ValueError, '%d is an invalid value for network MTU' % net_mtu
+		totem.addAttribute('net_mtu', str(net_mtu))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('net_mtu')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		threads = form['threads'].strip()
+		if not threads:
+			raise KeyError, 'threads'
+		threads = int(threads)
+		if threads < 0:
+			raise ValueError, '%d is an invalid value for number of threads' % threads
+		totem.addAttribute('threads', str(threads))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('threads')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		vsftype = form['vsftype'].strip().lower()
+		if not vsftype:
+			raise KeyError, 'vsftype'
+		if vsftype != 'none' and vsftype != 'ykd':
+			raise ValueError, '%s is an invalid value for virtual synchrony type' % vsftype
+		totem.addAttribute('vsftype', str(vsftype))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('vsftype')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		token = form['token'].strip()
+		if not token:
+			raise KeyError, 'token'
+		token = int(token)
+		if token < 1:
+			raise ValueError, '%d is an invalid value for token timeout' % token
+		totem.addAttribute('token', str(token))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('token')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		token_retransmit = form['token_retransmit'].strip()
+		if not token_retransmit:
+			raise KeyError, 'token_retransmit'
+		token_retransmit = int(token_retransmit)
+		if token_retransmit < 1:
+			raise ValueError, '%d is an invalid value for token retransmit' % token_retransmit
+		totem.addAttribute('token_retransmit', str(token_retransmit))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('token_retransmit')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		hold = form['hold'].strip()
+		if not hold:
+			raise KeyError, 'hold'
+		hold = int(hold)
+		if hold < 1:
+			raise ValueError, '%d is not a valid value for hold token timeout' % hold
+		totem.addAttribute('hold', str(hold))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('hold')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		retransmits_before_loss = form['retransmits_before_loss'].strip()
+		if not retransmits_before_loss:
+			raise KeyError, 'retransmits_before_loss'
+		retransmits_before_loss = int(retransmits_before_loss)
+		if retransmits_before_loss < 1:
+			raise ValueError, '%d is an invalid value for number of retransmits before loss' % retransmits_before_loss
+		totem.addAttribute('retransmits_before_loss', str(retransmits_before_loss))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('retransmits_before_loss')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		join = form['join'].strip()
+		if not join:
+			raise KeyError, 'join'
+		join = int(join)
+		if join < 1:
+			raise ValueError, '%d is an invalid value for join timeout' % join
+		totem.addAttribute('join', str(join))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('join')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		send_join = form['send_join'].strip()
+		if not send_join:
+			raise KeyError, 'send_join'
+		send_join = int(send_join)
+		if send_join < 0:
+			raise ValueError, '%d is an invalid value for time to wait before sending a join message' % send_join
+		totem.addAttribute('send_join', str(send_join))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('send_join')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		consensus = form['consensus'].strip()
+		if not consensus:
+			raise KeyError, 'consensus'
+		consensus = int(consensus)
+		if consensus < 1:
+			raise ValueError, '%d is an invalid value for consensus timeout' % consensus
+		totem.addAttribute('consensus', str(consensus))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('consensus')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		merge = form['merge'].strip()
+		if not merge:
+			raise KeyError, 'merge'
+		merge = int(merge)
+		if merge < 1:
+			raise ValueError, '%d is an invalid value for merge detection timeout' % merge
+		totem.addAttribute('merge', str(merge))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('merge')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		downcheck = form['downcheck'].strip()
+		if not downcheck:
+			raise KeyError, 'downcheck'
+		downcheck = int(downcheck)
+		if downcheck < 1:
+			raise ValueError, '%d is an invalid value for interface down check timeout' % downcheck
+		totem.addAttribute('downcheck', str(downcheck))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('downcheck')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		fail_to_recv_const = form['fail_to_recv_const'].strip()
+		if not fail_to_recv_const:
+			raise KeyError, 'fail_to_recv_const'
+		fail_to_recv_const = int(fail_to_recv_const)
+		if fail_to_recv_const < 1:
+			raise ValueError, '%d is an invalid value for fail to receive constant' % fail_to_recv_const
+		totem.addAttribute('fail_to_recv_const', str(fail_to_recv_const))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('fail_to_recv_const')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		seqno_unchanged_const = form['seqno_unchanged_const'].strip()
+		if not seqno_unchanged_const:
+			raise KeyError, 'seqno_unchanged_const'
+		seqno_unchanged_const = int(seqno_unchanged_const)
+		if seqno_unchanged_const < 1:
+			raise ValueError, '%d is an invalid value for rotations with no multicast traffic before merge detection timeout started' % seqno_unchanged_const
+		totem.addAttribute('seqno_unchanged_const', str(seqno_unchanged_const))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('seqno_unchanged_const')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		heartbeat_failures_allowed = form['heartbeat_failures_allowed'].strip()
+		if not heartbeat_failures_allowed:
+			raise KeyError, 'heartbeat_failures_allowed'
+		heartbeat_failures_allowed = int(heartbeat_failures_allowed)
+		if heartbeat_failures_allowed < 0:
+			raise ValueError, '%d is an invalid value for number of heartbeat failures allowed' % heartbeat_failures_allowed
+		totem.addAttribute('heartbeat_failures_allowed', str(heartbeat_failures_allowed))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('heartbeat_failures_allowed')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		max_network_delay = form['max_network_delay'].strip()
+		if not max_network_delay:
+			raise KeyError, 'max_network_delay'
+		max_network_delay = int(max_network_delay)
+		if max_network_delay < 1:
+			raise ValueError, '%d is an invalid value for maximum network delay' % max_network_delay
+		totem.addAttribute('max_network_delay', str(max_network_delay))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('max_network_delay')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		window_size = form['window_size'].strip()
+		if not window_size:
+			raise KeyError, 'window_size'
+		window_size = int(window_size)
+		if window_size < 1:
+			raise ValueError, '%d is an invalid value for window size' % window_size
+		totem.addAttribute('window_size', str(window_size))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('window_size')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		max_messages = form['max_messages'].strip()
+		if not max_messages:
+			raise KeyError, 'max_messages'
+		max_messages = int(max_messages)
+		if max_messages < 1:
+			raise ValueError, '%d is an invalid value for maximum messages' % max_messages
+		totem.addAttribute('max_messages', str(max_messages))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('max_messages')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		rrp_problem_count_timeout = form['rrp_problem_count_timeout'].strip()
+		if not rrp_problem_count_timeout:
+			raise KeyError, 'rrp_problem_count_timeout'
+		rrp_problem_count_timeout = int(rrp_problem_count_timeout)
+		if rrp_problem_count_timeout < 1:
+			raise ValueError, '%d is an invalid value for RRP problem count timeout' % rrp_problem_count_timeout
+		totem.addAttribute('rrp_problem_count_timeout', str(rrp_problem_count_timeout))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('rrp_problem_count_timeout')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		rrp_problem_count_threshold = form['rrp_problem_count_threshold'].strip()
+		if not rrp_problem_count_threshold:
+			raise KeyError, 'rrp_problem_count_threshold'
+		rrp_problem_count_threshold = int(rrp_problem_count_threshold)
+		if rrp_problem_count_threshold < 1:
+			raise ValueError, '%d is an invalid value for RRP problem count threshold' % rrp_problem_count_threshold
+		totem.addAttribute('rrp_problem_count_threshold', str(rrp_problem_count_threshold))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('rrp_problem_count_threshold')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
+	try:
+		rrp_token_expired_timeout = form['rrp_token_expired_timeout'].strip()
+		if not rrp_token_expired_timeout:
+			raise KeyError, 'rrp_token_expired_timeout'
+		rrp_token_expired_timeout = int(rrp_token_expired_timeout)
+		if rrp_token_expired_timeout < 1:
+			raise ValueError, '%d is an invalid value for RRP token expired timeout' % rrp_token_expired_timeout
+		totem.addAttribute('rrp_token_expired_timeout', str(rrp_token_expired_timeout))
+	except KeyError, e:
+		try:
+			totem.removeAttribute('rrp_token_expired_timeout')
+		except:
+			pass
+	except Exception, e:
+		errors.append(str(e))
+
 	if len(errors) > 0:
 		return (False, {'errors': errors})
 	return (True, {})
@@ -2200,7 +2573,7 @@
 	try:
 		vm_path = request.form['vmpath'].strip()
 		if not vm_path:
-			raise 'blank'
+			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.')
@@ -6524,9 +6897,9 @@
 
 	try:
 		shutdown_wait = int(form['shutdown_wait'].strip())
-		res.addAttribute('shutdown_wait', shutdown_wait)
+		res.addAttribute('shutdown_wait', str(shutdown_wait))
 	except KeyError, e:
-		res.addAttribute('shutdown_wait', 0)
+		res.addAttribute('shutdown_wait', '0')
 	except Exception, e:
 		err = str(e)
 		errors.append(err)
@@ -6623,9 +6996,9 @@
 
 	try:
 		shutdown_wait = int(form['shutdown_wait'].strip())
-		res.addAttribute('shutdown_wait', shutdown_wait)
+		res.addAttribute('shutdown_wait', str(shutdown_wait))
 	except KeyError, e:
-		res.addAttribute('shutdown_wait', 0)
+		res.addAttribute('shutdown_wait', '0')
 	except Exception, e:
 		err = str(e)
 		errors.append(err)
@@ -6722,9 +7095,9 @@
 
 	try:
 		shutdown_wait = int(form['shutdown_wait'].strip())
-		res.addAttribute('shutdown_wait', shutdown_wait)
+		res.addAttribute('shutdown_wait', str(shutdown_wait))
 	except KeyError, e:
-		res.addAttribute('shutdown_wait', 0)
+		res.addAttribute('shutdown_wait', '0')
 	except Exception, e:
 		err = str(e)
 		errors.append(err)
@@ -6821,9 +7194,9 @@
 
 	try:
 		shutdown_wait = int(form['shutdown_wait'].strip())
-		res.addAttribute('shutdown_wait', shutdown_wait)
+		res.addAttribute('shutdown_wait', str(shutdown_wait))
 	except KeyError, e:
-		res.addAttribute('shutdown_wait', 0)
+		res.addAttribute('shutdown_wait', '0')
 	except Exception, e:
 		err = str(e)
 		errors.append(err)
@@ -6930,9 +7303,9 @@
 
 	try:
 		shutdown_wait = int(form['shutdown_wait'].strip())
-		res.addAttribute('shutdown_wait', shutdown_wait)
+		res.addAttribute('shutdown_wait', str(shutdown_wait))
 	except KeyError, e:
-		res.addAttribute('shutdown_wait', 0)
+		res.addAttribute('shutdown_wait', '0')
 	except Exception, e:
 		err = str(e)
 		errors.append(err)
@@ -6942,6 +7315,80 @@
 		return [None, None, errors]
 	return [res, model, None]
 
+def addLVM(request, form=None):
+	errors = list()
+
+	if form is None:
+		form = request.form
+
+	if not form:
+		luci_log.debug_verbose('addLVM0: form is missing')
+		return None
+
+	model = request.SESSION.get('model')
+	if not model:
+		luci_log.debug_verbose('addLVM1: model is missing')
+		return None
+
+	res = None
+	if form.has_key('edit'):
+		try:
+			oldname = form['oldname'].strip()
+			if not oldname:
+				raise Exception, 'oldname is blank.'
+			try:
+				res = getResourceForEdit(model, oldname)
+			except KeyError, e:
+				errors.append('No LVM resource named \"%s\" exists.' % oldname)
+		except Exception, e:
+			errors.append('No original name was found for this LVM resource.')
+			luci_log.debug_verbose('addLVM2: %s' % str(e))
+	else:
+		try:
+			res = LVM()
+			if not res:
+				raise Exception, 'could not create LVM object'
+		except Exception, e:
+			errors.append('An error occurred while creating a LVM resource.')
+			luci_log.debug_verbose('addLVM3: %s' % str(e))
+
+	if not res:
+		return [None, None, errors]
+
+	try:
+		name = form['resourceName'].strip()
+		if not name:
+			raise Exception, 'No name was given for this LVM resource.'
+		res.addAttribute('name', name)
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addLVM4: %s' % err)
+
+	try:
+		vg_name = form['vg_name'].strip()
+		if not vg_name:
+			raise KeyError, 'No volume group name was given.'
+		res.addAttribute('vg_name', vg_name)
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addLVM5: %s' % err)
+
+	try:
+		lv_name = form['lv_name'].strip()
+		if not lv_name:
+			raise KeyError, 'No logical volume name was given.'
+		res.addAttribute('lv_name', lv_name)
+	except Exception, e:
+		err = str(e)
+		errors.append(err)
+		luci_log.debug_verbose('addLVM6: %s' % err)
+
+	if len(errors) > 1:
+		return [None, None, errors]
+	return [res, model, None]
+
 resourceAddHandler = {
 	'ip': addIp,
 	'fs': addFs,
@@ -6955,6 +7402,7 @@
 	'postgres-8': addPostgres8,
 	'apache': addApache,
 	'openldap': addOpenLDAP,
+	'lvm': addLVM,
 	'mysql': addMySQL
 }
 




More information about the Cluster-devel mailing list