Skip to content
This repository was archived by the owner on Oct 3, 2023. It is now read-only.

Commit 619b538

Browse files
Merge pull request #15 from hmrc/ADD_APPEND_ARGS
ADD_APPEND_ARGS Adding capability of play apps to take extra args. Merging post review
2 parents 8eff973 + a8ad927 commit 619b538

File tree

9 files changed

+182
-78
lines changed

9 files changed

+182
-78
lines changed

servicemanager/server/smserverlogic.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import sys
77
import traceback
88
import re
9+
import types
910

1011
from abc import abstractmethod
1112
from bottle import request, response
@@ -193,12 +194,13 @@ def _start_services(self, orchestration_services, service_mapping_ports, proxy):
193194
run_from = orchestration_services[service_name]["runFrom"]
194195
classifier = orchestration_services[service_name]["classifier"]
195196
version = orchestration_services[service_name]["version"]
197+
append_args = orchestration_services[service_name]["appendArgs"] # Allows for dynamic config overriding
196198

197199
# Allow for deprecated run_from values
198200
if run_from in deprecated_release_params:
199201
run_from = deprecated_release_params[run_from]
200202

201-
self.context.start_service(service_name, run_from, proxy, classifier, service_mapping_ports, port, admin_port, version)
203+
self.context.start_service(service_name, run_from, proxy, classifier, service_mapping_ports, port, admin_port, version, append_args)
202204

203205
def _await_service_startup(self, service_name, port, admin_port):
204206
seconds_remaining = SERVICE_START_TIMEOUT_SECONDS
@@ -268,6 +270,8 @@ def _service_mapping_for(self, service_start_request):
268270
if "version" in service_start_request and service_start_request["version"]:
269271
version = service_start_request["version"]
270272

273+
append_args = service_start_request.get("appendArgs", [])
274+
271275
if need_classifier:
272276

273277
valid_classifiers = "[" + (",".join(str(x) for x in mapping.keys())) + "]"
@@ -290,7 +294,7 @@ def _service_mapping_for(self, service_start_request):
290294
service_name = mapping
291295
classifier = None
292296

293-
return service_mapping_name, service_name, classifier, version
297+
return service_mapping_name, service_name, classifier, version, append_args
294298

295299
def _validate_start_request_and_assign_ports(self, services_to_start, dontrunfromsource):
296300

@@ -299,7 +303,10 @@ def _validate_start_request_and_assign_ports(self, services_to_start, dontrunfro
299303

300304
for service_start_request in services_to_start:
301305

302-
service_mapping_name, service_name, classifier, version = self._service_mapping_for(service_start_request)
306+
service_mapping_name, service_name, classifier, version, append_args = self._service_mapping_for(service_start_request)
307+
308+
if append_args and not isinstance(append_args, types.ListType):
309+
raise self._bad_request_exception("ERROR: I was passed a non list for append args of '" + str(append_args) + "' I dont know what to do with this")
303310

304311
if service_mapping_name in service_mapping_ports:
305312
raise self._bad_request_exception("Duplicate entry for service '%s' in start request" % service_mapping_name)
@@ -313,6 +320,9 @@ def _validate_start_request_and_assign_ports(self, services_to_start, dontrunfro
313320
if run_from == "SOURCE":
314321
raise self._bad_request_exception("runFrom parameter has value '%s', however --nosource was specified when smserver started" % run_from)
315322

323+
if append_args and not self.context.get_service_starter(service_name, run_from, None).supports_append_args():
324+
raise BadRequestException("The service type for '" + service_name + "' does not support append args")
325+
316326
if service_name in orchestration_services:
317327
existing_entry = orchestration_services[service_name]
318328
service_mapping_ports[service_mapping_name] = existing_entry["port"]
@@ -334,7 +344,8 @@ def _validate_start_request_and_assign_ports(self, services_to_start, dontrunfro
334344
"adminPort": admin_port,
335345
"runFrom": run_from,
336346
"classifier": classifier,
337-
"version": version
347+
"version": version,
348+
"appendArgs": append_args
338349
}
339350

340351
return orchestration_services, service_mapping_ports

servicemanager/service/smdropwizardservice.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ class SmDropwizardServiceStarter(SmJvmServiceStarter):
1616

1717
DEV_NULL = open(os.devnull, 'w')
1818

19-
def __init__(self, context, service_name, run_from, port, admin_port, classifier, service_mapping_ports, version, proxy):
20-
SmMicroServiceStarter.__init__(self, context, service_name, "dropwizard", run_from, port, classifier, service_mapping_ports, version, proxy)
19+
def __init__(self, context, service_name, run_from, port, admin_port, classifier, service_mapping_ports, version, proxy, append_args=None):
20+
SmMicroServiceStarter.__init__(self, context, service_name, "dropwizard", run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
2121

2222
self.admin_port = admin_port
2323

servicemanager/service/smexternalservice.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import re
44

55
import requests
6+
import types
67

78
from servicemanager.service.smservice import SmServiceStarter, SmService, SmServiceStatus
89
from servicemanager.smprocess import SmProcess, kill_pid
@@ -14,22 +15,33 @@ class SmExternalServiceStarter(SmServiceStarter):
1415
def process_arguments(self):
1516
pass
1617

17-
def __init__(self, context, service_name):
18-
SmServiceStarter.__init__(self, context, service_name, "external")
19-
18+
def __init__(self, context, service_name, append_args):
19+
SmServiceStarter.__init__(self, context, service_name, "external", append_args)
2020
if not "cmd" in self.service_data:
2121
context.log("Could not start 'external' service '" + service_name + "', 'cmd' is missing from services.json")
22-
2322
self.cmd = self.service_data["cmd"]
2423

24+
def get_start_command(self, context=None):
25+
if self.append_args:
26+
if isinstance(self.append_args, types.ListType):
27+
return self.cmd + self.append_args
28+
else:
29+
return self.cmd
30+
self.log("WARNING: I was passed a non list for append args of '" + str(self.append_args) + "' I dont know what to do with this")
31+
else:
32+
return self.cmd
33+
34+
def supports_append_args(self):
35+
return True
36+
2537
def start(self):
2638
try:
2739
location = "."
2840
if "location" in self.service_data:
2941
location = self.service_data["location"]
3042
microservice_path = os.path.join(self.context.application.workspace, location)
3143
os.chdir(microservice_path)
32-
return subprocess.Popen(self.cmd, cwd=microservice_path, env=os.environ.copy()).pid
44+
return subprocess.Popen(" ".join(self.get_start_command()), cwd=microservice_path, env=os.environ.copy(), shell=True).pid
3345
except Exception, e:
3446
self.log("Could not start service due to exception: " + str(e))
3547

servicemanager/service/smjvmservice.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ class SmJvmServiceStarter(SmMicroServiceStarter):
1515

1616
test_id_param = "service.manager.testId"
1717

18-
def __init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy):
19-
SmMicroServiceStarter.__init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy)
18+
def __init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy, append_args):
19+
SmMicroServiceStarter.__init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
2020

