示例#1
0
文件: heat.py 项目: 0xffea/solum
    def _delete_app_artifacts_from_swift(self, ctxt, t_logger,
                                         logs_resource_id, assem):
        # Delete image file from swift
        if assem.image_id:
            img = objects.registry.Image.get_by_id(ctxt, assem.image_id)
            if img.docker_image_name:
                img_filename = img.docker_image_name.split('-', 1)[1]
                try:
                    swift = solum_swiftclient.SwiftClient(ctxt)
                    swift.delete_object('solum_du', img_filename)
                except swiftexp.ClientException:
                    msg = "Unable to delete DU image from swift."
                    t_logger.log(logging.ERROR, msg)
                    LOG.debug(msg)
                    t_logger.upload()
                    return
            img.destroy(ctxt)

        # Delete logs
        try:
            log_handler = userlog_handler.UserlogHandler(ctxt)
            log_handler.delete(logs_resource_id)
        except exception.AuthorizationFailure as authexcp:
            t_logger.log(logging.ERROR, six.text_type(authexcp))
            LOG.debug(six.text_type(authexcp))
            t_logger.upload()
    def delete(self, uuid):
        """Delete a languagepack."""
        db_obj = objects.registry.Image.get_lp_by_name_or_uuid(
            self.context, uuid)
        # Check if the languagepack is being used.
        if (self._check_lp_referenced_in_any_plan(self.context, db_obj)
                or self._check_lp_referenced_in_any_app(self.context, db_obj)):
            raise exc.LPStillReferenced(name=uuid)

        if db_obj.docker_image_name:
            img_filename = db_obj.docker_image_name.split('-', 1)[1]

            if cfg.CONF.worker.image_storage == 'swift':
                # Delete image file from swift
                try:
                    swift = solum_swiftclient.SwiftClient(self.context)
                    swift.delete_object('solum_lp', img_filename)
                except swiftexp.ClientException:
                    raise exc.AuthorizationFailure(
                        client='swift',
                        message="Unable to delete languagepack image "
                        "from swift.")
            elif cfg.CONF.worker.image_storage == 'glance':
                glance = solum_glanceclient.GlanceClient(self.context)
                glance.delete_image_by_name(img_filename)
            else:
                LOG.error("Unrecognized image_storage option specified.")
                return

        # Delete logs
        log_handler = userlog_handler.UserlogHandler(self.context)
        log_handler.delete(db_obj.uuid)

        return db_obj.destroy(self.context)
    def delete(self, uuid):
        """Delete a languagepack."""
        db_obj = objects.registry.Image.get_lp_by_name_or_uuid(self.context,
                                                               uuid)
        # Check if the languagepack is being used.
        if (self._check_lp_referenced_in_any_plan(self.context, db_obj) or
                self._check_lp_referenced_in_any_app(self.context, db_obj)):
            raise exc.LPStillReferenced(name=uuid)

        # Delete image file from swift
        if db_obj.docker_image_name:
            img_filename = db_obj.docker_image_name.split('-', 1)[1]
            try:
                swift = solum_swiftclient.SwiftClient(self.context)
                swift.delete_object('solum_lp', img_filename)
            except swiftexp.ClientException:
                raise exc.AuthorizationFailure(
                    client='swift',
                    message="Unable to delete languagepack image from swift.")

        # Delete logs
        log_handler = userlog_handler.UserlogHandler(self.context)
        log_handler.delete(db_obj.uuid)

        return db_obj.destroy(self.context)
示例#4
0
    def delete(self, resource_uuid):
        """Delete existing logs."""
        ulogs = objects.registry.UserlogList.get_all_by_id(
            self.context, resource_uuid=resource_uuid)

        # Delete log files
        swift = solum_swiftclient.SwiftClient(self.context)
        for ulog in ulogs:
            location = ulog.location
            strategy = ulog.strategy
            strategy_info = json.loads(ulog.strategy_info)
            if strategy == 'swift':
                # Delete logs from swift
                try:
                    swift.delete_object(strategy_info['container'], location)
                except swiftexp.ClientException:
                    raise exc.AuthorizationFailure(
                        client='swift',
                        message="Unable to delete logs from swift.")
            elif strategy == 'local':
                # Delete logs from local filesystem
                # This setting is exclusively used for single node deployments.
                try:
                    os.remove(location)
                except OSError:
                    pass

            # Delete the log reference from db.
            ulog.destroy(self.context)

        return
