Hello community,
here is the log from the commit of package python-novaclient for openSUSE:Factory checked in at 2013-09-16 16:32:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-novaclient (Old)
and /work/SRC/openSUSE:Factory/.python-novaclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-novaclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-novaclient/python-novaclient.changes 2013-09-16 12:45:37.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-novaclient.new/python-novaclient.changes 2013-09-16 16:32:51.000000000 +0200
@@ -1,0 +2,31 @@
+Wed Sep 11 23:54:11 UTC 2013 - opensuse-cloud@opensuse.org
+
+- Update to version 2.14.1.54:
+ + Python3: Fix traceback while running unit tests
+ + Python3: Use six.StringIO for io.Bytes()
+
+-------------------------------------------------------------------
+Tue Sep 10 23:38:00 UTC 2013 - opensuse-cloud@opensuse.org
+
+- Update to version 2.14.1.50:
+ + Add support for os-assisted-volume-snapshots
+
+-------------------------------------------------------------------
+Tue Sep 10 00:07:59 UTC 2013 - opensuse-cloud@opensuse.org
+
+- Update to version 2.14.1.48:
+ + Unittests added for client v1_1
+
+-------------------------------------------------------------------
+Sat Sep 7 07:15:25 UTC 2013 - opensuse-cloud@opensuse.org
+
+- Update to version 2.14.1.47:
+ + Update oslo from oslo-incubator
+
+-------------------------------------------------------------------
+Thu Sep 5 00:24:08 UTC 2013 - opensuse-cloud@opensuse.org
+
+- Update to version 2.14.1.46:
+ + New syntax to boot from a block device mapping
+
+-------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-novaclient.spec ++++++
--- /var/tmp/diff_new_pack.WuCC3y/_old 2013-09-16 16:32:51.000000000 +0200
+++ /var/tmp/diff_new_pack.WuCC3y/_new 2013-09-16 16:32:51.000000000 +0200
@@ -19,7 +19,7 @@
%define component novaclient
Name: python-%{component}
-Version: 2.14.1.45
+Version: 2.14.1.54
Release: 0
Summary: Openstack Compute (Nova) API Client
License: Apache-2.0
@@ -92,7 +92,7 @@
This package contains testsuite files for %{name}.
%prep
-%setup -q -n python-novaclient-2.14.1.45.gd770bb3
+%setup -q -n python-novaclient-2.14.1.54.g9a1304b
%openstack_cleanup_prep
%build
++++++ python-novaclient-master.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/AUTHORS new/python-novaclient-2.14.1.54.g9a1304b/AUTHORS
--- old/python-novaclient-2.14.1.45.gd770bb3/AUTHORS 2013-09-01 16:07:36.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/AUTHORS 2013-09-12 00:07:48.000000000 +0200
@@ -169,6 +169,7 @@
Vincent Hou
Vincent Untz
Vishvananda Ishaya
+Vitaliy Kolosov
William Wolf
Wu Wenxiang
Xavier Queralt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/ChangeLog new/python-novaclient-2.14.1.54.g9a1304b/ChangeLog
--- old/python-novaclient-2.14.1.45.gd770bb3/ChangeLog 2013-09-01 16:07:36.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/ChangeLog 2013-09-12 00:07:48.000000000 +0200
@@ -1,3 +1,103 @@
+commit 9a1304bfab56d7aad1d65d1c6cde3303b64d70ce
+Merge: 447cf8d 28f9773
+Author: Jenkins
+Date: Wed Sep 11 22:07:13 2013 +0000
+
+ Merge "Python3: Use six.StringIO for io.Bytes()"
+
+commit 447cf8d6e5299aff456fc9c928e73720791c2ed3
+Merge: 500bb62 9d8869e
+Author: Jenkins
+Date: Wed Sep 11 18:09:43 2013 +0000
+
+ Merge "Python3: Fix traceback while running unit tests"
+
+commit 500bb6244d4896e7fee94219cefc4426b1360b40
+Merge: 3523ba9 69f8de6
+Author: Jenkins
+Date: Tue Sep 10 16:47:32 2013 +0000
+
+ Merge "Add support for os-assisted-volume-snapshots"
+
+commit 3523ba90f68d55ac20fb044d9acbe6c53fecbf1f
+Author: Vitaliy Kolosov
+Date: Mon Sep 9 12:11:32 2013 +0300
+
+ Unittests added for client v1_1
+
+ Unittests test_client_set_management_url_v1_1 and
+ test_client_get_reset_timings_v1_1 added.
+ New methods covered:
+ * client.set_management_url()
+ * client.get_timings()
+ * client.reset_timings()
+
+ Change-Id: I46cac01864a11fbaffc284d26f63b8e00f2631f0
+
+commit 9d8869e01c51f2611c187c45701033f507f40e2a
+Author: Chuck Short
+Date: Sat Sep 7 12:33:31 2013 -0400
+
+ Python3: Fix traceback while running unit tests
+
+ While running the unit tests with python3 the following
+ traceback appears:
+
+ TypeError: can't use a string pattern on a bytes-like object
+
+ This is due to the way that python2 and python3 handles unicodes.
+
+ Change-Id: I401f1cefed69780073222cae98d8da4c3d8031a8
+ Signed-off-by: Chuck Short
+
+commit 28f97734203a2df33805291673104742d45d34f3
+Author: Chuck Short
+Date: Sat Sep 7 12:27:46 2013 -0400
+
+ Python3: Use six.StringIO for io.Bytes()
+
+ The newer version of six (1.4.1) provides six.StringIO which
+ is a fake file object for textual data. It's an alias for StringIO.StringIO
+ in python2 and io.StringIO in Python3.
+
+ Use the fake object where approiate.
+
+ Change-Id: I364001933b4f2305ac27b293a9a4a3fec36c8a49
+ Signed-off-by: Chuck Short
+
+commit cab46172253add86a5a25431a1af4066d29418bc
+Author: Chuck Short
+Date: Fri Sep 6 08:02:31 2013 -0400
+
+ Update oslo from oslo-incubator
+
+ Update oslo from oslo-incubator includes various python3
+ fixes.
+
+ Change-Id: Ie30a4c319125c3d4fb704254f8553bc8fd960eae
+ Signed-off-by: Chuck Short
+
+commit 6a85c954c53f868251413db51cc1d9616acd4d02
+Author: Xavier Queralt
+Date: Fri Jul 26 09:23:19 2013 +0200
+
+ New syntax to boot from a block device mapping
+
+ Add new arguments and syntax for booting from a block device mapping
+ that use the new os-block-device-mapping-v2-boot extension. These
+ allow to:
+
+ * boot from an image, volume or snapshot (--image, --boot-volume, --snapshot)
+ * attach any type of block device (--block-device).
+ * attach an swap disk on boot (--swap).
+ * attach an ephemeral disk on boot (--ephemeral).
+
+ blueprint: improve-block-device-handling
+
+ DocImpact
+
+ Change-Id: I1aadeafed82b3bd1febcf0d1c3e64b258d6abeda
+
commit d770bb3aabffbe63afad62b489f64fe556a748b6
Merge: 756a433 12d5b95
Author: Jenkins
@@ -5,6 +105,22 @@
Merge "Add interface for listing security groups of an instance"
+commit 69f8de69d59084e0ca6b85834a3029193b17469b
+Author: Russell Bryant
+Date: Thu Aug 29 20:03:28 2013 -0400
+
+ Add support for os-assisted-volume-snapshots
+
+ This patch adds support for the assisted volume snapshots API extension.
+ This is used by Cinder to ask Nova to perform a volume snapshot on its
+ behalf. It's required when the volume is actually file backed (like
+ qcow2) and the hypervisor needs to be involved in the snapshot
+ operation.
+
+ Required for blueprint qemu-assisted-snapshots
+
+ Change-Id: I50ee9bf92c8de98528638d1724fe35e07bed729e
+
commit 756a4333e6845468ba82c2ba8be245a849bc8507
Author: Yufang Zhang
Date: Wed Aug 7 21:37:28 2013 +0800
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/PKG-INFO new/python-novaclient-2.14.1.54.g9a1304b/PKG-INFO
--- old/python-novaclient-2.14.1.45.gd770bb3/PKG-INFO 2013-09-01 16:07:36.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/PKG-INFO 2013-09-12 00:07:48.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-novaclient
-Version: 2.14.1.45.gd770bb3
+Version: 2.14.1.54.g9a1304b
Summary: Client library for OpenStack Compute API
Home-page: https://github.com/openstack/python-novaclient
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/base.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/base.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/base.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/base.py 2013-09-12 00:07:17.000000000 +0200
@@ -232,13 +232,45 @@
class BootingManagerWithFind(ManagerWithFind):
"""Like a `ManagerWithFind`, but has the ability to boot servers."""
+
+ def _parse_block_device_mapping(self, block_device_mapping):
+ bdm = []
+
+ for device_name, mapping in block_device_mapping.iteritems():
+ #
+ # The mapping is in the format:
+ # <id>:[<type>]:[]:[]
+ #
+ bdm_dict = {'device_name': device_name}
+
+ mapping_parts = mapping.split(':')
+ source_id = mapping_parts[0]
+ if len(mapping_parts) == 1:
+ bdm_dict['volume_id'] = source_id
+
+ elif len(mapping_parts) > 1:
+ source_type = mapping_parts[1]
+ if source_type.startswith('snap'):
+ bdm_dict['snapshot_id'] = source_id
+ else:
+ bdm_dict['volume_id'] = source_id
+
+ if len(mapping_parts) > 2 and mapping_parts[2]:
+ bdm_dict['volume_size'] = str(int(mapping_parts[2]))
+
+ if len(mapping_parts) > 3:
+ bdm_dict['delete_on_termination'] = mapping_parts[3]
+
+ bdm.append(bdm_dict)
+ return bdm
+
def _boot(self, resource_url, response_key, name, image, flavor,
meta=None, files=None, userdata=None,
reservation_id=None, return_raw=False, min_count=None,
max_count=None, security_groups=None, key_name=None,
- availability_zone=None, block_device_mapping=None, nics=None,
- scheduler_hints=None, config_drive=None, admin_pass=None,
- disk_config=None, **kwargs):
+ availability_zone=None, block_device_mapping=None,
+ block_device_mapping_v2=None, nics=None, scheduler_hints=None,
+ config_drive=None, admin_pass=None, disk_config=None, **kwargs):
"""
Create (boot) a new server.
@@ -263,6 +295,8 @@
placement.
:param block_device_mapping: A dict of block device mappings for this
server.
+ :param block_device_mapping_v2: A dict of block device mappings V2 for
+ this server.
:param nics: (optional extension) an ordered list of nics to be
added to this server, with information about
connected networks, fixed ips, etc.
@@ -329,30 +363,10 @@
# Block device mappings are passed as a list of dictionaries
if block_device_mapping:
- bdm = body['server']['block_device_mapping'] = []
- for device_name, mapping in block_device_mapping.items():
- #
- # The mapping is in the format:
- # <id>:[<type>]:[]:[]
- #
- bdm_dict = {'device_name': device_name}
-
- mapping_parts = mapping.split(':')
- id = mapping_parts[0]
- if len(mapping_parts) == 1:
- bdm_dict['volume_id'] = id
- if len(mapping_parts) > 1:
- type = mapping_parts[1]
- if type.startswith('snap'):
- bdm_dict['snapshot_id'] = id
- else:
- bdm_dict['volume_id'] = id
- if len(mapping_parts) > 2:
- if mapping_parts[2]:
- bdm_dict['volume_size'] = str(int(mapping_parts[2]))
- if len(mapping_parts) > 3:
- bdm_dict['delete_on_termination'] = mapping_parts[3]
- bdm.append(bdm_dict)
+ body['server']['block_device_mapping'] = \
+ self._parse_block_device_mapping(block_device_mapping)
+ elif block_device_mapping_v2:
+ body['server']['block_device_mapping_v2'] = block_device_mapping_v2
if nics is not None:
# NOTE(tr3buchet): nics can be an empty list
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/gettextutils.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/gettextutils.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/gettextutils.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/gettextutils.py 2013-09-12 00:07:17.000000000 +0200
@@ -26,10 +26,13 @@
import copy
import gettext
-import logging.handlers
+import logging
import os
import re
-import UserString
+try:
+ import UserString as _userString
+except ImportError:
+ import collections as _userString
from babel import localedata
import six
@@ -37,11 +40,27 @@
_localedir = os.environ.get('novaclient'.upper() + '_LOCALEDIR')
_t = gettext.translation('novaclient', localedir=_localedir, fallback=True)
-_AVAILABLE_LANGUAGES = []
+_AVAILABLE_LANGUAGES = {}
+USE_LAZY = False
+
+
+def enable_lazy():
+ """Convenience function for configuring _() to use lazy gettext
+
+ Call this at the start of execution to enable the gettextutils._
+ function to use lazy gettext functionality. This is useful if
+ your project is importing _ directly instead of using the
+ gettextutils.install() way of importing the _ function.
+ """
+ global USE_LAZY
+ USE_LAZY = True
def _(msg):
- return _t.ugettext(msg)
+ if USE_LAZY:
+ return Message(msg, 'novaclient')
+ else:
+ return _t.ugettext(msg)
def install(domain, lazy=False):
@@ -95,7 +114,7 @@
unicode=True)
-class Message(UserString.UserString, object):
+class Message(_userString.UserString, object):
"""Class used to encapsulate translatable messages."""
def __init__(self, msg, domain):
# _msg is the gettext msgid and should never change
@@ -236,7 +255,7 @@
if name in ops:
return getattr(self.data, name)
else:
- return UserString.UserString.__getattribute__(self, name)
+ return _userString.UserString.__getattribute__(self, name)
def get_available_languages(domain):
@@ -244,8 +263,8 @@
:param domain: the domain to get languages for
"""
- if _AVAILABLE_LANGUAGES:
- return _AVAILABLE_LANGUAGES
+ if domain in _AVAILABLE_LANGUAGES:
+ return copy.copy(_AVAILABLE_LANGUAGES[domain])
localedir = '%s_LOCALEDIR' % domain.upper()
find = lambda x: gettext.find(domain,
@@ -254,7 +273,7 @@
# NOTE(mrodden): en_US should always be available (and first in case
# order matters) since our in-line message strings are en_US
- _AVAILABLE_LANGUAGES.append('en_US')
+ language_list = ['en_US']
# NOTE(luisg): Babel <1.0 used a function called list(), which was
# renamed to locale_identifiers() in >=1.0, the requirements master list
# requires >=0.9.6, uncapped, so defensively work with both. We can remove
@@ -264,13 +283,14 @@
locale_identifiers = list_identifiers()
for i in locale_identifiers:
if find(i) is not None:
- _AVAILABLE_LANGUAGES.append(i)
- return _AVAILABLE_LANGUAGES
+ language_list.append(i)
+ _AVAILABLE_LANGUAGES[domain] = language_list
+ return copy.copy(language_list)
def get_localized_message(message, user_locale):
"""Gets a localized version of the given message in the given locale."""
- if (isinstance(message, Message)):
+ if isinstance(message, Message):
if user_locale:
message.locale = user_locale
return unicode(message)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/py3kcompat/urlutils.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/py3kcompat/urlutils.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/py3kcompat/urlutils.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/py3kcompat/urlutils.py 2013-09-12 00:07:17.000000000 +0200
@@ -17,7 +17,7 @@
#
"""
-Python2/Python3 compatibility layer for openstack
+Python2/Python3 compatibility layer for OpenStack
"""
import six
@@ -27,6 +27,7 @@
import urllib.parse
urlencode = urllib.parse.urlencode
+ urljoin = urllib.parse.urljoin
quote = urllib.parse.quote
parse_qsl = urllib.parse.parse_qsl
urlparse = urllib.parse.urlparse
@@ -42,6 +43,7 @@
parse = urlparse
parse_qsl = parse.parse_qsl
+ urljoin = parse.urljoin
urlparse = parse.urlparse
urlsplit = parse.urlsplit
urlunsplit = parse.urlunsplit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/timeutils.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/timeutils.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/openstack/common/timeutils.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/openstack/common/timeutils.py 2013-09-12 00:07:17.000000000 +0200
@@ -21,6 +21,7 @@
import calendar
import datetime
+import time
import iso8601
import six
@@ -90,6 +91,11 @@
def utcnow_ts():
"""Timestamp version of our utcnow function."""
+ if utcnow.override_time is None:
+ # NOTE(kgriffs): This is several times faster
+ # than going through calendar.timegm(...)
+ return int(time.time())
+
return calendar.timegm(utcnow().timetuple())
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/test_client.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/test_client.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/test_client.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/test_client.py 2013-09-12 00:07:17.000000000 +0200
@@ -122,3 +122,20 @@
auth_url="foo/v2", no_cache=False)
self.assertEqual(True, cs.os_cache)
self.assertEqual(True, cs.client.os_cache)
+
+ def test_client_set_management_url_v1_1(self):
+ cs = novaclient.v1_1.client.Client("user", "password", "project_id",
+ auth_url="foo/v2")
+ cs.set_management_url("blabla")
+ self.assertEqual("blabla", cs.client.management_url)
+
+ def test_client_get_reset_timings_v1_1(self):
+ cs = novaclient.v1_1.client.Client("user", "password", "project_id",
+ auth_url="foo/v2")
+ self.assertEqual(0, len(cs.get_timings()))
+ cs.client.times.append("somevalue")
+ self.assertEqual(1, len(cs.get_timings()))
+ self.assertEqual("somevalue", cs.get_timings()[0])
+
+ cs.reset_timings()
+ self.assertEqual(0, len(cs.get_timings()))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/test_utils.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/test_utils.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/test_utils.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/test_utils.py 2013-09-12 00:07:17.000000000 +0200
@@ -1,7 +1,7 @@
-import io
import sys
import mock
+import six
from novaclient import exceptions
from novaclient import utils
@@ -112,7 +112,7 @@
class PrintResultTestCase(test_utils.TestCase):
- @mock.patch('sys.stdout', io.BytesIO())
+ @mock.patch('sys.stdout', six.StringIO())
def test_print_list_sort_by_str(self):
objs = [_FakeResult("k1", 1),
_FakeResult("k3", 2),
@@ -129,7 +129,7 @@
'| k3 | 2 |\n'
'+------+-------+\n')
- @mock.patch('sys.stdout', io.BytesIO())
+ @mock.patch('sys.stdout', six.StringIO())
def test_print_list_sort_by_integer(self):
objs = [_FakeResult("k1", 1),
_FakeResult("k3", 2),
@@ -147,7 +147,7 @@
'+------+-------+\n')
# without sorting
- @mock.patch('sys.stdout', io.BytesIO())
+ @mock.patch('sys.stdout', six.StringIO())
def test_print_list_sort_by_none(self):
objs = [_FakeResult("k1", 1),
_FakeResult("k3", 3),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/contrib/fakes.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/contrib/fakes.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/contrib/fakes.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/contrib/fakes.py 2013-09-12 00:07:17.000000000 +0200
@@ -129,3 +129,9 @@
return (202, {}, {})
else:
return (500, {}, {})
+
+ def post_os_assisted_volume_snapshots(self, **kw):
+ return (202, {}, {'snapshot': {'id': 'blah', 'volumeId': '1'}})
+
+ def delete_os_assisted_volume_snapshots_x(self, **kw):
+ return (202, {}, {})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/contrib/test_assisted_volume_snapshots.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/contrib/test_assisted_volume_snapshots.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/contrib/test_assisted_volume_snapshots.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/contrib/test_assisted_volume_snapshots.py 2013-09-12 00:07:17.000000000 +0200
@@ -0,0 +1,41 @@
+# Copyright (C) 2013, Red Hat, 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.
+
+"""
+Assisted volume snapshots - to be used by Cinder and not end users.
+"""
+
+from novaclient import extension
+from novaclient.tests import utils
+from novaclient.tests.v1_1.contrib import fakes
+from novaclient.v1_1.contrib import assisted_volume_snapshots as assisted_snaps
+
+
+extensions = [
+ extension.Extension(assisted_snaps.__name__.split(".")[-1],
+ assisted_snaps),
+]
+cs = fakes.FakeClient(extensions=extensions)
+
+
+class AssistedVolumeSnapshotsTestCase(utils.TestCase):
+
+ def test_create_snap(self):
+ res = cs.assisted_volume_snapshots.create('1', {})
+ cs.assert_called('POST', '/os-assisted-volume-snapshots')
+
+ def test_delete_snap(self):
+ res = cs.assisted_volume_snapshots.delete('x', {})
+ cs.assert_called('DELETE',
+ '/os-assisted-volume-snapshots/x?delete_info={}')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/fakes.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/fakes.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/fakes.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/fakes.py 2013-09-12 00:07:17.000000000 +0200
@@ -364,8 +364,18 @@
def post_os_volumes_boot(self, body, **kw):
assert set(body.keys()) <= set(['server', 'os:scheduler_hints'])
fakes.assert_has_keys(body['server'],
- required=['name', 'block_device_mapping', 'flavorRef'],
+ required=['name', 'flavorRef'],
optional=['imageRef'])
+
+ # Require one, and only one, of the keys for bdm
+ if 'block_device_mapping' not in body['server']:
+ if 'block_device_mapping_v2' not in body['server']:
+ raise AssertionError(
+ "missing required keys: 'block_device_mapping'"
+ )
+ elif 'block_device_mapping_v2' in body['server']:
+ raise AssertionError("found extra keys: 'block_device_mapping'")
+
return (202, {}, self.get_servers_9012()[2])
def get_servers_1234(self, **kw):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/test_servers.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/test_servers.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/test_servers.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/test_servers.py 2013-09-12 00:07:17.000000000 +0200
@@ -1,7 +1,5 @@
# -*- coding: utf-8 -*-
-import io
-
import mock
import six
@@ -56,7 +54,7 @@
key_name="fakekey",
files={
'/etc/passwd': 'some data', # a file
- '/tmp/foo.txt': io.BytesIO('data'), # a stream
+ '/tmp/foo.txt': six.StringIO('data'), # a stream
}
)
cs.assert_called('POST', '/servers')
@@ -100,10 +98,10 @@
image=1,
flavor=1,
meta={'foo': 'bar'},
- userdata=io.BytesIO('hello moto'),
+ userdata=six.StringIO('hello moto'),
files={
'/etc/passwd': 'some data', # a file
- '/tmp/foo.txt': io.BytesIO('data'), # a stream
+ '/tmp/foo.txt': six.StringIO('data'), # a stream
},
)
cs.assert_called('POST', '/servers')
@@ -119,7 +117,7 @@
key_name="fakekey",
files={
'/etc/passwd': 'some data', # a file
- '/tmp/foo.txt': io.BytesIO('data'), # a stream
+ '/tmp/foo.txt': six.StringIO('data'), # a stream
},
)
cs.assert_called('POST', '/servers')
@@ -135,7 +133,7 @@
key_name="fakekey",
files={
'/etc/passwd': 'some data', # a file
- '/tmp/foo.txt': io.BytesIO('data'), # a stream
+ '/tmp/foo.txt': six.StringIO('data'), # a stream
},
)
cs.assert_called('POST', '/servers')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/test_shell.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/test_shell.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/tests/v1_1/test_shell.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/tests/v1_1/test_shell.py 2013-09-12 00:07:17.000000000 +0200
@@ -17,13 +17,13 @@
# under the License.
import datetime
-import io
import os
import mock
import sys
import tempfile
import fixtures
+import six
import novaclient.client
from novaclient import exceptions
@@ -71,7 +71,7 @@
lambda *_: fakes.FakeClient))
self.addCleanup(timeutils.clear_time_override)
- @mock.patch('sys.stdout', io.BytesIO())
+ @mock.patch('sys.stdout', six.StringIO())
def run_command(self, cmd):
if isinstance(cmd, list):
self.shell.main(cmd)
@@ -284,6 +284,163 @@
}
],
'imageRef': '',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ def test_boot_image_bdms_v2(self):
+ self.run_command(
+ 'boot --flavor 1 --image 1 --block-device id=fake-id,'
+ 'source=volume,dest=volume,device=vda,size=1,format=ext4,'
+ 'type=disk,shutdown=preserve some-server'
+ )
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'uuid': 1,
+ 'source_type': 'image',
+ 'destination_type': 'local',
+ 'boot_index': 0,
+ 'delete_on_termination': True,
+ },
+ {
+ 'uuid': 'fake-id',
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'device_name': 'vda',
+ 'volume_size': '1',
+ 'guest_format': 'ext4',
+ 'device_type': 'disk',
+ 'delete_on_termination': False,
+ },
+ ],
+ 'imageRef': '1',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ def test_boot_no_image_bdms_v2(self):
+ self.run_command(
+ 'boot --flavor 1 --block-device id=fake-id,source=volume,'
+ 'dest=volume,bus=virtio,device=vda,size=1,format=ext4,bootindex=0,'
+ 'type=disk,shutdown=preserve some-server'
+ )
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'uuid': 'fake-id',
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'disk_bus': 'virtio',
+ 'device_name': 'vda',
+ 'volume_size': '1',
+ 'guest_format': 'ext4',
+ 'boot_index': '0',
+ 'device_type': 'disk',
+ 'delete_on_termination': False,
+ }
+ ],
+ 'imageRef': '',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ cmd = 'boot --flavor 1 --boot-volume fake-id some-server'
+ self.run_command(cmd)
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'uuid': 'fake-id',
+ 'source_type': 'volume',
+ 'destination_type': 'volume',
+ 'boot_index': 0,
+ 'delete_on_termination': False,
+ }
+ ],
+ 'imageRef': '',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ cmd = 'boot --flavor 1 --snapshot fake-id some-server'
+ self.run_command(cmd)
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'uuid': 'fake-id',
+ 'source_type': 'snapshot',
+ 'destination_type': 'volume',
+ 'boot_index': 0,
+ 'delete_on_termination': False,
+ }
+ ],
+ 'imageRef': '',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ self.run_command('boot --flavor 1 --swap 1 some-server')
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'source_type': 'blank',
+ 'destination_type': 'local',
+ 'boot_index': -1,
+ 'guest_format': 'swap',
+ 'volume_size': '1',
+ 'delete_on_termination': True,
+ }
+ ],
+ 'imageRef': '',
+ 'min_count': 1,
+ 'max_count': 1,
+ }},
+ )
+
+ self.run_command(
+ 'boot --flavor 1 --ephemeral size=1,format=ext4 some-server'
+ )
+ self.assert_called_anytime(
+ 'POST', '/os-volumes_boot',
+ {'server': {
+ 'flavorRef': '1',
+ 'name': 'some-server',
+ 'block_device_mapping_v2': [
+ {
+ 'source_type': 'blank',
+ 'destination_type': 'local',
+ 'boot_index': -1,
+ 'guest_format': 'ext4',
+ 'volume_size': '1',
+ 'delete_on_termination': True,
+ }
+ ],
+ 'imageRef': '',
'min_count': 1,
'max_count': 1,
}},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/utils.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/utils.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/utils.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/utils.py 2013-09-12 00:07:17.000000000 +0200
@@ -343,7 +343,8 @@
import unicodedata
if not isinstance(value, unicode):
value = six.text_type(value)
- value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
+ value = unicodedata.normalize('NFKD', value).encode('ascii',
+ 'ignore').decode("ascii")
value = six.text_type(_slugify_strip_re.sub('', value).strip().lower())
return _slugify_hyphenate_re.sub('-', value)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/contrib/assisted_volume_snapshots.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/contrib/assisted_volume_snapshots.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/contrib/assisted_volume_snapshots.py 1970-01-01 01:00:00.000000000 +0100
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/contrib/assisted_volume_snapshots.py 2013-09-12 00:07:17.000000000 +0200
@@ -0,0 +1,48 @@
+# Copyright (C) 2013, Red Hat, 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.
+
+"""
+Assisted volume snapshots - to be used by Cinder and not end users.
+"""
+
+import json
+
+from novaclient import base
+
+
+class Snapshot(base.Resource):
+ def __repr__(self):
+ return "" % self.id
+
+ def delete(self):
+ """
+ Delete this snapshot.
+ """
+ self.manager.delete(self)
+
+
+class AssistedSnapshotManager(base.Manager):
+ resource_class = Snapshot
+
+ def create(self, volume_id, create_info):
+ body = {'snapshot': {'volume_id': volume_id,
+ 'create_info': create_info}}
+ return self._create('/os-assisted-volume-snapshots', body, 'snapshot')
+
+ def delete(self, snapshot, delete_info):
+ self._delete("/os-assisted-volume-snapshots/%s?delete_info=%s" % (
+ base.getid(snapshot), json.dumps(delete_info)))
+
+manager_class = AssistedSnapshotManager
+name = 'assisted_volume_snapshots'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/servers.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/servers.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/servers.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/servers.py 2013-09-12 00:07:17.000000000 +0200
@@ -583,7 +583,8 @@
reservation_id=None, min_count=None,
max_count=None, security_groups=None, userdata=None,
key_name=None, availability_zone=None,
- block_device_mapping=None, nics=None, scheduler_hints=None,
+ block_device_mapping=None, block_device_mapping_v2=None,
+ nics=None, scheduler_hints=None,
config_drive=None, disk_config=None, **kwargs):
# TODO(anthony): indicate in doc string if param is an extension
# and/or optional
@@ -611,6 +612,8 @@
placement.
:param block_device_mapping: (optional extension) A dict of block
device mappings for this server.
+ :param block_device_mapping_v2: (optional extension) A dict of block
+ device mappings for this server.
:param nics: (optional extension) an ordered list of nics to be
added to this server, with information about
connected networks, fixed ips, port etc.
@@ -642,6 +645,9 @@
if block_device_mapping:
resource_url = "/os-volumes_boot"
boot_kwargs['block_device_mapping'] = block_device_mapping
+ elif block_device_mapping_v2:
+ resource_url = "/os-volumes_boot"
+ boot_kwargs['block_device_mapping_v2'] = block_device_mapping_v2
else:
resource_url = "/servers"
if nics:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/shell.py new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/shell.py
--- old/python-novaclient-2.14.1.45.gd770bb3/novaclient/v1_1/shell.py 2013-09-01 16:06:53.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/novaclient/v1_1/shell.py 2013-09-12 00:07:17.000000000 +0200
@@ -36,6 +36,20 @@
from novaclient.v1_1 import servers
+CLIENT_BDM2_KEYS = {
+ 'id': 'uuid',
+ 'source': 'source_type',
+ 'dest': 'destination_type',
+ 'bus': 'disk_bus',
+ 'device': 'device_name',
+ 'size': 'volume_size',
+ 'format': 'guest_format',
+ 'bootindex': 'boot_index',
+ 'type': 'device_type',
+ 'shutdown': 'delete_on_termination',
+}
+
+
def _key_value_pairing(text):
try:
(k, v) = text.split('=', 1)
@@ -58,6 +72,66 @@
return images_matched
+def _parse_block_device_mapping_v2(args, image):
+ bdm = []
+
+ if args.boot_volume:
+ bdm_dict = {'uuid': args.boot_volume, 'source_type': 'volume',
+ 'destination_type': 'volume', 'boot_index': 0,
+ 'delete_on_termination': False}
+ bdm.append(bdm_dict)
+
+ if args.snapshot:
+ bdm_dict = {'uuid': args.snapshot, 'source_type': 'snapshot',
+ 'destination_type': 'volume', 'boot_index': 0,
+ 'delete_on_termination': False}
+ bdm.append(bdm_dict)
+
+ for device_spec in args.block_device:
+ spec_dict = dict(v.split('=') for v in device_spec.split(','))
+ bdm_dict = {}
+
+ for key, value in spec_dict.iteritems():
+ bdm_dict[CLIENT_BDM2_KEYS[key]] = value
+
+ # Convert the delete_on_termination to a boolean or set it to true by
+ # default for local block devices when not specified.
+ if 'delete_on_termination' in bdm_dict:
+ action = bdm_dict['delete_on_termination']
+ bdm_dict['delete_on_termination'] = (action == 'remove')
+ elif bdm_dict.get('destination_type') == 'local':
+ bdm_dict['delete_on_termination'] = True
+
+ bdm.append(bdm_dict)
+
+ for ephemeral_spec in args.ephemeral:
+ bdm_dict = {'source_type': 'blank', 'destination_type': 'local',
+ 'boot_index': -1, 'delete_on_termination': True}
+
+ eph_dict = dict(v.split('=') for v in ephemeral_spec.split(','))
+ if 'size' in eph_dict:
+ bdm_dict['volume_size'] = eph_dict['size']
+ if 'format' in eph_dict:
+ bdm_dict['guest_format'] = eph_dict['format']
+
+ bdm.append(bdm_dict)
+
+ if args.swap:
+ bdm_dict = {'source_type': 'blank', 'destination_type': 'local',
+ 'boot_index': -1, 'delete_on_termination': True,
+ 'guest_format': 'swap', 'volume_size': args.swap}
+ bdm.append(bdm_dict)
+
+ # Append the image to the list only if we have new style BDMs
+ if bdm and not args.block_device_mapping and image:
+ bdm_dict = {'uuid': image.id, 'source_type': 'image',
+ 'destination_type': 'local', 'boot_index': 0,
+ 'delete_on_termination': True}
+ bdm.insert(0, bdm_dict)
+
+ return bdm
+
+
def _boot(cs, args, reservation_id=None, min_count=None, max_count=None):
"""Boot a new server."""
if min_count is None:
@@ -83,11 +157,6 @@
# are selecting the first of many?
image = images[0]
- if not image and not args.block_device_mapping:
- raise exceptions.CommandError("you need to specify an Image ID "
- "or a block device mapping "
- "or provide a set of properties to match"
- " against an image")
if not args.flavor:
raise exceptions.CommandError("you need to specify a Flavor ID ")
@@ -140,6 +209,25 @@
device_name, mapping = bdm.split('=', 1)
block_device_mapping[device_name] = mapping
+ block_device_mapping_v2 = _parse_block_device_mapping_v2(args, image)
+
+ n_boot_args = len(filter(None, (image, args.boot_volume, args.snapshot)))
+ have_bdm = block_device_mapping_v2 or block_device_mapping
+
+ # Fail if more than one boot devices are present
+ # or if there is no device to boot from.
+ if n_boot_args > 1 or n_boot_args == 0 and not have_bdm:
+ raise exceptions.CommandError(
+ "you need to specify at least one source ID (Image, Snapshot or "
+ "Volume), a block device mapping or provide a set of properties "
+ "to match against an image")
+
+ if block_device_mapping and block_device_mapping_v2:
+ raise exceptions.CommandError(
+ "you can't mix old block devices (--block-device-mapping) "
+ "with the new ones (--block-device, --boot-volume, --snapshot, "
+ "--ephemeral, --swap)")
+
nics = []
for nic_str in args.nics:
err_msg = ("Invalid nic argument '%s'. Nic arguments must be of the "
@@ -196,6 +284,7 @@
availability_zone=availability_zone,
security_groups=security_groups,
block_device_mapping=block_device_mapping,
+ block_device_mapping_v2=block_device_mapping_v2,
nics=nics,
scheduler_hints=hints,
config_drive=config_drive)
@@ -217,6 +306,14 @@
action='append',
metavar='',
help="Image metadata property (see 'nova image-show'). ")
+@utils.arg('--boot-volume',
+ default=None,
+ metavar="",
+ help="Volume ID to boot from.")
+@utils.arg('--snapshot',
+ default=None,
+ metavar="",
+ help="Sapshot ID to boot from (will create a volume).")
@utils.arg('--num-instances',
default=None,
type=int,
@@ -269,6 +366,31 @@
@utils.arg('--block_device_mapping',
action='append',
help=argparse.SUPPRESS)
+@utils.arg('--block-device',
+ metavar="key1=value1[,key2=value2...]",
+ action='append',
+ default=[],
+ help="Block device mapping with the keys: "
+ "id=image_id, snapshot_id or volume_id, "
+ "source=source type (image, snapshot, volume or blank), "
+ "dest=destination type of the block device (volume or local), "
+ "bus=device's bus, "
+ "device=name of the device (e.g. vda, xda, ...), "
+ "size=size of the block device in GB, "
+ "format=device will be formatted (e.g. swap, ext3, ntfs, ...), "
+ "bootindex=integer used for ordering the boot disks, "
+ "type=device type (e.g. disk, cdrom, ...) and "
+ "shutdown=shutdown behaviour (either preserve or remove).")
+@utils.arg('--swap',
+ metavar="",
+ default=None,
+ help="Create and attach a local swap block device of MB.")
+@utils.arg('--ephemeral',
+ metavar="size=<size>[,format=<format>]",
+ action='append',
+ default=[],
+ help="Create and attach a local ephemeral block device of <size> GB "
+ "and format it to <format>.")
@utils.arg('--hint',
action='append',
dest='scheduler_hints',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/python_novaclient.egg-info/PKG-INFO new/python-novaclient-2.14.1.54.g9a1304b/python_novaclient.egg-info/PKG-INFO
--- old/python-novaclient-2.14.1.45.gd770bb3/python_novaclient.egg-info/PKG-INFO 2013-09-01 16:07:36.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/python_novaclient.egg-info/PKG-INFO 2013-09-12 00:07:48.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-novaclient
-Version: 2.14.1.45.gd770bb3
+Version: 2.14.1.54.g9a1304b
Summary: Client library for OpenStack Compute API
Home-page: https://github.com/openstack/python-novaclient
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-novaclient-2.14.1.45.gd770bb3/python_novaclient.egg-info/SOURCES.txt new/python-novaclient-2.14.1.54.g9a1304b/python_novaclient.egg-info/SOURCES.txt
--- old/python-novaclient-2.14.1.45.gd770bb3/python_novaclient.egg-info/SOURCES.txt 2013-09-01 16:07:36.000000000 +0200
+++ new/python-novaclient-2.14.1.54.g9a1304b/python_novaclient.egg-info/SOURCES.txt 2013-09-12 00:07:48.000000000 +0200
@@ -95,6 +95,7 @@
novaclient/tests/v1_1/utils.py
novaclient/tests/v1_1/contrib/__init__.py
novaclient/tests/v1_1/contrib/fakes.py
+novaclient/tests/v1_1/contrib/test_assisted_volume_snapshots.py
novaclient/tests/v1_1/contrib/test_baremetal.py
novaclient/tests/v1_1/contrib/test_cells.py
novaclient/tests/v1_1/contrib/test_instance_actions.py
@@ -136,6 +137,7 @@
novaclient/v1_1/volume_types.py
novaclient/v1_1/volumes.py
novaclient/v1_1/contrib/__init__.py
+novaclient/v1_1/contrib/assisted_volume_snapshots.py
novaclient/v1_1/contrib/baremetal.py
novaclient/v1_1/contrib/cells.py
novaclient/v1_1/contrib/deferred_delete.py
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org