21-
def start(self):
21+
def start(self, appendArgs=None):
2222
if self.run_from == "SOURCE":
2323
if not clone_repo_if_requred(self):
2424
# TODO - should this just return None? or throw an exception? Should clone_repo_if_required throw an exception?

servicemanager/service/smplayservice.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import shutil
55
import zipfile
66
import stat
7-
import time
8-
import json
97
import copy
8+
import types
109

1110
from servicemanager.subprocess import Popen
1211
from ..service.smservice import SmMicroServiceStarter
@@ -25,8 +24,8 @@ class SmPlayServiceStarter(SmJvmServiceStarter):
2524

2625
PLAY_PROCESS_STARTUP_TIMEOUT_SECONDS = 120
2726

28-
def __init__(self, context, service_name, run_from, port, classifier, service_mapping_ports, version, proxy):
29-
SmMicroServiceStarter.__init__(self, context, service_name, "play", run_from, port, classifier, service_mapping_ports, version, proxy)
27+
def __init__(self, context, service_name, run_from, port, classifier, service_mapping_ports, version, proxy, append_args):
28+
SmMicroServiceStarter.__init__(self, context, service_name, "play", run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
3029

3130
if not self.port:
3231
self.port = self.service_data["defaultPort"]
@@ -63,8 +62,17 @@ def _build_extra_params(self):
6362
"-Dhttp.proxyPort=" + proxy_config[1]
6463
]
6564

65+
if self.append_args:
66+
if not isinstance(self.append_args, types.ListType):
67+
self.log("WARNING: I was passed a non list for append args of '" + str(self.append_args) + "' I dont know what to do with this")
68+
else:
69+
extra_params += self.append_args
70+
6671
return extra_params
6772

73+
def supports_append_args(self):
74+
return True
75+
6876
def get_start_command(self, run_from):
6977
if run_from == "SOURCE":
7078
source_cmd = copy.copy(self.service_data["sources"]["cmd"])

servicemanager/service/smpythonservice.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ class SmPythonServiceStarter(SmMicroServiceStarter):
2020

2121
PROCESS_STARTUP_TIMEOUT_SECONDS = 90
2222