示例#5
0
    def _download_lp(self, lp_obj_name, lp_img_tag, logger):
        # TODO(james_li): try cache before downloading from origin
        logger.log(logging.INFO, 'Downloading LP...')

        if self.image_storage == 'glance':
            return
        elif self.image_storage == 'docker_registry':
            return
        elif self.image_storage == 'swift':
            if self.work_dir is None:
                return
            path = '{}/lp/{}'.format(self.work_dir, lp_obj_name)
            swift = solum_swiftclient.SwiftClient(self.context)
            try:
                swift.download(path, 'solum_lp', lp_obj_name)
            except swiftexp.ClientException as e:
                LOG.error('Error in downloading LP %s, %s' %
                          (lp_obj_name, str(e)))
                logger.log(logging.ERROR, 'Downloading LP failed.')
                return

            if self._docker_load(path) != 0:
                logger.log(logging.ERROR, 'Loading docker image failed.')
                return

            logger.log(logging.INFO, 'LP downloaded and loaded successfully.')
            return lp_img_tag
示例#6
0
    def test_swift_client_upload_exception(self, mock_file_size,
                                           mock_swift_client, mock_open):

        ctxt = utils.dummy_context()
        mock_file_size.return_value = 0

        swift = swiftclient.SwiftClient(ctxt)
        self.assertRaises(exc.InvalidObjectSizeError, swift.upload, 'filepath',
                          'fake-container', 'fname')
示例#7
0
 def _delete_app_artifacts_from_swift(self, ctxt, t_logger, assem):
     if assem.image_id:
         img = objects.registry.Image.get_by_id(ctxt, assem.image_id)
         if img.docker_image_name:
             img_filename = img.docker_image_name.split('-', 1)[1]
             try:
                 swift = solum_swiftclient.SwiftClient(ctxt)
                 swift.delete_object('solum_du', img_filename)
             except swiftexp.ClientException:
                 msg = "Unable to delete DU image from swift."
                 t_logger.log(logging.ERROR, msg)
                 LOG.debug(msg)
                 t_logger.upload()
                 return
         img.destroy(ctxt)
示例#8
0
 def _persist_to_backend(self, local_file, swift_container, swift_obj,
                         logger):
     loc = None
     if (self.image_storage == 'glance'
             or self.image_storage == 'docker_registry'):
         return loc
     elif self.image_storage == 'swift':
         swift = solum_swiftclient.SwiftClient(self.context)
         try:
             swift.upload(local_file, swift_container, swift_obj)
             loc = swift_obj
         except exc.InvalidObjectSizeError:
             logger.log(logging.INFO, 'Image with size exceeding 5GB'
                        ' is not supported')
         except swiftexp.ClientException as e:
             LOG.error('Error in persisting artifact to swift, %s' % str(e))
         return loc
示例#9
0
    def test_swift_client_upload(self, mock_file_size, mock_swift_client,
                                 mock_open):

        ctxt = utils.dummy_context()
        container = 'fake-container'
        filename = 'fake-file'
        mock_client = mock_swift_client.return_value
        fsize = 5
        mock_file_size.return_value = fsize

        swift = swiftclient.SwiftClient(ctxt)
        swift.upload('filepath', container, filename)
        mock_client.put_container.assert_called_once_with(container)
        mock_client.put_object.assert_called_once_with(container,
                                                       filename,
                                                       mock.ANY,
                                                       content_length=fsize)
示例#10
0
 def _upload(self, container, filename, filepath):
     swift = swiftclient.SwiftClient(self.context)
     swift.upload(filepath, container, filename)