def build(self, ctxt, build_id, source_uri, name, base_image_id, source_format, image_format, assembly_id): update_assembly_status(ctxt, assembly_id, ASSEMBLY_STATES.BUILDING) solum.TLS.trace.clear() solum.TLS.trace.import_context(ctxt) build_cmd = self._get_build_command(ctxt, source_uri, name, base_image_id, source_format, image_format) solum.TLS.trace.support_info(build_cmd=' '.join(build_cmd), assembly_id=assembly_id) try: user_env = self._get_environment(ctxt) except exception.SolumException as env_ex: LOG.exception(env_ex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=str(env_ex), assembly_id=assembly_id) return log_env = user_env.copy() if 'OS_AUTH_TOKEN' in log_env: del log_env['OS_AUTH_TOKEN'] solum.TLS.trace.support_info(environment=log_env) job_update_notification(ctxt, build_id, IMAGE_STATES.BUILDING, description='Starting the image build', assembly_id=assembly_id) try: out = subprocess.Popen(build_cmd, env=user_env, stdout=subprocess.PIPE).communicate()[0] except OSError as subex: LOG.exception(subex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=subex, assembly_id=assembly_id) return # we expect one line in the output that looks like: # created_image_id=<the glance_id> created_image_id = None for line in out.split('\n'): if 'created_image_id' in line: solum.TLS.trace.support_info(build_out_line=line) created_image_id = line.split('=')[-1].strip() if not uuidutils.is_uuid_like(created_image_id): job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description='image not created', assembly_id=assembly_id) return job_update_notification(ctxt, build_id, IMAGE_STATES.COMPLETE, description='built successfully', created_image_id=created_image_id, assembly_id=assembly_id) if assembly_id is not None: deployer_api.API(context=ctxt).deploy(assembly_id=assembly_id, image_id=created_image_id)
def update_and_save(cls, context, id_or_uuid, data): is_uuid = uuidutils.is_uuid_like(id_or_uuid) try: session = SolumBase.get_session() with session.begin(): if is_uuid: query = session.query(cls).filter_by(uuid=id_or_uuid) else: query = session.query(cls).filter_by(id=id_or_uuid) obj = filter_by_project(context, query).one() if obj._is_updatable(): obj.update(data) session.merge(obj) return obj except orm_exc.NoResultFound: cls._raise_not_found(id_or_uuid)
def get_lp_by_name_or_uuid(cls, context, name_or_uuid, include_operators_lp=False): if uuidutils.is_uuid_like(name_or_uuid): try: session = Image.get_session() result = session.query(cls).filter_by( artifact_type='language_pack', uuid=name_or_uuid) if include_operators_lp is True: result = result.filter( Image.project_id.in_([operator_id, context.tenant])) return result.one() else: return sql.filter_by_project(context, result).one() except exc.NoResultFound: return cls.get_by_name(context, name_or_uuid, include_operators_lp) else: return cls.get_by_name(context, name_or_uuid, include_operators_lp)
def build(self, ctxt, build_id, git_info, name, base_image_id, source_format, image_format, assembly_id, test_cmd, source_creds_ref=None, artifact_type=None, lp_metadata=None): if artifact_type == 'language_pack': self.build_lp(self, ctxt, git_info, name, base_image_id, source_format, image_format, test_cmd, source_creds_ref, artifact_type, lp_metadata) return # TODO(datsun180b): This is only temporary, until Mistral becomes our # workflow engine. if self._run_unittest(ctxt, build_id, git_info, name, base_image_id, source_format, image_format, assembly_id, test_cmd, source_creds_ref) != 0: return update_assembly_status(ctxt, assembly_id, ASSEMBLY_STATES.BUILDING) solum.TLS.trace.clear() solum.TLS.trace.import_context(ctxt) source_uri = git_info['source_url'] build_cmd = self._get_build_command(ctxt, 'build', source_uri, name, base_image_id, source_format, image_format, '', test_cmd, source_creds_ref, artifact_type, lp_metadata) solum.TLS.trace.support_info(build_cmd=' '.join(build_cmd), assembly_id=assembly_id) try: user_env = self._get_environment(ctxt, assembly_id) except exception.SolumException as env_ex: LOG.exception(env_ex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=str(env_ex), assembly_id=assembly_id) log_env = user_env.copy() if 'OS_AUTH_TOKEN' in log_env: del log_env['OS_AUTH_TOKEN'] solum.TLS.trace.support_info(environment=log_env) job_update_notification(ctxt, build_id, IMAGE_STATES.BUILDING, description='Starting the image build', assembly_id=assembly_id) # TODO(datsun180b): Associate log with assembly properly logpath = "%s/%s-%s.log" % (user_env['SOLUM_TASK_DIR'], 'build', user_env['BUILD_ID']) LOG.debug("Build logs stored at %s" % logpath) out = None try: out = subprocess.Popen(build_cmd, env=user_env, stdout=subprocess.PIPE).communicate()[0] except OSError as subex: LOG.exception(subex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=subex, assembly_id=assembly_id) return if assembly_id is not None: assem = get_assembly_by_id(ctxt, assembly_id) upload_task_log(ctxt, logpath, assem, user_env['BUILD_ID'], 'build') # we expect one line in the output that looks like: # created_image_id=<the glance_id> created_image_id = None for line in out.split('\n'): if 'created_image_id' in line: solum.TLS.trace.support_info(build_out_line=line) created_image_id = line.split('=')[-1].strip() if not uuidutils.is_uuid_like(created_image_id): job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description='image not created', assembly_id=assembly_id) return job_update_notification(ctxt, build_id, IMAGE_STATES.COMPLETE, description='built successfully', created_image_id=created_image_id, assembly_id=assembly_id) if created_image_id is not None: deployer_api.API(context=ctxt).deploy(assembly_id=assembly_id, image_id=created_image_id)
def build(self, ctxt, build_id, source_uri, name, base_image_id, source_format, image_format, assembly_id, test_cmd): # TODO(datsun180b): This is only temporary, until Mistral becomes our # workflow engine. if self._run_unittest(ctxt, assembly_id, source_uri, test_cmd) != 0: return update_assembly_status(ctxt, assembly_id, ASSEMBLY_STATES.BUILDING) solum.TLS.trace.clear() solum.TLS.trace.import_context(ctxt) build_cmd = self._get_build_command(ctxt, source_uri, name, base_image_id, source_format, image_format) solum.TLS.trace.support_info(build_cmd=' '.join(build_cmd), assembly_id=assembly_id) try: user_env = self._get_environment(ctxt) except exception.SolumException as env_ex: LOG.exception(env_ex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=str(env_ex), assembly_id=assembly_id) return log_env = user_env.copy() if 'OS_AUTH_TOKEN' in log_env: del log_env['OS_AUTH_TOKEN'] solum.TLS.trace.support_info(environment=log_env) job_update_notification(ctxt, build_id, IMAGE_STATES.BUILDING, description='Starting the image build', assembly_id=assembly_id) # TODO(datsun180b): Associate log with assembly properly logpath = "%s/%s.log" % (user_env['SOLUM_TASK_DIR'], user_env['BUILD_ID']) LOG.debug("Build logs stored at %s" % logpath) try: out = subprocess.Popen(build_cmd, env=user_env, stdout=subprocess.PIPE).communicate()[0] except OSError as subex: LOG.exception(subex) job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description=subex, assembly_id=assembly_id) return # we expect one line in the output that looks like: # created_image_id=<the glance_id> created_image_id = None for line in out.split('\n'): if 'created_image_id' in line: solum.TLS.trace.support_info(build_out_line=line) created_image_id = line.split('=')[-1].strip() if not uuidutils.is_uuid_like(created_image_id): job_update_notification(ctxt, build_id, IMAGE_STATES.ERROR, description='image not created', assembly_id=assembly_id) return job_update_notification(ctxt, build_id, IMAGE_STATES.COMPLETE, description='built successfully', created_image_id=created_image_id, assembly_id=assembly_id) if created_image_id is not None: deployer_api.API(context=ctxt).deploy(assembly_id=assembly_id, image_id=created_image_id)