Merge "Release notes 1.7.1" into stable/liberty
This commit is contained in:
commit
030f9e3263
@ -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)
|
||||||
|
@ -113,4 +113,4 @@ or
|
|||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
$ pip install -e
|
$ pip install -e .
|
||||||
|
@ -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)
|
||||||
===================
|
===================
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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")
|
||||||
|
@ -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__,
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user