Merge "Release notes 1.7.1" into stable/liberty

This commit is contained in:
Jenkins 2015-09-30 22:39:59 +00:00 committed by Gerrit Code Review
commit 030f9e3263
7 changed files with 132 additions and 17 deletions

View File

@ -212,7 +212,7 @@ Save an image locally
image set image set
--------- ---------
*Only supported for Image v1* *Image v1, v2*
Set image properties Set image properties
@ -271,6 +271,8 @@ Set image properties
Size of image data (in bytes) Size of image data (in bytes)
*Image version 1 only.*
.. option:: --protected .. option:: --protected
Prevent image from being deleted Prevent image from being deleted
@ -291,38 +293,94 @@ Set image properties
Upload image to this store Upload image to this store
*Image version 1 only.*
.. option:: --location <image-url> .. option:: --location <image-url>
Download image from an existing URL Download image from an existing URL
*Image version 1 only.*
.. option:: --copy-from <image-url> .. option:: --copy-from <image-url>
Copy image from the data store (similar to --location) Copy image from the data store (similar to --location)
*Image version 1 only.*
.. option:: --file <file> .. option:: --file <file>
Upload image from local file Upload image from local file
*Image version 1 only.*
.. option:: --volume <volume> .. option:: --volume <volume>
Update image with a volume Update image with a volume
*Image version 1 only.*
.. option:: --force .. option:: --force
Force image update if volume is in use (only meaningful with --volume) Force image update if volume is in use (only meaningful with --volume)
*Image version 1 only.*
.. option:: --checksum <checksum> .. option:: --checksum <checksum>
Image hash used for verification Image hash used for verification
*Image version 1 only.*
.. option:: --stdin .. option:: --stdin
Allow to read image data from standard input Allow to read image data from standard input
*Image version 1 only.*
.. option:: --property <key=value> .. option:: --property <key=value>
Set a property on this image (repeat for multiple values) Set a property on this image (repeat for multiple values)
*Image version 1 only.*
.. option:: --architecture <architecture>
Operating system Architecture
.. versionadded:: 2
.. option:: --ramdisk-id <ramdisk-id>
ID of image stored in Glance that should be used as
the ramdisk when booting an AMI-style image
.. versionadded:: 2
.. option:: --os-distro <os-distro>
Common name of operating system distribution
.. versionadded:: 2
.. option:: --os-version <os-version>
Operating system version as specified by the distributor
.. versionadded:: 2
.. option:: --kernel-id <kernel-id>
ID of image in Glance that should be used as the
kernel when booting an AMI-style image
.. versionadded:: 2
.. option:: --instance-uuid <instance_uuid>
ID of instance used to create this image
.. versionadded:: 2
.. describe:: <image> .. describe:: <image>
Image to modify (name or ID) Image to modify (name or ID)

View File

@ -113,4 +113,4 @@ or
.. code-block:: bash .. code-block:: bash
$ pip install -e $ pip install -e .

View File

@ -2,6 +2,12 @@
Release Notes Release Notes
============= =============
1.7.1 (30 Sep 2015)
===================
* Image v2 lookup issues
Bug `1501362 <https://bugs.launchpad.net/bugs/1501362>`_
1.7.0 (22 Sep 2015) 1.7.0 (22 Sep 2015)
=================== ===================

View File

@ -34,13 +34,8 @@ _compute_api_version = None
def make_client(instance): def make_client(instance):
"""Returns a compute service client.""" """Returns a compute service client."""
# Defer client imports until we actually need them # Defer client import until we actually need them
from novaclient import client as nova_client from novaclient import client as nova_client
from novaclient import extension
try:
from novaclient.v2.contrib import list_extensions
except ImportError:
from novaclient.v1_1.contrib import list_extensions
if _compute_api_version is not None: if _compute_api_version is not None:
version = _compute_api_version version = _compute_api_version
@ -52,7 +47,8 @@ def make_client(instance):
# Set client http_log_debug to True if verbosity level is high enough # Set client http_log_debug to True if verbosity level is high enough
http_log_debug = utils.get_effective_log_level() <= logging.DEBUG http_log_debug = utils.get_effective_log_level() <= logging.DEBUG
extensions = [extension.Extension('list_extensions', list_extensions)] extensions = [ext for ext in nova_client.discover_extensions(version)
if ext.name == "list_extensions"]
# Remember interface only if it is set # Remember interface only if it is set
kwargs = utils.build_kwargs_dict('endpoint_type', instance._interface) kwargs = utils.build_kwargs_dict('endpoint_type', instance._interface)

View File

