diff -urN a/luci/cluster/cluster_svc-macros b/luci/cluster/cluster_svc-macros --- a/luci/cluster/cluster_svc-macros 2009-05-21 09:35:23.000000000 -0400 +++ b/luci/cluster/cluster_svc-macros 2010-11-17 02:46:50.000000000 -0500 @@ -554,6 +554,12 @@ <tal:block tal:condition="python: type == 'oracledb'"> <div metal:use-macro="here/resource-form-macros/macros/oracledb_macro" /> </tal:block> + <tal:block tal:condition="python: type == 'oralistener'"> + <div metal:use-macro="here/resource-form-macros/macros/oralistener_macro" /> + </tal:block> + <tal:block tal:condition="python: type == 'orainstance'"> + <div metal:use-macro="here/resource-form-macros/macros/orainstance_macro" /> + </tal:block> </div> <div metal:define-macro="failover-prefs-macro" tal:omit-tag=""> diff -urN a/luci/cluster/resource_form_handlers.js b/luci/cluster/resource_form_handlers.js --- a/luci/cluster/resource_form_handlers.js 2010-11-17 02:46:13.000000000 -0500 +++ b/luci/cluster/resource_form_handlers.js 2010-11-17 02:46:50.000000000 -0500 @@ -307,6 +307,8 @@ form_validators['SAPDatabase'] = validate_sapdatabase; form_validators['ASEHAagent'] = validate_sybase; form_validators['oracledb'] = validate_oracle; +form_validators['orainstance'] = validate_oracle; +form_validators['oralistener'] = validate_oracle; function check_form(form) { var valfn = form_validators[form.type.value]; diff -urN a/luci/cluster/resource-form-macros b/luci/cluster/resource-form-macros --- a/luci/cluster/resource-form-macros 2010-11-17 02:46:13.000000000 -0500 +++ b/luci/cluster/resource-form-macros 2010-11-17 02:56:54.000000000 -0500 @@ -173,6 +173,10 @@ <option name="ASEHAagent" value="ASEHAagent">Sybase ASE Failover Instance</option> </tal:block> <option name="oracledb" value="oracledb">Oracle 10g Failover Instance</option> + <tal:block tal:condition="python:clusterinfo and clusterinfo.get('has_split_oracle_agents') == True"> + <option name="orainstance" value="orainstance">Oracle DB Agent</option> + <option name="oralistener" value="oralistener">Oracle Listener Agent</option> + </tal:block> </select> </form> @@ -196,6 +200,8 @@ <div metal:use-macro="here/resource-form-macros/macros/SAPDatabase_macro" /> <div metal:use-macro="here/resource-form-macros/macros/ASEHAagent_macro" /> <div metal:use-macro="here/resource-form-macros/macros/oracledb_macro" /> + <div metal:use-macro="here/resource-form-macros/macros/orainstance_macro" /> + <div metal:use-macro="here/resource-form-macros/macros/oralistener_macro" /> </div> </div> @@ -230,6 +236,10 @@ </tal:block> <option name="oracledb" value="oracledb">Oracle 10g Failover Instance</option> + <tal:block tal:condition="python:clusterinfo and clusterinfo.get('has_split_oracle_agents') == True"> + <option name="orainstance" value="orainstance">Oracle DB Agent</option> + <option name="oralistener" value="oralistener">Oracle Listener Agent</option> + </tal:block> </select> </form> @@ -277,6 +287,8 @@ <div metal:use-macro="here/resource-form-macros/macros/SAPDatabase_macro" /> <div metal:use-macro="here/resource-form-macros/macros/ASEHAagent_macro" /> <div metal:use-macro="here/resource-form-macros/macros/oracledb_macro" /> + <div metal:use-macro="here/resource-form-macros/macros/orainstance_macro" /> + <div metal:use-macro="here/resource-form-macros/macros/oralistener_macro" /> </div> </div> @@ -1559,6 +1571,168 @@ </form> </div> +<div class="rescfg" name="orainstance" + tal:attributes="id res/name | nothing" metal:define-macro="orainstance_macro"> + <p class="reshdr">Oracle 10g Failover Instance</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="orainstance" /> + + <table class="systemsTable"> + <tr class="systemsTable"> + <td class="systemsTable">Instance name (SID) of Oracle instance</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">Oracle user name</td> + <td class="systemsTable"> + <input type="text" size="20" name="user" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/user | nothing" /> + </td> + </tr> + <tr class="systemsTable"> + <td class="systemsTable">Oracle application home directory</td> + <td class="systemsTable"> + <input type="text" size="20" name="home" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/home | nothing" /> + </td> + </tr> + <tr class="systemsTable"> + <td class="systemsTable">List of Oracle listeners (optional, separated by spaces)</td> + <td class="systemsTable"> + <input type="text" size="20" name="listeners" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/listeners | nothing" /> + </td> + </tr> + <tr class="systemsTable"> + <td class="systemsTable">Path to lock file (optional)</td> + <td class="systemsTable"> + <input type="text" size="20" name="lockfile" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/lockfile | nothing" /> + </td> + </tr> + </table> + + <div metal:use-macro="here/resource-form-macros/macros/res_form_footer" /> + </form> +</div> + +<div class="rescfg" name="oralistener" + tal:attributes="id res/name | nothing" metal:define-macro="oralistener_macro"> + <p class="reshdr">Oracle 10g Listener Instance</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="oralistener" /> + + <table class="systemsTable"> + <tr class="systemsTable"> + <td class="systemsTable">Listener 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">Oracle user name</td> + <td class="systemsTable"> + <input type="text" size="20" name="user" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/user | nothing" /> + </td> + </tr> + <tr class="systemsTable"> + <td class="systemsTable">Oracle application home directory</td> + <td class="systemsTable"> + <input type="text" size="20" name="home" + tal:attributes=" + disabled python: editDisabled; + value res/attrs/home | nothing" /> + </td> + </tr> + </table> + + <div metal:use-macro="here/resource-form-macros/macros/res_form_footer" /> + </form> +</div> + <div class="rescfg" name="ASEHAagent" tal:attributes="id res/name | nothing" metal:define-macro="ASEHAagent_macro"> <p class="reshdr">Sybase ASE Failover Instance Configuration</p> diff -urN a/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py b/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py --- a/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2010-11-17 02:46:13.000000000 -0500 +++ b/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2010-11-17 02:53:51.000000000 -0500 @@ -35,6 +35,8 @@ from SAPInstance import SAPInstance from SybaseASE import SybaseASE from OracleDB import OracleDB +from OracleInstance import OracleInstance +from OracleListener import OracleListener from Multicast import Multicast from FenceDaemon import FenceDaemon from FenceXVMd import FenceXVMd @@ -97,6 +99,8 @@ 'SAPInstance': SAPInstance, 'ASEHAagent': SybaseASE, 'oracledb': OracleDB, + 'orainstance': OracleInstance, + 'oralistener': OracleListener, 'device': Device } diff -urN a/luci/site/luci/Extensions/ClusterModel/OracleInstance.py b/luci/site/luci/Extensions/ClusterModel/OracleInstance.py --- a/luci/site/luci/Extensions/ClusterModel/OracleInstance.py 1969-12-31 19:00:00.000000000 -0500 +++ b/luci/site/luci/Extensions/ClusterModel/OracleInstance.py 2010-11-17 02:46:50.000000000 -0500 @@ -0,0 +1,18 @@ +# Copyright (C) 2010 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 = 'orainstance' +RESOURCE_TYPE = _('Oracle 10g Failover Instance') + +class OracleInstance(BaseResource): + def __init__(self): + BaseResource.__init__(self) + self.TAG_NAME = TAG_NAME + self.resource_type = RESOURCE_TYPE diff -urN a/luci/site/luci/Extensions/ClusterModel/OracleListener.py b/luci/site/luci/Extensions/ClusterModel/OracleListener.py --- a/luci/site/luci/Extensions/ClusterModel/OracleListener.py 1969-12-31 19:00:00.000000000 -0500 +++ b/luci/site/luci/Extensions/ClusterModel/OracleListener.py 2010-11-17 02:46:50.000000000 -0500 @@ -0,0 +1,18 @@ +# Copyright (C) 2010 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 = 'oralistener' +RESOURCE_TYPE = _('Oracle 10g Listener Instance') + +class OracleListener(BaseResource): + def __init__(self): + BaseResource.__init__(self) + self.TAG_NAME = TAG_NAME + self.resource_type = RESOURCE_TYPE diff -urN a/luci/site/luci/Extensions/LuciClusterInfo.py b/luci/site/luci/Extensions/LuciClusterInfo.py --- a/luci/site/luci/Extensions/LuciClusterInfo.py 2010-11-17 02:46:13.000000000 -0500 +++ b/luci/site/luci/Extensions/LuciClusterInfo.py 2010-11-17 02:46:50.000000000 -0500 @@ -606,6 +606,7 @@ clumap['sap_agent_v19'] = False clumap['has_qemu'] = False clumap['has_sybase_agent'] = False + clumap['has_split_oracle_agents'] = False try: cluster_os = model.getClusterOS() if cluster_os.find('Tikanga') != -1: @@ -622,6 +623,8 @@ if os_minor > 3: clumap['sap_agent_v19'] = True clumap['has_qemu'] = True + if os_minor > 5: + clumap['has_split_oracle_agents'] = True elif cluster_os.find('Nahant') != -1: clumap['os_major'] = 4 os_minor = int(cluster_os[cluster_os.find('Update ') + 7]) diff -urN a/luci/site/luci/Extensions/ResourceHandler.py b/luci/site/luci/Extensions/ResourceHandler.py --- a/luci/site/luci/Extensions/ResourceHandler.py 2010-11-17 02:46:13.000000000 -0500 +++ b/luci/site/luci/Extensions/ResourceHandler.py 2010-11-17 02:46:50.000000000 -0500 @@ -22,6 +22,8 @@ from ClusterModel.SAPDatabase import SAPDatabase from ClusterModel.SAPInstance import SAPInstance from ClusterModel.OracleDB import OracleDB +from ClusterModel.OracleInstance import OracleInstance +from ClusterModel.OracleListener import OracleListener from ClusterModel.SybaseASE import SybaseASE from LuciZope import GetFormVars @@ -817,25 +819,45 @@ res.addAttribute('type', dbtype) return errors +def addOracleInstance(res, rname, form, model): + params = ( + ('user', 'Oracle User Name', True, None), + ('home', 'Oracle Home Directory', True, None), + ('listeners', 'Oracle listeners', False, None), + ('lockfile', 'Path to lock file', False, None), + ) + errors = config_resource(params, res, rname, form) + return errors + +def addOracleListener(res, rname, form, model): + params = ( + ('user', 'Oracle User Name', True, None), + ('home', 'Oracle Home Directory', True, 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 ), - 'oracledb': ( addOracleDB, OracleDB ), - 'ASEHAagent': ( addSybaseASE, SybaseASE ) + '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 ), + 'orainstance': ( addOracleInstance, OracleInstance ), + 'oralistener': ( addOracleListener, OracleListener ), + 'ASEHAagent': ( addSybaseASE, SybaseASE ) } def create_resource(res_type, form, model):