epics/Archiver Appliance インストールメモ: deployMultipleTomcats.py

File deployMultipleTomcats.py, 7.9 KB (added by shuei, 2 months ago)
Line 
1#!/usr/bin/env python
2
3# This script deploys a archiver appliance build onto a appliance into four separate JVM's as per the documentation.
4# The artifacts from the build are four war files that are independent of each other.
5# One can choose to deploy all of these on one JVM; however, as the archiver appliance is a fairly memory intensive application; this can adversely impact GC on the single JVM.
6# Also, one does not want a large user retrieval to affect the engine or ETL.
7# Therefore, there are some advantages to deploying each war file on a separate JVM.
8
9# This script uses TOMCAT_HOME to determine the source of the Tomcat distribution.
10# It then makes four subfolders in the specified folder, one each for the mgmt, engine, etl and retrieval webapps.
11# It copies over the necessary content from the source into each of these subfolders and adjusts the configuration as necessary.
12# It then deploys the war files into the appropriate tomcats.
13# The war files are assumed to be in the parent folder; however you can use an option to override this.
14
15# This is the just the deployment step; you can then have individual /etc/init.d scripts (or use commons daemon) to start the four webapps.
16# So your deployment script should be something like 1) Stop webapps 2) Deploy webapps using this script 3) Start webapps.
17
18# The appliance port configuration is determined from appliances.xml as specified in the ARCHAPPL_APPLIANCES environment variable.
19# The identity for this appliance is determined from the ARCHAPPL_MYIDENTITY environment variable and ise used to lookup the parameters for this appliance in appliances.xml.
20# The tomcat start/stop ports are set by incrementing the port specified in the source for each of the webapps.
21
22# To generate start and stop script use something like this
23# export CATALINA_HOME=$TOMCAT_HOME
24# DEPLOY_DIR=/opt/local/ArchiverAppliance/tomcats
25# The stop sequences....
26# export CATALINA_BASE=${DEPLOY_DIR}/mgmt; ${CATALINA_HOME}/bin/catalina.sh stop
27# export CATALINA_BASE=${DEPLOY_DIR}/engine; ${CATALINA_HOME}/bin/catalina.sh stop
28# export CATALINA_BASE=${DEPLOY_DIR}/etl; ${CATALINA_HOME}/bin/catalina.sh stop
29# export CATALINA_BASE=${DEPLOY_DIR}/retrieval; ${CATALINA_HOME}/bin/catalina.sh stop
30# The start sequences
31# export CATALINA_BASE=${DEPLOY_DIR}/mgmt; ${CATALINA_HOME}/bin/catalina.sh start
32# export CATALINA_BASE=${DEPLOY_DIR}/engine; ${CATALINA_HOME}/bin/catalina.sh start
33# export CATALINA_BASE=${DEPLOY_DIR}/etl; ${CATALINA_HOME}/bin/catalina.sh start
34# export CATALINA_BASE=${DEPLOY_DIR}/retrieval; ${CATALINA_HOME}/bin/catalina.sh start
35
36
37
38import sys
39import os
40import xml.dom.minidom
41#import urlparse
42from urllib.parse import urlparse
43import shutil
44
45def deployMultipleTomcats(destFolder):
46    tomcatHome = os.getenv("TOMCAT_HOME")
47    if tomcatHome == None:
48        print("We determine the source Tomcat distribution using the environment variable TOMCAT_HOME which does not seem to be set.")
49        sys.exit(1)
50    thisAppliance = os.getenv("ARCHAPPL_MYIDENTITY")
51    if thisAppliance == None:
52        print("We determine the identity of this appliance using the environment variable ARCHAPPL_MYIDENTITY which does not seem to be set.")
53        sys.exit(1)
54    appliancesXML = os.getenv("ARCHAPPL_APPLIANCES")
55    if appliancesXML == None:
56        print("We determine the location of the appliances.xml file using the environment variable ARCHAPPL_APPLIANCES which does not seem to be set.")
57        sys.exit(1)
58
59    print("Using\n\ttomcat installation at", tomcatHome, "\n\tto generate deployments for appliance", thisAppliance, "\n\tusing configuration info from", appliancesXML, "\n\tinto folder", destFolder)
60   
61    # Parse the tomcat/conf/server.xml file and determine the stop start port
62    # We start incrementing and use this port+1 for each of the new webapps
63    tomcatServerConfSrc = tomcatHome + '/conf/server.xml'
64    serverdom = xml.dom.minidom.parse(tomcatServerConfSrc);
65    serverStopStartPort = serverdom.getElementsByTagName('Server').item(0).getAttribute('port')
66    if int(serverStopStartPort) == 8005:
67        print("The start/stop port is the standard Tomcat start/stop port. Changing it to something else random - 16000")
68        serverStopStartPort='16000'
69    newServerStopStartPort = int(serverStopStartPort)+1
70    print('The stop/start ports for the new instance will being at ', newServerStopStartPort)
71   
72    # Parse the appliances.xml and determine the ports for the HTTP listeners
73    appliancesXMLDOM =  xml.dom.minidom.parse(appliancesXML)
74    appliances = appliancesXMLDOM.getElementsByTagName('appliance')
75    for appliance in appliances:
76        identity = appliance.getElementsByTagName('identity').item(0).firstChild.data
77        if identity != thisAppliance:
78            # print "Skipping config for", appliance, " looking for ", thisAppliance
79            continue
80        httplistenerports = {}
81        mgmtUrl = appliance.getElementsByTagName('mgmt_url').item(0).firstChild.data
82        engineUrl = appliance.getElementsByTagName('engine_url').item(0).firstChild.data
83        etlUrl = appliance.getElementsByTagName('etl_url').item(0).firstChild.data
84        retrievalUrl = appliance.getElementsByTagName('retrieval_url').item(0).firstChild.data
85
86        httplistenerports['mgmt'] = urlparse(mgmtUrl).port
87        httplistenerports['engine'] = urlparse(engineUrl).port
88        httplistenerports['etl'] = urlparse(etlUrl).port
89        httplistenerports['retrieval'] = urlparse(retrievalUrl).port
90       
91        for app in ['mgmt', 'engine', 'etl', 'retrieval']:
92            # Delete any existing subfolders if any and make new ones.
93            subFolder = destFolder + '/' + app
94            if os.access(subFolder, os.W_OK):
95                print("Removing ", subFolder)
96                shutil.rmtree(subFolder)
97            print("Generating tomcat folder for ", app, " in location", subFolder)
98            os.makedirs(subFolder)
99            # See http://kief.com/running-multiple-tomcat-instances-on-one-server.html for the steps we are using here.
100            shutil.copytree(tomcatHome + '/conf', subFolder + '/conf')
101            shutil.copytree(tomcatHome + '/webapps', subFolder + '/webapps')
102            os.makedirs(subFolder + '/logs')
103            os.makedirs(subFolder + '/temp')
104            os.makedirs(subFolder + '/work')
105           
106            # print 'StopStart for', app, ' is', newServerStopStartPort, "and the HTTP listener port as determined from appliances.xml is", httplistenerports[app]
107            newServerDom = xml.dom.minidom.parse(subFolder + '/conf/server.xml')
108            newServerDom.getElementsByTagName('Server').item(0).setAttribute('port', str(newServerStopStartPort))
109            # Find the 'Connector' whose 'protocol' is 'HTTP/1.1'
110            haveSetConnector = False
111            for httplistenerNode in newServerDom.getElementsByTagName('Connector'):
112                if httplistenerNode.hasAttribute('protocol') and httplistenerNode.getAttribute('protocol') == 'HTTP/1.1':
113                    httplistenerNode.setAttribute('port', str(httplistenerports[app]))
114                    haveSetConnector = True
115                else:
116                    print("Commenting connector with protocol ", httplistenerNode.getAttribute('protocol'), ". If you do need this connector, you should un-comment this.")
117                    comment = httplistenerNode.ownerDocument.createComment(httplistenerNode.toxml())
118                    httplistenerNode.parentNode.replaceChild(comment, httplistenerNode)
119                if haveSetConnector == False:
120                    raise AssertionError("We have not set the HTTP listener port for " + app);
121           
122
123            with open(subFolder + '/conf/server.xml', 'w') as file:
124                newServerDom.writexml(file)
125            newServerStopStartPort =  newServerStopStartPort+1
126
127if __name__ == "__main__":
128    if len(sys.argv) < 2:
129        print("Usage: ", sys.argv[0], "<DeploymentFolder>")
130        sys.exit(1)
131    deployMultipleTomcats(sys.argv[1])
132
133
134