Skip to content

Commit 02f3f4e

Browse files
authored
Merge pull request #2 from sanderegg/odeimaiz-feature/integrate-jupyter
wait until services are up and running before returning
2 parents 602e1bc + c600dee commit 02f3f4e

File tree

1 file changed

+33
-14
lines changed

1 file changed

+33
-14
lines changed

services/director/producer.py

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
import registry_proxy
33
import json
44
import docker
5+
import time
56

67
SERVICE_RUNTIME_SETTINGS = 'simcore.service.settings'
78

8-
def IsServiceAWebServer(dockerImagePath):
9+
def IsServiceAWebServer(dockerImagePath):
910
return str(dockerImagePath).find('webserver') != -1
1011

1112
def login_docker_registry(dockerClient):
@@ -14,7 +15,7 @@ def login_docker_registry(dockerClient):
1415
registry_url = os.environ.get('REGISTRY_URL')
1516
username = os.environ.get('REGISTRY_USER')
1617
password = os.environ.get('REGISTRY_PW')
17-
dockerClient.login(registry=registry_url + '/v2', username=username, password=password)
18+
dockerClient.login(registry=registry_url + '/v2', username=username, password=password)
1819
except docker.errors.APIError as e:
1920
raise Exception('Error while loging to registry: ' + str(e))
2021

@@ -25,7 +26,7 @@ def check_service_uuid_available(dockerClient, service_uuid):
2526
raise Exception('A service with the same uuid is already running: ' + service_uuid)
2627

2728
def get_service_runtime_parameters_labels(image, tag):
28-
image_labels = registry_proxy.retrieve_labels_of_image(image, tag)
29+
image_labels = registry_proxy.retrieve_labels_of_image(image, tag)
2930
runtime_parameters = dict()
3031
if SERVICE_RUNTIME_SETTINGS in image_labels:
3132
runtime_parameters = json.loads(image_labels[SERVICE_RUNTIME_SETTINGS])
@@ -101,19 +102,37 @@ def remove_overlay_network_of_swarm(docker_client, service_uuid):
101102
except docker.errors.APIError as e:
102103
raise Exception("docker server error while removing networks for service with uuid " + service_uuid)
103104

105+
def wait_until_service_running_or_failed(service_id):
106+
client = docker.APIClient()
107+
108+
# some times one has to wait until the task info is filled
109+
while True:
110+
task_infos_json = client.tasks(filters={'service':service_id})
111+
if len(task_infos_json) > 0:
112+
# check the status
113+
status_json = task_infos_json[0]["Status"]
114+
task_state = status_json["State"]
115+
if task_state == "running":
116+
# great it is running
117+
break
118+
elif task_state == 'failed' or task_state == "rejected":
119+
# error
120+
raise Exception("the service could not be started")
121+
time.sleep(0.005) # 5ms
122+
104123
def start_service(service_name, service_tag, service_uuid):
105124
# find the ones containing the service name
106125
listOfReposForService = registry_proxy.retrieve_list_of_interactive_services_with_name(service_name)
107126
# get the available image for each service (syntax is image:tag)
108127
listOfImages = {}
109128
for repo in listOfReposForService:
110129
listOfImages[repo] = registry_proxy.retrieve_list_of_images_in_repo(repo)
111-
130+
112131
# initialise docker client and check the uuid is available
113132
dockerClient = docker.from_env()
114133
check_service_uuid_available(dockerClient, service_uuid)
115134
login_docker_registry(dockerClient)
116-
135+
117136
# create a new network to connect the differnt containers
118137
docker_network = create_overlay_network_in_swarm(dockerClient, service_name, service_uuid)
119138
# create services
@@ -126,28 +145,29 @@ def start_service(service_name, service_tag, service_uuid):
126145
tag = availableTagsList[len(availableTagsList)-1]
127146
if not service_tag == 'latest' and availableTagsList.count(service_tag) == 1:
128147
tag = service_tag
129-
148+
130149
dockerImageFullPath = os.environ.get('REGISTRY_URL') +'/' + dockerImagePath + ':' + tag
131-
150+
132151
# prepare runtime parameters
133152
service_runtime_parameters_labels = get_service_runtime_parameters_labels(dockerImagePath, tag)
134153
docker_service_runtime_parameters = convert_labels_to_docker_runtime_parameters(service_runtime_parameters_labels, service_uuid)
135-
add_uuid_label_to_service_runtime_params(docker_service_runtime_parameters, service_uuid)
154+
add_uuid_label_to_service_runtime_params(docker_service_runtime_parameters, service_uuid)
136155
add_network_to_service_runtime_params(docker_service_runtime_parameters, docker_network)
137156
set_service_name(docker_service_runtime_parameters, registry_proxy.get_service_sub_name(dockerImagePath), service_uuid)
138157
# let-s start the service
139-
try:
158+
try:
140159
service = dockerClient.services.create(dockerImageFullPath, **docker_service_runtime_parameters)
160+
wait_until_service_running_or_failed(service.id)
141161
published_ports = get_docker_image_published_ports(service.id)
142162
container_meta_data = {"container_id":service.id, "published_ports":published_ports}
143-
containers_meta_data.append(container_meta_data)
163+
containers_meta_data.append(container_meta_data)
144164
except docker.errors.ImageNotFound as e:
145165
# first cleanup
146166
stop_service(service_uuid)
147167
raise Exception('Error service not found: ' + str(e))
148168
except docker.errors.APIError as e:
149169
# first cleanup
150-
stop_service(service_uuid)
170+
stop_service(service_uuid)
151171
raise Exception('Error while accessing docker server: ' + str(e))
152172
service_meta_data = {"service_name":service_name, "service_uuid":service_uuid, "containers":containers_meta_data}
153173
return json.dumps(service_meta_data)
@@ -156,11 +176,10 @@ def stop_service(service_uuid):
156176
# get the docker client
157177
dockerClient = docker.from_env()
158178
login_docker_registry(dockerClient)
159-
160-
try:
179+
180+
try:
161181
listOfRunningServicesWithUUID = dockerClient.services.list(filters={'label':'uuid=' + service_uuid})
162182
[service.remove() for service in listOfRunningServicesWithUUID]
163183
remove_overlay_network_of_swarm(dockerClient, service_uuid)
164184
except docker.errors.APIError as e:
165185
raise Exception('Error while stopping container' + str(e))
166-

0 commit comments

Comments
 (0)