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 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 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
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)
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()