Skip to content

Commit 37287ca

Browse files
authored
Merge pull request #199 from oracle/feature/dynamic-cluster
Feature/dynamic cluster
2 parents dea3092 + 4a16532 commit 37287ca

32 files changed

+3037
-500
lines changed

kubernetes/create-weblogic-domain-inputs.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ domainName: base_domain
1414
# This id must be lowercase and unique across all domains in a Kubernetes cluster.
1515
#domainUID: domain1
1616

17+
# Type of WebLogic Cluster
18+
# Legal values are "CONFIGURED" or "DYNAMIC"
19+
clusterType: DYNAMIC
20+
1721
# Determines which WebLogic Servers the Operator will start up
1822
# Legal values are "NONE", "ALL", "ADMIN", "SPECIFIED", or "AUTO"
1923
startupControl: AUTO

kubernetes/internal/create-weblogic-domain-job-template.yaml

Lines changed: 47 additions & 281 deletions
Original file line numberDiff line numberDiff line change
@@ -104,241 +104,9 @@ data:
104104
105105
export DOMAIN_HOME=${SHARED_PATH}/domain/%DOMAIN_NAME%
106106
107-
# Function to create node manager home for a server
108-
# $1 - Domain UID
109-
# $2 - Server Name
110-
# $3 - Admin Server Hostname (only passed for managed servers)
111-
function createNodeMgrHome() {
112-
113-
# Create startup.properties file
114-
datadir=${DOMAIN_HOME}/servers/$2/data/nodemanager
115-
startProp=${datadir}/startup.properties
116-
createFolder ${datadir}
117-
echo "# Server startup properties" > ${startProp}
118-
echo "AutoRestart=true" >> ${startProp}
119-
if [ -n "$3" ]; then
120-
echo "AdminURL=http\://$3\:%ADMIN_PORT%" >> ${startProp}
121-
fi
122-
echo "RestartMax=2" >> ${startProp}
123-
echo "RotateLogOnStartup=false" >> ${startProp}
124-
echo "RotationType=bySize" >> ${startProp}
125-
echo "RotationTimeStart=00\:00" >> ${startProp}
126-
echo "RotatedFileCount=100" >> ${startProp}
127-
echo "RestartDelaySeconds=0" >> ${startProp}
128-
echo "FileSizeKB=5000" >> ${startProp}
129-
echo "FileTimeSpanFactor=3600000" >> ${startProp}
130-
echo "RestartInterval=3600" >> ${startProp}
131-
echo "NumberOfFilesLimited=true" >> ${startProp}
132-
echo "FileTimeSpan=24" >> ${startProp}
133-
echo "NMHostName=$1-$2" >> ${startProp}
134-
135-
# Create nodemanager home for the server
136-
nmdir=${DOMAIN_HOME}/servers/$2/nodemgr_home
137-
createFolder ${nmdir}
138-
prop=${nmdir}/nodemanager.properties
139-
cp ${DOMAIN_HOME}/nodemanager/nodemanager.properties ${nmdir}
140-
cp ${DOMAIN_HOME}/nodemanager/nodemanager.domains ${nmdir}
141-
cp ${DOMAIN_HOME}/bin/startNodeManager.sh ${nmdir}
142-
143-
# Edit the start nodemanager script to use the home for the server
144-
sed -i -e "s:/nodemanager:/servers/$2/nodemgr_home:g" ${nmdir}/startNodeManager.sh
145-
146-
# Edit the nodemanager properties file to use the home for the server
147-
sed -i -e "s:DomainsFile=.*:DomainsFile=${nmdir}/nodemanager.domains:g" ${prop}
148-
sed -i -e "s:NodeManagerHome=.*:NodeManagerHome=${nmdir}:g" ${prop}
149-
sed -i -e "s:ListenAddress=.*:ListenAddress=$1-$2:g" ${prop}
150-
sed -i -e "s:LogFile=.*:LogFile=/shared/logs/nodemanager-$2.log:g" ${prop}
151-
152-
}
153-
154-
# Function to create script for starting a server
155-
# $1 - Domain UID
156-
# $2 - Server Name
157-
# $3 - Flag (only passed for admin server)
158-
function createStartScript() {
159-
160-
nmdir=${DOMAIN_HOME}/servers/$2/nodemgr_home
161-
stateFile=${DOMAIN_HOME}/servers/$2/data/nodemanager/$2.state
162-
scriptFile=${nmdir}/startServer.sh
163-
pyFile=${nmdir}/start-server.py
164-
argsFile=${nmdir}/set-ms-args.py
165-
166-
# Create a script that starts the node manager, then uses wlst to connect
167-
# to the nodemanager and start the server.
168-
# The script and 'EOF' on the following lines must not be indented!
169-
cat << EOF > ${scriptFile}
170-
#!/bin/bash
171-
172-
# Check for stale state file and remove if found"
173-
if [ -f ${stateFile} ]; then
174-
echo "Removing stale file ${stateFile}"
175-
rm ${stateFile}
176-
fi
177-
178-
echo "Start the nodemanager"
179-
. ${nmdir}/startNodeManager.sh &
180-
181-
echo "Allow the nodemanager some time to start before attempting to connect"
182-
sleep 15
183-
echo "Finished waiting for the nodemanager to start"
184-
185-
echo "Update JVM arguments"
186-
if [ $# -eq 3 ]
187-
then
188-
echo "Update JVM arguments for admin server"
189-
echo "Arguments=\${USER_MEM_ARGS} -XX\:+UnlockExperimentalVMOptions -XX\:+UseCGroupMemoryLimitForHeap \${JAVA_OPTIONS}" >> ${startProp}
190-
else
191-
echo "Update JVM arguments for managed server"
192-
wlst.sh ${argsFile} $1 $2 ${startProp}
193-
fi
194-
195-
echo "Start the server"
196-
wlst.sh -skipWLSModuleScanning ${pyFile}
197-
198-
echo "Wait indefinitely so that the Kubernetes pod does not exit and try to restart"
199-
while true; do sleep 60; done
200-
EOF
201-
202-
checkFileExists ${scriptFile}
203-
chmod +x ${scriptFile}
204-
205-
# Create a python script to execute the wlst commands.
206-
# The script and 'EOF' on the following lines must not be indented!
207-
cat /u01/weblogic/read-domain-secret.py > ${pyFile}
208-
cat << EOF >> ${pyFile}
209-
210-
# Connect to nodemanager and start server
211-
nmConnect(admin_username, admin_password, '$1-$2', '5556', '%DOMAIN_NAME%', '${DOMAIN_HOME}', 'plain')
212-
nmStart('$2')
213-
214-
# Exit WLST
215-
nmDisconnect()
216-
exit()
217-
EOF
218-
219-
checkFileExists ${pyFile}
220-
221-
# Create a python script to set JVM arguments for managed server.
222-
# The script and 'EOF' on the following lines must not be indented!
223-
cat << EOF > ${argsFile}
224-
225-
import os
226-
import sys
227-
EOF
228-
229-
cat /u01/weblogic/read-domain-secret.py >> ${argsFile}
230-
cat << EOF >> ${argsFile}
231-
232-
mem_args=os.environ['USER_MEM_ARGS']
233-
java_opt=os.environ['JAVA_OPTIONS']
234-
admin_server=os.environ['ADMIN_NAME']
235-
admin_port=os.environ['ADMIN_PORT']
236-
237-
domain_UID=sys.argv[1]
238-
server_name=sys.argv[2]
239-
startup_file=sys.argv[3]
240-
241-
adminUrl='t3://' + domain_UID + '-' + admin_server + ':' + admin_port
242-
dirStr='Servers/managed-server1/ServerStart/' + server_name
243-
244-
# Connect to admin server to get startup arguments of this server
245-
connect(admin_username, admin_password, adminUrl)
246-
cd(dirStr)
247-
args=get('Arguments')
248-
disconnect()
249-
250-
f = open(startup_file, 'a')
251-
s=str("Arguments="+ mem_args + " -XX\:+UnlockExperimentalVMOptions -XX\:+UseCGroupMemoryLimitForHeap " + java_opt )
252-
if not (args is None):
253-
s=str(s + " " + args + "\n")
254-
else:
255-
s=str(s + "\n")
256-
257-
f.write(s)
258-
f.close()
259-
EOF
260-
261-
checkFileExists ${argsFile}
262-
263-
}
264-
265-
# Function to create script for stopping a server
266-
# $1 - Domain UID
267-
# $2 - Server Name
268-
function createStopScript() {
269-
270-
nmdir=${DOMAIN_HOME}/servers/$2/nodemgr_home
271-
scriptFile=${nmdir}/stopServer.sh
272-
pyFile=${nmdir}/stop-server.py
273-
274-
# Create a script that stops the server.
275-
# The script and 'EOF' on the following lines must not be indented!
276-
cat << EOF > ${scriptFile}
277-
#!/bin/bash
278-
279-
echo "Stop the server"
280-
wlst.sh -skipWLSModuleScanning ${pyFile}
281-
282-
# Return status of 2 means failed to stop a server through the NodeManager.
283-
# Look to see if there is a server process that can be killed.
284-
if [ \$? -eq 2 ]; then
285-
pid=\$(jps -v | grep '[D]weblogic.Name=$2' | awk '{print \$1}')
286-
if [ ! -z \$pid ]; then
287-
echo "Killing the server process \$pid"
288-
kill -15 \$pid
289-
fi
290-
fi
291-
292-
EOF
293-
294-
checkFileExists ${scriptFile}
295-
chmod +x ${scriptFile}
296-
297-
# Create a python script to execute the wlst commands.
298-
# The script and 'EOF' on the following lines must not be indented!
299-
cat /u01/weblogic/read-domain-secret.py > ${pyFile}
300-
cat << EOF >> ${pyFile}
301-
302-
# Connect to nodemanager and stop server
303-
try:
304-
nmConnect(admin_username, admin_password, '$1-$2', '5556', '%DOMAIN_NAME%', '${DOMAIN_HOME}', 'plain')
305-
except:
306-
print('Failed to connect to the NodeManager')
307-
exit(exitcode=2)
308-
309-
# Kill the server
310-
try:
311-
nmKill('$2')
312-
except:
313-
print('Connected to the NodeManager, but failed to stop the server')
314-
exit(exitcode=2)
315-
316-
# Exit WLST
317-
nmDisconnect()
318-
exit()
319-
EOF
320-
}
321-
322-
checkFileExists ${pyFile}
323-
324107
# Create the domain
325108
wlst.sh -skipWLSModuleScanning /u01/weblogic/create-domain.py
326109
327-
# Setup admin server
328-
createNodeMgrHome %DOMAIN_UID% %ADMIN_SERVER_NAME%
329-
createStartScript %DOMAIN_UID% %ADMIN_SERVER_NAME% 'admin'
330-
createStopScript %DOMAIN_UID% %ADMIN_SERVER_NAME%
331-
332-
# Create the managed servers
333-
index=0
334-
while [ $index -lt %CONFIGURED_MANAGED_SERVER_COUNT% ]
335-
do
336-
((index++))
337-
createNodeMgrHome %DOMAIN_UID% %MANAGED_SERVER_NAME_BASE%${index} %DOMAIN_UID%-%ADMIN_SERVER_NAME%
338-
createStartScript %DOMAIN_UID% %MANAGED_SERVER_NAME_BASE%${index}
339-
createStopScript %DOMAIN_UID% %MANAGED_SERVER_NAME_BASE%${index}
340-
done
341-
342110
echo "Successfully Completed"
343111
344112
create-domain.py: |-
@@ -351,13 +119,15 @@ data:
351119
domain_path = os.environ.get("DOMAIN_HOME")
352120
cluster_name = "%CLUSTER_NAME%"
353121
number_of_ms = %CONFIGURED_MANAGED_SERVER_COUNT%
122+
cluster_type = "%CLUSTER_TYPE%"
354123
355124
print('domain_path : [%s]' % domain_path);
356125
print('domain_name : [%DOMAIN_NAME%]');
357126
print('admin_username : [%s]' % admin_username);
358127
print('admin_port : [%ADMIN_PORT%]');
359128
print('cluster_name : [%s]' % cluster_name);
360129
print('server_port : [%s]' % server_port);
130+
print('cluster_type : [%s]' % cluster_type);
361131
362132
# Open default domain template
363133
# ============================
@@ -416,28 +186,56 @@ data:
416186
set('NodeManagerPasswordEncrypted', admin_password)
417187
418188
# Create a cluster
189+
# ======================
419190
cd('/')
420-
create(cluster_name, 'Cluster')
191+
cl=create(cluster_name, 'Cluster')
192+
193+
if cluster_type == "CONFIGURED":
421194
422-
# Create managed servers
423-
for index in range(0, number_of_ms):
424-
cd('/')
195+
# Create managed servers
196+
for index in range(0, number_of_ms):
197+
cd('/')
425198
426-
msIndex = index+1
427-
name = '%MANAGED_SERVER_NAME_BASE%%s' % msIndex
199+
msIndex = index+1
200+
name = '%MANAGED_SERVER_NAME_BASE%%s' % msIndex
428201
429-
create(name, 'Server')
430-
cd('/Servers/%s/' % name )
431-
print('managed server name is %s' % name);
432-
set('ListenAddress', '%DOMAIN_UID%-%s' % name)
433-
set('ListenPort', server_port)
434-
set('NumOfRetriesBeforeMSIMode', 0)
435-
set('RetryIntervalBeforeMSIMode', 1)
436-
set('Cluster', cluster_name)
202+
create(name, 'Server')
203+
cd('/Servers/%s/' % name )
204+
print('managed server name is %s' % name);
205+
set('ListenAddress', '%DOMAIN_UID%-%s' % name)
206+
set('ListenPort', server_port)
207+
set('NumOfRetriesBeforeMSIMode', 0)
208+
set('RetryIntervalBeforeMSIMode', 1)
209+
set('Cluster', cluster_name)
437210
438-
create(name,'Log')
439-
cd('/Servers/%s/Log/%s' % (name, name))
440-
set('FileName', '/shared/logs/%s.log' % name)
211+
create(name,'Log')
212+
cd('/Servers/%s/Log/%s' % (name, name))
213+
set('FileName', '/shared/logs/%s.log' % name)
214+
else:
215+
print('Configuring Dynamic Cluster %s' % cluster_name)
216+
217+
templateName = cluster_name + "-template"
218+
print('Creating Server Template: %s' % templateName)
219+
st1=create(templateName, 'ServerTemplate')
220+
print('Done creating Server Template: %s' % templateName)
221+
cd('/ServerTemplates/%s' % templateName)
222+
cmo.setListenPort(server_port)
223+
cmo.setListenAddress('%DOMAIN_UID%-%MANAGED_SERVER_NAME_BASE%${id}')
224+
cmo.setCluster(cl)
225+
print('Done setting attributes for Server Template: %s' % templateName);
226+
227+
228+
cd('/Clusters/%s' % cluster_name)
229+
create(cluster_name, 'DynamicServers')
230+
cd('DynamicServers/%s' % cluster_name)
231+
set('ServerTemplate', st1)
232+
set('ServerNamePrefix', "%MANAGED_SERVER_NAME_BASE%")
233+
set('DynamicClusterSize', number_of_ms)
234+
set('MaxDynamicClusterSize', number_of_ms)
235+
set('CalculatedListenPorts', false)
236+
set('Id', 1)
237+
238+
print('Done setting attributes for Dynamic Cluster: %s' % cluster_name);
441239
442240
# Write Domain
443241
# ============
@@ -452,38 +250,6 @@ data:
452250
updateDomain()
453251
closeDomain()
454252
print 'Domain Updated'
455-
456-
# Encrypt the admin username and password
457-
adminUsernameEncrypted=encrypt(admin_username, domain_path)
458-
adminPasswordEncrypted=encrypt(admin_password, domain_path)
459-
460-
print 'Create boot.properties files for admin and managed servers'
461-
462-
asbpFile=open('%s/servers/%ADMIN_SERVER_NAME%/security/boot.properties' % domain_path, 'w+')
463-
asbpFile.write("username=%s\n" % adminUsernameEncrypted)
464-
asbpFile.write("password=%s\n" % adminPasswordEncrypted)
465-
asbpFile.close()
466-
467-
import os
468-
469-
# Create boot.properties file for each managed server
470-
for index in range(0, number_of_ms):
471-
472-
# Define the folder path
473-
secdir='%s/servers/%MANAGED_SERVER_NAME_BASE%%s/security' % (domain_path, index+1)
474-
475-
# Create the security folder (if it does not already exist)
476-
try:
477-
os.makedirs(secdir)
478-
except OSError:
479-
if not os.path.isdir(secdir):
480-
raise
481-
482-
bpFile=open('%s/boot.properties' % secdir, 'w+')
483-
bpFile.write("username=%s\n" % adminUsernameEncrypted)
484-
bpFile.write("password=%s\n" % adminPasswordEncrypted)
485-
bpFile.close()
486-
487253
print 'Done'
488254
489255
# Exit WLST

0 commit comments

Comments
 (0)