Beispiel #1
0
def create_image(image_collection, base_image_id=None, target_image_id=None):
    try:
        image_type = image_collection[0:-1]
        content_type = request.headers.get('Content-Type')
        form_data = form_data_for_content_type(content_type)
        if(('application/x-www-form-urlencoded' in content_type) or ('multipart/form-data' in content_type)):
            request_data = form_data
        else:
            request_data = form_data.get(image_type)
        if(not request_data):
            raise HTTPResponse(status=400, output='%s not found in request.' % image_type)

        req_base_img_id = request_data.get('base_image_id')
        req_target_img_id = request_data.get('target_image_id')
        base_img_id = req_base_img_id if req_base_img_id else base_image_id
        target_img_id = req_target_img_id if req_target_img_id else target_image_id

        if(image_collection == 'base_images'):
            builder = BuildDispatcher().builder_for_base_image(template=request_data.get('template'),
                                                               parameters=request_data.get('parameters'))
            image = builder.base_image
        elif(image_collection == 'target_images'):
            builder = BuildDispatcher().builder_for_target_image(target=request_data.get('target'),
                                                                 image_id=base_img_id,
                                                                 template=request_data.get('template'),
                                                                 parameters=request_data.get('parameters'))
            image = builder.target_image
        elif(image_collection == 'provider_images'):
            _provider = request_data.get('provider')
            _credentials = request_data.get('credentials')
            _target = request_data.get('target')
            if(_provider and _credentials and _target):
                builder = BuildDispatcher().builder_for_provider_image(provider=_provider,
                                                                   credentials=_credentials,
                                                                   target=_target,
                                                                   image_id=target_img_id,
                                                                   template=request_data.get('template'),
                                                                   parameters=request_data.get('parameters'))
                image = builder.provider_image
            else:
                _credentials = 'REDACTED' if _credentials else None
                raise HTTPResponse(status=400, output="Missing key/value pair: provider(%s), credentials(%s), target(%s)" % (_provider, _credentials, _target))
        else:
            raise HTTPResponse(status=404, output="%s not found" % image_collection)

        _response = {'_type':type(image).__name__,
                     'id':image.identifier,
                     'href':'%s/%s' % (request.url, image.identifier)}
        for key in image.metadata():
            if key not in ('identifier', 'data'):
                _response[key] = getattr(image, key, None)

        response.status = 202
        return converted_response({image_collection[0:-1]:_response})
    except KeyError as e:
        log.exception(e)
        raise HTTPResponse(status=400, output='Missing value for key: %s' % e)
    except Exception as e:
        log.exception(e)
        raise HTTPResponse(status=500, output=e)
    def buildimagetype(self, imagetype, baseid, imgopts={}):
        """
        This method compliments the builder method by taking its
        uuid and outputputting various image formats
        """
        print "Working on a {0} for {1}".format(imagetype, baseid)
        bd = BuildDispatcher()
        imagebuilder = bd.builder_for_target_image(imagetype, image_id=baseid, template=None, parameters=imgopts)
        target_image = imagebuilder.target_image
        thread = imagebuilder.target_thread
        thread.join()
        if target_image.status != "COMPLETE":
            fail_msg("Failed image status: " + target_image.status)

        print target_image.identifier
        # Now doing the OVA

        print "Creating OVA for {0}".format(imagetype)

        bdi = BuildDispatcher()
        ovabuilder = bdi.builder_for_target_image("ova", image_id=target_image.identifier, template=None, parameters=imgopts)
        target_ova = ovabuilder.target_image
        ovathread = ovabuilder.target_thread
        ovathread.join()
        if target_ova.status != "COMPLETE":
            fail_msg("Failed image status: " + target_ova.status)
        return target_ova
    def build(self, template=None, parameters=None):
        bd = BuildDispatcher()
        builder = bd.builder_for_base_image(template=template, parameters=parameters)
        image = builder.base_image
        thread = builder.base_thread

        thread.join()

        if image.status != "COMPLETE":
            fail_msg("Failed image status: " + image.status)
        return image
    def build(self, template=None, parameters=None):
        bd = BuildDispatcher()
        builder = bd.builder_for_base_image(template=template,
                                            parameters=parameters)
        image = builder.base_image
        thread = builder.base_thread

        thread.join()

        if image.status != "COMPLETE":
            fail_msg("Failed image status: " + image.status)
        return image
    def buildimagetype(self, imagetype, baseid, imgopts={}):
        """
        This method compliments the builder method by taking its
        uuid and outputputting various image formats
        """

        # This dict maps the imagetype to an imageformat
        imageformats = {
            "kvm": "kvm",
            "rhevm": "rhevm",
            "vsphere": "vsphere",
            "vagrant-libvirt": "rhevm",
            "vagrant-virtualbox": "vsphere",
        }

        log("Working on a {0} for {1}".format(imagetype, baseid))
        vagrant = True if imagetype in ["vagrant-virtualbox", "vagrant-libvirt"] else False
        if vagrant:
            # Absent this directive, Vagrant will attempt to sync to /vagrant
            # which is not writeable in a normal rpm-ostree host
            imgopts["vagrant_sync_directory"] = "/home/vagrant/sync"
        bd = BuildDispatcher()
        imagebuilder = bd.builder_for_target_image(
            imageformats[imagetype], image_id=baseid, template=None, parameters=imgopts
        )
        target_image = imagebuilder.target_image
        thread = imagebuilder.target_thread
        thread.join()
        if target_image.status != "COMPLETE":
            fail_msg("Failed image status: " + target_image.status)

        # Now doing the OVA

        log("Creating OVA for {0}".format(imagetype))

        bdi = BuildDispatcher()
        if imagetype == "vagrant-virtualbox":
            imgopts["vsphere_ova_format"] = "vagrant-virtualbox"
        if imagetype == "vagrant-libvirt":
            imgopts["rhevm_ova_format"] = "vagrant-libvirt"

        ovabuilder = bdi.builder_for_target_image(
            "ova", image_id=target_image.identifier, template=None, parameters=imgopts
        )
        target_ova = ovabuilder.target_image
        ovathread = ovabuilder.target_thread
        ovathread.join()
        if target_ova.status != "COMPLETE":
            fail_msg("Failed image status: " + target_ova.status)
        return target_ova
    def build(self, template=None, parameters=None):
        bd = BuildDispatcher()
        builder = bd.builder_for_base_image(template=template,
                                            parameters=parameters)
        print json.dumps(builder.app_config)
        image = builder.base_image
        thread = builder.base_thread
        for key in image.metadata():
            print "%s %s" % (key, getattr(image, key, None))

        thread.join()

        if image.status != "COMPLETE":
            fail_msg("Failed image status: " + image.status)
        return image
    def build(self, template=None, parameters=None):
        bd = BuildDispatcher()
        builder = bd.builder_for_base_image(template=template,
                                            parameters=parameters)
        print json.dumps(builder.app_config)
        image = builder.base_image
        thread = builder.base_thread
        for key in image.metadata():
            print "%s %s" % (key, getattr(image, key, None))

        thread.join()

        if image.status != "COMPLETE":
            fail_msg("Failed image status: " + image.status)
        return image