23-
def __init__(self, context, service_name, run_from, port, classifier, service_mapping_ports, version, proxy):
24-
SmMicroServiceStarter.__init__(self, context, service_name, "assets", run_from, port, classifier, service_mapping_ports, version, None)
23+
def __init__(self, context, service_name, run_from, port, classifier, service_mapping_ports, version, proxy=None, append_args=None):
24+
SmMicroServiceStarter.__init__(self, context, service_name, "assets", run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
2525

2626
if not self.port:
2727
self.port = self.service_data["defaultPort"]

servicemanager/service/smservice.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
from abc import abstractmethod
44

5-
65
class SmServiceBase():
76
def __init__(self, context, service_name, expected_service_type):
87
self.context = context
@@ -55,8 +54,9 @@ def get_pattern(self):
5554

5655
class SmServiceStarter(SmServiceBase):
5756

58-
def __init__(self, context, service_name, expected_service_type):
57+
def __init__(self, context, service_name, expected_service_type, append_args):
5958
SmServiceBase.__init__(self, context, service_name, expected_service_type)
59+
self.append_args = append_args
6060

6161
@abstractmethod
6262
def start(self):
@@ -66,15 +66,19 @@ def start(self):
6666
def process_arguments(self):
6767
pass
6868

69+
@abstractmethod
70+
def supports_append_args(self):
71+
return False
72+
6973
@abstractmethod
7074
def get_start_command(self, context = None):
7175
return ["get_start_command() not implemented for this type of service - fork and make a pull request :)"]
7276

7377

7478
class SmMicroServiceStarter(SmServiceStarter):
7579

76-
def __init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy):
77-
SmServiceStarter.__init__(self, context, service_name, expected_service_type)
80+
def __init__(self, context, service_name, expected_service_type, run_from, port, classifier, service_mapping_ports, version, proxy, append_args):
81+
SmServiceStarter.__init__(self, context, service_name, expected_service_type, append_args)
7882

7983
self.run_from = run_from
8084
self.version = version
@@ -89,7 +93,7 @@ def __init__(self, context, service_name, expected_service_type, run_from, port,
8993
self.sources = self.service_data["sources"]
9094

9195
@abstractmethod
92-
def start(self):
96+
def start(self, appendArgs=None):
9397
pass
9498

9599
@abstractmethod

servicemanager/smcontext.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ def get_run_from_service_override_value_or_use_default(self, service, original_r
312312
return service.service_data["always_run_from"]
313313
return original_runfrom
314314

315-
def get_service_starter(self, service_name, run_from, proxy, classifier=None, service_mapping_ports=None, port=None, admin_port=None, version=None):
315+
def get_service_starter(self, service_name, run_from, proxy, classifier=None, service_mapping_ports=None, port=None, admin_port=None, version=None, append_args=None):
316316
service = self.get_service(service_name)
317317
run_from = self.get_run_from_service_override_value_or_use_default(service, run_from)
318318

@@ -326,20 +326,21 @@ def get_service_starter(self, service_name, run_from, proxy, classifier=None, se
326326
return None
327327

328328
if service_type == "external":
329-
starter = SmExternalServiceStarter(self, service_name)
329+
starter = SmExternalServiceStarter(self, service_name, append_args)
330330
elif service_type == "dropwizard":
331-
starter = SmDropwizardServiceStarter(self, service_name, run_from, port, admin_port, classifier, service_mapping_ports, version, proxy)
331+
starter = SmDropwizardServiceStarter(self, service_name, run_from, port, admin_port, classifier, service_mapping_ports, version, proxy, append_args)
332332
elif service_type == "play":
333-
starter = SmPlayServiceStarter(self, service_name, run_from, port, classifier, service_mapping_ports, version, proxy)
333+
starter = SmPlayServiceStarter(self, service_name, run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
334334
elif service_type == "assets":
335-
starter = SmPythonServiceStarter(self, service_name, run_from, port, classifier, service_mapping_ports, version, None)
335+
proxy = None
336+
starter = SmPythonServiceStarter(self, service_name, run_from, port, classifier, service_mapping_ports, version, proxy, append_args)
336337
else:
337338
raise self.exception("Unknown service type '%s' for service '%s' - please check services.json" % (service_type, service_name))
338339

339340
return starter
340341

341-
def start_service(self, service_name, run_from, proxy, classifier=None, service_mapping_ports=None, port=None, admin_port=None, version=None):
342-
service_starter = self.get_service_starter(service_name, run_from, proxy, classifier, service_mapping_ports, port, admin_port, version)
342+
def start_service(self, service_name, run_from, proxy, classifier=None, service_mapping_ports=None, port=None, admin_port=None, version=None, appendArgs=None):
343+
service_starter = self.get_service_starter(service_name, run_from, proxy, classifier, service_mapping_ports, port, admin_port, version, appendArgs)
343344
feature_string = pretty_print_list(" with feature$s $list enabled", self.features)
344345
self.log("Starting '%s' from %s%s..." % (service_name, run_from, feature_string))
345346
service_process_id = service_starter.start()

0 commit comments

Comments
 (0)