@ -553,9 +553,22 @@ class SetImage(show.ShowOne):
"""Set image properties""" """Set image properties"""
log = logging.getLogger(__name__ + ".SetImage") log = logging.getLogger(__name__ + ".SetImage")
deadopts = ('size', 'store', 'location', 'copy-from', 'checksum')
def get_parser(self, prog_name): def get_parser(self, prog_name):
parser = super(SetImage, self).get_parser(prog_name) parser = super(SetImage, self).get_parser(prog_name)
# TODO(bunting): There are additional arguments that v1 supported
# --size - does not exist in v2
# --store - does not exist in v2
# --location - maybe location add?
# --copy-from - does not exist in v2
# --file - should be able to upload file
# --volume - needs adding
# --force - needs adding
# --checksum - maybe could be done client side
# --stdin - could be implemented
# --property - needs adding
# --tags - needs adding
parser.add_argument( parser.add_argument(
"image", "image",
metavar="<image>", metavar="<image>",
@ -571,12 +584,28 @@ class SetImage(show.ShowOne):
metavar="<architecture>", metavar="<architecture>",
help="Operating system Architecture" help="Operating system Architecture"
) )
parser.add_argument( protected_group = parser.add_mutually_exclusive_group()
protected_group.add_argument(
"--protected", "--protected",
dest="protected",
action="store_true", action="store_true",
help="Prevent image from being deleted" help="Prevent image from being deleted"
) )
protected_group.add_argument(
"--unprotected",
action="store_true",
help="Allow image to be deleted (default)"
)
public_group = parser.add_mutually_exclusive_group()
public_group.add_argument(
"--public",
action="store_true",
help="Image is accessible to the public",
)
public_group.add_argument(
"--private",
action="store_true",
help="Image is inaccessible to the public (default)",
)
parser.add_argument( parser.add_argument(
"--instance-uuid", "--instance-uuid",
metavar="<instance_uuid>", metavar="<instance_uuid>",
@ -589,12 +618,11 @@ class SetImage(show.ShowOne):
help="Minimum disk size needed to boot image, in gigabytes" help="Minimum disk size needed to boot image, in gigabytes"
) )
visibility_choices = ["public", "private"] visibility_choices = ["public", "private"]
parser.add_argument( public_group.add_argument(
"--visibility", "--visibility",
metavar="<visibility>", metavar="<visibility>",
choices=visibility_choices, choices=visibility_choices,
help="Scope of image accessibility. Valid values: %s" help=argparse.SUPPRESS
% visibility_choices
) )
help_msg = ("ID of image in Glance that should be used as the kernel" help_msg = ("ID of image in Glance that should be used as the kernel"
" when booting an AMI-style image") " when booting an AMI-style image")
@ -649,12 +677,25 @@ class SetImage(show.ShowOne):
choices=container_choices, choices=container_choices,
help=help_msg help=help_msg
) )
for deadopt in self.deadopts:
parser.add_argument(
"--%s" % deadopt,
metavar="<%s>" % deadopt,
dest=deadopt.replace('-', '_'),
help=argparse.SUPPRESS
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args) self.log.debug("take_action(%s)", parsed_args)
image_client = self.app.client_manager.image image_client = self.app.client_manager.image
for deadopt in self.deadopts:
if getattr(parsed_args, deadopt.replace('-', '_'), None):
raise exceptions.CommandError(
"ERROR: --%s was given, which is an Image v1 option"
" that is no longer supported in Image v2" % deadopt)
kwargs = {} kwargs = {}
copy_attrs = ('architecture', 'container_format', 'disk_format', copy_attrs = ('architecture', 'container_format', 'disk_format',
'file', 'kernel_id', 'locations', 'name', 'file', 'kernel_id', 'locations', 'name',
@ -668,10 +709,21 @@ class SetImage(show.ShowOne):
# Only include a value in kwargs for attributes that are # Only include a value in kwargs for attributes that are
# actually present on the command line # actually present on the command line
kwargs[attr] = val kwargs[attr] = val
# Handle exclusive booleans with care
# Avoid including attributes in kwargs if an option is not
# present on the command line. These exclusive booleans are not
# a single value for the pair of options because the default must be
# to do nothing when no options are present as opposed to always
# setting a default.
if parsed_args.protected: if parsed_args.protected:
kwargs['protected'] = True kwargs['protected'] = True
else: if parsed_args.unprotected:
kwargs['protected'] = False kwargs['protected'] = False
if parsed_args.public:
kwargs['visibility'] = 'public'
if parsed_args.private:
kwargs['visibility'] = 'private'
if not kwargs: if not kwargs:
self.log.warning("No arguments specified") self.log.warning("No arguments specified")

View File

@ -79,6 +79,10 @@ class OpenStackShell(app.App):
help.HelpCommand.auth_required = False help.HelpCommand.auth_required = False
complete.CompleteCommand.auth_required = False complete.CompleteCommand.auth_required = False
# Slight change to the meaning of --debug
self.DEFAULT_DEBUG_VALUE = None
self.DEFAULT_DEBUG_HELP = 'Set debug logging and traceback on errors.'
super(OpenStackShell, self).__init__( super(OpenStackShell, self).__init__(
description=__doc__.strip(), description=__doc__.strip(),
version=openstackclient.__version__, version=openstackclient.__version__,

View File

@ -713,8 +713,7 @@ class TestImageSet(TestImage):
'name': 'new-name', 'name': 'new-name',
'owner': 'new-owner', 'owner': 'new-owner',
'min_disk': 2, 'min_disk': 2,
'min_ram': 4, 'min_ram': 4
'protected': False
} }
# ImageManager.update(image, **kwargs) # ImageManager.update(image, **kwargs)
self.images_mock.update.assert_called_with( self.images_mock.update.assert_called_with(