Beispiel #8
0
def create_image(image_collection, base_image_id=None, target_image_id=None):
    try:
        image_type = image_collection[0:-1]
        request_data = form_data_for_content_type(request.headers.get('Content-Type')).get(image_type)
        if(not request_data):
            raise HTTPResponse(status=400, output='%s not found in request.' % image_type)

        req_base_img_id = request_data.get('base_image_id')
        req_target_img_id = request_data.get('target_image_id')
        base_img_id = req_base_img_id if req_base_img_id else base_image_id
        target_img_id = req_target_img_id if req_target_img_id else target_image_id

        if(image_collection == 'base_images'):
            builder = BuildDispatcher().builder_for_base_image(template=request_data.get('template'),
                                                               parameters=request_data.get('parameters'))
            image = builder.base_image
        elif(image_collection == 'target_images'):
            builder = BuildDispatcher().builder_for_target_image(target=request_data.get('target'),
                                                                 image_id=base_img_id,
                                                                 template=request_data.get('template'),
                                                                 parameters=request_data.get('parameters'))
            image = builder.target_image
        elif(image_collection == 'provider_images'):
            builder = BuildDispatcher().builder_for_provider_image(provider=request_data.get('provider'),
                                                                   credentials=request_data.get('credentials'),
                                                                   target=request_data.get('target'),
                                                                   image_id=target_img_id,
                                                                   template=request_data.get('template'),
                                                                   parameters=request_data.get('parameters'))
            image = builder.provider_image
        else:
            raise HTTPResponse(status=404, output="%s not found" % image_collection)

        _response = {'_type':type(image).__name__,
                     'id':image.identifier,
                     'href':'%s/%s' % (request.url, image.identifier)}
        for key in image.metadata():
            if key not in ('identifier', 'data'):
                _response[key] = getattr(image, key, None)

        response.status = 202
        return converted_response({image_collection[0:-1]:_response})
    except KeyError as e:
        log.exception(e)
        raise HTTPResponse(status=400, output='Missing value for key: %s' % e)
    except Exception as e:
        log.exception(e)
        raise HTTPResponse(status=500, output=e)
    def buildimagetype(self, imagetype, baseid, imgopts={}):
        """
        This method compliments the builder method by taking its
        uuid and outputputting various image formats
        """

        # This dict maps the imagetype to an imageformat
        imageformats = {'kvm':'kvm', 'rhevm': 'rhevm', 'vsphere':'vsphere', 
                        'vagrant-libvirt':'rhevm', 'vagrant-virtualbox': 'vsphere'
                        }

        log("Working on a {0} for {1}".format(imagetype, baseid))
        vagrant = True if imagetype in ['vagrant-virtualbox', 'vagrant-libvirt'] else False
        bd = BuildDispatcher()
        imagebuilder = bd.builder_for_target_image(imageformats[imagetype], image_id=baseid, template=None, parameters=imgopts)
        target_image = imagebuilder.target_image
        thread = imagebuilder.target_thread
        thread.join()
        if target_image.status != "COMPLETE":
            fail_msg("Failed image status: " + target_image.status)

        # Now doing the OVA

        log("Creating OVA for {0}".format(imagetype))

        bdi = BuildDispatcher()
        if imagetype == 'vagrant-virtualbox' :
            imgopts['vsphere_ova_format'] = 'vagrant-virtualbox'
        if imagetype == 'vagrant-libvirt':
            imgopts['rhevm_ova_format'] = 'vagrant-libvirt'

        ovabuilder = bdi.builder_for_target_image("ova", image_id=target_image.identifier, template=None, parameters=imgopts)
        target_ova = ovabuilder.target_image
        ovathread = ovabuilder.target_thread
        ovathread.join()
        if target_ova.status != "COMPLETE":
            fail_msg("Failed image status: " + target_ova.status)
        return target_ova
    def buildimagetype(self, imagetype, baseid, imgopts={}):
        """
        This method compliments the builder method by taking its
        uuid and outputputting various image formats
        """

        # This dict maps the imagetype to an imageformat
        imageformats = {
            'kvm': 'kvm',
            'rhevm': 'rhevm',
            'vsphere': 'vsphere',
            'vagrant-libvirt': 'rhevm',
            'vagrant-virtualbox': 'vsphere'
        }

        log("Working on a {0} for {1}".format(imagetype, baseid))
        vagrant = True if imagetype in [
            'vagrant-virtualbox', 'vagrant-libvirt'
        ] else False
        if vagrant:
            # Absent this directive, Vagrant will attempt to sync to /vagrant
            # which is not writeable in a normal rpm-ostree host
            imgopts['vagrant_sync_directory'] = '/home/vagrant/sync'
        bd = BuildDispatcher()
        imagebuilder = bd.builder_for_target_image(imageformats[imagetype],
                                                   image_id=baseid,
                                                   template=None,
                                                   parameters=imgopts)
        target_image = imagebuilder.target_image
        thread = imagebuilder.target_thread
        thread.join()
        if target_image.status != "COMPLETE":
            fail_msg("Failed image status: " + target_image.status)

        # Now doing the OVA

        log("Creating OVA for {0}".format(imagetype))

        bdi = BuildDispatcher()
        if imagetype == 'vagrant-virtualbox':
            imgopts['vsphere_ova_format'] = 'vagrant-virtualbox'
        if imagetype == 'vagrant-libvirt':
            imgopts['rhevm_ova_format'] = 'vagrant-libvirt'

        ovabuilder = bdi.builder_for_target_image(
            "ova",
            image_id=target_image.identifier,
            template=None,
            parameters=imgopts)
        target_ova = ovabuilder.target_image
        ovathread = ovabuilder.target_thread
        ovathread.join()
        if target_ova.status != "COMPLETE":
            fail_msg("Failed image status: " + target_ova.status)
        return target_ova
    def buildimagetype(self, imagetype, baseid, imgopts={}):
        """
        This method compliments the builder method by taking its
        uuid and outputputting various image formats
        """

        # This dict maps the imagetype to an imageformat
        imageformats = {'kvm':'kvm', 'rhevm': 'rhevm', 'vsphere':'vsphere', 
                        'vagrant-libvirt':'rhevm', 'vagrant-virtualbox': 'vsphere'
                        }

        print "Working on a {0} for {1}".format(imagetype, baseid)
        vagrant = True if imagetype in ['vagrant-virtualbox', 'vagrant-libvirt'] else False
        bd = BuildDispatcher()
        imagebuilder = bd.builder_for_target_image(imageformats[imagetype], image_id=baseid, template=None, parameters=imgopts)
        target_image = imagebuilder.target_image
        thread = imagebuilder.target_thread
        thread.join()
        if target_image.status != "COMPLETE":
            fail_msg("Failed image status: " + target_image.status)

        print target_image.identifier
        # Now doing the OVA

        print "Creating OVA for {0}".format(imagetype)

        bdi = BuildDispatcher()
        if imagetype == 'vagrant-virtualbox' :
            imgopts['vsphere_ova_format'] = 'vagrant-virtualbox'
        if imagetype == 'vagrant-libvirt':
            imgopts['rhevm_ova_format'] = 'vagrant-libvirt'

        ovabuilder = bdi.builder_for_target_image("ova", image_id=target_image.identifier, template=None, parameters=imgopts)
        target_ova = ovabuilder.target_image
        ovathread = ovabuilder.target_thread
        ovathread.join()
        if target_ova.status != "COMPLETE":
            fail_msg("Failed image status: " + target_ova.status)
        return target_ova
