deb-python-saharaclient/saharaclient/osc/v1/images.py

310 lines
9.3 KiB
Python

# Copyright (c) 2015 Mirantis Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
from osc_lib.command import command
from osc_lib import utils as osc_utils
from oslo_log import log as logging
from saharaclient.osc.v1 import utils
IMAGE_FIELDS = ['name', 'id', 'username', 'tags', 'status', 'description']
class ListImages(command.Lister):
"""Lists registered images"""
log = logging.getLogger(__name__ + ".ListImages")
def get_parser(self, prog_name):
parser = super(ListImages, self).get_parser(prog_name)
parser.add_argument(
'--long',
action='store_true',
default=False,
help='List additional fields in output',
)
parser.add_argument(
'--name',
metavar="<name-regex>",
help="Regular expression to match image name"
)
parser.add_argument(
'--tags',
metavar="<tag>",
nargs="+",
help="List images with specific tag(s)"
)
parser.add_argument(
'--username',
metavar="<username>",
help="List images with specific username"
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
search_opts = {'tags': parsed_args.tags} if parsed_args.tags else {}
data = client.images.list(search_opts=search_opts)
if parsed_args.name:
data = utils.get_by_name_substring(data, parsed_args.name)
if parsed_args.username:
data = [i for i in data if parsed_args.username in i.username]
if parsed_args.long:
columns = IMAGE_FIELDS
column_headers = [c.capitalize() for c in columns]
else:
columns = ('name', 'id', 'username', 'tags')
column_headers = [c.capitalize() for c in columns]
return (
column_headers,
(osc_utils.get_item_properties(
s,
columns,
formatters={
'tags': osc_utils.format_list
},
) for s in data)
)
class ShowImage(command.ShowOne):
"""Display image details"""
log = logging.getLogger(__name__ + ".ShowImage")
def get_parser(self, prog_name):
parser = super(ShowImage, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
help="Name or id of the image to display",
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
data = utils.get_resource(
client.images, parsed_args.image).to_dict()
data['tags'] = osc_utils.format_list(data['tags'])
data = utils.prepare_data(data, IMAGE_FIELDS)
return self.dict2columns(data)
class RegisterImage(command.ShowOne):
"""Register an image"""
log = logging.getLogger(__name__ + ".RegisterImage")
def get_parser(self, prog_name):
parser = super(RegisterImage, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
help="Name or ID of the image to register",
)
parser.add_argument(
"--username",
metavar="<username>",
help="Username of privileged user in the image [REQUIRED]",
required=True
)
parser.add_argument(
"--description",
metavar="<description>",
help="Description of the image. If not provided, description of "
"the image will be reset to empty",
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
image_client = self.app.client_manager.image
image_id = osc_utils.find_resource(
image_client.images, parsed_args.image).id
data = client.images.update_image(
image_id, user_name=parsed_args.username,
desc=parsed_args.description).image
data['tags'] = osc_utils.format_list(data['tags'])
data = utils.prepare_data(data, IMAGE_FIELDS)
return self.dict2columns(data)
class UnregisterImage(command.Command):
"""Unregister image(s)"""
log = logging.getLogger(__name__ + ".RegisterImage")
def get_parser(self, prog_name):
parser = super(UnregisterImage, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
nargs="+",
help="Name(s) or id(s) of the image(s) to unregister",
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
for image in parsed_args.image:
image_id = utils.get_resource_id(client.images, image)
client.images.unregister_image(image_id)
sys.stdout.write(
'Image "{image}" has been unregistered '
'successfully.\n'.format(image=image))
class SetImageTags(command.ShowOne):
"""Set image tags (Replace current image tags with provided ones)"""
log = logging.getLogger(__name__ + ".AddImageTags")
def get_parser(self, prog_name):
parser = super(SetImageTags, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
help="Name or id of the image",
)
parser.add_argument(
'--tags',
metavar="<tag>",
nargs="+",
required=True,
help="Tag(s) to set [REQUIRED]"
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
image_id = utils.get_resource_id(client.images, parsed_args.image)
data = client.images.update_tags(image_id, parsed_args.tags).to_dict()
data['tags'] = osc_utils.format_list(data['tags'])
data = utils.prepare_data(data, IMAGE_FIELDS)
return self.dict2columns(data)
class AddImageTags(command.ShowOne):
"""Add image tags"""
log = logging.getLogger(__name__ + ".AddImageTags")
def get_parser(self, prog_name):
parser = super(AddImageTags, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
help="Name or id of the image",
)
parser.add_argument(
'--tags',
metavar="<tag>",
nargs="+",
required=True,
help="Tag(s) to add [REQUIRED]"
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
image = utils.get_resource(client.images, parsed_args.image)
parsed_args.tags.extend(image.tags)
data = client.images.update_tags(
image.id, list(set(parsed_args.tags))).to_dict()
data['tags'] = osc_utils.format_list(data['tags'])
data = utils.prepare_data(data, IMAGE_FIELDS)
return self.dict2columns(data)
class RemoveImageTags(command.ShowOne):
"""Remove image tags"""
log = logging.getLogger(__name__ + ".RemoveImageTags")
def get_parser(self, prog_name):
parser = super(RemoveImageTags, self).get_parser(prog_name)
parser.add_argument(
"image",
metavar="<image>",
help="Name or id of the image",
)
group = parser.add_mutually_exclusive_group()
group.add_argument(
'--tags',
metavar="<tag>",
nargs="+",
help="Tag(s) to remove"
),
group.add_argument(
'--all',
action='store_true',
default=False,
help='Remove all tags from image',
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
client = self.app.client_manager.data_processing
image = utils.get_resource(client.images, parsed_args.image)
if parsed_args.all:
data = client.images.update_tags(image.id, []).to_dict()
else:
parsed_args.tags = parsed_args.tags or []
new_tags = list(set(image.tags) - set(parsed_args.tags))
data = client.images.update_tags(image.id, new_tags).to_dict()
data['tags'] = osc_utils.format_list(data['tags'])
data = utils.prepare_data(data, IMAGE_FIELDS)
return self.dict2columns(data)