diff --git a/xos/synchronizers/onboarding/files/__init__.py b/xos/synchronizers/onboarding/files/__init__.py
deleted file mode 100644
index 8b13789..0000000
--- a/xos/synchronizers/onboarding/files/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/xos/synchronizers/onboarding/model-deps b/xos/synchronizers/onboarding/model-deps
deleted file mode 100644
index 4bf692a..0000000
--- a/xos/synchronizers/onboarding/model-deps
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-    "XOS": [
-        "ServiceController",
-        "Library"
-    ], 
-    "ServiceController": [
-        "LoadableModuleResource"
-    ],
-    "Library": [
-        "LoadableModuleResource"
-    ]
-}
diff --git a/xos/synchronizers/onboarding/onboarding-synchronizer.py b/xos/synchronizers/onboarding/onboarding-synchronizer.py
deleted file mode 100755
index 84bec4f..0000000
--- a/xos/synchronizers/onboarding/onboarding-synchronizer.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-synchronizer")
-mod.main()
diff --git a/xos/synchronizers/onboarding/onboarding_synchronizer_config b/xos/synchronizers/onboarding/onboarding_synchronizer_config
deleted file mode 100644
index fb33044..0000000
--- a/xos/synchronizers/onboarding/onboarding_synchronizer_config
+++ /dev/null
@@ -1,35 +0,0 @@
-[plc]
-name=plc
-deployment=plc
-
-[db]
-name=xos
-user=postgres
-password=password
-host=xos_db
-port=5432
-
-[api]
-host=localhost
-port=8000
-ssl_key=None
-ssl_cert=None
-ca_ssl_cert=None
-ratelimit_enabled=0
-omf_enabled=0
-mail_support_address=support@localhost
-nova_enabled=True
-
-[observer]
-name=onboarding
-dependency_graph=/opt/xos/synchronizers/onboarding/model-deps
-steps_dir=/opt/xos/synchronizers/onboarding/steps
-sys_dir=/opt/xos/synchronizers/onboarding/sys
-deleters_dir=/opt/xos/synchronizers/onboarding/deleters
-log_file=console
-driver=None
-backoff_disabled=True
-pretend=False
-save_ansible_output=True
-node_key=/opt/cord_profile/node_key
-
diff --git a/xos/synchronizers/onboarding/run.sh b/xos/synchronizers/onboarding/run.sh
deleted file mode 100755
index d52d39c..0000000
--- a/xos/synchronizers/onboarding/run.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-export XOS_DIR=/opt/xos
-python onboarding-synchronizer.py  -C $XOS_DIR/synchronizers/onboarding/onboarding_synchronizer_config
diff --git a/xos/synchronizers/onboarding/steps/sync_component.py b/xos/synchronizers/onboarding/steps/sync_component.py
deleted file mode 100644
index da556e0..0000000
--- a/xos/synchronizers/onboarding/steps/sync_component.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import os
-import sys
-import base64
-from django.db.models import F, Q
-from xos.config import Config
-from synchronizers.base.syncstep import SyncStep, DeferredException
-from core.models import XOS, XOSComponent
-from xos.logger import Logger, logging
-from synchronizers.base.ansible_helper import run_template
-
-# xosbuilder will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__),"..")
-sys.path.insert(0,parentdir)
-
-from xosbuilder import XOSBuilder
-
-logger = Logger(level=logging.INFO)
-
-class SyncXOSComponent(SyncStep, XOSBuilder):
-    provides=[XOSComponent]
-    observes=XOSComponent
-    requested_interval=0
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-        XOSBuilder.__init__(self)
-
-    def sync_record(self, sc):
-        logger.info("Sync'ing XOSComponent %s" % sc)
-
-        if sc.xos and (not sc.xos.enable_build):
-            raise DeferredException("XOS build is currently disabled")
-
-        unready = self.check_controller_unready(sc)
-        if unready:
-            raise Exception("Controller %s has unready resources: %s" % (str(sc), ",".join([str(x) for x in unready])))
-
-        # There's nothing to actually do, since there's no synchronizer
-        # container for libraries.
-
-    def delete_record(self, m):
-        pass
-
-    def fetch_pending(self, deleted=False):
-        pend = super(SyncXOSComponent, self).fetch_pending(deleted)
-        return pend
-
diff --git a/xos/synchronizers/onboarding/steps/sync_library.py b/xos/synchronizers/onboarding/steps/sync_library.py
deleted file mode 100644
index 2e9ddd2..0000000
--- a/xos/synchronizers/onboarding/steps/sync_library.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import os
-import sys
-import base64
-from django.db.models import F, Q
-from xos.config import Config
-from synchronizers.base.syncstep import SyncStep, DeferredException
-from core.models import XOS, Library
-from xos.logger import Logger, logging
-from synchronizers.base.ansible_helper import run_template
-
-# xosbuilder will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__),"..")
-sys.path.insert(0,parentdir)
-
-from xosbuilder import XOSBuilder
-
-logger = Logger(level=logging.INFO)
-
-class SyncLibrary(SyncStep, XOSBuilder):
-    provides=[Library]
-    observes=Library
-    requested_interval=0
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-        XOSBuilder.__init__(self)
-
-    def sync_record(self, sc):
-        logger.info("Sync'ing Library %s" % sc)
-
-        if sc.xos and (not sc.xos.enable_build):
-            raise DeferredException("XOS build is currently disabled")
-
-        unready = self.check_controller_unready(sc)
-        if unready:
-            raise Exception("Controller %s has unready resources: %s" % (str(sc), ",".join([str(x) for x in unready])))
-
-        # There's nothing to actually do, since there's no synchronizer
-        # container for libraries.
-
-    def delete_record(self, m):
-        pass
-
-    def fetch_pending(self, deleted=False):
-        pend = super(SyncLibrary, self).fetch_pending(deleted)
-        return pend
-
diff --git a/xos/synchronizers/onboarding/steps/sync_loadablemoduleresource.py b/xos/synchronizers/onboarding/steps/sync_loadablemoduleresource.py
deleted file mode 100644
index 46734a9..0000000
--- a/xos/synchronizers/onboarding/steps/sync_loadablemoduleresource.py
+++ /dev/null
@@ -1,56 +0,0 @@
-import os
-import sys
-import base64
-from django.db.models import F, Q
-from xos.config import Config
-from synchronizers.base.syncstep import SyncStep
-from core.models import Service, ServiceController, LoadableModuleResource
-from xos.logger import Logger, logging
-
-# xosbuilder will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__),"..")
-sys.path.insert(0,parentdir)
-
-from xosbuilder import XOSBuilder
-
-logger = Logger(level=logging.INFO)
-
-class SyncLoadableModuleResource(SyncStep, XOSBuilder):
-    provides=[LoadableModuleResource]
-    observes=LoadableModuleResource
-    requested_interval=0
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-        XOSBuilder.__init__(self)
-
-    def sync_record(self, scr):
-        logger.info("Sync'ing LoadableModuleResource %s" % scr)
-        self.download_resource(scr)
-
-        # TODO: The following should be redone with watchers
-
-        if scr.loadable_module and scr.loadable_module.xos:
-            # Make sure the xos UI is resynced
-            xos = scr.loadable_module.xos
-            xos.save(update_fields=["updated"], always_update_timestamp=True)
-
-        if (scr.kind=="models") and scr.loadable_module and (scr.loadable_module.name != "openstack"):
-            # Make sure the openstack controller is restarted. This is necessary
-            # as the OpenStack controller is the only one that handles model
-            # policies.
-            #
-            # Note: Expect to resolve this dependence as part of XOS refactoring.
-            #
-            os_scr = ServiceController.objects.filter(name="openstack")
-            if os_scr:
-                os_scr = os_scr[0]
-                os_scr.save(update_fields=["updated"], always_update_timestamp=True)
-
-    def delete_record(self, m):
-        pass
-
-    def fetch_pending(self, deleted=False):
-        pend = super(SyncLoadableModuleResource, self).fetch_pending(deleted)
-        return pend
-
diff --git a/xos/synchronizers/onboarding/steps/sync_servicecontroller.py b/xos/synchronizers/onboarding/steps/sync_servicecontroller.py
deleted file mode 100644
index 31e3b30..0000000
--- a/xos/synchronizers/onboarding/steps/sync_servicecontroller.py
+++ /dev/null
@@ -1,62 +0,0 @@
-import os
-import sys
-import base64
-from django.db.models import F, Q
-from xos.config import Config
-from synchronizers.base.syncstep import SyncStep, DeferredException
-from core.models import XOS, ServiceController
-from xos.logger import Logger, logging
-from synchronizers.base.ansible_helper import run_template
-
-# xosbuilder will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__),"..")
-sys.path.insert(0,parentdir)
-
-from xosbuilder import XOSBuilder
-
-logger = Logger(level=logging.INFO)
-
-class SyncServiceController(SyncStep, XOSBuilder):
-    provides=[ServiceController]
-    observes=ServiceController
-    requested_interval=0
-    playbook = "sync_servicecontroller.yaml"
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-        XOSBuilder.__init__(self)
-
-    def sync_record(self, sc):
-        logger.info("Sync'ing ServiceController %s" % sc)
-
-        if sc.xos and (not sc.xos.enable_build):
-            raise DeferredException("XOS build is currently disabled")
-
-        unready = self.check_controller_unready(sc)
-        if unready:
-            raise Exception("Controller %s has unready resources: %s" % (str(sc), ",".join([str(x) for x in unready])))
-
-        if sc.no_build:
-            # nothing to do for a no-build ServiceController
-            return
-
-        dockerfile = self.create_synchronizer_dockerfile(sc)
-        if dockerfile:
-            dockerfiles=[dockerfile]
-        else:
-            dockerfiles=[]
-
-        tenant_fields = {"dockerfiles": dockerfiles,
-                         "build_dir": self.build_dir,
-                         "ansible_tag": sc.__class__.__name__ + "_" + str(sc.id)}
-
-        path="servicecontroller"
-        res = run_template(self.playbook, tenant_fields, path=path, object=sc)
-
-    def delete_record(self, m):
-        pass
-
-    def fetch_pending(self, deleted=False):
-        pend = super(SyncServiceController, self).fetch_pending(deleted)
-        return pend
-
diff --git a/xos/synchronizers/onboarding/steps/sync_servicecontroller.yaml b/xos/synchronizers/onboarding/steps/sync_servicecontroller.yaml
deleted file mode 100644
index b81cde1..0000000
--- a/xos/synchronizers/onboarding/steps/sync_servicecontroller.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-- hosts: localhost
-
-  vars:
-    dockerfiles:
-    {% for dockerfile in dockerfiles %}
-      - docker_image_name: {{ dockerfile.docker_image_name }}
-        dockerfile_fn: {{ dockerfile.dockerfile_fn }}
-    {% endfor %}  
-
-  tasks: 
-    {% for dockerfile in dockerfiles %}
-    - name: build_docker_{{ dockerfile.docker_image_name }}
-      shell: chdir={{ build_dir }} docker build -f {{ dockerfile.dockerfile_fn }} --rm -t {{ dockerfile.docker_image_name }} .
-    {% endfor %}
-
-#  - build_dockers:
-#    shell: docker build -f {{ '{{' }} item.dockerfile_fn {{ '}}' }} --rm -t {{ '{{' }} item.docker_image_name {{ '}}' }} .
-#    with items: "dockerfiles"
diff --git a/xos/synchronizers/onboarding/steps/sync_xos.py b/xos/synchronizers/onboarding/steps/sync_xos.py
deleted file mode 100644
index b1ecf98..0000000
--- a/xos/synchronizers/onboarding/steps/sync_xos.py
+++ /dev/null
@@ -1,74 +0,0 @@
-import os
-import sys
-import base64
-from django.db.models import F, Q
-from xos.config import Config
-from synchronizers.base.syncstep import SyncStep, DeferredException
-from core.models import XOS
-from xos.logger import Logger, logging
-from synchronizers.base.ansible_helper import run_template
-
-# xosbuilder will be in steps/..
-parentdir = os.path.join(os.path.dirname(__file__),"..")
-sys.path.insert(0,parentdir)
-
-from xosbuilder import XOSBuilder
-
-logger = Logger(level=logging.INFO)
-
-class SyncXOS(SyncStep, XOSBuilder):
-    provides=[XOS]
-    observes=XOS
-    requested_interval=0
-    playbook = "sync_xos.yaml"
-
-    def __init__(self, **args):
-        SyncStep.__init__(self, **args)
-        XOSBuilder.__init__(self)
-
-    def sync_record(self, xos):
-        logger.info("Sync'ing XOS %s" % xos)
-
-        if not xos.docker_project_name:
-            raise Exception("xos.docker_project_name is not set")
-
-        if not xos.db_container_name:
-            raise Exception("xos.db_container_name is not set")
-
-        if (not xos.enable_build):
-            raise DeferredException("XOS build is currently disabled")
-
-        # We've seen the XOS object get synced before the ServiceController object
-        # is synced. This results in the XOS UI container getting built with files
-        # from that controller missing. So let's try to defer.
-        #
-        # It could be argued that we should continue to defer if the ServiceController
-        # is in error state, but it is important that a single broken service does
-        # not takedown the entirety of XOS.
-
-        for scr in xos.loadable_modules.all():
-            if (scr.backend_status is not None) and (scr.backend_status.startswith("0")):
-                raise DeferredException("Detected unsynced loadable module. Deferring.")
-
-        self.create_docker_compose()
-
-        if xos.no_build:
-            dockerfiles = []
-        else:
-            dockerfiles = [self.create_ui_dockerfile()]
-
-        tenant_fields = {"dockerfiles": dockerfiles,
-                         "build_dir": self.build_dir,
-                         "docker_project_name": xos.docker_project_name,
-                         "ansible_tag": xos.__class__.__name__ + "_" + str(xos.id)}
-
-        path="XOS"
-        res = run_template(self.playbook, tenant_fields, path=path, object=xos)
-
-    def delete_record(self, m):
-        pass
-
-    def fetch_pending(self, deleted=False):
-        pend = super(SyncXOS, self).fetch_pending(deleted)
-        return pend
-
diff --git a/xos/synchronizers/onboarding/steps/sync_xos.yaml b/xos/synchronizers/onboarding/steps/sync_xos.yaml
deleted file mode 100644
index 49d86fe..0000000
--- a/xos/synchronizers/onboarding/steps/sync_xos.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-- hosts: localhost
-
-  vars:
-    dockerfiles:
-    {% for dockerfile in dockerfiles %}
-      - docker_image_name: {{ dockerfile.docker_image_name }}
-        dockerfile_fn: {{ dockerfile.dockerfile_fn }}
-    {% endfor %}
-
-  tasks:
-    {% for dockerfile in dockerfiles %}
-    - name: build_docker_{{ dockerfile.docker_image_name }}
-      shell: chdir={{ build_dir }} docker build -f {{ dockerfile.dockerfile_fn }} --rm -t {{ dockerfile.docker_image_name }} .
-    {% endfor %}
-
-    - name: run docker-compose
-      shell: docker-compose -p {{ docker_project_name }} -f /opt/xos/synchronizers/onboarding/docker-compose/docker-compose.yml up -d
-
diff --git a/xos/synchronizers/onboarding/templates/docker-compose.yml.j2 b/xos/synchronizers/onboarding/templates/docker-compose.yml.j2
deleted file mode 100644
index 55252d1..0000000
--- a/xos/synchronizers/onboarding/templates/docker-compose.yml.j2
+++ /dev/null
@@ -1,80 +0,0 @@
-version: '2'
-
-{% if networks %}
-networks:
-{% for network in networks %}
-  {{ network }}:
-    external: true
-{% endfor %}
-{% endif %}
-
-services:
-{% for container_name, container in containers.iteritems() %}
-  {{ container_name }}:
-#  container_name: {{ container.container_base_name }}_{{ container_name }}_1
-    image: {{ container.image }}
-{%- if container.networks %}
-    networks:
-{%- for network in container.networks %}
-      - {{ network }}
-{%- endfor %}
-{%- endif %}
-{%- if container.command %}
-    command: {{ container.command }}
-{%- endif %}
-{%- if container.ports %}
-    ports:
-{%- for src,dest in container.ports.iteritems() %}
-      - "{{ src }}:{{ dest }}"
-{%- endfor %}
-{%- endif %}
-{%- if container.links %}
-    links:
-{%- for link in container.links %}
-      - {{ link }}
-{%- endfor %}
-{%- endif %}
-{%- if container.external_links %}
-    external_links:
-{%- for link in container.external_links %}
-      - {{ link }}
-{%- endfor %}
-{%- endif %}
-{%- if container.volumes %}
-    volumes:
-{%- for volume in container.volumes %}
-{%- if volume.read_only %}
-      - {{ volume.host_path }}:{{ volume.container_path }}:ro
-{%- elif volume.host_path == "" %}
-      - {{ volume.container_path }}
-{%- else %}
-      - {{ volume.host_path }}:{{ volume.container_path }}
-{%- endif %}
-{%- endfor %}
-{%- endif %}
-{%- if container.volumes_from %}
-    volumes_from:
-{%- for volume in container.volumes_from %}
-      - {{ volume }}
-{%- endfor %}
-{%- endif %}
-{%- if container.expose %}
-    expose:
-{%- for expose in container.expose %}
-      - "{{ expose }}"
-{%- endfor %}
-{%- endif %}
-{%- if container.extra_hosts %}
-    extra_hosts:
-{%- for host in container.extra_hosts %}
-      - "{{ host }}"
-{%- endfor %}
-{%- endif %}
-    logging:
-      driver: "json-file"
-      options:
-        max-size: "1000k"
-        max-file: "5"
-
-{%- endfor %}
-
diff --git a/xos/synchronizers/onboarding/xosbuilder.py b/xos/synchronizers/onboarding/xosbuilder.py
deleted file mode 100644
index b1acdb2..0000000
--- a/xos/synchronizers/onboarding/xosbuilder.py
+++ /dev/null
@@ -1,507 +0,0 @@
-import os
-import base64
-import jinja2
-import string
-import sys
-import urllib2
-import urlparse
-import xmlrpclib
-
-from xos.config import Config
-from core.models import Service, ServiceController, LoadableModule, LoadableModuleResource, XOS, XOSComponent
-from xos.logger import Logger, logging
-
-from django.utils import timezone
-
-logger = Logger(level=logging.INFO)
-
-
-def add_unique(list, item):
-    if not item in list:
-        list.append(item)
-
-
-class XOSBuilder(object):
-    UI_KINDS = ["models", "xproto", "admin", "admin_template", "django_library", "rest_service", "rest_tenant", "tosca_custom_types", "tosca_resource","public_key","vendor_js"]
-    SYNC_CONTROLLER_KINDS = ["synchronizer", "private_key", "public_key"]
-    SYNC_ALLCONTROLLER_KINDS = ["models", "xproto", "django_library"]
-
-    def __init__(self):
-        self.build_dir = "/opt/xos/BUILD/"
-        self.build_tainted = False
-
-    # stuff that has to do with downloading
-
-    def get_base_dest_dir(self, scr):
-        xos_base = "opt/xos"
-        service_name = scr.loadable_module.name
-        base_dirs = {"models": "%s/services/%s/" % (xos_base, service_name),
-                     "xproto": "%s/services/%s/xproto/" % (xos_base, service_name),
-                     "admin": "%s/services/%s/" % (xos_base, service_name),
-                     "admin_template": "%s/services/%s/templates/" % (xos_base, service_name),
-                     "django_library": "%s/services/%s/" % (xos_base, service_name),
-                     "synchronizer": "%s/synchronizers/%s/" % (xos_base, service_name),
-                     "tosca_custom_types": "%s/tosca/custom_types/" % (xos_base),
-                     "tosca_resource": "%s/tosca/resources/" % (xos_base),
-                     "rest_service": "%s/api/service/" % (xos_base),
-                     "rest_tenant": "%s/api/tenant/" % (xos_base),
-                     "private_key": "%s/services/%s/keys/" % (xos_base, service_name),
-                     "public_key": "%s/services/%s/keys/" % (xos_base, service_name),
-                     "vendor_js": "%s/core/xoslib/static/vendor/" % (xos_base)}
-        dest_dir = base_dirs[scr.kind]
-
-        return dest_dir
-
-    def get_dest_dir(self, scr):
-        dest_dir = self.get_base_dest_dir(scr)
-
-        if scr.subdirectory:
-            dest_dir = os.path.join(dest_dir, scr.subdirectory)
-
-        return dest_dir
-
-    def get_build_fn(self, scr):
-        dest_dir = self.get_dest_dir(scr)
-        dest_fn = os.path.split(urlparse.urlsplit(scr.full_url).path)[-1]
-        return os.path.join(dest_dir, dest_fn)
-
-    def get_download_fn(self, scr):
-        dest_fn = self.get_build_fn(scr)
-        return os.path.join(self.build_dir, dest_fn)
-
-    def read_manifest(self, scr, fn):
-        manifest = []
-        manifest_lines = file(fn).readlines()
-        manifest_lines = [x.strip() for x in manifest_lines]
-        manifest_lines = [x for x in manifest_lines if x]
-        for line in manifest_lines:
-            url_parts = urlparse.urlsplit(scr.full_url)
-            new_path = os.path.join(os.path.join(*os.path.split(url_parts.path)[:-1]), line)
-            url = urlparse.urlunsplit((url_parts.scheme, url_parts.netloc, new_path, url_parts.query, url_parts.fragment))
-
-            build_fn = os.path.join(self.get_dest_dir(scr), line)
-            download_fn = os.path.join(self.build_dir, build_fn)
-
-            manifest.append((url, download_fn, build_fn))
-        return manifest
-
-    def download_file(self, url, dest_fn):
-        logger.info("Download %s to %s" % (url, dest_fn))
-        if not os.path.exists(os.path.dirname(dest_fn)):
-            os.makedirs(os.path.dirname(dest_fn))
-        obj = urllib2.urlopen(url)
-        file(dest_fn, "w").write(obj.read())
-
-        # make python files executable
-        if dest_fn.endswith(".py"):  # and contents.startswith("#!"):
-            os.chmod(dest_fn, 0755)
-
-    def download_resource(self, scr):
-        if scr.format == "manifest":
-            manifest_fn = self.get_download_fn(scr)
-            self.download_file(scr.full_url, manifest_fn)
-            manifest = self.read_manifest(scr, manifest_fn)
-            for (url, download_fn, build_fn) in manifest:
-                self.download_file(url, download_fn)
-        else:
-            self.download_file(scr.full_url, self.get_download_fn(scr))
-
-# XXX docker creates a new container and commits it for every single COPY
-# line in the dockerfile. This causes services with many files (for example,
-# vsg) to take ~ 10-15 minutes to build the docker file. So instead we'll copy
-# the whole build directory, and then run a script that copies the files
-# we want.
-
-#    def get_docker_lines(self, scr):
-#        if scr.format == "manifest":
-#            manifest_fn = self.get_download_fn(scr)
-#            manifest = self.read_manifest(scr, manifest_fn)
-#            lines = []
-#            for (url, download_fn, build_fn) in manifest:
-#               script.append("mkdir -p
-#               #lines.append("COPY %s /%s" % (build_fn, build_fn))
-#            return lines
-#        else:
-#            build_fn = self.get_build_fn(scr)
-#            #return ["COPY %s /%s" % (build_fn, build_fn)]
-
-#    def get_controller_docker_lines(self, controller, kinds):
-#        need_service_init_py = False
-#        dockerfile=[]
-#        for scr in controller.loadable_module_resources.all():
-#            if scr.kind in kinds:
-#                lines = self.get_docker_lines(scr)
-#                dockerfile = dockerfile + lines
-#            if scr.kind in ["admin", "models"]:
-#                need_service_init_py = True
-#
-#        if need_service_init_py:
-#            file(os.path.join(self.build_dir, "opt/xos/empty__init__.py"),"w").write("")
-#            dockerfile.append("COPY opt/xos/empty__init__.py /opt/xos/services/%s/__init__.py" % controller.name)
-#
-#        return dockerfile
-
-    def get_script_lines(self, scr):
-        if scr.format == "manifest":
-            manifest_fn = self.get_download_fn(scr)
-            manifest = self.read_manifest(scr, manifest_fn)
-            lines = []
-            for (url, download_fn, build_fn) in manifest:
-                lines.append("mkdir -p /%s" % os.path.dirname(build_fn))
-                lines.append("cp /build/%s /%s" % (build_fn, build_fn))
-            return lines
-        else:
-            build_fn = self.get_build_fn(scr)
-            return ["mkdir -p /%s" % os.path.dirname(build_fn),
-                    "cp /build/%s /%s" % (build_fn, build_fn)]
-
-    def get_controller_script_lines(self, controller, kinds):
-        need_service_init_py = False
-        script = []
-        inits = []
-        for scr in list(controller.loadable_module_resources.all()):
-            if not (scr.kind in kinds):
-                continue
-
-            # Check and see if the resource we're trying to install has
-            # disappeared. This may happen if the onboarding synchronizer
-            # container has been destroyed and restarted. In this case, flag
-            # the resource for re-download, and set the build_tainted bit
-            # so we can throw an exception after we've evaluated all
-            # resources.
-
-            download_fn = self.get_download_fn(scr)
-            if not os.path.exists(download_fn):
-                logger.info("File %s is missing; dirtying the resource" % download_fn)
-                scr.backend_status = "2 - download_fn is missing"
-                scr.updated = timezone.now()
-                scr.save(update_fields=['backend_status', 'updated'])
-                self.build_tainted = True
-                continue
-
-            lines = self.get_script_lines(scr)
-            script = script + lines
-
-            # compute the set of __init__.py files that we will need
-            if scr.kind in ["admin", "models", "rest_service", "rest_tenant"]:
-                dir = self.get_base_dest_dir(scr)
-                add_unique(inits, dir)
-
-                if scr.subdirectory:
-                    for part in scr.subdirectory.split("/"):
-                        dir = os.path.join(dir, part)
-                        add_unique(inits, dir)
-
-        for init in inits:
-            script.append("echo > %s" % os.path.join("/", init, "__init__.py"))
-
-        return script
-
-    def check_controller_unready(self, controller):
-        unready_resources = []
-        for scr in controller.loadable_module_resources.all():
-            if (not scr.backend_status) or (not scr.backend_status.startswith("1")):
-                unready_resources.append(scr)
-
-        return unready_resources
-
-    # stuff that has to do with building
-
-    def create_xos_app_data(self, name, script, app_list, migration_list):
-        if not os.path.exists(os.path.join(self.build_dir, "opt/xos/xos")):
-            os.makedirs(os.path.join(self.build_dir, "opt/xos/xos"))
-
-        if app_list:
-            script.append("mkdir -p /opt/xos/xos")
-            script.append("cp /build/opt/xos/xos/%s_xosbuilder_app_list /opt/xos/xos/xosbuilder_app_list" % name)
-            # dockerfile.append("COPY opt/xos/xos/%s_xosbuilder_app_list /opt/xos/xos/xosbuilder_app_list" % name)
-            file(os.path.join(self.build_dir, "opt/xos/xos/%s_xosbuilder_app_list") % name, "w").write("\n".join(app_list)+"\n")
-
-        if migration_list:
-            script.append("mkdir -p /opt/xos/xos")
-            script.append("cp /build/opt/xos/xos/%s_xosbuilder_migration_list /opt/xos/xos/xosbuilder_migration_list" % name)
-            # dockerfile.append("COPY opt/xos/xos/%s_xosbuilder_migration_list /opt/xos/xos/xosbuilder_migration_list" % name)
-            file(os.path.join(self.build_dir, "opt/xos/xos/%s_xosbuilder_migration_list") % name, "w").write("\n".join(migration_list)+"\n")
-
-    def create_ui_dockerfile(self):
-        self.build_tainted = False
-        xos = XOS.objects.all()[0]
-        dockerfile_fn = "Dockerfile.UI"
-
-        app_list = []
-        migration_list = []
-
-        dockerfile = ["FROM %s" % xos.source_ui_image]
-        script = []
-        for controller in LoadableModule.objects.all():
-            if self.check_controller_unready(controller):
-                logger.warning("Loadable Module %s has unready resources" % str(controller))
-                continue
-
-            # dockerfile = dockerfile + self.get_controller_docker_lines(controller, self.UI_KINDS)
-            script = script + self.get_controller_script_lines(controller, self.UI_KINDS)
-            if controller.loadable_module_resources.filter(kind="models").exists():
-                app_list.append("services." + controller.name)
-                migration_list.append(controller.name)
-
-        self.create_xos_app_data("ui", script, app_list, migration_list)
-
-        file(os.path.join(self.build_dir, "install-xos.sh"), "w").write("\n".join(script)+"\n")
-        dockerfile.append("COPY . /build/")
-        dockerfile.append("RUN bash /build/install-xos.sh")
-
-        file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
-
-        if self.build_tainted:
-            raise Exception("Build was tainted due to errors")
-
-        return {"dockerfile_fn": dockerfile_fn,
-                "docker_image_name": "xosproject/xos-ui"}
-
-    def create_synchronizer_dockerfile(self, controller):
-        self.build_tainted = False
-
-        if not controller.loadable_module_resources.filter(kind="synchronizer").exists():
-            # it doesn't have a synchronizer, therefore it doesn't need a dockerfile
-            return None
-
-        # bake in the synchronizer from this controller
-        sync_lines = self.get_controller_script_lines(controller, self.SYNC_CONTROLLER_KINDS)
-
-        if self.build_tainted:
-            raise Exception("Build was tainted due to errors")
-
-        # If there's no sync_lines for this ServiceController, then it must not
-        # have a synchronizer.
-        if not sync_lines:
-            return None
-
-        dockerfile_fn = "Dockerfile.%s" % controller.name
-        dockerfile = ["FROM %s" % controller.xos.source_ui_image]
-        script = []
-
-        # Now bake in models from this controller as well as the others
-        # It's important to bake all services in, because some services'
-        # synchronizers may depend on models from another service.
-        app_list = []
-        for c in LoadableModule.objects.all():
-            script = script + self.get_controller_script_lines(c, self.SYNC_ALLCONTROLLER_KINDS)
-            if c.loadable_module_resources.filter(kind="models").exists():
-                app_list.append("services." + c.name)
-
-        self.create_xos_app_data(controller.name, script, app_list, None)
-
-        script = script + sync_lines
-
-        file(os.path.join(self.build_dir, "install-%s.sh" % controller.name), "w").write("\n".join(script)+"\n")
-        dockerfile.append("COPY . /build/")
-        dockerfile.append("RUN bash /build/install-%s.sh" % controller.name)
-
-        file(os.path.join(self.build_dir, dockerfile_fn), "w").write("\n".join(dockerfile)+"\n")
-
-        if self.build_tainted:
-            raise Exception("Build was tainted due to errors")
-
-        return {"dockerfile_fn": dockerfile_fn,
-                "docker_image_name": "xosproject/xos-synchronizer-%s" % controller.name}
-
-    def create_docker_compose(self):
-        xos = XOS.objects.all()[0]
-
-        volume_list = []
-        for volume in xos.volumes.all():
-            volume_list.append({"host_path": volume.host_path,
-                                "container_path": volume.container_path,
-                                "read_only": volume.read_only})
-
-        # Force all legacy UI and Synchronizer containers to include
-        # the certificate, so that it does not have to be built at build time.
-
-        volume_list.append({"host_path": "/opt/cord_profile/im_cert_chain.pem",
-                                  "container_path": "/usr/local/share/ca-certificates/local_certs.crt",
-                                  "read_only": True})
-
-        if xos.extra_hosts:
-            extra_hosts = [x.strip() for x in xos.extra_hosts.split(",")]
-        else:
-            extra_hosts = []
-
-        networks = [ "xos" ] # docker networks used by XOS, parameterize in the future
-
-        containers = {}
-
-        external_links = []
-        if xos.db_container_name:
-            external_links.append("%s:%s" % (xos.db_container_name, "xos_db"))
-        if xos.redis_container_name:
-            external_links.append("%s:%s" % (xos.redis_container_name, "redis"))
-
-        # eventually xos_ui will go away, and only xos_core shall remain.
-
-        containers["xos_ui"] = {
-            "image": xos.dest_ui_image,
-            "command": "python /opt/xos/manage.py runserver 0.0.0.0:%d --insecure --makemigrations" % xos.ui_port,
-            "networks": networks,
-            "ports": {"%d" % xos.ui_port: "%d" % xos.ui_port},
-            "external_links": external_links,
-            "extra_hosts": extra_hosts,
-            "volumes": volume_list}
-
-        # The core needs access to docker so it can restart Chameleon
-        core_volume_list = volume_list + [{"host_path": "/var/run/docker.sock", "container_path": "/var/run/docker.sock", "read_only": False}]
-
-        containers["xos_core"] = {
-            "image": xos.dest_ui_image,
-            "command": 'bash -c "cd coreapi; bash ./start_coreapi.sh"',
-            "networks": networks,
-            "ports": {"50055": "50055", "50051" : "50051"},
-            "external_links": external_links,
-            "extra_hosts": extra_hosts,
-            "volumes": core_volume_list}
-
-        if xos.no_start:
-            containers["xos_ui"]["command"] = "sleep 864000"
-            containers["xos_core"]["command"] = "sleep 864000"
-
-        # creating Component containers
-        for c in XOSComponent.objects.all():
-
-            # create internal and external links list
-            component_links = []
-            component_external_links = []
-            for l in c.links.all():
-                if l.kind == 'internal':
-                    component_links.append("%s:%s" % (l.container, l.alias))
-                elif l.kind == 'external':
-                    component_external_links.append("%s:%s" % (l.container, l.alias))
-
-            # creating volumes list
-            component_volume_list = []
-            for volume in c.volumes.all():
-                component_volume_list.append({"host_path": volume.host_path,
-                                    "container_path": volume.container_path,
-                                    "read_only": volume.read_only})
-
-            # creating containervolumes list
-            component_containervolume_list = []
-            for volume in c.volumecontainers.all():
-                component_containervolume_list.append(volume.container)
-
-            if c.ports:
-                port = c.ports.split(":")
-                ports = {
-                    port[0]: port[1]
-                }
-            else:
-                ports = {}
-
-            containers[c.name] = {
-                "image": c.image,
-                "command": c.command,
-                "networks": networks,
-                "ports": ports,
-                "links": component_links,
-                "external_links": component_external_links,
-                "volumes": component_volume_list,
-                "volumes_from": component_containervolume_list,
-            }
-
-            if c.no_start:
-                containers[c.name]["command"] = "sleep 864000"
-
-        if not xos.frontend_only:
-            for c in ServiceController.objects.all():
-                if self.check_controller_unready(c):
-                    logger.warning("Controller %s has unready resources" % str(c))
-                    continue
-
-                if c.no_deploy:
-                    logger.info("Controller %s has no_deploy set" % str(c))
-
-                if c.no_build and c.image:
-                    # refactored synchronizer containers
-
-                    nb_volume_list=[{"host_path": "/opt/cord_profile/node_key",
-                                  "container_path": "/opt/cord_profile/node_key",
-                                  "read_only": True},
-                                 {"host_path": "/opt/cord/build/platform-install/credentials/xosadmin@opencord.org",
-                                  "container_path": "/opt/xos/services/%s/credentials/xosadmin@opencord.org" % c.name,
-                                  "read_only": True},
-                                 {"host_path": "/opt/cord_profile/im_cert_chain.pem",
-                                  "container_path": "/usr/local/share/ca-certificates/local_certs.crt",
-                                  "read_only": True}]
-
-                    # keys inside onboarding sync are relative to /opt/xos/key_import
-                    # keys outside onboarding sync are relative to /opt/cord_profile
-                    if os.path.exists("/opt/xos/key_import/%s_rsa" % c.name):
-                        nb_volume_list.append({"host_path": "/opt/cord_profile/key_import/%s_rsa" % c.name,    # Note: not all services have keys
-                                  "container_path": "/opt/xos/services/%s/keys/%s_rsa" % (c.name, c.name),
-                                  "read_only": True})
-
-                    if c.name.lower() == "vtr":
-                        # VTR is special -- it has the vSG's private key
-                        # TODO: If docker-compose autogenerate remains a feature,
-                        #   then replace this special-purposing with a general-
-                        #   purpose mechanism for sharing private keys with
-                        #   trusted services.
-                        nb_volume_list.append({"host_path": "/opt/cord_profile/key_import/vsg_rsa",
-                                  "container_path": "/opt/xos/services/%s/keys/vsg_rsa" % c.name,
-                                  "read_only": True})
-
-                    if c.name.lower() == "openstack":
-                        # OpenStack is special -- it needs to onboard images to glance
-                        # TODO: If docker-compose autogenerate remains a feature,
-                        #   then replace this special-purposing with a general-
-                        #   purpose mechanism allowing volume mounts to specific
-                        #   containers.
-                        nb_volume_list.append({"host_path": "/opt/cord_profile/images",
-                                  "container_path": "/opt/xos/images",
-                                  "read_only": True})
-
-
-                    nb_external_links = []
-                    if xos.redis_container_name:
-                        nb_external_links.append("%s:%s" % (xos.redis_container_name, "redis"))
-
-                    containers["%s-synchronizer" % c.name] = {
-                        "image": c.image,
-                        "volumes": nb_volume_list,
-                        "external_links": nb_external_links,
-                        "networks": networks}
-
-                elif c.loadable_module_resources.filter(kind="synchronizer").exists():
-                    # old-style synchronizer containers
-                    if c.synchronizer_run and c.synchronizer_config:
-                        command = 'bash -c "sleep 120; update-ca-certificates; cd /opt/xos/synchronizers/%s; python ./%s -C %s"' % (c.name, c.synchronizer_run, c.synchronizer_config)
-                    else:
-                        command = 'bash -c "sleep 120; update-ca-certificates; cd /opt/xos/synchronizers/%s; bash ./run.sh"' % c.name
-
-                    containers["xos_synchronizer_%s" % c.name] = {
-                        "image": "xosproject/xos-synchronizer-%s" % c.name,
-                        "command": command,
-                        "networks": networks,
-                        "external_links": external_links,
-                        "extra_hosts": extra_hosts,
-                        "volumes": volume_list
-                    }
-
-                    if c.no_start:
-                        containers["xos_synchronizer_%s" % c.name]["command"] = "sleep 864000"
-
-        vars = {"containers": containers, "networks": networks }
-
-        template_loader = jinja2.FileSystemLoader("/opt/xos/synchronizers/onboarding/templates/")
-        template_env = jinja2.Environment(loader=template_loader)
-        template = template_env.get_template("docker-compose.yml.j2")
-        buffer = template.render(vars)
-
-        if not os.path.exists("/opt/xos/synchronizers/onboarding/docker-compose"):
-            os.makedirs("/opt/xos/synchronizers/onboarding/docker-compose")
-        file("/opt/xos/synchronizers/onboarding/docker-compose/docker-compose.yml", "w").write(buffer)
-
-#    def build_xos(self):
-#        dockerfiles=[]
-#        dockerfiles.append(self.create_ui_dockerfile())
-#
-#        for controller in ServiceController.objects.all():
-#            dockerfiles.append(self.create_synchronizer_dockerfile(controller))