Beispiel #12
0
def operate_on_image_with_id(image_collection, image_id):
    log.debug("In the generic route (%s)" % request.method)
    image_type = image_collection[0:-1]

    if image_type not in [ 'target_image', 'provider_image' ]:
        raise HTTPResponse(status=500, output='Attempt to access invalid image type: %s' % image_type)

    if request.method == "GET":
        log.debug("In the generic GET")
	try:
	    image = PersistentImageManager.default_manager().image_with_id(image_id)
	    if(not image):
                log.error("Did search for image with id (%s) and got (%s)" % (image_id, image))
		raise HTTPResponse(status=404, output='No image found with id: %s' % (image_id))
            else:
                log.debug("Found image id (%s). Constructing response" % (image_id))
	    _type = type(image).__name__
	    _response = {'_type':_type,
			 'id':image.identifier,
			 'href':request.url}
	    for key in image.metadata():
		if key not in ('identifier', 'data', 'base_image_id', 'target_image_id'):
		    _response[key] = getattr(image, key, None)

	    api_url = '%s://%s/imagefactory' % (request.urlparts[0], request.urlparts[1])

	    if(_type == "TargetImage"):
		_objtype = 'target_image'
	    elif(_type == "ProviderImage"):
		_objtype = 'provider_image'
	    else:
		log.error("Returning HTTP status 500 due to unknown image type: %s" % _type)
		raise HTTPResponse(status=500, output='Bad type for found object: %s' % _type) 

            if _objtype != image_type:
                raise HTTPResponse(status=500, output='Requested image type %s got image of type %s' % (image_type, _objtype))

	    response.status = 200
	    return {_objtype:_response}
	except Exception as e:
	    log.exception(e)
	    raise HTTPResponse(status=500, output=e)

