blob: 38e2deffd589085fff4df5cbc5f0cbcf99db9f84 [file] [log] [blame]
Scott Baker7581c252016-05-27 13:12:47 -07001import os
2import base64
Scott Bakeraab8a292016-06-03 16:32:45 -07003import jinja2
Scott Baker7581c252016-05-27 13:12:47 -07004import string
5import sys
Scott Bakerb0eb23e2016-06-01 16:08:04 -07006import urllib2
7import urlparse
Scott Baker7581c252016-05-27 13:12:47 -07008import xmlrpclib
9
Scott Baker7581c252016-05-27 13:12:47 -070010from xos.config import Config
Scott Bakerc01ce942016-10-03 11:55:12 -070011from core.models import Service, ServiceController, ServiceControllerResource, LoadableModule, LoadableModuleResource, XOS
Scott Baker7581c252016-05-27 13:12:47 -070012from xos.logger import Logger, logging
13
Scott Baker2b3b1ad2016-08-02 22:29:18 -070014from django.utils import timezone
15
Scott Baker7581c252016-05-27 13:12:47 -070016logger = Logger(level=logging.INFO)
17
Scott Bakerfb4c98c2016-08-08 17:45:45 -070018def add_unique(list, item):
19 if not item in list:
20 list.append(item)
21
Scott Baker7581c252016-05-27 13:12:47 -070022class XOSBuilder(object):
Scott Baker9b491332016-10-24 10:25:41 -070023 UI_KINDS=["models", "admin", "admin_template", "django_library", "rest_service", "rest_tenant", "tosca_custom_types", "tosca_resource","public_key","vendor_js"]
Scott Baker18c89172016-06-02 16:40:25 -070024 SYNC_CONTROLLER_KINDS=["synchronizer", "private_key", "public_key"]
Scott Baker513ea452016-06-02 16:03:26 -070025 SYNC_ALLCONTROLLER_KINDS=["models", "django_library"]
Scott Bakerb0eb23e2016-06-01 16:08:04 -070026
Scott Baker7581c252016-05-27 13:12:47 -070027 def __init__(self):
Scott Baker2979cae2016-10-20 14:48:32 -070028 self.source_sync_image = "xosproject/xos" # "xosproject/xos-synchronizer-openstack"
Scott Bakerb0eb23e2016-06-01 16:08:04 -070029 self.build_dir = "/opt/xos/BUILD/"
Scott Baker2b3b1ad2016-08-02 22:29:18 -070030 self.build_tainted = False
Scott Bakerb0eb23e2016-06-01 16:08:04 -070031
32 # stuff that has to do with downloading
33
Scott Bakerfb4c98c2016-08-08 17:45:45 -070034 def get_base_dest_dir(self, scr):
Scott Bakerb0eb23e2016-06-01 16:08:04 -070035 xos_base = "opt/xos"
Scott Bakerc01ce942016-10-03 11:55:12 -070036 service_name = scr.loadable_module.name
Scott Bakerb0eb23e2016-06-01 16:08:04 -070037 base_dirs = {"models": "%s/services/%s/" % (xos_base, service_name),
38 "admin": "%s/services/%s/" % (xos_base, service_name),
Scott Bakere360ff82016-06-13 10:55:23 -070039 "admin_template": "%s/services/%s/templates/" % (xos_base, service_name),
Scott Bakerb0eb23e2016-06-01 16:08:04 -070040 "django_library": "%s/services/%s/" % (xos_base, service_name),
41 "synchronizer": "%s/synchronizers/%s/" % (xos_base, service_name),
42 "tosca_custom_types": "%s/tosca/custom_types/" % (xos_base),
Scott Baker18c89172016-06-02 16:40:25 -070043 "tosca_resource": "%s/tosca/resources/" % (xos_base),
Scott Baker16cfb9c2016-06-07 15:37:03 -070044 "rest_service": "%s/api/service/" % (xos_base),
Scott Baker7806f622016-06-07 17:45:04 -070045 "rest_tenant": "%s/api/tenant/" % (xos_base),
Scott Bakercfd53722016-06-13 19:02:43 -070046 "private_key": "%s/services/%s/keys/" % (xos_base, service_name),
Scott Baker9b491332016-10-24 10:25:41 -070047 "public_key": "%s/services/%s/keys/" % (xos_base, service_name),
48 "vendor_js": "%s/core/xoslib/static/vendor/" % (xos_base)}
Scott Baker260a21c2016-06-13 10:42:49 -070049 dest_dir = base_dirs[scr.kind]
50
Scott Bakerfb4c98c2016-08-08 17:45:45 -070051 return dest_dir
52
53 def get_dest_dir(self, scr):
54 dest_dir = self.get_base_dest_dir(scr)
55
Scott Baker260a21c2016-06-13 10:42:49 -070056 if scr.subdirectory:
57 dest_dir = os.path.join(dest_dir, scr.subdirectory)
58
59 return dest_dir
Scott Bakerb0eb23e2016-06-01 16:08:04 -070060
61 def get_build_fn(self, scr):
62 dest_dir = self.get_dest_dir(scr)
63 dest_fn = os.path.split(urlparse.urlsplit(scr.full_url).path)[-1]
64 return os.path.join(dest_dir, dest_fn)
65
66 def get_download_fn(self, scr):
67 dest_fn = self.get_build_fn(scr)
68 return os.path.join(self.build_dir, dest_fn)
69
70 def read_manifest(self, scr, fn):
71 manifest = []
72 manifest_lines = file(fn).readlines()
73 manifest_lines = [x.strip() for x in manifest_lines]
Scott Bakerc2a2fe92016-06-02 13:19:10 -070074 manifest_lines = [x for x in manifest_lines if x]
Scott Bakerb0eb23e2016-06-01 16:08:04 -070075 for line in manifest_lines:
Scott Bakerc2a2fe92016-06-02 13:19:10 -070076 url_parts = urlparse.urlsplit(scr.full_url)
77 new_path = os.path.join(os.path.join(*os.path.split(url_parts.path)[:-1]),line)
78 url = urlparse.urlunsplit( (url_parts.scheme, url_parts.netloc, new_path, url_parts.query, url_parts.fragment) )
Scott Bakerb0eb23e2016-06-01 16:08:04 -070079
80 build_fn = os.path.join(self.get_dest_dir(scr), line)
Scott Bakerc2a2fe92016-06-02 13:19:10 -070081 download_fn = os.path.join(self.build_dir, build_fn)
Scott Bakerb0eb23e2016-06-01 16:08:04 -070082
83 manifest.append( (url, download_fn, build_fn) )
84 return manifest
85
86 def download_file(self, url, dest_fn):
87 logger.info("Download %s to %s" % (url, dest_fn))
88 if not os.path.exists(os.path.dirname(dest_fn)):
89 os.makedirs(os.path.dirname(dest_fn))
90 obj = urllib2.urlopen(url)
91 file(dest_fn,"w").write(obj.read())
92
Scott Bakerc2a2fe92016-06-02 13:19:10 -070093 # make python files executable
94 if dest_fn.endswith(".py"): # and contents.startswith("#!"):
95 os.chmod(dest_fn, 0755)
96
Scott Bakerb0eb23e2016-06-01 16:08:04 -070097 def download_resource(self, scr):
98 if scr.format == "manifest":
99 manifest_fn = self.get_download_fn(scr)
100 self.download_file(scr.full_url, manifest_fn)
Scott Bakerc2a2fe92016-06-02 13:19:10 -0700101 manifest = self.read_manifest(scr, manifest_fn)
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700102 for (url, download_fn, build_fn) in manifest:
103 self.download_file(url, download_fn)
104 else:
105 self.download_file(scr.full_url, self.get_download_fn(scr))
106
Scott Bakercf3586f2016-06-14 00:22:44 -0700107# XXX docker creates a new container and commits it for every single COPY
108# line in the dockerfile. This causes services with many files (for example,
109# vsg) to take ~ 10-15 minutes to build the docker file. So instead we'll copy
110# the whole build directory, and then run a script that copies the files
111# we want.
112
113# def get_docker_lines(self, scr):
114# if scr.format == "manifest":
115# manifest_fn = self.get_download_fn(scr)
116# manifest = self.read_manifest(scr, manifest_fn)
117# lines = []
118# for (url, download_fn, build_fn) in manifest:
119# script.append("mkdir -p
120# #lines.append("COPY %s /%s" % (build_fn, build_fn))
121# return lines
122# else:
123# build_fn = self.get_build_fn(scr)
124# #return ["COPY %s /%s" % (build_fn, build_fn)]
125
126# def get_controller_docker_lines(self, controller, kinds):
127# need_service_init_py = False
128# dockerfile=[]
Scott Bakerc01ce942016-10-03 11:55:12 -0700129# for scr in controller.loadable_module_resources.all():
Scott Bakercf3586f2016-06-14 00:22:44 -0700130# if scr.kind in kinds:
131# lines = self.get_docker_lines(scr)
132# dockerfile = dockerfile + lines
133# if scr.kind in ["admin", "models"]:
134# need_service_init_py = True
135#
136# if need_service_init_py:
137# file(os.path.join(self.build_dir, "opt/xos/empty__init__.py"),"w").write("")
138# dockerfile.append("COPY opt/xos/empty__init__.py /opt/xos/services/%s/__init__.py" % controller.name)
139#
140# return dockerfile
141
142 def get_script_lines(self, scr):
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700143 if scr.format == "manifest":
144 manifest_fn = self.get_download_fn(scr)
145 manifest = self.read_manifest(scr, manifest_fn)
146 lines = []
147 for (url, download_fn, build_fn) in manifest:
Scott Bakercf3586f2016-06-14 00:22:44 -0700148 lines.append("mkdir -p /%s" % os.path.dirname(build_fn))
149 lines.append("cp /build/%s /%s" % (build_fn, build_fn))
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700150 return lines
151 else:
152 build_fn = self.get_build_fn(scr)
Scott Bakercf3586f2016-06-14 00:22:44 -0700153 return ["mkdir -p /%s" % os.path.dirname(build_fn),
154 "cp /build/%s /%s" % (build_fn, build_fn)]
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700155
Scott Bakercf3586f2016-06-14 00:22:44 -0700156 def get_controller_script_lines(self, controller, kinds):
Scott Baker7806f622016-06-07 17:45:04 -0700157 need_service_init_py = False
Scott Bakercf3586f2016-06-14 00:22:44 -0700158 script=[]
Scott Bakerfb4c98c2016-08-08 17:45:45 -0700159 inits=[]
Scott Bakerc01ce942016-10-03 11:55:12 -0700160 for scr in list(controller.loadable_module_resources.all()):
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700161 if not (scr.kind in kinds):
162 continue
163
164 # Check and see if the resource we're trying to install has
165 # disappeared. This may happen if the onboarding synchronizer
166 # container has been destroyed and restarted. In this case, flag
167 # the resource for re-download, and set the build_tainted bit
168 # so we can throw an exception after we've evaluated all
169 # resources.
170
171 download_fn = self.get_download_fn(scr)
172 if not os.path.exists(download_fn):
173 logger.info("File %s is missing; dirtying the resource" % download_fn)
174 scr.backend_status = "2 - download_fn is missing"
175 scr.updated = timezone.now()
176 scr.save(update_fields=['backend_status', 'updated'])
177 self.build_tainted = True
178 continue
179
180 lines = self.get_script_lines(scr)
181 script = script + lines
182
Scott Bakerfb4c98c2016-08-08 17:45:45 -0700183 # compute the set of __init__.py files that we will need
184 if scr.kind in ["admin", "models", "rest_service", "rest_tenant"]:
185 dir = self.get_base_dest_dir(scr)
186 add_unique(inits, dir)
Scott Baker7806f622016-06-07 17:45:04 -0700187
Scott Bakerfb4c98c2016-08-08 17:45:45 -0700188 if scr.subdirectory:
189 for part in scr.subdirectory.split("/"):
190 dir = os.path.join(dir, part)
191 add_unique(inits, dir)
192
193 for init in inits:
194 script.append("echo > %s" % os.path.join("/",init,"__init__.py"))
Scott Baker7806f622016-06-07 17:45:04 -0700195
Scott Bakercf3586f2016-06-14 00:22:44 -0700196 return script
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700197
Scott Baker7806f622016-06-07 17:45:04 -0700198 def check_controller_unready(self, controller):
199 unready_resources=[]
Scott Bakerc01ce942016-10-03 11:55:12 -0700200 for scr in controller.loadable_module_resources.all():
Scott Baker7806f622016-06-07 17:45:04 -0700201 if (not scr.backend_status) or (not scr.backend_status.startswith("1")):
202 unready_resources.append(scr)
203
204 return unready_resources
205
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700206 # stuff that has to do with building
207
Scott Bakercf3586f2016-06-14 00:22:44 -0700208 def create_xos_app_data(self, name, script, app_list, migration_list):
Scott Bakerae196c32016-06-01 23:29:22 -0700209 if not os.path.exists(os.path.join(self.build_dir,"opt/xos/xos")):
210 os.makedirs(os.path.join(self.build_dir,"opt/xos/xos"))
211
212 if app_list:
Scott Bakercf3586f2016-06-14 00:22:44 -0700213 script.append("mkdir -p /opt/xos/xos")
214 script.append("cp /build/opt/xos/xos/%s_xosbuilder_app_list /opt/xos/xos/xosbuilder_app_list" % name)
215 #dockerfile.append("COPY opt/xos/xos/%s_xosbuilder_app_list /opt/xos/xos/xosbuilder_app_list" % name)
Scott Baker513ea452016-06-02 16:03:26 -0700216 file(os.path.join(self.build_dir, "opt/xos/xos/%s_xosbuilder_app_list") % name, "w").write("\n".join(app_list)+"\n")
Scott Bakerae196c32016-06-01 23:29:22 -0700217
218 if migration_list:
Scott Bakercf3586f2016-06-14 00:22:44 -0700219 script.append("mkdir -p /opt/xos/xos")
220 script.append("cp /build/opt/xos/xos/%s_xosbuilder_migration_list /opt/xos/xos/xosbuilder_migration_list" % name)
221 #dockerfile.append("COPY opt/xos/xos/%s_xosbuilder_migration_list /opt/xos/xos/xosbuilder_migration_list" % name)
Scott Baker513ea452016-06-02 16:03:26 -0700222 file(os.path.join(self.build_dir, "opt/xos/xos/%s_xosbuilder_migration_list") % name, "w").write("\n".join(migration_list)+"\n")
Scott Bakerae196c32016-06-01 23:29:22 -0700223
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700224 def create_ui_dockerfile(self):
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700225 self.build_tainted = False
Scott Bakerd2ba7492016-06-15 14:33:34 -0700226 xos = XOS.objects.all()[0]
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700227 dockerfile_fn = "Dockerfile.UI"
228
Scott Bakerae196c32016-06-01 23:29:22 -0700229 app_list = []
230 migration_list = []
231
Scott Bakerd2ba7492016-06-15 14:33:34 -0700232 dockerfile = ["FROM %s" % xos.source_ui_image]
Scott Bakercf3586f2016-06-14 00:22:44 -0700233 script = []
Scott Bakerc01ce942016-10-03 11:55:12 -0700234 for controller in LoadableModule.objects.all():
Scott Baker7806f622016-06-07 17:45:04 -0700235 if self.check_controller_unready(controller):
Scott Bakerc01ce942016-10-03 11:55:12 -0700236 logger.warning("Loadable Module %s has unready resources" % str(controller))
Scott Baker7806f622016-06-07 17:45:04 -0700237 continue
238
Scott Bakercf3586f2016-06-14 00:22:44 -0700239 #dockerfile = dockerfile + self.get_controller_docker_lines(controller, self.UI_KINDS)
240 script = script + self.get_controller_script_lines(controller, self.UI_KINDS)
Scott Bakerc01ce942016-10-03 11:55:12 -0700241 if controller.loadable_module_resources.filter(kind="models").exists():
Scott Bakerae196c32016-06-01 23:29:22 -0700242 app_list.append("services." + controller.name)
243 migration_list.append(controller.name)
244
Scott Bakercf3586f2016-06-14 00:22:44 -0700245 self.create_xos_app_data("ui", script, app_list, migration_list)
246
247 file(os.path.join(self.build_dir, "install-xos.sh"), "w").write("\n".join(script)+"\n")
248 dockerfile.append("COPY . /build/")
249 dockerfile.append("RUN bash /build/install-xos.sh")
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700250
251 file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
252
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700253 if self.build_tainted:
254 raise Exception("Build was tainted due to errors")
255
Scott Baker8d252b62016-06-01 23:08:04 -0700256 return {"dockerfile_fn": dockerfile_fn,
257 "docker_image_name": "xosproject/xos-ui"}
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700258
259 def create_synchronizer_dockerfile(self, controller):
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700260 self.build_tainted = False
261
Scott Bakerc01ce942016-10-03 11:55:12 -0700262 if not controller.loadable_module_resources.filter(kind="synchronizer").exists():
263 # it doesn't have a synchronizer, therefore it doesn't need a dockerfile
264 return None
265
Scott Baker513ea452016-06-02 16:03:26 -0700266 # bake in the synchronizer from this controller
Scott Bakercf3586f2016-06-14 00:22:44 -0700267 sync_lines = self.get_controller_script_lines(controller, self.SYNC_CONTROLLER_KINDS)
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700268
269 if self.build_tainted:
270 raise Exception("Build was tainted due to errors")
271
272 # If there's no sync_lines for this ServiceController, then it must not
273 # have a synchronizer.
Scott Baker513ea452016-06-02 16:03:26 -0700274 if not sync_lines:
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700275 return None
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700276
277 dockerfile_fn = "Dockerfile.%s" % controller.name
278 dockerfile = ["FROM %s" % self.source_sync_image]
Scott Bakercf3586f2016-06-14 00:22:44 -0700279 script = []
Scott Baker513ea452016-06-02 16:03:26 -0700280
281 # Now bake in models from this controller as well as the others
282 # It's important to bake all services in, because some services'
283 # synchronizers may depend on models from another service.
284 app_list = []
Scott Bakerc01ce942016-10-03 11:55:12 -0700285 for c in LoadableModule.objects.all():
Scott Bakercf3586f2016-06-14 00:22:44 -0700286 script = script + self.get_controller_script_lines(c, self.SYNC_ALLCONTROLLER_KINDS)
Scott Bakerc01ce942016-10-03 11:55:12 -0700287 if c.loadable_module_resources.filter(kind="models").exists():
Scott Bakercf3586f2016-06-14 00:22:44 -0700288 app_list.append("services." + c.name)
Scott Baker513ea452016-06-02 16:03:26 -0700289
Scott Bakercf3586f2016-06-14 00:22:44 -0700290 self.create_xos_app_data(controller.name, script, app_list, None)
Scott Baker513ea452016-06-02 16:03:26 -0700291
Scott Bakercf3586f2016-06-14 00:22:44 -0700292 script = script + sync_lines
293
294 file(os.path.join(self.build_dir, "install-%s.sh" % controller.name), "w").write("\n".join(script)+"\n")
295 dockerfile.append("COPY . /build/")
296 dockerfile.append("RUN bash /build/install-%s.sh" % controller.name)
297
Scott Bakerc2a2fe92016-06-02 13:19:10 -0700298 file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700299
Scott Baker2b3b1ad2016-08-02 22:29:18 -0700300 if self.build_tainted:
301 raise Exception("Build was tainted due to errors")
302
Scott Baker8d252b62016-06-01 23:08:04 -0700303 return {"dockerfile_fn": dockerfile_fn,
304 "docker_image_name": "xosproject/xos-synchronizer-%s" % controller.name}
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700305
Scott Bakeraab8a292016-06-03 16:32:45 -0700306 def create_docker_compose(self):
307 xos = XOS.objects.all()[0]
308
Scott Baker29b677b2016-06-07 10:20:00 -0700309 volume_list = []
310 for volume in xos.volumes.all():
311 volume_list.append({"host_path": volume.host_path,
312 "container_path": volume.container_path,
313 "read_only": volume.read_only})
Scott Bakeraab8a292016-06-03 16:32:45 -0700314
Scott Bakerb1f466c2016-08-22 10:33:09 -0700315 if xos.extra_hosts:
316 extra_hosts = [x.strip() for x in xos.extra_hosts.split(",")]
317 else:
318 extra_hosts = []
319
Scott Bakeraab8a292016-06-03 16:32:45 -0700320 containers = {}
321
Scott Bakerf68418f2016-06-16 15:30:09 -0700322# containers["xos_db"] = \
323# {"image": "xosproject/xos-postgres",
324# "expose": [5432]}
Scott Bakeraab8a292016-06-03 16:32:45 -0700325
326 containers["xos_ui"] = \
327 {"image": "xosproject/xos-ui",
328 "command": "python /opt/xos/manage.py runserver 0.0.0.0:%d --insecure --makemigrations" % xos.ui_port,
329 "ports": {"%d"%xos.ui_port : "%d"%xos.ui_port},
Scott Bakerf68418f2016-06-16 15:30:09 -0700330 #"links": ["xos_db"],
Scott Baker0c0139a2016-06-22 14:54:23 -0700331 "external_links": ["%s:%s" % (xos.db_container_name, "xos_db")],
Scott Bakerb1f466c2016-08-22 10:33:09 -0700332 "extra_hosts": extra_hosts,
Scott Bakeraab8a292016-06-03 16:32:45 -0700333 "volumes": volume_list}
334
Scott Baker885894a2016-08-24 22:31:10 -0700335 if xos.no_start:
336 containers["xos_ui"]["command"] = "sleep 864000"
337
Scott Baker584cd892016-06-09 16:10:31 -0700338# containers["xos_bootstrap_ui"] = {"image": "xosproject/xos",
339# "command": "python /opt/xos/manage.py runserver 0.0.0.0:%d --insecure --makemigrations" % xos.bootstrap_ui_port,
340# "ports": {"%d"%xos.bootstrap_ui_port : "%d"%xos.bootstrap_ui_port},
Scott Baker0c0139a2016-06-22 14:54:23 -0700341# #"external_links": ["%s:%s" % (xos.db_container_name, "xos_db")],
Scott Baker584cd892016-06-09 16:10:31 -0700342# "links": ["xos_db"],
343# "volumes": volume_list}
Scott Bakerbe41a122016-06-06 10:40:40 -0700344
Scott Baker057a6a12016-06-13 15:45:55 -0700345 if not xos.frontend_only:
346 for c in ServiceController.objects.all():
347 if self.check_controller_unready(c):
348 logger.warning("Controller %s has unready resources" % str(c))
349 continue
Scott Baker7806f622016-06-07 17:45:04 -0700350
Scott Bakerc01ce942016-10-03 11:55:12 -0700351 if c.loadable_module_resources.filter(kind="synchronizer").exists():
Scott Baker07615902016-06-13 21:41:52 -0700352 if c.synchronizer_run and c.synchronizer_config:
Scott Bakercf3586f2016-06-14 00:22:44 -0700353 command = 'bash -c "sleep 120; cd /opt/xos/synchronizers/%s; python ./%s -C %s"' % (c.name, c.synchronizer_run, c.synchronizer_config)
Scott Baker07615902016-06-13 21:41:52 -0700354 else:
355 command = 'bash -c "sleep 120; cd /opt/xos/synchronizers/%s; bash ./run.sh"' % c.name
356
357 containers["xos_synchronizer_%s" % c.name] = \
358 {"image": "xosproject/xos-synchronizer-%s" % c.name,
359 "command": command,
Scott Baker0c0139a2016-06-22 14:54:23 -0700360 "external_links": ["%s:%s" % (xos.db_container_name, "xos_db")],
Scott Bakerb1f466c2016-08-22 10:33:09 -0700361 "extra_hosts": extra_hosts,
Scott Baker07615902016-06-13 21:41:52 -0700362 "volumes": volume_list}
Scott Bakeraab8a292016-06-03 16:32:45 -0700363
Scott Baker0df54fa2016-08-31 15:25:06 -0700364 if c.no_start:
365 containers["xos_synchronizer_%s" % c.name]["command"] = "sleep 864000"
366
Scott Bakeraab8a292016-06-03 16:32:45 -0700367 vars = { "containers": containers }
368
369 template_loader = jinja2.FileSystemLoader( "/opt/xos/synchronizers/onboarding/templates/" )
370 template_env = jinja2.Environment(loader=template_loader)
371 template = template_env.get_template("docker-compose.yml.j2")
372 buffer = template.render(vars)
373
374 if not os.path.exists("/opt/xos/synchronizers/onboarding/docker-compose"):
375 os.makedirs("/opt/xos/synchronizers/onboarding/docker-compose")
376 file("/opt/xos/synchronizers/onboarding/docker-compose/docker-compose.yml", "w").write(buffer)
377
Scott Baker8d252b62016-06-01 23:08:04 -0700378# def build_xos(self):
379# dockerfiles=[]
380# dockerfiles.append(self.create_ui_dockerfile())
381#
382# for controller in ServiceController.objects.all():
383# dockerfiles.append(self.create_synchronizer_dockerfile(controller))
Scott Bakerb0eb23e2016-06-01 16:08:04 -0700384
385
386