109 lines
3.8 KiB
Python
109 lines
3.8 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
#
|
|
# @author: Giancarlo Panichi
|
|
#
|
|
# Created on 2020/06/12
|
|
#
|
|
import docker
|
|
import json
|
|
import time
|
|
from docker.types.services import RestartPolicy
|
|
|
|
|
|
class SwarmEngine:
|
|
|
|
def __init__(self, gcubeToken, storageHubUrl, softwareImage, softwareExecuteCommandName, fileItemId, tempFolderItemId):
|
|
self.gcubeToken = gcubeToken
|
|
self.storageHubUrl = storageHubUrl
|
|
|
|
# Software image for example: "microservices-VirtualBox:443/sortapp"
|
|
self.softwareImage = softwareImage
|
|
# Software Execute Command Name for example: "sortapp"
|
|
self.softwareExecuteCommandName = softwareExecuteCommandName
|
|
|
|
# Input Data File
|
|
self.fileItemId = fileItemId
|
|
self.tempFolderItemId = tempFolderItemId
|
|
|
|
|
|
def monitorTask(self, srv):
|
|
print("Monitor Task")
|
|
|
|
end = False
|
|
sId=None
|
|
|
|
while not end:
|
|
for task in srv.tasks():
|
|
print("Task: " + str(task))
|
|
sId = task['ServiceID']
|
|
if sId and sId == srv.id:
|
|
status = task['DesiredState']
|
|
print("Task DesiredState: " + str(status))
|
|
if status == 'shutdown' or status == 'complete':
|
|
print("Task End")
|
|
srv.remove()
|
|
print("Service Removed")
|
|
end = True
|
|
elif (status == 'failed' or status == 'rejected'
|
|
or status == 'orphaned' or status == 'remove'):
|
|
print("Error in execute Docker Image on Swarm Node: " + str(status))
|
|
raise Exception("Error in execute Docker Image on Swarm Node: " + str(status))
|
|
else:
|
|
time.sleep(2)
|
|
else:
|
|
continue
|
|
if sId==None:
|
|
print("Waiting Task load on Service")
|
|
time.sleep(2)
|
|
|
|
def execute(self):
|
|
print("Execute SwarmRegistryEngine")
|
|
|
|
print("Create Client")
|
|
|
|
# DockerClient
|
|
# for example: http://microservices-VirtualBox:2375/
|
|
#
|
|
# TLS support
|
|
# tls_config = docker.tls.TLSConfig(
|
|
# client_cert=('/path/to/client-cert.pem', '/path/to/client-key.pem')
|
|
# )
|
|
# client = docker.DockerClient(base_url='<https_url>', tls=tls_config)
|
|
|
|
client = docker.DockerClient(base_url='http://docker-swarm1.int.d4science.net:2376/')
|
|
# client = docker.DockerClient(base_url='unix://var/run/docker.sock')
|
|
print(json.dumps(client.info(), indent=2))
|
|
|
|
image=client.images.pull(self.softwareImage, tag='latest')
|
|
|
|
print("Pulled: "+str(image))
|
|
|
|
print("Services: " + str(client.services.list()))
|
|
|
|
cmdValue = "{} {} {} {}".format(self.softwareExecuteCommandName, self.gcubeToken, self.fileItemId, self.tempFolderItemId)
|
|
print("CommandValue: " + cmdValue)
|
|
|
|
print("Create Service")
|
|
|
|
srv = client.services.create(self.softwareImage, command=cmdValue,
|
|
restart_policy=RestartPolicy(condition='none', delay=0, max_attempts=0, window=0))
|
|
|
|
print("Service: " + str(srv))
|
|
|
|
print("Service Id: " + str(srv.id))
|
|
|
|
print("Node: " + str(client.nodes.list()))
|
|
|
|
self.monitorTask(srv)
|
|
|
|
print("Service Execution End")
|
|
|
|
def __str__(self):
|
|
return ('SwarmRegistryEngine[storageHubUrl=' + str(self.storageHubUrl) +
|
|
', softwareImage=' + str(self.softwareImage) +
|
|
', softwareExecuteCommandName=' + str(self.softwareExecuteCommandName) +
|
|
', fileItemId=' + str(self.fileItemId) +
|
|
', tempFolderItemId=' + str(self.tempFolderItemId) + ']')
|
|
|