#@rest_api.get('/imagefactory/<image_collection>')
#@rest_api.get('/imagefactory/target_images/<target_image_id>/<image_collection>')
#@log_request
#@oauth_protect
#def list_images(image_collection, base_image_id=None, target_image_id=None, list_url=None):
#    try:
#        fetch_spec = {}
#        if(image_collection == 'target_images'):
#            fetch_spec['type'] = 'TargetImage'
#        elif(image_collection == 'provider_images'):
#            fetch_spec['type'] = 'ProviderImage'
#            if target_image_id:
#                fetch_spec['target_image_id'] = target_image_id
#        else:
#            raise HTTPResponse(status=404, output='%s not found' % image_collection)
#
#        fetched_images = PersistentImageManager.default_manager().images_from_query(fetch_spec)
#        images = list()
#        _url = list_url if list_url else request.url
#        for image in fetched_images:
#            resp_item = {image_collection[0:-1]:
#                            {'_type':type(image).__name__,
#                            'id':image.identifier,
#                            'href':'%s/%s' % (_url, image.identifier)}
#                        }
#            images.append(resp_item)
#
#        return images
#    except Exception as e:
#        log.exception(e)
#        raise HTTPResponse(status=500, output=e)

#@rest_api.post('/imagefactory/target_images/<target_image_id>')
#@log_request
#@oauth_protect
#def clone_target_image(target_image_id):
    elif request.method == "POST":
        try:
	    if image_type == 'target_image':
		request_data = RESTtools.form_data_for_content_type(request.headers.get('Content-Type'))    

		(target_image, upload_id) = SecondaryDispatcher().prep_target_image_clone(request_data, image_id)

		_response = { }
		_response['target_image'] = {'_type':type(target_image).__name__,
					     'id':target_image.identifier,
					     'href':'%s' % (request.url)}
		for key in target_image.metadata():
		    if key not in ('identifier', 'data'):
			_response['target_image'][key] = getattr(target_image, key, None)
		
		if upload_id:
		    _response['upload_id'] = upload_id

		response.status = 202
		return _response
	    else:
		request_data = RESTtools.form_data_for_content_type(request.headers.get('Content-Type'))
		if(not request_data):
		    raise HTTPResponse(status=400, output='%s not found in request.' % (image_type))

		req_target_img_id = request_data.get('target_image_id')
		target_img_id = req_target_img_id if req_target_img_id else target_image_id

		builder = BuildDispatcher().builder_for_provider_image(provider=request_data.get('provider'),
								       credentials=request_data.get('credentials'),
								       target=request_data.get('target'),
								       image_id=target_img_id,
								       template=request_data.get('template'),
								       parameters=request_data.get('parameters'),
								       my_image_id=image_id)
		image = builder.provider_image

		_response = {'_type':type(image).__name__,
			     'id':image.identifier,
			     'href':'%s/%s' % (request.url, image.identifier)}
		for key in image.metadata():
		    if key not in ('identifier', 'data'):
			_response[key] = getattr(image, key, None)

		response.status = 202
		return {image_collection[0:-1]:_response}
        except Exception as e:
            log.exception(e)
	    raise HTTPResponse(status=500, output=e)
    else:
	raise HTTPResponse(status=405)
