From mboxrd@z Thu Jan 1 00:00:00 1970 From: rmccabe@sourceware.org Date: 5 Mar 2008 23:09:00 -0000 Subject: [Cluster-devel] conga/luci cluster/cluster_svc-macros cluster/ ... Message-ID: <20080305230900.13580.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 2008-03-05 23:08:58 Modified files: luci/cluster : cluster_svc-macros resource-form-macros resource_form_handlers.js luci/site/luci/Extensions: LuciClusterActions.py LuciDB.py LuciValidation.py LuciZope.py ResourceHandler.py RicciQueries.py cluster_adapters.py conga_constants.py Added files: luci/site/luci/Extensions/ClusterModel: OracleDB.py SybaseASE.py Log message: Add Sybase resource agent support Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/cluster_svc-macros.diff?cvsroot=cluster&r1=1.5&r2=1.6 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource-form-macros.diff?cvsroot=cluster&r1=1.47&r2=1.48 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/resource_form_handlers.js.diff?cvsroot=cluster&r1=1.43&r2=1.44 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterActions.py.diff?cvsroot=cluster&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciDB.py.diff?cvsroot=cluster&r1=1.11&r2=1.12 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciValidation.py.diff?cvsroot=cluster&r1=1.8&r2=1.9 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciZope.py.diff?cvsroot=cluster&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ResourceHandler.py.diff?cvsroot=cluster&r1=1.6&r2=1.7 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/RicciQueries.py.diff?cvsroot=cluster&r1=1.11&r2=1.12 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.281&r2=1.282 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/conga_constants.py.diff?cvsroot=cluster&r1=1.49&r2=1.50 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/OracleDB.py.diff?cvsroot=cluster&r1=NONE&r2=1.1 http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/SybaseASE.py.diff?cvsroot=cluster&r1=NONE&r2=1.1 --- conga/luci/cluster/cluster_svc-macros 2008/02/27 20:09:19 1.5 +++ conga/luci/cluster/cluster_svc-macros 2008/03/05 23:08:57 1.6 @@ -617,6 +617,9 @@
+ +
+
--- conga/luci/cluster/resource-form-macros 2008/01/02 20:52:22 1.47 +++ conga/luci/cluster/resource-form-macros 2008/03/05 23:08:57 1.48 @@ -146,6 +146,7 @@ + @@ -167,6 +168,7 @@
+
@@ -195,6 +197,7 @@ + @@ -240,6 +243,7 @@
+
@@ -312,7 +316,7 @@ src="/luci/cluster/resource_form_handlers.js"> - + Name - @@ -587,7 +591,7 @@ Name - @@ -709,7 +713,7 @@ Name - @@ -834,7 +838,7 @@ Name - @@ -918,7 +922,7 @@ Name - @@ -1011,7 +1015,7 @@ Name - @@ -1104,7 +1108,7 @@ Name - @@ -1198,7 +1202,7 @@ Name - @@ -1270,7 +1274,7 @@ SAP Instance Name - @@ -1314,6 +1318,141 @@
+
+

