Exemple #1
0
    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)
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
 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)
Exemple #5
0
    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)
Exemple #6
0
    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)