Beispiel #13
0
    def create(self, installer_outputdir, args, cmd, profile, post=None):
        imgfunc = AbstractImageFactoryTask(args, cmd, profile)
        repos = self.getrepos(self.jsonfilename)
        util_xml = self.template_xml(
            repos, os.path.join(self.pkgdatadir,
                                'lorax-indirection-repo.tmpl'))
        lorax_repos = []
        if self.lorax_additional_repos:
            if getattr(self, 'yum_baseurl') not in self.lorax_additional_repos:
                self.lorax_additional_repos += ", {0}".format(
                    getattr(self, 'yum_baseurl'))
            for repourl in self.lorax_additional_repos.split(','):
                lorax_repos.extend(['-s', repourl.strip()])
        else:
            lorax_repos.extend(['-s', getattr(self, 'yum_baseurl')])

        port_file_path = self.workdir + '/repo-port'

        if not self.ostree_repo_is_remote:
            # Start trivial-httpd
            trivhttp = TrivialHTTP()
            trivhttp.start(self.ostree_repo)
            httpd_port = str(trivhttp.http_port)
            print "trivial httpd port=%s, pid=%s" % (httpd_port,
                                                     trivhttp.http_pid)
        else:
            httpd_port = str(self.httpd_port)
        substitutions = {
            'OSTREE_PORT': httpd_port,
            'OSTREE_REF': self.ref,
            'OSTREE_OSNAME': self.os_name,
            'LORAX_REPOS': " ".join(lorax_repos),
            'OS_PRETTY': self.os_pretty_name,
            'OS_VER': self.release
        }
        if '@OSTREE_HOSTIP@' in util_xml:
            if not self.ostree_repo_is_remote:
                host_ip = getDefaultIP()
            else:
                host_ip = self.httpd_host
            substitutions['OSTREE_HOSTIP'] = host_ip

        if '@OSTREE_PATH' in util_xml:
            substitutions['OSTREE_PATH'] = self.httpd_path

        print type(util_xml)
        for subname, subval in substitutions.iteritems():
            util_xml = util_xml.replace('@%s@' % (subname, ), subval)

        # Dump util_xml to workdir for logging
        self.dumpTempMeta(os.path.join(self.workdir, "lorax.xml"), util_xml)
        global verbosemode
        imgfacbuild = ImgFacBuilder(verbosemode=verbosemode)
        imgfacbuild.verbosemode = verbosemode
        imgfunc.checkoz("qcow2")
        util_ks = self.createUtilKS(self.tdl)

        # Building of utility image
        parameters = {
            "install_script": util_ks,
            "generate_icicle": False,
            "oz_overrides": json.dumps(imgfunc.ozoverrides)
        }
        if self.util_uuid is None:
            print "Starting Utility image build"
            util_image = imgfacbuild.build(template=open(self.util_tdl).read(),
                                           parameters=parameters)
            print "Created Utility Image: {0}".format(util_image.data)

        else:
            pim = PersistentImageManager.default_manager()
            util_image = pim.image_with_id(self.util_uuid)
            print "Re-using Utility Image: {0}".format(util_image.identifier)

        # Now lorax
        bd = BuildDispatcher()
        lorax_parameters = {
            "results_location": "/lorout/output.tar",
            "utility_image": util_image.identifier,
            "utility_customizations": util_xml,
            "oz_overrides": json.dumps(imgfunc.ozoverrides)
        }
        print "Building the lorax image"
        loraxiso_builder = bd.builder_for_target_image(
            "indirection",
            image_id=util_image.identifier,
            template=None,
            parameters=lorax_parameters)
        loraxiso_image = loraxiso_builder.target_image
        thread = loraxiso_builder.target_thread
        thread.join()

        # Extract the tarball of built images
        print "Extracting images to {0}/images".format(installer_outputdir)
        t = tarfile.open(loraxiso_image.data)
        t.extractall(path=installer_outputdir)
        if not self.ostree_repo_is_remote:
            trivhttp.stop()
    def create(self, outputdir, post=None):
        imgfunc = ImageFunctions()
        repos = self.getrepos(self.jsonfilename)
        util_xml = self.template_xml(repos, os.path.join(self.pkgdatadir, 'lorax-indirection-repo.tmpl'))
        lorax_repos = []
        if self.lorax_additional_repos:
            if getattr(self, 'yum_baseurl') not in self.lorax_additional_repos:
                self.lorax_additional_repos += ", {0}".format(getattr(self, 'yum_baseurl'))
            for repourl in self.lorax_additional_repos.split(','):
                lorax_repos.extend(['-s', repourl.strip()])
        else:
            lorax_repos.extend(['-s', getattr(self, 'yum_baseurl')])

        port_file_path = self.workdir + '/repo-port'

        # Start trivial-httpd

        trivhttp = TrivialHTTP()
        trivhttp.start(self.ostree_repo)
        httpd_port = str(trivhttp.http_port)
        print "trivial httpd port=%s, pid=%s" % (httpd_port, trivhttp.http_pid)
        substitutions = {'OSTREE_PORT': httpd_port,
                         'OSTREE_REF':  self.ref,
                         'OSTREE_OSNAME':  self.os_name,
                         'LORAX_REPOS': " ".join(lorax_repos),
                         'OS_PRETTY': self.os_pretty_name,
                         'OS_VER': self.release
                         }
        if '@OSTREE_HOSTIP@' in util_xml:
            host_ip = getDefaultIP()
            substitutions['OSTREE_HOSTIP'] = host_ip

        print type(util_xml)
        for subname, subval in substitutions.iteritems():
            util_xml = util_xml.replace('@%s@' % (subname, ), subval)

        # Dump util_xml to workdir for logging
        self.dumpTempMeta(os.path.join(self.workdir, "lorax.xml"), util_xml)
        global verbosemode
        imgfacbuild = ImgFacBuilder(verbosemode=verbosemode)
        imgfacbuild.verbosemode = verbosemode
        imgfunc.checkoz()
        util_ks = self.createUtilKS(self.tdl)

        # Building of utility image
        parameters = {"install_script": util_ks,
                      "generate_icicle": False,
                      "oz_overrides": json.dumps(imgfunc.ozoverrides)
                      }
        print "Starting build"
        if self.util_uuid is None:
            util_image = imgfacbuild.build(template=open(self.util_tdl).read(), parameters=parameters)
            print "Created Utility Image: {0}".format(util_image.data)

        else:
            pim = PersistentImageManager.default_manager()
            util_image = pim.image_with_id(self.util_uuid)
            print "Re-using Utility Image: {0}".format(util_image.identifier)

        # Now lorax
        bd = BuildDispatcher()
        lorax_parameters = {"results_location": "/lorout/output.tar",
                            "utility_image": util_image.identifier,
                            "utility_customizations": util_xml,
                            "oz_overrides": json.dumps(imgfunc.ozoverrides)
                            }
        print "Building the lorax image"
        loraxiso_builder = bd.builder_for_target_image("indirection", image_id=util_image.identifier, template=None, parameters=lorax_parameters)
        loraxiso_image = loraxiso_builder.target_image
        thread = loraxiso_builder.target_thread
        thread.join()

        # Extract the tarball of built images
        print "Extracting images to {0}/images".format(outputdir)
        t = tarfile.open(loraxiso_image.data)
        t.extractall(path=outputdir)
        trivhttp.stop()