Sybase ASE Failover Instance Configuration

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Instance Name + +
+ ASE server name + + +
+ SYBASE home directory + + +
+ Login file + + +
Interfaces file + +
SYBASE_ASE directory name + +
SYBASE_OCS directory name + +
Sybase user + +
Deep probe timeout + +
+
+ +
+
@@ -1357,7 +1496,7 @@ SAP Database Name - @@ -1490,7 +1629,7 @@ Name - @@ -1583,7 +1722,7 @@ Name - @@ -1687,7 +1826,7 @@ Name - @@ -1742,7 +1881,7 @@ Name - @@ -1807,7 +1946,7 @@ Name - --- conga/luci/cluster/resource_form_handlers.js 2008/02/05 19:32:04 1.43 +++ conga/luci/cluster/resource_form_handlers.js 2008/03/05 23:08:57 1.44 @@ -250,6 +250,11 @@ return (errors); } +function validate_sybase(form) { + var errors = new Array(); + return (errors); +} + function validate_sapdatabase(form) { var errors = new Array(); @@ -295,6 +300,7 @@ form_validators['lvm'] = validate_lvm; form_validators['SAPInstance'] = validate_sapinstance; form_validators['SAPDatabase'] = validate_sapdatabase; +form_validators['ASEHAagent'] = validate_sybase; function check_form(form) { var valfn = form_validators[form.type.value]; @@ -302,11 +308,11 @@ return (-1); var errors = valfn(form); if (form.type.value != 'ip') { - if (!form.resourceName || str_is_blank(form.resourceName.value)) { + if (!form.resourcename || str_is_blank(form.resourcename.value)) { errors.push('No resource name was given.'); - set_form_err(form.resourceName); + set_form_err(form.resourcename); } else - clr_form_err(form.resourceName); + clr_form_err(form.resourcename); } return (errors); --- conga/luci/site/luci/Extensions/LuciClusterActions.py 2008/01/23 04:34:09 1.9 +++ conga/luci/site/luci/Extensions/LuciClusterActions.py 2008/03/05 23:08:58 1.10 @@ -12,7 +12,7 @@ from LuciDB import set_node_flag, getRicciAgent, \ getClusterNode, getStorageNode, NodeBusy, \ - setNodeStatus, resolve_nodename, \ + setNodeStatus, resolve_nodename, getCluster, \ delCluster, delClusterSystem, \ CLUSTER_NODE_NEED_AUTH @@ -280,6 +280,8 @@ % (nodename_resolved, clustername)) return None + cluster_obj = getCluster(self, clustername) + try: model.deleteNodeByName(nodename.lower()) except Exception, e: @@ -306,7 +308,7 @@ return None try: - ret = delClusterSystem(self, clustername, nodename_resolved) + ret = delClusterSystem(self, cluster_obj, nodename_resolved) if ret is not None: raise Exception, ret except Exception, e: @@ -332,6 +334,8 @@ nodename_resolved, delete_cluster=False): + cluster_obj = getCluster(self, clustername) + # We need to get a node name other than the node # to be deleted, then delete the node from the cluster.conf # and propogate it. We will need two ricci agents for this task, @@ -405,7 +409,7 @@ return None try: - ret = delClusterSystem(self, clustername, nodename_resolved) + ret = delClusterSystem(self, cluster_obj, nodename_resolved) if ret is not None: raise Exception, ret except Exception, e: @@ -529,15 +533,6 @@ luci_log.debug_verbose('ClusterDelete0: %r %s' % (e, str(e))) return None - # Try to stop all the cluster nodes before deleting any. - num_errors = ClusterStop(self, model, delete=False) - if num_errors > 0: - if LUCI_DEBUG_MODE is True: - luci_log.debug_verbose('ClusterDelete1: %s: %d errors' \ - % (clustername, num_errors)) - return None - - # If the cluster is stopped, delete all of the nodes. num_errors = ClusterStop(self, model, delete=True) if num_errors > 0: if LUCI_DEBUG_MODE is True: --- conga/luci/site/luci/Extensions/LuciDB.py 2008/02/06 21:15:06 1.11 +++ conga/luci/site/luci/Extensions/LuciDB.py 2008/03/05 23:08:58 1.12 @@ -1,4 +1,4 @@ -# Copyright (C) 2006-2007 Red Hat, Inc. +# Copyright (C) 2006-2008 Red Hat, Inc. # # This program is free software; you can redistribute # it and/or modify it under the terms of version 2 of the @@ -667,10 +667,11 @@ error_list = list() for i in csystems: - err = delClusterSystem(self, cluster, i[0]) + cur_sysname = str(i[0]) + err = delClusterSystem(self, cluster, cur_sysname) if err: error_list.append('Unable to delete the cluster system %s: %s\n' \ - % (i[0], err)) + % (cur_sysname, err)) if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('delCluSystems2: %s' % err) return ''.join(error_list) --- conga/luci/site/luci/Extensions/LuciValidation.py 2008/02/08 21:47:56 1.8 +++ conga/luci/site/luci/Extensions/LuciValidation.py 2008/03/05 23:08:58 1.9 @@ -332,7 +332,7 @@ try: if res_type == 'ip': - dummy_form['resourceName'] = dummy_form['ip_address'] + dummy_form['resourcename'] = dummy_form['ip_address'] except Exception, e: if LUCI_DEBUG_MODE is True: luci_log.debug_verbose('vSA3a: type is ip but no addr: %r %s' \ @@ -341,7 +341,7 @@ try: if dummy_form.has_key('immutable'): - newRes = model.getResourceByName(dummy_form['resourceName']) + newRes = model.getResourceByName(dummy_form['resourcename']) resObj = RefObject(newRes) resObj.setRef(newRes.getName()) else: @@ -470,6 +470,8 @@ try: res = create_resource(res_type, request.form, model) except Exception, e: + if LUCI_DEBUG_MODE is True: + luci_log.debug_verbose('VRA1: create res: %r %s' % (e, str(e))) return (False, { 'errors': e[0] } ) resname = '' --- conga/luci/site/luci/Extensions/LuciZope.py 2008/02/08 21:47:56 1.9 +++ conga/luci/site/luci/Extensions/LuciZope.py 2008/03/05 23:08:58 1.10 @@ -148,6 +148,21 @@ ret[i] = pval return ret +def GetFormVars(req, varlist): + ret = {} + from types import ListType + + for i in varlist: + pval = None + if req and req.has_key(i): + pval = req[i] + if type(req[i]) is not ListType: + pval = req[i].strip() + if not pval: + pval = None + ret[i] = pval + return ret + def getClusterURL(self, request, model): try: clustername = request['clustername'].strip() --- conga/luci/site/luci/Extensions/ResourceHandler.py 2008/01/23 04:34:09 1.6 +++ conga/luci/site/luci/Extensions/ResourceHandler.py 2008/03/05 23:08:58 1.7 @@ -21,6 +21,10 @@ from ClusterModel.MySQL import MySQL from ClusterModel.SAPDatabase import SAPDatabase from ClusterModel.SAPInstance import SAPInstance +from ClusterModel.OracleDB import OracleDB +from ClusterModel.SybaseASE import SybaseASE + +from LuciZope import GetFormVars from LuciSyslog import get_logger from conga_constants import LUCI_DEBUG_MODE @@ -736,23 +740,77 @@ luci_log.debug_verbose('addSAPI1: %s %s' % (param, err)) return errors +def config_resource(params, res, rname, form): + errors = list() + + fvar = GetFormVars(form, map(lambda x: x[0], params)) + for i in params: + name = i[0] + val = fvar[name] + required = i[2] + default_val = i[3] + + if val is None: + if required is True: + if default_val is None: + errors.append('No value for %s was given for resource "%s"' % (i[1], rname)) + else: + res.addAttribute(name, default_val) + else: + try: + res.removeAttribute(name) + except: + pass + else: + res.addAttribute(name, val) + return errors + +def addSybaseASE(res, rname, form, model): + # parameter (str), short desc (str), required (bool), default (str or None) + params = ( + ('sybase_home', 'SYBASE home directory', True, None), + ('server_name', 'ASE server name', True, None), + ('login_file', 'Login file', True, None), + ('interfaces_file', 'Interfaces file', True, None), + ('sybase_ase', 'SYBASE_ASE directory name', True, 'ASE-15_0'), + ('sybase_ocs', 'SYBASE_OCS directory name', True, 'OCS-15_0'), + ('sybase_user', 'Sybase user', True, 'sybase'), + ('shutdown_timeout', 'Shutdown timeout value', True, '0'), + ('start_timeout', 'Start timeout value', True, '0'), + ('deep_probe_timeout', 'Deep probe timeout value', True, '0') + ) + errors = config_resource(params, res, rname, form) + return errors + +def addOracleDB(res, rname, form, model): + params = ( + ('user', 'Oracle User Name', True, None), + ('home', 'Oracle Home Directory', True, None), + ('type', 'Oracle Installation Type', True, None), + ('vhost', 'Virtual Hostname', False, None) + ) + errors = config_resource(params, res, rname, form) + return errors + resource_table = { - 'ip': [ addIp, Ip ], - 'fs': [ addFs, Fs ], - 'gfs': [ addClusterfs, Clusterfs ], - 'nfsm': [ addNetfs, Netfs ], - 'nfsx': [ addNFSExport, NFSExport ], - 'nfsc': [ addNFSClient, NFSClient ], - 'scr': [ addScript, Script ], - 'smb': [ addSamba, Samba ], - 'tomcat-5': [ addTomcat5, Tomcat5 ], - 'postgres-8': [ addPostgres8, Postgres8 ], - 'apache': [ addApache, Apache ], - 'openldap': [ addOpenLDAP, OpenLDAP ], - 'lvm': [ addLVM, LVM ], - 'mysql': [ addMySQL, MySQL ], - 'SAPDatabase': [ addSAPDatabase, SAPDatabase ], - 'SAPInstance': [ addSAPInstance, SAPInstance ] + 'ip': ( addIp, Ip ), + 'fs': ( addFs, Fs ), + 'gfs': ( addClusterfs, Clusterfs ), + 'nfsm': ( addNetfs, Netfs ), + 'nfsx': ( addNFSExport, NFSExport ), + 'nfsc': ( addNFSClient, NFSClient ), + 'scr': ( addScript, Script ), + 'smb': ( addSamba, Samba ), + 'tomcat-5': ( addTomcat5, Tomcat5 ), + 'postgres-8': ( addPostgres8, Postgres8 ), + 'apache': ( addApache, Apache ), + 'openldap': ( addOpenLDAP, OpenLDAP ), + 'lvm': ( addLVM, LVM ), + 'mysql': ( addMySQL, MySQL ), + 'SAPDatabase': ( addSAPDatabase, SAPDatabase ), + 'SAPInstance': ( addSAPInstance, SAPInstance ), + 'oracledb': ( addOracleDB, OracleDB ), + 'ASEHAagent': ( addSybaseASE, SybaseASE ) } def create_resource(res_type, form, model): @@ -779,9 +837,9 @@ res = resource_table[res_type][1]() if res_type != 'ip': - if not form.has_key('resourceName') or not form['resourceName'].strip(): + if not form.has_key('resourcename') or not form['resourcename'].strip(): raise Exception, [ 'All resources must have a unique name.' ] - rname = form['resourceName'].strip() + rname = form['resourcename'].strip() res.addAttribute('name', rname) else: rname = form['ip_address'].strip() --- conga/luci/site/luci/Extensions/RicciQueries.py 2008/01/25 00:36:59 1.11 +++ conga/luci/site/luci/Extensions/RicciQueries.py 2008/03/05 23:08:58 1.12 @@ -121,7 +121,6 @@ batch.append('') return ''.join(batch) -## return minidom.parseString(''.join(batch)).firstChild def createClusterBatch( os_str, cluster_name, --- conga/luci/site/luci/Extensions/cluster_adapters.py 2008/01/25 00:36:59 1.281 +++ conga/luci/site/luci/Extensions/cluster_adapters.py 2008/03/05 23:08:58 1.282 @@ -24,7 +24,7 @@ from conga_constants import BATCH_ID, CLUNODE_CREATE_ERRORS, \ CLUSTER_ADD, CLUSTER_CONFIG, CLUSTER_DAEMON, CLUSTER_DELETE, \ CLUSTER_FOLDER_PATH, CLUSTER_RESTART, CLUSTER_START, CLUSTER_STOP, \ - DISABLE_SVC_TASK, ENABLE_SVC_TASK, FDOM, FENCEDEV, \ + CLUSTER_DELETE2, DISABLE_SVC_TASK, ENABLE_SVC_TASK, FDOM, FENCEDEV, \ FENCEDEV_NODE_CONFIG, FENCEDEVS, FLAG_DESC, INSTALL_TASK, CLUSTER_PROCESS, \ LAST_STATUS, LUCI_DEBUG_MODE, NODE, NODE_ADD, NODE_DELETE, \ NODE_FENCE, NODE_FORCE_DELETE, NODE_JOIN_CLUSTER, NODE_LEAVE_CLUSTER, \ @@ -1271,6 +1271,12 @@ % (baseurl, CLUSTER_PROCESS, cluname, CLUSTER_START)) return elif task == CLUSTER_DELETE: + from LuciClusterActions import ClusterStop + ClusterStop(self, model) + request.RESPONSE.redirect('%s?pagetype=%s&clustername=%s&task=%s&busyfirst=true' \ + % (baseurl, CLUSTER_PROCESS, cluname, CLUSTER_DELETE2)) + return + elif task == CLUSTER_DELETE2: from LuciClusterActions import ClusterDelete ret = ClusterDelete(self, model) if LUCI_DEBUG_MODE is True: --- conga/luci/site/luci/Extensions/conga_constants.py 2008/02/08 21:47:56 1.49 +++ conga/luci/site/luci/Extensions/conga_constants.py 2008/03/05 23:08:58 1.50 @@ -64,6 +64,7 @@ CLUSTER_START = '1001' CLUSTER_RESTART = '1002' CLUSTER_DELETE = '1003' +CLUSTER_DELETE2 = '1004' # Node tasks NODE_LEAVE_CLUSTER = '100' /cvs/cluster/conga/luci/site/luci/Extensions/ClusterModel/OracleDB.py,v --> standard output revision 1.1 --- conga/luci/site/luci/Extensions/ClusterModel/OracleDB.py +++ - 2008-03-05 23:09:00.121552000 +0000 @@ -0,0 +1,18 @@ +# Copyright (C) 2008 Red Hat, Inc. +# +# This program is free software; you can redistribute +# it and/or modify it under the terms of version 2 of the +# GNU General Public License as published by the +# Free Software Foundation. + +from BaseResource import BaseResource +from gettext import gettext as _ + +TAG_NAME = 'oracledb' +RESOURCE_TYPE = _('Oracle 10g Failover Instance') + +class OracleDB(BaseResource): + def __init__(self): + BaseResource.__init__(self) + self.TAG_NAME = TAG_NAME + self.resource_type = RESOURCE_TYPE /cvs/cluster/conga/luci/site/luci/Extensions/ClusterModel/SybaseASE.py,v --> standard output revision 1.1 --- conga/luci/site/luci/Extensions/ClusterModel/SybaseASE.py +++ - 2008-03-05 23:09:00.215586000 +0000 @@ -0,0 +1,18 @@ +# Copyright (C) 2008 Red Hat, Inc. +# +# This program is free software; you can redistribute +# it and/or modify it under the terms of version 2 of the +# GNU General Public License as published by the +# Free Software Foundation. + +from BaseResource import BaseResource +from gettext import gettext as _ + +TAG_NAME = 'ASEHAagent' +RESOURCE_TYPE = _('Sybase ASE Failover Instance') + +class SybaseASE(BaseResource): + def __init__(self): + BaseResource.__init__(self) + self.TAG_NAME = TAG_NAME + self.resource_type = RESOURCE_TYPE