openSUSE Commits
Threads by month
- ----- 2024 -----
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
October 2015
- 1 participants
- 1896 discussions
Hello community,
here is the log from the commit of package python-glanceclient for openSUSE:Factory checked in at 2015-10-30 13:42:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-glanceclient (Old)
and /work/SRC/openSUSE:Factory/.python-glanceclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-glanceclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-glanceclient/python-glanceclient.changes 2015-09-08 18:05:36.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-glanceclient.new/python-glanceclient.changes 2015-10-30 13:42:46.000000000 +0100
@@ -1,0 +2,20 @@
+Wed Sep 16 15:38:45 UTC 2015 - tbechtold(a)suse.com
+
+- update to 1.1.0:
+ * Change next version in docs
+ * 1.0.1 Release notes
+ * Fixes CLI client called without subcommands
+ * Print the reverting back to v1 to stderr
+ * Updates default --sort behaviour
+ * Invalid output running the command 'glance image-show <image_id>'
+ * Don't make `help` require auth parameters
+ * check for None value in utils.safe_header
+ * Updated from global requirements
+ * Consider `--os-token` when using v2
+ * Check if v2 is available and fallback
+ * Update path to subunit2html in post_test_hook
+ * Fix the remove property logic in V2
+ * Password should be prompted once
+- adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
python-glanceclient-1.0.0.tar.gz
New:
----
python-glanceclient-1.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-glanceclient.spec ++++++
--- /var/tmp/diff_new_pack.C9PM3d/_old 2015-10-30 13:42:47.000000000 +0100
+++ /var/tmp/diff_new_pack.C9PM3d/_new 2015-10-30 13:42:47.000000000 +0100
@@ -19,7 +19,7 @@
%define component glanceclient
Name: python-glanceclient
-Version: 1.0.0
+Version: 1.1.0
Release: 0
Summary: Openstack Image (Glance) API Client
License: Apache-2.0
@@ -37,7 +37,6 @@
BuildRequires: python-keystoneclient
BuildRequires: python-oslosphinx
BuildRequires: python-pbr
-BuildRequires: python-pyOpenSSL
BuildRequires: python-warlock
Requires: python >= 2.6.8
Requires: python-Babel >= 1.3
@@ -46,9 +45,8 @@
Requires: python-PrettyTable >= 0.7
Requires: python-keystoneclient >= 1.6.0
Requires: python-oslo.i18n >= 1.5.0
-Requires: python-oslo.utils >= 1.9.0
-Requires: python-pbr >= 1.4
-Requires: python-pyOpenSSL >= 0.11
+Requires: python-oslo.utils >= 2.0.0
+Requires: python-pbr >= 1.6
Requires: python-requests >= 2.5.2
Requires: python-six >= 1.9.0
Requires: python-warlock >= 1.0.1
@@ -71,9 +69,12 @@
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
Requires: python-discover
%endif
+Requires: python-fixtures >= 1.3.1
Requires: python-mock >= 1.2
-Requires: python-mox3 >= 0.7.0
+Requires: python-requests-mock >= 0.6.0
+Requires: python-tempest-lib >= 0.6.1
Requires: python-testrepository >= 0.0.18
+Requires: python-testscenarios >= 0.4
Requires: python-testtools >= 1.4.0
%description test
++++++ python-glanceclient-1.0.0.tar.gz -> python-glanceclient-1.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/AUTHORS new/python-glanceclient-1.1.0/AUTHORS
--- old/python-glanceclient-1.0.0/AUTHORS 2015-08-31 18:27:07.000000000 +0200
+++ new/python-glanceclient-1.1.0/AUTHORS 2015-09-15 13:56:46.000000000 +0200
@@ -35,8 +35,10 @@
Darja Shakhray <dshakhray(a)mirantis.com>
Davanum Srinivas <davanum(a)gmail.com>
Davanum Srinivas <dims(a)linux.vnet.ibm.com>
+David Edery <david.edery(a)alcatel-lucent.com>
David Koo <david.koo(a)huawei.com>
David Peraza <dperaza(a)linux.vnet.ibm.com>
+David Sariel <dsariel(a)redhat.com>
David Wittman <david.wittman(a)rackspace.com>
Dazhao <dzyu(a)cn.ibm.com>
Dean Troyer <dtroyer(a)gmail.com>
@@ -65,6 +67,7 @@
Hugh Saunders <hugh(a)wherenow.org>
Ian Cordasco <ian.cordasco(a)rackspace.com>
Ian Wienand <iwienand(a)redhat.com>
+Jake Yip <jake.yip(a)unimelb.edu.au>
Jakub Ruzicka <jruzicka(a)redhat.com>
James E. Blair <jeblair(a)hp.com>
James Li <yueli.m(a)gmail.com>
@@ -124,6 +127,7 @@
Sudipta Biswas <sbiswas7(a)in.ibm.com>
Sulochan Acharya <sulochan(a)gmail.com>
Sushil Kumar <sushil.kumar2(a)globallogic.com>
+Takashi NATSUME <natsume.takashi(a)lab.ntt.co.jp>
Tatyana Leontovich <tleontov(a)yahoo-inc.com>
Thierry Carrez <thierry(a)openstack.org>
Thomas Goirand <zigo(a)debian.org>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/ChangeLog new/python-glanceclient-1.1.0/ChangeLog
--- old/python-glanceclient-1.0.0/ChangeLog 2015-08-31 18:27:07.000000000 +0200
+++ new/python-glanceclient-1.1.0/ChangeLog 2015-09-15 13:56:46.000000000 +0200
@@ -1,6 +1,24 @@
CHANGES
=======
+1.1.0
+-----
+
+* Change next version in docs
+* 1.0.1 Release notes
+* Fixes CLI client called without subcommands
+* Print the reverting back to v1 to stderr
+* Updates default --sort behaviour
+* Invalid output running the command 'glance image-show <image_id>'
+* Don't make `help` require auth parameters
+* check for None value in utils.safe_header
+* Updated from global requirements
+* Consider `--os-token` when using v2
+* Check if v2 is available and fallback
+* Update path to subunit2html in post_test_hook
+* Fix the remove property logic in V2
+* Password should be prompted once
+
1.0.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/PKG-INFO new/python-glanceclient-1.1.0/PKG-INFO
--- old/python-glanceclient-1.0.0/PKG-INFO 2015-08-31 18:27:08.000000000 +0200
+++ new/python-glanceclient-1.1.0/PKG-INFO 2015-09-15 13:56:46.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-glanceclient
-Version: 1.0.0
+Version: 1.1.0
Summary: OpenStack Image API Client Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/doc/source/index.rst new/python-glanceclient-1.1.0/doc/source/index.rst
--- old/python-glanceclient-1.0.0/doc/source/index.rst 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/doc/source/index.rst 2015-09-15 13:55:53.000000000 +0200
@@ -53,6 +53,32 @@
Release Notes
=============
+1.1.0
+-----
+
+* This release provides mainly bugfixes for the bugs discovered after defaulting to v2 API on CLI. If you're using 1.0.0 client, it is highly recommended to upgrade.
+
+* 1494259_: Fixes CLI client called without subcommands
+* 1488914_: Print the reverting back to v1 to stderr
+* 1487645_: Invalid output running the command 'glance image-show <image_id>'
+* 1490457_: Don't make `help` require auth parameters
+* 1491311_: check for None value in utils.safe_header
+* f0b30f4 Updated from global requirements
+* 1490462_: Consider `--os-token` when using v2
+* 1489381_: Check if v2 is available and fallback
+* 1491646_: Update path to subunit2html in post_test_hook
+* 1488892_: Password should be prompted once
+
+.. _1494259: https://bugs.launchpad.net/python-glanceclient/+bug/1494259
+.. _1488914: https://bugs.launchpad.net/python-glanceclient/+bug/1488914
+.. _1487645: https://bugs.launchpad.net/python-glanceclient/+bug/1487645
+.. _1490457: https://bugs.launchpad.net/python-glanceclient/+bug/1490457
+.. _1491311: https://bugs.launchpad.net/python-glanceclient/+bug/1491311
+.. _1490462: https://bugs.launchpad.net/python-glanceclient/+bug/1490462
+.. _1489381: https://bugs.launchpad.net/python-glanceclient/+bug/1489381
+.. _1491646: https://bugs.launchpad.net/python-glanceclient/+bug/1491646
+.. _1488892: https://bugs.launchpad.net/python-glanceclient/+bug/1488892
+
1.0.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/common/http.py new/python-glanceclient-1.1.0/glanceclient/common/http.py
--- old/python-glanceclient-1.0.0/glanceclient/common/http.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/common/http.py 2015-09-15 13:55:48.000000000 +0200
@@ -91,7 +91,10 @@
if not resp.ok:
LOG.debug("Request returned failure status %s." % resp.status_code)
raise exc.from_response(resp, resp.content)
- elif resp.status_code == requests.codes.MULTIPLE_CHOICES:
+ elif (resp.status_code == requests.codes.MULTIPLE_CHOICES and
+ resp.request.path_url != '/versions'):
+ # NOTE(flaper87): Eventually, we'll remove the check on `versions`
+ # which is a bug (1491350) on the server.
raise exc.from_response(resp)
content_type = resp.headers.get('Content-Type')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/common/utils.py new/python-glanceclient-1.1.0/glanceclient/common/utils.py
--- old/python-glanceclient-1.0.0/glanceclient/common/utils.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/common/utils.py 2015-09-15 13:55:48.000000000 +0200
@@ -450,7 +450,7 @@
def safe_header(name, value):
- if name in SENSITIVE_HEADERS:
+ if value is not None and name in SENSITIVE_HEADERS:
v = value.encode('utf-8')
h = hashlib.sha1(v)
d = h.hexdigest()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/shell.py new/python-glanceclient-1.1.0/glanceclient/shell.py
--- old/python-glanceclient-1.0.0/glanceclient/shell.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/shell.py 2015-09-15 13:55:48.000000000 +0200
@@ -442,12 +442,13 @@
ks_session.auth = auth
return ks_session
- def _get_endpoint_and_token(self, args, force_auth=False):
+ def _get_endpoint_and_token(self, args):
image_url = self._get_image_url(args)
auth_token = args.os_auth_token
- auth_reqd = force_auth or (utils.is_authentication_required(args.func)
- and not (auth_token and image_url))
+ auth_reqd = (not (auth_token and image_url) or
+ (hasattr(args, 'func') and
+ utils.is_authentication_required(args.func)))
if not auth_reqd:
endpoint = image_url
@@ -537,9 +538,8 @@
return endpoint, token
- def _get_versioned_client(self, api_version, args, force_auth=False):
- endpoint, token = self._get_endpoint_and_token(args,
- force_auth=force_auth)
+ def _get_versioned_client(self, api_version, args):
+ endpoint, token = self._get_endpoint_and_token(args)
kwargs = {
'token': token,
@@ -553,7 +553,7 @@
client = glanceclient.Client(api_version, endpoint, **kwargs)
return client
- def _cache_schemas(self, options, home_dir='~/.glanceclient'):
+ def _cache_schemas(self, options, client, home_dir='~/.glanceclient'):
homedir = os.path.expanduser(home_dir)
path_prefix = homedir
if options.os_auth_url:
@@ -573,16 +573,11 @@
schema_file_paths = [os.path.join(path_prefix, x + '_schema.json')
for x in ['image', 'namespace', 'resource_type']]
- client = None
failed_download_schema = 0
for resource, schema_file_path in zip(resources, schema_file_paths):
if (not os.path.exists(schema_file_path)) or options.get_schema:
try:
- if not client:
- client = self._get_versioned_client('2', options,
- force_auth=True)
schema = client.schemas.get(resource)
-
with open(schema_file_path, 'w') as f:
f.write(json.dumps(schema.raw()))
except Exception:
@@ -594,6 +589,24 @@
return failed_download_schema >= len(resources)
def main(self, argv):
+
+ def _get_subparser(api_version):
+ try:
+ return self.get_subcommand_parser(api_version)
+ except ImportError as e:
+ if options.debug:
+ traceback.print_exc()
+ if not str(e):
+ # Add a generic import error message if the raised
+ # ImportError has none.
+ raise ImportError('Unable to import module. Re-run '
+ 'with --debug for more info.')
+ raise
+ except Exception:
+ if options.debug:
+ traceback.print_exc()
+ raise
+
# Parse args once to find version
# NOTE(flepied) Under Python3, parsed arguments are removed
@@ -624,49 +637,55 @@
"Supported values are %s" % SUPPORTED_VERSIONS)
utils.exit(msg=msg)
- if api_version == 2:
- switch_version = self._cache_schemas(options)
- if switch_version:
- print('WARNING: The client is falling back to v1 because'
- ' the accessing to v2 failed. This behavior will'
- ' be removed in future versions')
- api_version = 1
-
- try:
- subcommand_parser = self.get_subcommand_parser(api_version)
- except ImportError as e:
- if options.debug:
- traceback.print_exc()
- if not str(e):
- # Add a generic import error message if the raised ImportError
- # has none.
- raise ImportError('Unable to import module. Re-run '
- 'with --debug for more info.')
- raise
- except Exception:
- if options.debug:
- traceback.print_exc()
- raise
-
- self.parser = subcommand_parser
-
# Handle top-level --help/-h before attempting to parse
# a command off the command line
if options.help or not argv:
- self.do_help(options)
+ self.do_help(options, parser=parser)
return 0
- # Parse args again and call whatever callback was selected
- args = subcommand_parser.parse_args(argv)
-
# Short-circuit and deal with help command right away.
+ sub_parser = _get_subparser(api_version)
+ args = sub_parser.parse_args(argv)
+
if args.func == self.do_help:
- self.do_help(args)
+ self.do_help(args, parser=sub_parser)
return 0
elif args.func == self.do_bash_completion:
self.do_bash_completion(args)
return 0
+ if not options.os_image_api_version and api_version == 2:
+ switch_version = True
+ client = self._get_versioned_client('2', options)
+
+ resp, body = client.http_client.get('/versions')
+
+ for version in body['versions']:
+ if version['id'].startswith('v2'):
+ # NOTE(flaper87): We know v2 is enabled in the server,
+ # which means we should be able to get the schemas and
+ # move on.
+ switch_version = self._cache_schemas(options, client)
+ break
+
+ if switch_version:
+ print('WARNING: The client is falling back to v1 because'
+ ' the accessing to v2 failed. This behavior will'
+ ' be removed in future versions', file=sys.stderr)
+ api_version = 1
+
+ sub_parser = _get_subparser(api_version)
+
+ # Parse args again and call whatever callback was selected
+ args = sub_parser.parse_args(argv)
+
+ # NOTE(flaper87): Make sure we re-use the password input if we
+ # have one. This may happen if the schemas were downloaded in
+ # this same command. Password will be asked to download the
+ # schemas and then for the operations below.
+ if not args.os_password and options.os_password:
+ args.os_password = options.os_password
+
LOG = logging.getLogger('glanceclient')
LOG.addHandler(logging.StreamHandler())
LOG.setLevel(logging.DEBUG if args.debug else logging.INFO)
@@ -675,8 +694,7 @@
if profile:
osprofiler_profiler.init(options.profile)
- client = self._get_versioned_client(api_version, args,
- force_auth=False)
+ client = self._get_versioned_client(api_version, args)
try:
args.func(client, args)
@@ -697,16 +715,24 @@
@utils.arg('command', metavar='<subcommand>', nargs='?',
help='Display help for <subcommand>.')
- def do_help(self, args):
+ def do_help(self, args, parser):
"""Display help about this program or one of its subcommands."""
- if getattr(args, 'command', None):
+ command = getattr(args, 'command', '')
+
+ if command:
if args.command in self.subcommands:
self.subcommands[args.command].print_help()
else:
raise exc.CommandError("'%s' is not a valid subcommand" %
args.command)
+ command = ' ' + command
else:
- self.parser.print_help()
+ parser.print_help()
+
+ if not args.os_image_api_version or args.os_image_api_version == '2':
+ print()
+ print(("Run `glance --os-image-api-version 1 help%s` "
+ "for v1 help") % command)
def do_bash_completion(self, _args):
"""Prints arguments for bash_completion.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/tests/functional/hooks/post_test_hook.sh new/python-glanceclient-1.1.0/glanceclient/tests/functional/hooks/post_test_hook.sh
--- old/python-glanceclient-1.0.0/glanceclient/tests/functional/hooks/post_test_hook.sh 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/tests/functional/hooks/post_test_hook.sh 2015-09-15 13:55:48.000000000 +0200
@@ -18,7 +18,7 @@
if [ -f .testrepository/0 ]; then
sudo .tox/functional/bin/testr last --subunit > $WORKSPACE/testrepository.subunit
sudo mv $WORKSPACE/testrepository.subunit $BASE/logs/testrepository.subunit
- sudo .tox/functional/bin/python /usr/local/jenkins/slave_scripts/subunit2html.py $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
+ sudo /usr/os-testr-env/bin/subunit2html $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
sudo gzip -9 $BASE/logs/testrepository.subunit
sudo gzip -9 $BASE/logs/testr_results.html
sudo chown jenkins:jenkins $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/tests/functional/test_readonly_glance.py new/python-glanceclient-1.1.0/glanceclient/tests/functional/test_readonly_glance.py
--- old/python-glanceclient-1.0.0/glanceclient/tests/functional/test_readonly_glance.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/tests/functional/test_readonly_glance.py 2015-09-15 13:55:48.000000000 +0200
@@ -80,7 +80,7 @@
params=param_image_id)
def test_help(self):
- help_text = self.glance('help')
+ help_text = self.glance('--os-image-api-version 2 help')
lines = help_text.split('\n')
self.assertFirstLineStartsWith(lines, 'usage: glance')
@@ -103,7 +103,7 @@
self.glance('', flags='--version')
def test_debug_list(self):
- self.glance('image-list', flags='--debug')
+ self.glance('--os-image-api-version 2 image-list', flags='--debug')
def test_no_ssl_compression(self):
# Test deprecating this hasn't broken anything
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/tests/unit/test_shell.py new/python-glanceclient-1.1.0/glanceclient/tests/unit/test_shell.py
--- old/python-glanceclient-1.0.0/glanceclient/tests/unit/test_shell.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/tests/unit/test_shell.py 2015-09-15 13:55:48.000000000 +0200
@@ -147,24 +147,36 @@
def test_help_unknown_command(self):
shell = openstack_shell.OpenStackImagesShell()
- argstr = 'help foofoo'
+ argstr = '--os-image-api-version 2 help foofoo'
self.assertRaises(exc.CommandError, shell.main, argstr.split())
def test_help(self):
shell = openstack_shell.OpenStackImagesShell()
- argstr = 'help'
- actual = shell.main(argstr.split())
- self.assertEqual(0, actual)
+ argstr = '--os-image-api-version 2 help'
+ with mock.patch.object(shell, '_get_endpoint_and_token') as et_mock:
+ actual = shell.main(argstr.split())
+ self.assertEqual(0, actual)
+ self.assertFalse(et_mock.called)
+
+ def test_blank_call(self):
+ shell = openstack_shell.OpenStackImagesShell()
+ with mock.patch.object(shell, '_get_endpoint_and_token') as et_mock:
+ actual = shell.main('')
+ self.assertEqual(0, actual)
+ self.assertFalse(et_mock.called)
def test_help_on_subcommand_error(self):
- self.assertRaises(exc.CommandError, shell, 'help bad')
+ self.assertRaises(exc.CommandError, shell,
+ '--os-image-api-version 2 help bad')
def test_help_v2_no_schema(self):
shell = openstack_shell.OpenStackImagesShell()
argstr = '--os-image-api-version 2 help image-create'
- actual = shell.main(argstr.split())
- self.assertEqual(0, actual)
- self.assertNotIn('<unavailable>', actual)
+ with mock.patch.object(shell, '_get_endpoint_and_token') as et_mock:
+ actual = shell.main(argstr.split())
+ self.assertEqual(0, actual)
+ self.assertNotIn('<unavailable>', actual)
+ self.assertFalse(et_mock.called)
def test_get_base_parser(self):
test_shell = openstack_shell.OpenStackImagesShell()
@@ -185,7 +197,9 @@
def test_cert_and_key_args_interchangeable(self,
mock_versioned_client):
# make sure --os-cert and --os-key are passed correctly
- args = '--os-cert mycert --os-key mykey image-list'
+ args = ('--os-image-api-version 2 '
+ '--os-cert mycert '
+ '--os-key mykey image-list')
shell(args)
assert mock_versioned_client.called
((api_version, args), kwargs) = mock_versioned_client.call_args
@@ -193,7 +207,9 @@
self.assertEqual('mykey', args.os_key)
# make sure we get the same thing with --cert-file and --key-file
- args = '--cert-file mycertfile --key-file mykeyfile image-list'
+ args = ('--os-image-api-version 2 '
+ '--cert-file mycertfile '
+ '--key-file mykeyfile image-list')
glance_shell = openstack_shell.OpenStackImagesShell()
glance_shell.main(args.split())
assert mock_versioned_client.called
@@ -214,21 +230,18 @@
self.assertEqual('mytoken', kwargs['token'])
self.assertEqual('https://image:1234', args[0])
- @mock.patch.object(openstack_shell.OpenStackImagesShell, '_cache_schemas',
- return_value=False)
- def test_no_auth_with_token_and_image_url_with_v2(self,
- cache_schemas):
- with mock.patch('glanceclient.v2.client.Client') as v2_client:
- # test no authentication is required if both token and endpoint url
- # are specified
- args = ('--os-auth-token mytoken '
- '--os-image-url https://image:1234/v2 '
- '--os-image-api-version 2 image-list')
- glance_shell = openstack_shell.OpenStackImagesShell()
- glance_shell.main(args.split())
- ((args), kwargs) = v2_client.call_args
- self.assertEqual('https://image:1234', args[0])
- self.assertEqual('mytoken', kwargs['token'])
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_no_auth_with_token_and_image_url_with_v2(self, v2_client):
+ # test no authentication is required if both token and endpoint url
+ # are specified
+ args = ('--os-image-api-version 2 --os-auth-token mytoken '
+ '--os-image-url https://image:1234 image-list')
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertTrue(v2_client.called)
+ (args, kwargs) = v2_client.call_args
+ self.assertEqual('mytoken', kwargs['token'])
+ self.assertEqual('https://image:1234', args[0])
def _assert_auth_plugin_args(self):
# make sure our auth plugin is invoked with the correct args
@@ -284,18 +297,30 @@
@mock.patch('sys.stdin', side_effect=mock.MagicMock)
@mock.patch('getpass.getpass', return_value='password')
- def test_password_prompted_with_v2(self, mock_getpass, mock_stdin):
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_password_prompted_with_v2(self, v2_client,
+ mock_getpass, mock_stdin):
self.requests.post(self.token_url, exc=requests.ConnectionError)
+
+ cli2 = mock.MagicMock()
+ v2_client.return_value = cli2
+ cli2.http_client.get.return_value = (None, {'versions': []})
glance_shell = openstack_shell.OpenStackImagesShell()
self.make_env(exclude='OS_PASSWORD')
self.assertRaises(ks_exc.ConnectionRefused,
glance_shell.main, ['image-list'])
# Make sure we are actually prompted.
- mock_getpass.assert_called_with('OS Password: ')
+ mock_getpass.assert_called_once_with('OS Password: ')
@mock.patch('sys.stdin', side_effect=mock.MagicMock)
@mock.patch('getpass.getpass', side_effect=EOFError)
- def test_password_prompted_ctrlD_with_v2(self, mock_getpass, mock_stdin):
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_password_prompted_ctrlD_with_v2(self, v2_client,
+ mock_getpass, mock_stdin):
+ cli2 = mock.MagicMock()
+ v2_client.return_value = cli2
+ cli2.http_client.get.return_value = (None, {'versions': []})
+
glance_shell = openstack_shell.OpenStackImagesShell()
self.make_env(exclude='OS_PASSWORD')
# We should get Command Error because we mock Ctl-D.
@@ -381,10 +406,38 @@
msg = 'Unable to import module. Re-run with --debug for more info.'
self.assertEqual(msg, str(e))
+ @mock.patch('glanceclient.v2.client.Client')
+ @mock.patch('glanceclient.v1.images.ImageManager.list')
+ def test_shell_v1_fallback_from_v2(self, v1_imgs, v2_client):
+ self.make_env()
+ cli2 = mock.MagicMock()
+ v2_client.return_value = cli2
+ cli2.http_client.get.return_value = (None, {'versions': []})
+ args = 'image-list'
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertFalse(cli2.schemas.get.called)
+ self.assertTrue(v1_imgs.called)
+
+ @mock.patch.object(openstack_shell.OpenStackImagesShell,
+ '_cache_schemas')
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_shell_no_fallback_from_v2(self, v2_client, cache_schemas):
+ self.make_env()
+ cli2 = mock.MagicMock()
+ v2_client.return_value = cli2
+ cli2.http_client.get.return_value = (None,
+ {'versions': [{'id': 'v2'}]})
+ cache_schemas.return_value = False
+ args = 'image-list'
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertTrue(cli2.images.list.called)
+
@mock.patch('glanceclient.v1.client.Client')
def test_auth_plugin_invocation_without_username_with_v1(self, v1_client):
self.make_env(exclude='OS_USERNAME')
- args = 'image-list'
+ args = '--os-image-api-version 2 image-list'
glance_shell = openstack_shell.OpenStackImagesShell()
self.assertRaises(exc.CommandError, glance_shell.main, args.split())
@@ -398,7 +451,7 @@
@mock.patch('glanceclient.v1.client.Client')
def test_auth_plugin_invocation_without_auth_url_with_v1(self, v1_client):
self.make_env(exclude='OS_AUTH_URL')
- args = 'image-list'
+ args = '--os-image-api-version 1 image-list'
glance_shell = openstack_shell.OpenStackImagesShell()
self.assertRaises(exc.CommandError, glance_shell.main, args.split())
@@ -415,7 +468,7 @@
self.make_env(exclude='OS_TENANT_NAME')
if 'OS_PROJECT_ID' in os.environ:
self.make_env(exclude='OS_PROJECT_ID')
- args = 'image-list'
+ args = '--os-image-api-version 1 image-list'
glance_shell = openstack_shell.OpenStackImagesShell()
self.assertRaises(exc.CommandError, glance_shell.main, args.split())
@@ -472,12 +525,13 @@
side_effect=ks_exc.ClientException())
def test_api_discovery_failed_with_unversioned_auth_url(self,
discover):
- args = '--os-auth-url %s image-list' % DEFAULT_UNVERSIONED_AUTH_URL
+ args = ('--os-image-api-version 2 --os-auth-url %s image-list'
+ % DEFAULT_UNVERSIONED_AUTH_URL)
glance_shell = openstack_shell.OpenStackImagesShell()
self.assertRaises(exc.CommandError, glance_shell.main, args.split())
def test_bash_completion(self):
- stdout, stderr = self.shell('bash_completion')
+ stdout, stderr = self.shell('--os-image-api-version 2 bash_completion')
# just check we have some output
required = [
'--status',
@@ -542,8 +596,9 @@
}
schema_odict = OrderedDict(self.schema_dict)
- self.shell._cache_schemas(self._make_args(options),
- home_dir=self.cache_dir)
+ args = self._make_args(options)
+ client = self.shell._get_versioned_client('2', args, force_auth=True)
+ self.shell._cache_schemas(args, client, home_dir=self.cache_dir)
self.assertEqual(12, open.mock_calls.__len__())
self.assertEqual(mock.call(self.cache_files[0], 'w'),
@@ -564,8 +619,9 @@
}
schema_odict = OrderedDict(self.schema_dict)
- self.shell._cache_schemas(self._make_args(options),
- home_dir=self.cache_dir)
+ args = self._make_args(options)
+ client = self.shell._get_versioned_client('2', args, force_auth=True)
+ self.shell._cache_schemas(args, client, home_dir=self.cache_dir)
self.assertEqual(12, open.mock_calls.__len__())
self.assertEqual(mock.call(self.cache_files[0], 'w'),
@@ -585,8 +641,9 @@
'os_auth_url': self.os_auth_url
}
+ client = mock.MagicMock()
self.shell._cache_schemas(self._make_args(options),
- home_dir=self.cache_dir)
+ client, home_dir=self.cache_dir)
os.path.exists.assert_any_call(self.prefix_path)
os.path.exists.assert_any_call(self.cache_files[0])
@@ -604,6 +661,8 @@
self.client.schemas.get.return_value = Exception()
+ client = mock.MagicMock()
switch_version = self.shell._cache_schemas(self._make_args(options),
+ client,
home_dir=self.cache_dir)
self.assertEqual(switch_version, True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/tests/unit/test_utils.py new/python-glanceclient-1.1.0/glanceclient/tests/unit/test_utils.py
--- old/python-glanceclient-1.0.0/glanceclient/tests/unit/test_utils.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/tests/unit/test_utils.py 2015-09-15 13:55:48.000000000 +0200
@@ -177,3 +177,18 @@
i = utils.IterableWithLength(data, 10)
self.assertRaises(IOError, _iterate, i)
data.close.assert_called_with()
+
+ def test_safe_header(self):
+ self.assertEqual(('somekey', 'somevalue'),
+ utils.safe_header('somekey', 'somevalue'))
+ self.assertEqual(('somekey', None),
+ utils.safe_header('somekey', None))
+
+ for sensitive_header in utils.SENSITIVE_HEADERS:
+ (name, value) = utils.safe_header(sensitive_header, 'somestring')
+ self.assertEqual(sensitive_header, name)
+ self.assertTrue(value.startswith("{SHA1}"))
+
+ (name, value) = utils.safe_header(sensitive_header, None)
+ self.assertEqual(sensitive_header, name)
+ self.assertIsNone(value)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/v1/images.py new/python-glanceclient-1.1.0/glanceclient/v1/images.py
--- old/python-glanceclient-1.0.0/glanceclient/v1/images.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/v1/images.py 2015-09-15 13:55:48.000000000 +0200
@@ -73,6 +73,11 @@
meta = {'properties': {}}
safe_decode = encodeutils.safe_decode
for key, value in six.iteritems(headers):
+ # NOTE(flaper87): this is a compatibility fix
+ # for urllib3 >= 1.11. Please, refer to this
+ # bug for more info:
+ # https://bugs.launchpad.net/python-glanceclient/+bug/1487645
+ key = key.lower()
value = safe_decode(value, incoming='utf-8')
if key.startswith('x-image-meta-property-'):
_key = safe_decode(key[22:], incoming='utf-8')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/v2/images.py new/python-glanceclient-1.1.0/glanceclient/v2/images.py
--- old/python-glanceclient-1.0.0/glanceclient/v2/images.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/v2/images.py 2015-09-15 13:55:48.000000000 +0200
@@ -252,7 +252,7 @@
except warlock.InvalidOperation as e:
raise TypeError(utils.exception_to_str(e))
- if remove_props is not None:
+ if remove_props:
cur_props = image.keys()
new_props = kwargs.keys()
# NOTE(esheffield): Only remove props that currently exist on the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/glanceclient/v2/shell.py new/python-glanceclient-1.1.0/glanceclient/v2/shell.py
--- old/python-glanceclient-1.0.0/glanceclient/v2/shell.py 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/glanceclient/v2/shell.py 2015-09-15 13:55:48.000000000 +0200
@@ -142,8 +142,8 @@
help='Sort image list in specified directions.')
@utils.arg('--sort', metavar='<key>[:<direction>]', default=None,
help=(("Comma-separated list of sort keys and directions in the "
- "form of <key>[:<asc|desc>]. Valid keys: %s. OPTIONAL: "
- "Default='name:asc'.") % ', '.join(images.SORT_KEY_VALUES)))
+ "form of <key>[:<asc|desc>]. Valid keys: %s. OPTIONAL."
+ ) % ', '.join(images.SORT_KEY_VALUES)))
def do_image_list(gc, args):
"""List images you can access."""
filter_keys = ['visibility', 'member_status', 'owner', 'checksum', 'tag']
@@ -169,7 +169,8 @@
if args.sort is not None:
kwargs['sort'] = args.sort
elif not args.sort_dir and not args.sort_key:
- kwargs['sort'] = 'name:asc'
+ kwargs['sort_key'] = 'name'
+ kwargs['sort_dir'] = 'asc'
columns = ['ID', 'Name']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/python_glanceclient.egg-info/PKG-INFO new/python-glanceclient-1.1.0/python_glanceclient.egg-info/PKG-INFO
--- old/python-glanceclient-1.0.0/python_glanceclient.egg-info/PKG-INFO 2015-08-31 18:27:07.000000000 +0200
+++ new/python-glanceclient-1.1.0/python_glanceclient.egg-info/PKG-INFO 2015-09-15 13:56:46.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-glanceclient
-Version: 1.0.0
+Version: 1.1.0
Summary: OpenStack Image API Client Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/python_glanceclient.egg-info/pbr.json new/python-glanceclient-1.1.0/python_glanceclient.egg-info/pbr.json
--- old/python-glanceclient-1.0.0/python_glanceclient.egg-info/pbr.json 2015-08-31 18:27:07.000000000 +0200
+++ new/python-glanceclient-1.1.0/python_glanceclient.egg-info/pbr.json 2015-09-15 13:56:46.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "54ae632"}
\ No newline at end of file
+{"is_release": true, "git_version": "8663586"}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/python_glanceclient.egg-info/requires.txt new/python-glanceclient-1.1.0/python_glanceclient.egg-info/requires.txt
--- old/python-glanceclient-1.0.0/python_glanceclient.egg-info/requires.txt 2015-08-31 18:27:07.000000000 +0200
+++ new/python-glanceclient-1.1.0/python_glanceclient.egg-info/requires.txt 2015-09-15 13:56:46.000000000 +0200
@@ -1,4 +1,4 @@
-pbr<2.0,>=1.4
+pbr<2.0,>=1.6
Babel>=1.3
argparse
PrettyTable<0.8,>=0.7
@@ -6,5 +6,5 @@
requests>=2.5.2
warlock<2,>=1.0.1
six>=1.9.0
-oslo.utils>=1.9.0
+oslo.utils>=2.0.0
oslo.i18n>=1.5.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-glanceclient-1.0.0/requirements.txt new/python-glanceclient-1.1.0/requirements.txt
--- old/python-glanceclient-1.0.0/requirements.txt 2015-08-31 18:26:14.000000000 +0200
+++ new/python-glanceclient-1.1.0/requirements.txt 2015-09-15 13:55:48.000000000 +0200
@@ -1,7 +1,7 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr<2.0,>=1.4
+pbr<2.0,>=1.6
Babel>=1.3
argparse
PrettyTable<0.8,>=0.7
@@ -9,5 +9,5 @@
requests>=2.5.2
warlock<2,>=1.0.1
six>=1.9.0
-oslo.utils>=1.9.0 # Apache-2.0
+oslo.utils>=2.0.0 # Apache-2.0
oslo.i18n>=1.5.0 # Apache-2.0
1
0
Hello community,
here is the log from the commit of package python-swiftclient for openSUSE:Factory checked in at 2015-10-30 13:42:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-swiftclient (Old)
and /work/SRC/openSUSE:Factory/.python-swiftclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-swiftclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-swiftclient/python-swiftclient.changes 2015-09-02 07:53:50.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-swiftclient.new/python-swiftclient.changes 2015-10-30 13:42:43.000000000 +0100
@@ -1,0 +2,41 @@
+Mon Sep 14 11:00:08 UTC 2015 - tbechtold(a)suse.com
+
+- update to 2.6.0:
+ * Several CLI options have learned short options. The usage strings have
+ been updated to reflect this.
+ * Added --no-shuffle option to the CLI download command.
+ * Added --absolute option for CLI TempURL generation and the corresponding
+ parameter to utils.generate_temp_url(). This allows for an exact, specific
+ time to be used for the TempURL expiry time.
+ * CLI arguments are now always decoded as UTF-8.
+ * Stop Connection class modifying os_options parameter.
+ * Reduce memory usage for download/delete.
+ * The swift service API now logs and reports the traceback
+ on failed operations.
+ * Increase httplib._MAXHEADERS to 256 to work around header limits in recent
+ Python releases.
+ * Added minimal working service token support to client.py.
+ * Various other minor bug fixes and improvements.
+ * The CLI learned an "auth" subcommand which returns bash environment
+ snippets for auth credentials.
+ * The CLI --version option is now more explicit by calling itself
+ "python-swiftclient" rather than the name of the binary.
+ * Now validates the checksum of each chunk of a large object as it is
+ uploaded.
+ * Fixes uploading an object with a relative path.
+ * Added the ability to download objects to a particular folder.
+ * Now correctly removes all old segments of an object when replacing a
+ Dynamic Large Object (DLO).
+ * The --skip-identical option now works properly when downloading
+ large objects.
+ * The client.get_object() response learned a .read([length]) method.
+ * Fixed an issue where an intermediate caching/proxy service could cause
+ object content to be improperly decoded.
+ * Added a timeout parameter to HTTPConnection objects for socket-level
+ read timeouts.
+ * Removed a dependency on simplejson.
+ * Various other minor bug fixes and improvements.
+- Adjust Requires according to requirements.txt
+- Add python_requires to _service file
+
+-------------------------------------------------------------------
Old:
----
python-swiftclient-2.4.0.tar.gz
New:
----
python-swiftclient-2.6.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-swiftclient.spec ++++++
--- /var/tmp/diff_new_pack.EZOubX/_old 2015-10-30 13:42:44.000000000 +0100
+++ /var/tmp/diff_new_pack.EZOubX/_new 2015-10-30 13:42:44.000000000 +0100
@@ -18,7 +18,7 @@
%define component swiftclient
Name: python-%{component}
-Version: 2.4.0
+Version: 2.6.0
Release: 0
Summary: Openstack Object Storage (Swift) API Client
License: Apache-2.0
@@ -36,9 +36,8 @@
BuildRequires: python-Sphinx
BuildRequires: python-oslosphinx
Requires: python >= 2.6.8
+Requires: python-futures >= 2.1.3
Requires: python-requests >= 1.1
-Requires: python-setuptools
-Requires: python-simplejson >= 2.0.9
Requires: python-six >= 1.5.2
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
@@ -67,9 +66,8 @@
Summary: Openstack Object Storage (Swift) API Client - Testsuite
Group: System/Management
Requires: %{name} = %{version}
-Requires: python-discover
-Requires: python-keystoneclient >= 0.6.0
-Requires: python-mock >= 1.0
+Requires: python-keystoneclient >= 0.7.0
+Requires: python-mock >= 1.2
Requires: python-testrepository >= 0.0.18
Requires: python-testtools >= 0.9.34
++++++ _service ++++++
--- /var/tmp/diff_new_pack.EZOubX/_old 2015-10-30 13:42:44.000000000 +0100
+++ /var/tmp/diff_new_pack.EZOubX/_new 2015-10-30 13:42:44.000000000 +0100
@@ -1,10 +1,12 @@
<services>
- <service mode="disabled" name="download_files">
+ <service mode="disabled" name="download_files">
<param name="changesgenerate">enable</param>
</service>
<service mode="disabled" name="set_version">
<param name="basename">python-swiftclient</param>
</service>
+ <service mode="disabled" name="python_requires">
+ </service>
<service name="refresh_patches" mode="disabled">
<param name="changesgenerate">enable</param>
</service>
++++++ python-swiftclient-2.4.0.tar.gz -> python-swiftclient-2.6.0.tar.gz ++++++
++++ 6259 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-keystoneclient for openSUSE:Factory checked in at 2015-10-30 13:42:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-keystoneclient (Old)
and /work/SRC/openSUSE:Factory/.python-keystoneclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-keystoneclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-keystoneclient/python-keystoneclient.changes 2015-08-27 08:54:34.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-keystoneclient.new/python-keystoneclient.changes 2015-10-30 13:42:42.000000000 +0100
@@ -1,0 +2,101 @@
+Wed Oct 7 04:26:24 UTC 2015 - tbechtold(a)suse.com
+
+- update 1.7.2:
+ * Redirect on 303 in SAML plugin
+ * HTTPClient/region_name deprecation test updates
+ * Updated from global requirements
+ * Update .gitreview for stable/liberty
+- adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
+Mon Sep 14 09:10:15 UTC 2015 - tbechtold(a)suse.com
+
+- update to 1.7.1:
+ * Adding back exception mapping for ConnectionError
+ * Update path to subunit2html in post_test_hook
+ * Deprecate create Discover without session
+ * Mask passwords when logging the HTTP response
+ * Updated from global requirements
+ * Update deprecation text for Session properties
+ * Proper deprecation for httpclient.USER_AGENT
+ * Deprecate create HTTPClient without session
+ * Fix Accept header in SAML2 requests
+ * Fixes missing socket attribute error during init_poolmanager
+ * Updated from global requirements
+ * Expose token_endpoint.Token as admin_token
+ * Proper deprecation for UserManager project argument
+ * Proper deprecation for CredentialManager data argument
+ * Deprecate create v3 Client without session
+ * Deprecate create v2_0 Client without session
+ * Proper deprecation for Session.get_token()
+ * Deprecate use of cert and key
+ * Proper deprecation for Session.construct()
+ * Deprecate ServiceCatalog.get_urls() with no attr
+ * Deprecate ServiceCatalog(region_name)
+ * Updated from global requirements
+ * Updated from global requirements
+ * Updated from global requirements
+ * Stop using .keys() on dicts where not needed
+ * Inhrerit roles project calls on keystoneclient v3
+ * Deprecate openstack.common.apiclient
+ * Move apiclient.base.Resource into keystoneclient
+ * oslo-incubator apiclient.exceptions to keystoneclient.exceptions
+ * Proper deprecation for HTTPClient session and adapter properties
+ * Proper deprecation for HTTPClient.request methods
+ * Proper deprecation for HTTPClient.tenant_id|name
+ * Proper deprecation for HTTPClient tenant_id, tenant_name parameters
+ * Updated from global requirements
+ * Clarify setting socket_options
+ * Remove check for requests version
+ * Updated from global requirements
+ * Fix tests passing user, project, and token
+ * Proper deprecation for httpclient.request()
+ * Proper deprecation for Dicover.raw_version_data unstable parameter
+ * Proper deprecation for Dicover.available_versions()
+ * Proper deprecation for is_ans1_token
+ * Proper deprecation for client.HTTPClient
+ * Proper deprecation for Manager.api
+ * Stop using Manager.api
+ * Proper deprecation for BaseIdentityPlugin trust_id property
+ * Proper deprecation for BaseIdentityPlugin username, password,
+ token_id properties
+ * Proper deprecations for modules
+ * Use UUID values in v3 test fixtures
+ * Proper deprecation for AccessInfo management_url property
+ * Proper deprecation for AccessInfo auth_url property
+ * Stop using deprecated AccessInfo.auth_url and management_url
+ * Proper deprecation for AccessInfo scoped property
+ * Proper deprecation for AccessInfo region_name parameter
+ * Deprecations fixture support calling deprecated function
+ * Set reasonable defaults for TCP Keep-Alive
+ * Updated from global requirements
+ * Remove unused time_patcher
+ * Make OAuth testcase use actual request headers
+ * Prevent attempts to "filter" list() calls by globally unique IDs
+ * Add get_token_data to token CRUD
+ * Updated from global requirements
+ * py34 not py33 is tested and supported
+ * Updated from global requirements
+ * Remove confusing deprecation comment from token_to_cms
+ * Fixes modules index generated by Sphinx
+ * Updated from global requirements
+ * Unit tests catch deprecated function usage
+ * Switch from deprecated oslo_utils.timeutils.strtime
+ * Switch from deprecated isotime
+ * Remove keystoneclient CLI references in README
+ * Update README.rst and remove ancient reference
+ * Remove unused images from docs
+ * Updated from global requirements
+ * Add openid connect client support
+ * Stop using tearDown
+ * Use mock rather than mox
+ * Remove unused setUp from ClientTest
+ * Updated from global requirements
+ * Iterate over copy of sys.modules keys in Python2/3
+ * Use random strings for test fixtures
+ * Stop using function deprecated in Python 3
+ * Use python-six shim for assertRaisesRegex/p
+ * tox env for Bandit
+- Adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
python-keystoneclient-1.6.0.tar.gz
New:
----
python-keystoneclient-1.7.2.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-keystoneclient.spec ++++++
--- /var/tmp/diff_new_pack.F3IZyc/_old 2015-10-30 13:42:43.000000000 +0100
+++ /var/tmp/diff_new_pack.F3IZyc/_new 2015-10-30 13:42:43.000000000 +0100
@@ -19,7 +19,7 @@
%define component keystoneclient
Name: python-%{component}
-Version: 1.6.0
+Version: 1.7.2
Release: 0
Summary: Openstack Identity (Keystone) API Client
License: Apache-2.0
@@ -41,17 +41,18 @@
Requires: python >= 2.6.8
Requires: python-Babel >= 1.3
Requires: python-PrettyTable >= 0.7
+Requires: python-debtcollector >= 0.3.0
Requires: python-iso8601 >= 0.1.9
Requires: python-lxml >= 2.3
Requires: python-netaddr >= 0.7.12
-Requires: python-oslo.config >= 1.9.3
+Requires: python-oslo.config >= 2.3.0
Requires: python-oslo.i18n >= 1.5.0
Requires: python-oslo.serialization >= 1.4.0
-Requires: python-oslo.utils >= 1.4.0
-Requires: python-pbr >= 0.6
-Requires: python-requests >= 2.2.0
+Requires: python-oslo.utils >= 2.0.0
+Requires: python-pbr >= 1.6
+Requires: python-requests >= 2.5.2
Requires: python-six >= 1.9.0
-Requires: python-stevedore >= 1.3.0
+Requires: python-stevedore >= 1.5.0
Recommends: python-keyring
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
@@ -83,16 +84,16 @@
Group: System/Management
Requires: %{name} = %{version}
Requires: python-WebOb >= 1.2.3
-Requires: python-coverage >= 3.6
-Requires: python-discover
-Requires: python-fixtures >= 0.3.14
-Requires: python-mock >= 1.0
-Requires: python-mox3 >= 0.7.0
-Requires: python-oslotest >= 1.5.1
+Requires: python-fixtures >= 1.3.1
+Requires: python-mock >= 1.2
+Requires: python-oauthlib >= 0.6
+Requires: python-oslotest >= 1.10.0
Requires: python-pycrypto >= 2.6
+Requires: python-requests-mock >= 0.6.0
+Requires: python-tempest-lib >= 0.8.0
Requires: python-testrepository >= 0.0.18
Requires: python-testresources >= 0.2.4
-Requires: python-testtools >= 0.9.36
+Requires: python-testtools >= 1.4.0
%description test
This package contains testsuite files for %{name}.
++++++ python-keystoneclient-1.6.0.tar.gz -> python-keystoneclient-1.7.2.tar.gz ++++++
++++ 8980 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-novaclient for openSUSE:Factory checked in at 2015-10-30 13:42:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 2015-08-27 08:54:58.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-novaclient.new/python-novaclient.changes 2015-10-30 13:42:40.000000000 +0100
@@ -1,0 +2,102 @@
+Sun Oct 4 07:25:16 UTC 2015 - tbechtold(a)suse.com
+
+- update to 2.30.1:
+ * Always send volume_id when booting with legacy bdm
+ * Update .gitreview for stable/liberty
+ * Change ignore-errors to ignore_errors
+ * Modify nova help list message for --tenant
+ * Updated from global requirements
+ * Encode unicode filter arguments for server list
+ * [docs] Fix length of underline
+ * Updated from global requirements
+ * Fix nova bash-completion needs authentication
+ * Show reserved status for a fixed_ip if available
+ * Fix unicode issue in shell.main() error handling
+ * Remove redundant help command test and commonize
+ * Fix the homepage url in setup.cfg
+ * Fix mistakes in comments
+ * Modify "nova keypair-show" Positional arguments help information
+
+-------------------------------------------------------------------
+Mon Sep 14 09:17:30 UTC 2015 - tbechtold(a)suse.com
+
+- update to 2.29.0:
+ * make sure os_password is set for auth_plugins
+ * [BugFix] Change parameters for legacy bdm
+ * Set api_version to 2.0 by default for v2.Client
+ * Deprecate 'novaclient.client.get_client_class'
+ * Restrict direct usage of novaclient.v2.client
+ * Fix bugs with rackspace
+ * Enable i18n with Babel
+ * Fix nova --help needs authentication
+ * [Bug-Fix] Update requests body for quota-update
+ * Adds missing internationalization for help message
+ * workaround for RAX repose configuration
+ * fix novaclient functional tests for new devstack config
+ * Don't assume oscomputeversions is correctly deployed
+ * Update path to subunit2html in post_test_hook
+ * Option to specify max servers for live evacuate
+ * Allow to reboot multiple servers
+ * Add method for better random name
+ * Launch functional tests serially
+ * Add mechanism to vm list to return all resources
+ * Fixed typo Errors in comments
+ * Updated from global requirements
+ * Add "limit" option to servers list cli
+ * Add 'marker' argument to server list cli
+ * Fix a fault of request logging with no credentials
+ * Fix versions.list for v2.1 Nova API
+ * Add help message for floating ip bulk operation
+ * Correct the files's description "overrwriter"
+ * Updated from global requirements
+ * Updated from global requirements
+ * Add ability to use default major version
+ * Copy cli arguments in api_versions.wraps decorator
+ * Change docstring of api_versions.discover_version
+ * Allow display project-id for server groups
+ * Remove _discover_extensions
+ * Updated from global requirements
+ * Support forcing service down
+ * Adds support for x509 certificates as keypairs
+ * Set "latest" as default compute api version
+ * Add version discover and check in CLI
+ * Specify NIC option for nova boot
+ * Refactor and update test_instances and test_volumes_api
+ * Use keystoneclient's TCPKeepAliveAdapter
+ * Add 'deleted' status check in _poll_for_status
+ * Add "get_current" method to VersionManager
+ * Implements 'microversions' api type - Part 2
+ * Fixes table when there are multiline in result data
+ * rename root-password to set-password
+ * Updated from global requirements
+ * hypervisor command can't use cell format id to show hypervisor
+ * Set iso8601 log level to WARNING
+ * Updated from global requirements
+ * Implements 'microversions' api type - Part 1
+ * Updated from global requirements
+ * Updated from global requirements
+ * Improve hypervisor-show print list
+ * Updated from global requirements
+ * Fix resolving image.id in servers.boot
+ * Added marker functionality to flavours and images
+ * Updated from global requirements
+ * Updated from global requirements
+ * Change future nova version number references based on new values
+ * cleanup openstack-common.conf and sync updated files
+ * Updated from global requirements
+ * Revert "Allow admin user to get all tenant's floating IPs"
+ * Add a sample clouds.yaml
+ * Pass full path to pkgutil.iter_modules()
+ * Cache a new token when the existing token expires
+ * Add help message for secgroup-add/del-default-rule
+ * Cleanup various inaccuracies in the README.rst
+ * Update weblinks
+ * Adds support to set admin password from the cli
+ * Adding missing nova read only CLI test
+ * Updated from global requirements
+ * Fix all doc warnings and gate on warnings
+ * Add docs tox env
+- Adjust Requires according to requirements.txt
+- Add python_requires to _service file
+
+-------------------------------------------------------------------
Old:
----
python-novaclient-2.26.0.tar.gz
New:
----
python-novaclient-2.30.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-novaclient.spec ++++++
--- /var/tmp/diff_new_pack.ZRLEpG/_old 2015-10-30 13:42:41.000000000 +0100
+++ /var/tmp/diff_new_pack.ZRLEpG/_new 2015-10-30 13:42:41.000000000 +0100
@@ -18,7 +18,7 @@
%define component novaclient
Name: python-%{component}
-Version: 2.26.0
+Version: 2.30.1
Release: 0
Summary: Openstack Compute (Nova) API Client
License: Apache-2.0
@@ -41,12 +41,12 @@
Requires: python-Babel >= 1.3
Requires: python-PrettyTable >= 0.7
Requires: python-iso8601 >= 0.1.9
-Requires: python-keystoneclient >= 1.3.0
-Requires: python-os-client-config
+Requires: python-keystoneclient >= 1.6.0
+Requires: python-os-client-config >= 1.4.0
Requires: python-oslo.i18n >= 1.5.0
Requires: python-oslo.serialization >= 1.4.0
-Requires: python-oslo.utils >= 1.4.0
-Requires: python-pbr >= 0.11
+Requires: python-oslo.utils >= 2.0.0
+Requires: python-pbr >= 1.6
Requires: python-requests >= 2.5.2
Requires: python-simplejson >= 2.2.0
Requires: python-six >= 1.9.0
@@ -83,10 +83,10 @@
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
Requires: python-discover
%endif
-Requires: python-fixtures >= 0.3.14
-Requires: python-mock >= 1.0
+Requires: python-fixtures >= 1.3.1
+Requires: python-mock >= 1.2
Requires: python-testrepository >= 0.0.18
-Requires: python-testtools >= 0.9.36
+Requires: python-testtools >= 1.4.0
%description test
This package contains testsuite files for %{name}.
++++++ _service ++++++
--- /var/tmp/diff_new_pack.ZRLEpG/_old 2015-10-30 13:42:41.000000000 +0100
+++ /var/tmp/diff_new_pack.ZRLEpG/_new 2015-10-30 13:42:41.000000000 +0100
@@ -1,10 +1,12 @@
<services>
- <service mode="disabled" name="download_files">
+ <service mode="disabled" name="download_files">
<param name="changesgenerate">enable</param>
</service>
<service mode="disabled" name="set_version">
<param name="basename">python-novaclient</param>
</service>
+ <service mode="disabled" name="python_requires">
+ </service>
<service name="refresh_patches" mode="disabled">
<param name="changesgenerate">enable</param>
</service>
++++++ python-novaclient-2.26.0.tar.gz -> python-novaclient-2.30.1.tar.gz ++++++
++++ 8021 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-manilaclient for openSUSE:Factory checked in at 2015-10-30 13:42:38
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-manilaclient (Old)
and /work/SRC/openSUSE:Factory/.python-manilaclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-manilaclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-manilaclient/python-manilaclient.changes 2015-09-19 06:55:02.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-manilaclient.new/python-manilaclient.changes 2015-10-30 13:42:39.000000000 +0100
@@ -1,0 +2,9 @@
+Fri Sep 25 10:25:15 UTC 2015 - tbechtold(a)suse.com
+
+- update to 1.4.0:
+ * Fix shares CLI for using CGs
+ * Workaround broken openstack client for functional tests
+ * Bump latest supported version to 2.6
+ * Add consistency group support to manila client
+
+-------------------------------------------------------------------
Old:
----
python-manilaclient-1.3.0.tar.gz
New:
----
python-manilaclient-1.4.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-manilaclient.spec ++++++
--- /var/tmp/diff_new_pack.ASyQnt/_old 2015-10-30 13:42:39.000000000 +0100
+++ /var/tmp/diff_new_pack.ASyQnt/_new 2015-10-30 13:42:39.000000000 +0100
@@ -19,7 +19,7 @@
%define component manilaclient
Name: python-%{component}
-Version: 1.3.0
+Version: 1.4.0
Release: 0
Summary: Openstack shared file system service (Manila) API Client
License: Apache-2.0
++++++ python-manilaclient-1.3.0.tar.gz -> python-manilaclient-1.4.0.tar.gz ++++++
++++ 1864 lines of diff (skipped)
1
0
Hello community,
here is the log from the commit of package python-saharaclient for openSUSE:Factory checked in at 2015-10-30 13:42:35
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-saharaclient (Old)
and /work/SRC/openSUSE:Factory/.python-saharaclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-saharaclient"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-saharaclient/python-saharaclient.changes 2015-09-17 09:22:00.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-saharaclient.new/python-saharaclient.changes 2015-10-30 13:42:37.000000000 +0100
@@ -1,0 +2,14 @@
+Sun Oct 4 07:41:24 UTC 2015 - tbechtold(a)suse.com
+
+- update to 0.11.1:
+ * Updating saharaclient api docs
+ * Updated from global requirements
+ * Change ignore-errors to ignore_errors
+ * Fixing cluster and node group template updates
+ * Remove `data source update` from setup.cfg
+ * Adding missed public/protected support for jobs creation
+ * Fix functional tests in saharaclient
+ * Update .gitreview for stable/liberty
+- adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
python-saharaclient-0.11.0.tar.gz
New:
----
python-saharaclient-0.11.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-saharaclient.spec ++++++
--- /var/tmp/diff_new_pack.TU0xYZ/_old 2015-10-30 13:42:37.000000000 +0100
+++ /var/tmp/diff_new_pack.TU0xYZ/_new 2015-10-30 13:42:37.000000000 +0100
@@ -19,7 +19,7 @@
%define component saharaclient
Name: python-%{component}
-Version: 0.11.0
+Version: 0.11.1
Release: 0
Summary: Openstack Data Processing (Savanna) API Client
License: Apache-2.0
@@ -38,10 +38,12 @@
Requires: python >= 2.6.8
Requires: python-Babel >= 1.3
Requires: python-PrettyTable >= 0.7
+Requires: python-cliff >= 1.14.0
Requires: python-keystoneclient >= 1.6.0
Requires: python-netaddr >= 0.7.12
Requires: python-neutronclient >= 2.6.0
-Requires: python-novaclient >= 2.26.0
+Requires: python-novaclient >= 2.28.1
+Requires: python-openstackclient >= 1.5.0
Requires: python-oslo.config >= 2.3.0
Requires: python-oslo.i18n >= 1.5.0
Requires: python-oslo.utils >= 2.0.0
@@ -71,7 +73,7 @@
%endif
Requires: python-mock >= 1.2
Requires: python-requests-mock >= 0.6.0
-Requires: python-tempest-lib >= 0.6.1
+Requires: python-tempest-lib >= 0.8.0
Requires: python-testrepository >= 0.0.18
%description test
++++++ python-saharaclient-0.11.0.tar.gz -> python-saharaclient-0.11.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/.coveragerc new/python-saharaclient-0.11.1/.coveragerc
--- old/python-saharaclient-0.11.0/.coveragerc 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/.coveragerc 2015-09-29 01:38:45.000000000 +0200
@@ -10,4 +10,4 @@
source = saharaclient
[report]
-ignore-errors = True
+ignore_errors = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/AUTHORS new/python-saharaclient-0.11.1/AUTHORS
--- old/python-saharaclient-0.11.0/AUTHORS 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/AUTHORS 2015-09-29 01:39:44.000000000 +0200
@@ -20,6 +20,7 @@
Michael McCune <mimccune(a)redhat.com>
Mina Park <mina922.park(a)samsung.com>
Minkyung Maisy Kim <mk90.kim(a)samsung.com>
+Monty Taylor <mordred(a)inaugust.com>
Nikita Konovalov <nkonovalov(a)mirantis.com>
Nikolay Mahotkin <nmakhotkin(a)mirantis.com>
Pavlo Shchelokovskyy <pshchelokovskyy(a)mirantis.com>
@@ -31,6 +32,7 @@
Sergey Reshetnyak <reshetniaksv(a)gmail.com>
Sergey Reshetnyak <sreshetniak(a)mirantis.com>
Shrirang Phadke <shrirang.phadke(a)izeltech.com>
+Steve Martinelli <stevemar(a)ca.ibm.com>
Telles Nobrega <tellesmvn(a)lsd.ufcg.edu.br>
Tetiana Lashchova <tlashchova(a)mirantis.com>
Trevor McKay <tmckay(a)redhat.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/ChangeLog new/python-saharaclient-0.11.1/ChangeLog
--- old/python-saharaclient-0.11.0/ChangeLog 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/ChangeLog 2015-09-29 01:39:44.000000000 +0200
@@ -1,6 +1,18 @@
CHANGES
=======
+0.11.1
+------
+
+* Updating saharaclient api docs
+* Updated from global requirements
+* Change ignore-errors to ignore_errors
+* Fixing cluster and node group template updates
+* Remove `data source update` from setup.cfg
+* Adding missed public/protected support for jobs creation
+* Fix functional tests in saharaclient
+* Update .gitreview for stable/liberty
+
0.11.0
------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/PKG-INFO new/python-saharaclient-0.11.1/PKG-INFO
--- old/python-saharaclient-0.11.0/PKG-INFO 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/PKG-INFO 2015-09-29 01:39:45.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-saharaclient
-Version: 0.11.0
+Version: 0.11.1
Summary: Client library for Sahara API
Home-page: https://github.com/openstack/python-saharaclient
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/doc/source/api.rst new/python-saharaclient-0.11.1/doc/source/api.rst
--- old/python-saharaclient-0.11.0/doc/source/api.rst 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/doc/source/api.rst 2015-09-29 01:38:45.000000000 +0200
@@ -24,6 +24,9 @@
* project_name - Keystone Tenant name.
* project_id - Keystone Tenant id.
* input_auth_token - Keystone authorization token.
+ * insecure - Allow insecure.
+ * auth - Keystone Authentication Plugin object.
+ * session - Keystone Session object.
**Important!**
It is not a mandatory rule to provide all of the parameters above. The minimum number should be enough
@@ -32,36 +35,28 @@
Authentication check
~~~~~~~~~~~~~~~~~~~~
-If a user already has a Keystone authentication token, it may be used in `input_auth_token` parameter.
+Passing authentication parameters to Sahara Client is deprecated. Keystone
+Session object should be used for this purpose. For example:
.. sourcecode:: python
- from saharaclient.api.client import Client as saharaclient
+ from keystoneclient.auth.identity import v2
+ from keystoneclient import session
+ from saharaclient import client
+
+ auth = v2.Password(auth_url=AUTH_URL,
+ username=USERNAME,
+ password=PASSWORD,
+ tenant_name=PROJECT_ID)
- sahara = saharaclient(sahara_url="http://sahara:8386/v1.1",
- project_id="11111111-2222-3333-4444-555555555555",
- input_auth_token="66666666-7777-8888-9999-000000000000")
-..
-
-In this case no other authentication parameters are required and `input_auth_token` has a higher
-priority than other parameters. Otherwise user has to provide:
-
- * auth_url
- * username
- * api_key
- * any of project_name or project_id
-
-.. sourcecode:: python
-
- from saharaclient.api.client import Client as saharaclient
+ ses = session.Session(auth=auth)
- sahara = saharaclient(auth_url="http://keystone:5000/v2.0",
- sahara_url="http://sahara:8386/v1.1",
- username="user",
- api_key="PaSsWoRd",
- project_name="demo-project")
+ sahara = client.Client('1.1', session=ses)
..
+For more information about Keystone Sessions, see `Using Sessions`_.
+
+.. _Using Sessions: http://docs.openstack.org/developer/python-keystoneclient/using-sessions.ht…
Sahara endpoint discovery
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -73,24 +68,22 @@
.. sourcecode:: python
- from saharaclient.api.client import Client as saharaclient
-
- sahara = saharaclient(auth_url="http://keystone:5000/v2.0",
- username="user",
- api_key="PaSsWoRd",
- project_name="demo-project",
- service_type="non-default-service-type",
- endpoint_type="internalURL")
+ from keystoneclient.auth.identity import v2
+ from keystoneclient import session
+ from saharaclient import client
+
+ auth = v2.Password(auth_url=AUTH_URL,
+ username=USERNAME,
+ password=PASSWORD,
+ tenant_name=PROJECT_ID)
+
+ ses = session.Session(auth=auth)
+
+ sahara = client.Client('1.1', session=ses,
+ service_type="non-default-service-type",
+ endpoint_type="internalURL")
..
-
-Tenant specification
-~~~~~~~~~~~~~~~~~~~~
-
-All Sahara operations should be performed in one of OpenStack tenants.
-There are two parameters: `project_name` and `project_id` which allow to specify a tenant.
-`project_id` parameter has a higher priority.
-
Object managers
---------------
Sahara Client has a list of fields to operate with:
@@ -104,6 +97,7 @@
* job_binaries
* job_binary_internals
* job_executions
+ * job_types
Each of this fields is a reference to a Manager for a corresponding group of REST calls.
@@ -133,42 +127,50 @@
Node Group Template ops
~~~~~~~~~~~~~~~~~~~~~~~
- * create(name, plugin_name, hadoop_version, flavor_id, description, volumes_per_node, volumes_size, node_processes, node_configs, floating_ip_pool, availability_zone, volumes_availability_zone) - Create a Node Group Template with specified parameters.
+ * create(name, plugin_name, hadoop_version, flavor_id, description, volumes_per_node, volumes_size, node_processes, node_configs, floating_ip_pool, security_groups, auto_security_group, availability_zone, volumes_availability_zone, volume_type, image_id, is_proxy_gateway, volume_local_to_instance, use_autoconfig, shares, is_public, is_protected) - Create a Node Group Template with specified parameters.
+ * update(ng_template_id, name, plugin_name, hadoop_version, flavor_id, description, volumes_per_node, volumes_size, node_processes, node_configs, floating_ip_pool, security_groups, auto_security_group, availability_zone, volumes_availability_zone, volume_type, image_id, is_proxy_gateway, volume_local_to_instance, use_autoconfig, shares, is_public, is_protected) - Update a Node Group Template with specified parameters.
Cluster Template ops
~~~~~~~~~~~~~~~~~~~~
- * create(name, plugin_name, hadoop_version, description, cluster_configs, node_groups, anti_affinity, net_id) - Create a Cluster Template with specified parameters.
+ * create(name, plugin_name, hadoop_version, description, cluster_configs, node_groups, anti_affinity, net_id, default_image_id, use_autoconfig, shares, is_public, is_protected) - Create a Cluster Template with specified parameters.
+ * update(cluster_template_id, name, plugin_name, hadoop_version, description, cluster_configs, node_groups, anti_affinity, net_id, default_image_id, use_autoconfig, shares, is_public, is_protected) - Update a Cluster Template with specified parameters.
Cluster ops
~~~~~~~~~~~
- * create(name, plugin_name, hadoop_version, cluster_template_id, default_image_id, is_transient, description, cluster_configs, node_groups, user_keypair_id, anti_affinity, net_id) - Launch a Cluster with specified parameters.
+ * create(name, plugin_name, hadoop_version, cluster_template_id, default_image_id, is_transient, description, cluster_configs, node_groups, user_keypair_id, anti_affinity, net_id, count, use_autoconfig, shares, is_public, is_protected) - Launch a Cluster with specified parameters.
* scale(cluster_id, scale_object) - Scale an existing Cluster. `scale_object` format is described in REST API doc.
+ * update(cluster_id, name, description, is_public, is_protected) - Update a Cluster with specified parameters.
Data Source ops
~~~~~~~~~~~~~~~
- * create(name, description, data_source_type, url, credential_user, credential_pass) - Create a Data Source with specified parameters.
+ * create(name, description, data_source_type, url, credential_user, credential_pass, is_public, is_protected) - Create a Data Source with specified parameters.
+ * update(data_source_id, update_data) - Update a Data Source with provided `data`.
Job Binary Internal ops
~~~~~~~~~~~~~~~~~~~~~~~
* create(name, data) - Create a Job Binary Internal from provided `data`.
+ * update(job_binary_id, name, is_public, is_protected) - Update a Job Binary Internal with specified parameters
Job Binary ops
~~~~~~~~~~~~~~
- * create(name, url, description, extra) - Create a Job Binary with specified parameters.
- * get_file(job_binary_id) - Download a Job Binary
+ * create(name, url, description, extra, is_public, is_protected) - Create a Job Binary with specified parameters.
+ * get_file(job_binary_id) - Download a Job Binary.
+ * update(job_binary_id, data) - Update Job Binary with provided `data`.
Job ops
~~~~~~~
- * create(name, type, mains, libs, description) - Create a Job with specified parameters.
+ * create(name, type, mains, libs, description, interface, is_public, is_protected) - Create a Job with specified parameters.
* get_configs(job_type) - Get config hints for a specified Job type.
+ * update(job_id, name, description, is_public, is_protected) - Update a Job with specified parameters.
Job Execution ops
~~~~~~~~~~~~~~~~~
- * create(job_id, cluster_id, input_id, output_id, configs) - Launch a Job with specified parameters.
+ * create(job_id, cluster_id, input_id, output_id, configs, interface, is_public, is_protected) - Launch a Job with specified parameters.
+ * update(obj_id, is_public, is_protected) - Update a Job Execution with specified parameters.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/python_saharaclient.egg-info/PKG-INFO new/python-saharaclient-0.11.1/python_saharaclient.egg-info/PKG-INFO
--- old/python-saharaclient-0.11.0/python_saharaclient.egg-info/PKG-INFO 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/python_saharaclient.egg-info/PKG-INFO 2015-09-29 01:39:44.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-saharaclient
-Version: 0.11.0
+Version: 0.11.1
Summary: Client library for Sahara API
Home-page: https://github.com/openstack/python-saharaclient
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/python_saharaclient.egg-info/entry_points.txt new/python-saharaclient-0.11.1/python_saharaclient.egg-info/entry_points.txt
--- old/python-saharaclient-0.11.0/python_saharaclient.egg-info/entry_points.txt 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/python_saharaclient.egg-info/entry_points.txt 2015-09-29 01:39:44.000000000 +0200
@@ -9,7 +9,6 @@
dataprocessing_data_source_delete = saharaclient.osc.v1.data_sources:DeleteDataSource
dataprocessing_data_source_list = saharaclient.osc.v1.data_sources:ListDataSources
dataprocessing_data_source_show = saharaclient.osc.v1.data_sources:ShowDataSource
-dataprocessing_data_source_update = saharaclient.osc.v1.data_sources:UpdateDataSource
dataprocessing_plugin_configs_get = saharaclient.osc.v1.plugins:GetPluginConfigs
dataprocessing_plugin_list = saharaclient.osc.v1.plugins:ListPlugins
dataprocessing_plugin_show = saharaclient.osc.v1.plugins:ShowPlugin
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/python_saharaclient.egg-info/pbr.json new/python-saharaclient-0.11.1/python_saharaclient.egg-info/pbr.json
--- old/python-saharaclient-0.11.0/python_saharaclient.egg-info/pbr.json 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/python_saharaclient.egg-info/pbr.json 2015-09-29 01:39:44.000000000 +0200
@@ -1 +1 @@
-{"git_version": "d7dae5e", "is_release": true}
\ No newline at end of file
+{"git_version": "ec678db", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/python_saharaclient.egg-info/requires.txt new/python-saharaclient-0.11.1/python_saharaclient.egg-info/requires.txt
--- old/python-saharaclient-0.11.0/python_saharaclient.egg-info/requires.txt 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/python_saharaclient.egg-info/requires.txt 2015-09-29 01:39:44.000000000 +0200
@@ -1,4 +1,4 @@
-pbr<2.0,>=1.6
+pbr>=1.6
Babel>=1.3
cliff>=1.14.0
netaddr!=0.7.16,>=0.7.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/requirements.txt new/python-saharaclient-0.11.1/requirements.txt
--- old/python-saharaclient-0.11.0/requirements.txt 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/requirements.txt 2015-09-29 01:38:45.000000000 +0200
@@ -2,7 +2,7 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr<2.0,>=1.6
+pbr>=1.6
Babel>=1.3
cliff>=1.14.0 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/saharaclient/api/cluster_templates.py new/python-saharaclient-0.11.1/saharaclient/api/cluster_templates.py
--- old/python-saharaclient-0.11.0/saharaclient/api/cluster_templates.py 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/saharaclient/api/cluster_templates.py 2015-09-29 01:38:45.000000000 +0200
@@ -23,11 +23,11 @@
class ClusterTemplateManager(base.ResourceManager):
resource_class = ClusterTemplate
- def _assign_field(self, name, plugin_name, hadoop_version,
- description=None, cluster_configs=None, node_groups=None,
- anti_affinity=None, net_id=None, default_image_id=None,
- use_autoconfig=None, shares=None, is_public=None,
- is_protected=None):
+ def create(self, name, plugin_name, hadoop_version, description=None,
+ cluster_configs=None, node_groups=None, anti_affinity=None,
+ net_id=None, default_image_id=None, use_autoconfig=None,
+ shares=None, is_public=None, is_protected=None):
+
data = {
'name': name,
'plugin_name': plugin_name,
@@ -45,30 +45,29 @@
shares=shares,
is_public=is_public,
is_protected=is_protected)
- return data
-
- def create(self, name, plugin_name, hadoop_version, description=None,
- cluster_configs=None, node_groups=None, anti_affinity=None,
- net_id=None, default_image_id=None, use_autoconfig=None,
- shares=None, is_public=None, is_protected=None):
- data = self._assign_field(name, plugin_name, hadoop_version,
- description, cluster_configs, node_groups,
- anti_affinity, net_id, default_image_id,
- use_autoconfig, shares, is_public,
- is_protected)
return self._create('/cluster-templates', data, 'cluster_template')
- def update(self, cluster_template_id, name, plugin_name, hadoop_version,
- description=None, cluster_configs=None, node_groups=None,
- anti_affinity=None, net_id=None, default_image_id=None,
- use_autoconfig=None, shares=None, is_public=None,
- is_protected=None):
- data = self._assign_field(name, plugin_name, hadoop_version,
- description, cluster_configs, node_groups,
- anti_affinity, net_id, default_image_id,
- use_autoconfig, shares, is_public,
- is_protected)
+ def update(self, cluster_template_id, name=None, plugin_name=None,
+ hadoop_version=None, description=None, cluster_configs=None,
+ node_groups=None, anti_affinity=None, net_id=None,
+ default_image_id=None, use_autoconfig=None, shares=None,
+ is_public=None, is_protected=None):
+
+ data = {}
+ self._copy_if_defined(data, name=name,
+ plugin_name=plugin_name,
+ hadoop_version=hadoop_version,
+ description=description,
+ cluster_configs=cluster_configs,
+ node_groups=node_groups,
+ anti_affinity=anti_affinity,
+ neutron_management_network=net_id,
+ default_image_id=default_image_id,
+ use_autoconfig=use_autoconfig,
+ shares=shares,
+ is_public=is_public,
+ is_protected=is_protected)
return self._update('/cluster-templates/%s' % cluster_template_id,
data, 'cluster_template')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/saharaclient/api/jobs.py new/python-saharaclient-0.11.1/saharaclient/api/jobs.py
--- old/python-saharaclient-0.11.0/saharaclient/api/jobs.py 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/saharaclient/api/jobs.py 2015-09-29 01:38:45.000000000 +0200
@@ -23,7 +23,8 @@
class JobsManager(base.ResourceManager):
resource_class = Job
- def create(self, name, type, mains, libs, description, interface=None):
+ def create(self, name, type, mains, libs, description, interface=None,
+ is_public=None, is_protected=None):
data = {
'name': name,
'type': type,
@@ -32,8 +33,8 @@
'libs': libs,
}
- if interface:
- data['interface'] = interface
+ self._copy_if_defined(data, interface=interface, is_public=is_public,
+ is_protected=is_protected)
return self._create('/jobs', data, 'job')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/saharaclient/api/node_group_templates.py new/python-saharaclient-0.11.1/saharaclient/api/node_group_templates.py
--- old/python-saharaclient-0.11.0/saharaclient/api/node_group_templates.py 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/saharaclient/api/node_group_templates.py 2015-09-29 01:38:45.000000000 +0200
@@ -23,15 +23,14 @@
class NodeGroupTemplateManager(base.ResourceManager):
resource_class = NodeGroupTemplate
- def _assign_field(self, name, plugin_name, hadoop_version, flavor_id,
- description=None, volumes_per_node=None,
- volumes_size=None, node_processes=None,
- node_configs=None, floating_ip_pool=None,
- security_groups=None, auto_security_group=None,
- availability_zone=None, volumes_availability_zone=None,
- volume_type=None, image_id=None, is_proxy_gateway=None,
- volume_local_to_instance=None, use_autoconfig=None,
- shares=None, is_public=None, is_protected=None):
+ def create(self, name, plugin_name, hadoop_version, flavor_id,
+ description=None, volumes_per_node=None, volumes_size=None,
+ node_processes=None, node_configs=None, floating_ip_pool=None,
+ security_groups=None, auto_security_group=None,
+ availability_zone=None, volumes_availability_zone=None,
+ volume_type=None, image_id=None, is_proxy_gateway=None,
+ volume_local_to_instance=None, use_autoconfig=None,
+ shares=None, is_public=None, is_protected=None):
data = {
'name': name,
@@ -68,49 +67,36 @@
data.update(
{"volume_local_to_instance": volume_local_to_instance})
- return data
-
- def create(self, name, plugin_name, hadoop_version, flavor_id,
- description=None, volumes_per_node=None, volumes_size=None,
- node_processes=None, node_configs=None, floating_ip_pool=None,
- security_groups=None, auto_security_group=None,
- availability_zone=None, volumes_availability_zone=None,
- volume_type=None, image_id=None, is_proxy_gateway=None,
- volume_local_to_instance=None, use_autoconfig=None,
- shares=None, is_public=None, is_protected=None):
-
- data = self._assign_field(name, plugin_name, hadoop_version, flavor_id,
- description, volumes_per_node, volumes_size,
- node_processes, node_configs,
- floating_ip_pool, security_groups,
- auto_security_group, availability_zone,
- volumes_availability_zone, volume_type,
- image_id, is_proxy_gateway,
- volume_local_to_instance, use_autoconfig,
- shares, is_public, is_protected)
-
return self._create('/node-group-templates', data,
'node_group_template')
- def update(self, ng_template_id, name, plugin_name, hadoop_version,
- flavor_id, description=None, volumes_per_node=None,
- volumes_size=None, node_processes=None, node_configs=None,
- floating_ip_pool=None, security_groups=None,
+ def update(self, ng_template_id, name=None, plugin_name=None,
+ hadoop_version=None, flavor_id=None, description=None,
+ volumes_per_node=None, volumes_size=None, node_processes=None,
+ node_configs=None, floating_ip_pool=None, security_groups=None,
auto_security_group=None, availability_zone=None,
volumes_availability_zone=None, volume_type=None,
image_id=None, is_proxy_gateway=None,
volume_local_to_instance=None, use_autoconfig=None,
shares=None, is_public=None, is_protected=None):
- data = self._assign_field(name, plugin_name, hadoop_version, flavor_id,
- description, volumes_per_node, volumes_size,
- node_processes, node_configs,
- floating_ip_pool, security_groups,
- auto_security_group, availability_zone,
- volumes_availability_zone, volume_type,
- image_id, is_proxy_gateway,
- volume_local_to_instance, use_autoconfig,
- shares, is_public, is_protected)
+ data = {}
+ self._copy_if_defined(
+ data, name=name, plugin_name=plugin_name,
+ hadoop_version=hadoop_version, flavor_id=flavor_id,
+ description=description, volumes_per_node=volumes_per_node,
+ volumes_size=volumes_size, node_processes=node_processes,
+ node_configs=node_configs, floating_ip_pool=floating_ip_pool,
+ security_groups=security_groups,
+ auto_security_group=auto_security_group,
+ availability_zone=availability_zone,
+ volumes_availability_zone=volumes_availability_zone,
+ volume_type=volume_type, image_id=image_id,
+ is_proxy_gateway=is_proxy_gateway,
+ volume_local_to_instance=volume_local_to_instance,
+ use_autoconfig=use_autoconfig, shares=shares,
+ is_public=is_public, is_protected=is_protected
+ )
return self._update('/node-group-templates/%s' % ng_template_id, data,
'node_group_template')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/saharaclient/tests/functional/hooks/post_test_hook.sh new/python-saharaclient-0.11.1/saharaclient/tests/functional/hooks/post_test_hook.sh
--- old/python-saharaclient-0.11.0/saharaclient/tests/functional/hooks/post_test_hook.sh 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/saharaclient/tests/functional/hooks/post_test_hook.sh 2015-09-29 01:38:45.000000000 +0200
@@ -18,7 +18,7 @@
if [ -f .testrepository/0 ]; then
sudo .tox/functional/bin/testr last --subunit > $WORKSPACE/testrepository.subunit
sudo mv $WORKSPACE/testrepository.subunit $BASE/logs/testrepository.subunit
- sudo .tox/functional/bin/python /usr/local/jenkins/slave_scripts/subunit2html.py $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
+ sudo /usr/os-testr-env/bin/subunit2html $BASE/logs/testrepository.subunit $BASE/logs/testr_results.html
sudo gzip -9 $BASE/logs/testrepository.subunit
sudo gzip -9 $BASE/logs/testr_results.html
sudo chown jenkins:jenkins $BASE/logs/testrepository.subunit.gz $BASE/logs/testr_results.html.gz
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/saharaclient/tests/unit/test_jobs.py new/python-saharaclient-0.11.1/saharaclient/tests/unit/test_jobs.py
--- old/python-saharaclient-0.11.0/saharaclient/tests/unit/test_jobs.py 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/saharaclient/tests/unit/test_jobs.py 2015-09-29 01:38:45.000000000 +0200
@@ -24,7 +24,9 @@
'type': 'pig',
'mains': ['job_binary_id'],
'libs': [],
- 'description': 'descr'
+ 'description': 'descr',
+ 'is_public': True,
+ 'is_protected': False
}
def test_create_job(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/setup.cfg new/python-saharaclient-0.11.1/setup.cfg
--- old/python-saharaclient-0.11.0/setup.cfg 2015-09-01 19:31:47.000000000 +0200
+++ new/python-saharaclient-0.11.1/setup.cfg 2015-09-29 01:39:45.000000000 +0200
@@ -40,7 +40,6 @@
dataprocessing_data_source_create = saharaclient.osc.v1.data_sources:CreateDataSource
dataprocessing_data_source_list = saharaclient.osc.v1.data_sources:ListDataSources
dataprocessing_data_source_show = saharaclient.osc.v1.data_sources:ShowDataSource
- dataprocessing_data_source_update = saharaclient.osc.v1.data_sources:UpdateDataSource
dataprocessing_data_source_delete = saharaclient.osc.v1.data_sources:DeleteDataSource
[build_sphinx]
@@ -53,6 +52,6 @@
[egg_info]
tag_date = 0
-tag_build =
tag_svn_revision = 0
+tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/setup.py new/python-saharaclient-0.11.1/setup.py
--- old/python-saharaclient-0.11.0/setup.py 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/setup.py 2015-09-29 01:38:45.000000000 +0200
@@ -25,5 +25,5 @@
pass
setuptools.setup(
- setup_requires=['pbr>=1.3'],
+ setup_requires=['pbr>=1.8'],
pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-saharaclient-0.11.0/test-requirements.txt new/python-saharaclient-0.11.1/test-requirements.txt
--- old/python-saharaclient-0.11.0/test-requirements.txt 2015-09-01 19:30:56.000000000 +0200
+++ new/python-saharaclient-0.11.1/test-requirements.txt 2015-09-29 01:38:45.000000000 +0200
@@ -9,10 +9,10 @@
mock>=1.2
oslo.config>=2.3.0 # Apache-2.0
oslosphinx>=2.5.0 # Apache-2.0
-python-neutronclient<3,>=2.6.0
-python-novaclient>=2.26.0
+python-neutronclient>=2.6.0
+python-novaclient>=2.28.1
python-swiftclient>=2.2.0
requests-mock>=0.6.0 # Apache-2.0
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
-tempest-lib>=0.6.1
+tempest-lib>=0.8.0
testrepository>=0.0.18
1
0
Hello community,
here is the log from the commit of package python-os-client-config for openSUSE:Factory checked in at 2015-10-30 13:42:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-os-client-config (Old)
and /work/SRC/openSUSE:Factory/.python-os-client-config.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-os-client-config"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-os-client-config/python-os-client-config.changes 2015-09-02 07:54:09.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-os-client-config.new/python-os-client-config.changes 2015-10-30 13:42:35.000000000 +0100
@@ -1,0 +2,33 @@
+Sat Sep 26 17:52:40 UTC 2015 - tbechtold(a)suse.com
+
+- update to 1.7.5:
+ * Fix a little error with the None auth type
+ * Change ignore-errors to ignore_errors
+ * Handle ksa opt with no deprecated field
+ * Fall back to keystoneclient arg processing
+ * Fix typo in ovh region names
+ * Move plugin loader creation to try block
+ * Convert auth kwargs '-' to '_'
+ * Properly handle os- prefixed args in fix_args
+ * Test kwargs passing not just argparse
+ * Allow configuring domain id once
+ * Add internap to the vendor list
+ * Fix typo in comment - we use ksa not ksc
+ * Defer plugin validation to keystoneauth
+ * Remove an extra line
+ * Add Datacentred to the vendor list
+ * Add ultimum to list of vendors
+ * Add Enter Cloud Suite to vendors list
+ * Add elastx to vendor support matrix
+ * Switch the image default to v2
+ * Update auro auth_url and region information
+ * Add citycloud to the vendors list
+ * Return keystoneauth plugins based on auth args
+ * Remove duplicate lines that are the same as default
+ * Add default version number for heat
+ * Update OVH public cloud information
+ * Handle empty defaults.yaml file
+ * Do not treat project_name and project_id the same
+ * Revert "Revert "Use the correct auth_plugin for token authentication""
+
+-------------------------------------------------------------------
Old:
----
os-client-config-1.6.3.tar.gz
New:
----
os-client-config-1.7.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-os-client-config.spec ++++++
--- /var/tmp/diff_new_pack.7ijSKu/_old 2015-10-30 13:42:36.000000000 +0100
+++ /var/tmp/diff_new_pack.7ijSKu/_new 2015-10-30 13:42:36.000000000 +0100
@@ -19,7 +19,7 @@
%bcond_with test
Name: python-os-client-config
-Version: 1.6.3
+Version: 1.7.5
Release: 0
Summary: OpenStack Client Configuation Library
License: Apache-2.0
++++++ os-client-config-1.6.3.tar.gz -> os-client-config-1.7.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/.coveragerc new/os-client-config-1.7.5/.coveragerc
--- old/os-client-config-1.6.3/.coveragerc 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/.coveragerc 2015-09-22 21:41:42.000000000 +0200
@@ -4,4 +4,4 @@
omit = os_client_config/tests/*,os_client_config/openstack/*
[report]
-ignore-errors = True
\ No newline at end of file
+ignore_errors = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/AUTHORS new/os-client-config-1.7.5/AUTHORS
--- old/os-client-config-1.6.3/AUTHORS 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/AUTHORS 2015-09-22 21:42:24.000000000 +0200
@@ -1,12 +1,15 @@
Alex Gaynor <alex.gaynor(a)gmail.com>
Chris Church <chris(a)ninemoreminutes.com>
+Clark Boylan <clark.boylan(a)gmail.com>
Clint Byrum <clint(a)fewbar.com>
David Shrewsbury <shrewsbury.dave(a)gmail.com>
Davide Guerri <davide.guerri(a)gmail.com>
Dean Troyer <dtroyer(a)gmail.com>
Dean Troyer <dtroyer(a)users.noreply.github.com>
+Eric Harney <eharney(a)redhat.com>
Ghe Rivero <ghe.rivero(a)hp.com>
Gregory Haynes <greg(a)greghaynes.net>
+James E. Blair <jeblair(a)linux.vnet.ibm.com>
Jeremy Stanley <fungi(a)yuggoth.org>
Julia Kreger <juliaashleykreger(a)gmail.com>
Monty Taylor <mordred(a)inaugust.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/ChangeLog new/os-client-config-1.7.5/ChangeLog
--- old/os-client-config-1.6.3/ChangeLog 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/ChangeLog 2015-09-22 21:42:24.000000000 +0200
@@ -1,6 +1,62 @@
CHANGES
=======
+1.7.5
+-----
+
+* Fix a little error with the None auth type
+* Change ignore-errors to ignore_errors
+
+1.7.4
+-----
+
+* Handle ksa opt with no deprecated field
+
+1.7.3
+-----
+
+* Fall back to keystoneclient arg processing
+* Fix typo in ovh region names
+
+1.7.2
+-----
+
+* Move plugin loader creation to try block
+
+1.7.1
+-----
+
+* Convert auth kwargs '-' to '_'
+* Properly handle os- prefixed args in fix_args
+* Test kwargs passing not just argparse
+
+1.7.0
+-----
+
+* Allow configuring domain id once
+* Add internap to the vendor list
+* Fix typo in comment - we use ksa not ksc
+* Defer plugin validation to keystoneauth
+
+1.6.4
+-----
+
+* Remove an extra line
+* Add Datacentred to the vendor list
+* Add ultimum to list of vendors
+* Add Enter Cloud Suite to vendors list
+* Add elastx to vendor support matrix
+* Switch the image default to v2
+* Update auro auth_url and region information
+* Add citycloud to the vendors list
+* Return keystoneauth plugins based on auth args
+* Remove duplicate lines that are the same as default
+* Add default version number for heat
+* Update OVH public cloud information
+* Handle empty defaults.yaml file
+* Do not treat project_name and project_id the same
+* Revert "Revert "Use the correct auth_plugin for token authentication""
+
1.6.3
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/PKG-INFO new/os-client-config-1.7.5/PKG-INFO
--- old/os-client-config-1.6.3/PKG-INFO 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/PKG-INFO 2015-09-22 21:42:25.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: os-client-config
-Version: 1.6.3
+Version: 1.7.5
Summary: OpenStack Client Configuation Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/doc/source/vendor-support.rst new/os-client-config-1.7.5/doc/source/vendor-support.rst
--- old/os-client-config-1.6.3/doc/source/vendor-support.rst 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/doc/source/vendor-support.rst 2015-09-22 21:41:42.000000000 +0200
@@ -15,7 +15,7 @@
* Identity uses `password` authentication
* Identity API Version is 2
-* Image API Version is 1
+* Image API Version is 2
* Images must be in `qcow2` format
* Images are uploaded using PUT interface
* Public IPv4 is directly routable via DHCP from Neutron
@@ -37,6 +37,7 @@
============== ================
* DNS Service Type is `hpext:dns`
+* Image API Version is 1
* Public IPv4 is provided via NAT with Neutron Floating IP
rackspace
@@ -56,7 +57,6 @@
* Database Service Type is `rax:database`
* Compute Service Name is `cloudServersOpenStack`
-* Image API Version is 2
* Images must be in `vhd` format
* Images must be uploaded using the Glance Task Interface
* Floating IPs are not needed
@@ -78,7 +78,6 @@
RegionOne Region One
============== ================
-* Image API Version is 2
* Images must be in `raw` format
* Public IPv4 is provided via NAT with Neutron Floating IP
* IPv6 is provided to every server
@@ -94,8 +93,6 @@
ca-ymq-1 Montreal
============== ================
-* Image API Version is 2
-
runabove
--------
@@ -108,8 +105,6 @@
BHS-1 Beauharnois, QC
============== ================
-* Image API Version is 2
-* Images must be in `qcow2` format
* Floating IPs are not supported
unitedstack
@@ -125,7 +120,6 @@
============== ================
* Identity API Version is 3
-* Image API Version is 2
* Images must be in `raw` format
auro
@@ -136,10 +130,9 @@
============== ================
Region Name Human Name
============== ================
-RegionOne RegionOne
+van1 Vancouver, BC
============== ================
-* Identity API Version is 2
* Public IPv4 is provided via NAT with Nova Floating IP
* Floating IPs are provided by Nova
* Security groups are provided by Nova
@@ -152,8 +145,91 @@
============== ================
Region Name Human Name
============== ================
-SBG-1 Strassbourg, FR
+SBG1 Strassbourg, FR
+GRA1 Gravelines, FR
============== ================
* Images must be in `raw` format
* Floating IPs are not supported
+
+citycloud
+---------
+
+https://identity1.citycloud.com:5000/v3/
+
+============== ================
+Region Name Human Name
+============== ================
+Lon1 London, UK
+Sto2 Stockholm, SE
+Kna1 Karlskrona, SE
+============== ================
+
+* Identity API Version is 3
+* Public IPv4 is provided via NAT with Neutron Floating IP
+
+elastx
+------
+
+https://ops.elastx.net:5000/v2.0
+
+============== ================
+Region Name Human Name
+============== ================
+regionOne Region One
+============== ================
+
+* Public IPv4 is provided via NAT with Neutron Floating IP
+
+entercloudsuite
+---------------
+
+https://api.entercloudsuite.com/v2.0
+
+============== ================
+Region Name Human Name
+============== ================
+nl-ams1 Amsterdam, NL
+it-mil1 Milan, IT
+de-fra1 Frankfurt, DE
+============== ================
+
+ultimum
+-------
+
+https://console.ultimum-cloud.com:5000/v2.0
+
+============== ================
+Region Name Human Name
+============== ================
+RegionOne Region One
+============== ================
+
+datacentred
+-----------
+
+https://compute.datacentred.io:5000/v2.0
+
+============== ================
+Region Name Human Name
+============== ================
+sal01 Manchester, UK
+============== ================
+
+* Image API Version is 1
+
+internap
+--------
+
+https://identity.api.cloud.iweb.com/v2.0
+
+============== ================
+Region Name Human Name
+============== ================
+ams01 Amsterdam, NL
+da01 Dallas, TX
+nyj01 New York, NY
+============== ================
+
+* Image API Version is 1
+* Floating IPs are not supported
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/cloud_config.py new/os-client-config-1.7.5/os_client_config/cloud_config.py
--- old/os-client-config-1.6.3/os_client_config/cloud_config.py 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/cloud_config.py 2015-09-22 21:41:42.000000000 +0200
@@ -16,11 +16,13 @@
class CloudConfig(object):
- def __init__(self, name, region, config, prefer_ipv6=False):
+ def __init__(self, name, region, config,
+ prefer_ipv6=False, auth_plugin=None):
self.name = name
self.region = region
self.config = config
self._prefer_ipv6 = prefer_ipv6
+ self._auth = auth_plugin
def __getattr__(self, key):
"""Return arbitrary attributes."""
@@ -106,3 +108,7 @@
@property
def prefer_ipv6(self):
return self._prefer_ipv6
+
+ def get_auth(self):
+ """Return a keystoneauth plugin from the auth credentials."""
+ return self._auth
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/config.py new/os-client-config-1.7.5/os_client_config/config.py
--- old/os-client-config-1.6.3/os_client_config/config.py 2015-08-13 11:14:34.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/config.py 2015-09-22 21:41:43.000000000 +0200
@@ -17,12 +17,11 @@
import warnings
import appdirs
-import yaml
-
try:
- import keystoneclient.auth as ksc_auth
+ from keystoneauth1 import loading
except ImportError:
- ksc_auth = None
+ loading = None
+import yaml
from os_client_config import cloud_config
from os_client_config import defaults
@@ -283,15 +282,38 @@
cloud = self._fix_backwards_project(cloud)
cloud = self._fix_backwards_auth_plugin(cloud)
cloud = self._fix_backwards_interface(cloud)
+ cloud = self._handle_domain_id(cloud)
+ return cloud
+
+ def _handle_domain_id(self, cloud):
+ # Allow people to just specify domain once if it's the same
+ mappings = {
+ 'domain_id': ('user_domain_id', 'project_domain_id'),
+ 'domain_name': ('user_domain_name', 'project_domain_name'),
+ }
+ for target_key, possible_values in mappings.items():
+ for key in possible_values:
+ if target_key in cloud['auth'] and key not in cloud['auth']:
+ cloud['auth'][key] = cloud['auth'][target_key]
+ cloud['auth'].pop(target_key, None)
return cloud
def _fix_backwards_project(self, cloud):
# Do the lists backwards so that project_name is the ultimate winner
+ # Also handle moving domain names into auth so that domain mapping
+ # is easier
mappings = {
- 'project_name': ('tenant_id', 'tenant-id',
- 'project_id', 'project-id',
- 'tenant_name', 'tenant-name',
+ 'project_id': ('tenant_id', 'tenant-id',
+ 'project_id', 'project-id'),
+ 'project_name': ('tenant_name', 'tenant-name',
'project_name', 'project-name'),
+ 'domain_id': ('domain_id', 'domain-id'),
+ 'domain_name': ('domain_name', 'domain-name'),
+ 'user_domain_id': ('user_domain_id', 'user-domain-id'),
+ 'user_domain_name': ('user_domain_name', 'user-domain-name'),
+ 'project_domain_id': ('project_domain_id', 'project-domain-id'),
+ 'project_domain_name': (
+ 'project_domain_name', 'project-domain-name'),
}
for target_key, possible_values in mappings.items():
target = None
@@ -363,8 +385,13 @@
os_args = dict()
new_args = dict()
for (key, val) in iter(args.items()):
+ if type(args[key]) == dict:
+ # dive into the auth dict
+ new_args[key] = self._fix_args(args[key])
+ continue
+
key = key.replace('-', '_')
- if key.startswith('os'):
+ if key.startswith('os_'):
os_args[key[3:]] = val
else:
new_args[key] = val
@@ -376,12 +403,33 @@
if opt_name in config:
return config[opt_name]
else:
- for d_opt in opt.deprecated_opts:
+ deprecated = getattr(opt, 'deprecated', getattr(
+ opt, 'deprecated_opts', []))
+ for d_opt in deprecated:
d_opt_name = d_opt.name.replace('-', '_')
if d_opt_name in config:
return config[d_opt_name]
- def _validate_auth(self, config):
+ def _get_auth_loader(self, config):
+ # Re-use the admin_token plugin for the "None" plugin
+ # since it does not look up endpoints or tokens but rather
+ # does a passthrough. This is useful for things like Ironic
+ # that have a keystoneless operational mode, but means we're
+ # still dealing with a keystoneauth Session object, so all the
+ # _other_ things (SSL arg handling, timeout) all work consistently
+ if config['auth_type'] in (None, "None", ''):
+ config['auth_type'] = 'admin_token'
+ # Set to notused rather than None because validate_auth will
+ # strip the value if it's actually python None
+ config['auth']['token'] = 'notused'
+ return loading.get_plugin_loader(config['auth_type'])
+
+ def _validate_auth_ksc(self, config):
+ try:
+ import keystoneclient.auth as ksc_auth
+ except ImportError:
+ return config
+
# May throw a keystoneclient.exceptions.NoMatchingPlugin
plugin_options = ksc_auth.get_plugin_class(
config['auth_type']).get_options()
@@ -424,6 +472,38 @@
return config
+ def _validate_auth(self, config, loader):
+ # May throw a keystoneauth1.exceptions.NoMatchingPlugin
+
+ plugin_options = loader.get_options()
+
+ for p_opt in plugin_options:
+ # if it's in config.auth, win, kill it from config dict
+ # if it's in config and not in config.auth, move it
+ # deprecated loses to current
+ # provided beats default, deprecated or not
+ winning_value = self._find_winning_auth_value(
+ p_opt, config['auth'])
+ if not winning_value:
+ winning_value = self._find_winning_auth_value(p_opt, config)
+
+ # Clean up after ourselves
+ for opt in [p_opt.name] + [o.name for o in p_opt.deprecated]:
+ opt = opt.replace('-', '_')
+ config.pop(opt, None)
+ config['auth'].pop(opt, None)
+
+ if winning_value:
+ # Prefer the plugin configuration dest value if the value's key
+ # is marked as depreciated.
+ if p_opt.dest is None:
+ config['auth'][p_opt.name.replace('-', '_')] = (
+ winning_value)
+ else:
+ config['auth'][p_opt.dest] = winning_value
+
+ return config
+
def get_one_cloud(self, cloud=None, validate=True,
argparse=None, **kwargs):
"""Retrieve a single cloud configuration and merge additional options
@@ -431,13 +511,16 @@
:param string cloud:
The name of the configuration to load from clouds.yaml
:param boolean validate:
- Validate that required arguments are present and certain
- argument combinations are valid
+ Validate the config. Setting this to False causes no auth plugin
+ to be created. It's really only useful for testing.
:param Namespace argparse:
An argparse Namespace object; allows direct passing in of
argparse options to be added to the cloud config. Values
of None and '' will be removed.
:param kwargs: Additional configuration options
+
+ :raises: keystoneauth1.exceptions.MissingRequiredOptions
+ on missing required auth parameters
"""
if cloud is None and self.envvar_key in self.get_cloud_names():
@@ -467,12 +550,27 @@
if type(config[key]) is not bool:
config[key] = get_boolean(config[key])
- if 'auth_type' in config:
- if config['auth_type'] in ('', 'None', None):
- validate = False
-
- if validate and ksc_auth:
- config = self._validate_auth(config)
+ if loading:
+ if validate:
+ try:
+ loader = self._get_auth_loader(config)
+ config = self._validate_auth(config, loader)
+ auth_plugin = loader.load_from_options(**config['auth'])
+ except Exception as e:
+ # We WANT the ksa exception normally
+ # but OSC can't handle it right now, so we try deferring
+ # to ksc. If that ALSO fails, it means there is likely
+ # a deeper issue, so we assume the ksa error was correct
+ auth_plugin = None
+ try:
+ config = self._validate_auth_ksc(config)
+ except Exception:
+ raise e
+ else:
+ auth_plugin = None
+ else:
+ auth_plugin = None
+ config = self._validate_auth_ksc(config)
# If any of the defaults reference other values, we need to expand
for (key, value) in config.items():
@@ -488,7 +586,8 @@
return cloud_config.CloudConfig(
name=cloud_name, region=config['region_name'],
config=self._normalize_keys(config),
- prefer_ipv6=prefer_ipv6)
+ prefer_ipv6=prefer_ipv6,
+ auth_plugin=auth_plugin)
@staticmethod
def set_one_cloud(config_file, cloud, set_config=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/defaults.py new/os-client-config-1.7.5/os_client_config/defaults.py
--- old/os-client-config-1.6.3/os_client_config/defaults.py 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/defaults.py 2015-09-22 21:41:42.000000000 +0200
@@ -35,6 +35,8 @@
key=None,
)
with open(_yaml_path, 'r') as yaml_file:
- _defaults.update(yaml.load(yaml_file.read()))
+ updates = yaml.load(yaml_file.read())
+ if updates is not None:
+ _defaults.update(updates)
return _defaults.copy()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/defaults.yaml new/os-client-config-1.7.5/os_client_config/defaults.yaml
--- old/os-client-config-1.6.3/os_client_config/defaults.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/defaults.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -8,9 +8,10 @@
floating_ip_source: neutron
identity_api_version: '2'
image_api_use_tasks: false
-image_api_version: '1'
+image_api_version: '2'
image_format: qcow2
network_api_version: '2'
object_api_version: '1'
+orchestration_api_version: '1'
secgroup_source: neutron
volume_api_version: '1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/tests/base.py new/os-client-config-1.7.5/os_client_config/tests/base.py
--- old/os-client-config-1.6.3/os_client_config/tests/base.py 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/tests/base.py 2015-09-22 21:41:42.000000000 +0200
@@ -31,6 +31,7 @@
'public-clouds': {
'_test_cloud_in_our_cloud': {
'auth': {
+ 'auth_url': 'http://example.com/v2',
'username': 'testotheruser',
'project_name': 'testproject',
},
@@ -45,6 +46,7 @@
'_test-cloud_': {
'profile': '_test_cloud_in_our_cloud',
'auth': {
+ 'auth_url': 'http://example.com/v2',
'username': 'testuser',
'password': 'testpass',
},
@@ -53,6 +55,7 @@
'_test_cloud_no_vendor': {
'profile': '_test_non_existant_cloud',
'auth': {
+ 'auth_url': 'http://example.com/v2',
'username': 'testuser',
'password': 'testpass',
'project_name': 'testproject',
@@ -64,6 +67,18 @@
'username': 'testuser',
'password': 'testpass',
'project_id': 12345,
+ 'auth_url': 'http://example.com/v2',
+ },
+ 'region_name': 'test-region',
+ },
+ '_test-cloud-domain-id_': {
+ 'auth': {
+ 'username': 'testuser',
+ 'password': 'testpass',
+ 'project_id': 12345,
+ 'auth_url': 'http://example.com/v2',
+ 'domain_id': '6789',
+ 'project_domain_id': '123456789',
},
'region_name': 'test-region',
},
@@ -72,6 +87,7 @@
'username': 'testuser',
'password': 'testpass',
'project-id': 'testproject',
+ 'auth_url': 'http://example.com/v2',
},
'regions': [
'region1',
@@ -83,6 +99,7 @@
'username': 'testuser',
'password': 'testpass',
'project-id': '12345',
+ 'auth_url': 'http://example.com/v2',
},
'region_name': 'test-region',
}
@@ -132,4 +149,8 @@
self.assertIsNone(cc.cloud)
self.assertIn('username', cc.auth)
self.assertEqual('testuser', cc.auth['username'])
- self.assertEqual('testproject', cc.auth['project_name'])
+ self.assertTrue('project_name' in cc.auth or 'project_id' in cc.auth)
+ if 'project_name' in cc.auth:
+ self.assertEqual('testproject', cc.auth['project_name'])
+ elif 'project_id' in cc.auth:
+ self.assertEqual('testproject', cc.auth['project_id'])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/tests/test_config.py new/os-client-config-1.7.5/os_client_config/tests/test_config.py
--- old/os-client-config-1.6.3/os_client_config/tests/test_config.py 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/tests/test_config.py 2015-09-22 21:41:42.000000000 +0200
@@ -43,7 +43,7 @@
def test_get_one_cloud(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
- cloud = c.get_one_cloud()
+ cloud = c.get_one_cloud(validate=False)
self.assertIsInstance(cloud, cloud_config.CloudConfig)
self.assertEqual(cloud.name, '')
@@ -61,12 +61,12 @@
)
def test_get_one_cloud_auth_override_defaults(self):
- default_options = {'auth_type': 'token'}
+ default_options = {'compute_api_version': '4'}
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
override_defaults=default_options)
cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'})
self.assertEqual('user', cc.auth['username'])
- self.assertEqual('token', cc.auth_type)
+ self.assertEqual('4', cc.compute_api_version)
self.assertEqual(
defaults._defaults['identity_api_version'],
cc.identity_api_version,
@@ -89,13 +89,37 @@
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
cc = c.get_one_cloud('_test-cloud-int-project_')
- self.assertEqual('12345', cc.auth['project_name'])
+ self.assertEqual('12345', cc.auth['project_id'])
+
+ def test_get_one_cloud_with_domain_id(self):
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+ cc = c.get_one_cloud('_test-cloud-domain-id_')
+ self.assertEqual('6789', cc.auth['user_domain_id'])
+ self.assertEqual('123456789', cc.auth['project_domain_id'])
+ self.assertNotIn('domain_id', cc.auth)
+ self.assertNotIn('domain-id', cc.auth)
def test_get_one_cloud_with_hyphenated_project_id(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
cc = c.get_one_cloud('_test_cloud_hyphenated')
- self.assertEqual('12345', cc.auth['project_name'])
+ self.assertEqual('12345', cc.auth['project_id'])
+
+ def test_get_one_cloud_with_hyphenated_kwargs(self):
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+ args = {
+ 'auth': {
+ 'username': 'testuser',
+ 'password': 'testpass',
+ 'project-id': '12345',
+ 'auth-url': 'http://example.com/v2',
+ },
+ 'region_name': 'test-region',
+ }
+ cc = c.get_one_cloud(**args)
+ self.assertEqual('http://example.com/v2', cc.auth['auth_url'])
def test_no_environ(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
@@ -109,7 +133,7 @@
for k in os.environ.keys():
if k.startswith('OS_'):
self.useFixture(fixtures.EnvironmentVariable(k))
- c.get_one_cloud(cloud='defaults')
+ c.get_one_cloud(cloud='defaults', validate=False)
def test_prefer_ipv6_true(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
@@ -120,7 +144,7 @@
def test_prefer_ipv6_false(self):
c = config.OpenStackConfig(config_files=[self.no_yaml],
vendor_files=[self.no_yaml])
- cc = c.get_one_cloud(cloud='defaults')
+ cc = c.get_one_cloud(cloud='defaults', validate=False)
self.assertFalse(cc.prefer_ipv6)
def test_get_one_cloud_auth_merge(self):
@@ -132,7 +156,8 @@
def test_get_cloud_names(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml])
self.assertEqual(
- ['_test-cloud-int-project_',
+ ['_test-cloud-domain-id_',
+ '_test-cloud-int-project_',
'_test-cloud_',
'_test_cloud_hyphenated',
'_test_cloud_no_vendor',
@@ -144,7 +169,7 @@
for k in os.environ.keys():
if k.startswith('OS_'):
self.useFixture(fixtures.EnvironmentVariable(k))
- c.get_one_cloud(cloud='defaults')
+ c.get_one_cloud(cloud='defaults', validate=False)
self.assertEqual(['defaults'], sorted(c.get_cloud_names()))
def test_set_one_cloud_creates_file(self):
@@ -168,7 +193,8 @@
resulting_cloud_config = {
'auth': {
'password': 'newpass',
- 'username': 'testuser'
+ 'username': 'testuser',
+ 'auth_url': 'http://example.com/v2',
},
'cloud': 'new_cloud',
'profile': '_test_cloud_in_our_cloud',
@@ -188,10 +214,15 @@
def setUp(self):
super(TestConfigArgparse, self).setUp()
- self.options = argparse.Namespace(
+ self.args = dict(
+ auth_url='http://example.com/v2',
+ username='user',
+ password='password',
+ project_name='project',
region_name='other-test-region',
snack_type='cookie',
)
+ self.options = argparse.Namespace(**self.args)
def test_get_one_cloud_argparse(self):
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
@@ -206,9 +237,34 @@
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
- cc = c.get_one_cloud(cloud='', argparse=self.options)
+ cc = c.get_one_cloud(argparse=self.options)
+ self.assertIsNone(cc.cloud)
+ self.assertEqual(cc.region_name, 'other-test-region')
+ self.assertEqual(cc.snack_type, 'cookie')
+
+ def test_get_one_cloud_just_kwargs(self):
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+
+ cc = c.get_one_cloud(**self.args)
+ self.assertIsNone(cc.cloud)
+ self.assertEqual(cc.region_name, 'other-test-region')
+ self.assertEqual(cc.snack_type, 'cookie')
+
+ def test_get_one_cloud_dash_kwargs(self):
+ c = config.OpenStackConfig(config_files=[self.cloud_yaml],
+ vendor_files=[self.vendor_yaml])
+
+ args = {
+ 'auth-url': 'http://example.com/v2',
+ 'username': 'user',
+ 'password': 'password',
+ 'project_name': 'project',
+ 'region_name': 'other-test-region',
+ 'snack_type': 'cookie',
+ }
+ cc = c.get_one_cloud(**args)
self.assertIsNone(cc.cloud)
- self.assertNotIn('username', cc.auth)
self.assertEqual(cc.region_name, 'other-test-region')
self.assertEqual(cc.snack_type, 'cookie')
@@ -270,11 +326,11 @@
self.assertEqual('password', cc.auth_type)
def test_set_default_before_init(self):
- config.set_default('auth_type', 'token')
+ config.set_default('identity_api_version', '4')
c = config.OpenStackConfig(config_files=[self.cloud_yaml],
vendor_files=[self.vendor_yaml])
cc = c.get_one_cloud(cloud='_test-cloud_', argparse=None)
- self.assertEqual('token', cc.auth_type)
+ self.assertEqual('4', cc.identity_api_version)
class TestBackwardsCompatibility(base.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/auro.yaml new/os-client-config-1.7.5/os_client_config/vendors/auro.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/auro.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/auro.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -1,7 +1,7 @@
name: auro
profile:
auth:
- auth_url: https://api.auro.io:5000/v2.0
- region_name: RegionOne
+ auth_url: https://api.van1.auro.io:5000/v2.0
+ region_name: van1
secgroup_source: nova
floating_ip_source: nova
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/citycloud.yaml new/os-client-config-1.7.5/os_client_config/vendors/citycloud.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/citycloud.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/citycloud.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,9 @@
+name: citycloud
+profile:
+ auth:
+ auth_url: https://identity1.citycloud.com:5000/v3/
+ regions:
+ - Lon1
+ - Sto2
+ - Kna1
+ identity_api_version: '3'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/datacentred.yaml new/os-client-config-1.7.5/os_client_config/vendors/datacentred.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/datacentred.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/datacentred.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,6 @@
+name: datacentred
+profile:
+ auth:
+ auth_url: https://compute.datacentred.io:5000/v2.0
+ region-name: sal01
+ image_api_version: '1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/dreamhost.yaml new/os-client-config-1.7.5/os_client_config/vendors/dreamhost.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/dreamhost.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/dreamhost.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -3,5 +3,4 @@
auth:
auth_url: https://keystone.dream.io/v2.0
region_name: RegionOne
- image_api_version: '2'
image_format: raw
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/elastx.yaml new/os-client-config-1.7.5/os_client_config/vendors/elastx.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/elastx.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/elastx.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,5 @@
+name: elastx
+profile:
+ auth:
+ auth_url: https://ops.elastx.net:5000/v2.0
+ region_name: regionOne
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/entercloudsuite.yaml new/os-client-config-1.7.5/os_client_config/vendors/entercloudsuite.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/entercloudsuite.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/entercloudsuite.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,8 @@
+name: entercloudsuite
+profile:
+ auth:
+ auth_url: https://api.entercloudsuite.com/v2.0
+ regions:
+ - it-mil1
+ - nl-ams1
+ - de-fra1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/hp.yaml new/os-client-config-1.7.5/os_client_config/vendors/hp.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/hp.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/hp.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -6,3 +6,4 @@
- region-a.geo-1
- region-b.geo-1
dns_service_type: hpext:dns
+ image_api_version: '1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/internap.yaml new/os-client-config-1.7.5/os_client_config/vendors/internap.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/internap.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/internap.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,10 @@
+name: internap
+profile:
+ auth:
+ auth_url: https://identity.api.cloud.iweb.com/v2.0
+ regions:
+ - ams01
+ - da01
+ - nyj01
+ image_api_version: '1'
+ floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/ovh.yaml new/os-client-config-1.7.5/os_client_config/vendors/ovh.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/ovh.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/ovh.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -2,5 +2,8 @@
profile:
auth:
auth_url: https://auth.cloud.ovh.net/v2.0
- region_name: SBG1
+ regions:
+ - GRA1
+ - SBG1
image_format: raw
+ floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/rackspace.yaml new/os-client-config-1.7.5/os_client_config/vendors/rackspace.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/rackspace.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/rackspace.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -10,7 +10,6 @@
- SYD
database_service_type: rax:database
compute_service_name: cloudServersOpenStack
- image_api_version: '2'
image_api_use_tasks: true
image_format: vhd
floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/runabove.yaml new/os-client-config-1.7.5/os_client_config/vendors/runabove.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/runabove.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/runabove.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -5,6 +5,5 @@
regions:
- BHS-1
- SBG-1
- image_api_version: '2'
image_format: qcow2
floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/ultimum.yaml new/os-client-config-1.7.5/os_client_config/vendors/ultimum.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/ultimum.yaml 1970-01-01 01:00:00.000000000 +0100
+++ new/os-client-config-1.7.5/os_client_config/vendors/ultimum.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -0,0 +1,5 @@
+name: ultimum
+profile:
+ auth:
+ auth_url: https://console.ultimum-cloud.com:5000/v2.0
+ region-name: RegionOne
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/unitedstack.yaml new/os-client-config-1.7.5/os_client_config/vendors/unitedstack.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/unitedstack.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/unitedstack.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -6,6 +6,5 @@
- bj1
- gd1
identity_api_version: '3'
- image_api_version: '2'
image_format: raw
floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config/vendors/vexxhost.yaml new/os-client-config-1.7.5/os_client_config/vendors/vexxhost.yaml
--- old/os-client-config-1.6.3/os_client_config/vendors/vexxhost.yaml 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config/vendors/vexxhost.yaml 2015-09-22 21:41:42.000000000 +0200
@@ -3,5 +3,4 @@
auth:
auth_url: http://auth.api.thenebulacloud.com:5000/v2.0/
region_name: ca-ymq-1
- image_api_version: '2'
floating_ip_source: None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config.egg-info/PKG-INFO new/os-client-config-1.7.5/os_client_config.egg-info/PKG-INFO
--- old/os-client-config-1.6.3/os_client_config.egg-info/PKG-INFO 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config.egg-info/PKG-INFO 2015-09-22 21:42:24.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: os-client-config
-Version: 1.6.3
+Version: 1.7.5
Summary: OpenStack Client Configuation Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config.egg-info/SOURCES.txt new/os-client-config-1.7.5/os_client_config.egg-info/SOURCES.txt
--- old/os-client-config-1.6.3/os_client_config.egg-info/SOURCES.txt 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config.egg-info/SOURCES.txt 2015-09-22 21:42:25.000000000 +0200
@@ -39,10 +39,16 @@
os_client_config/tests/test_environ.py
os_client_config/vendors/__init__.py
os_client_config/vendors/auro.yaml
+os_client_config/vendors/citycloud.yaml
+os_client_config/vendors/datacentred.yaml
os_client_config/vendors/dreamhost.yaml
+os_client_config/vendors/elastx.yaml
+os_client_config/vendors/entercloudsuite.yaml
os_client_config/vendors/hp.yaml
+os_client_config/vendors/internap.yaml
os_client_config/vendors/ovh.yaml
os_client_config/vendors/rackspace.yaml
os_client_config/vendors/runabove.yaml
+os_client_config/vendors/ultimum.yaml
os_client_config/vendors/unitedstack.yaml
os_client_config/vendors/vexxhost.yaml
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config.egg-info/pbr.json new/os-client-config-1.7.5/os_client_config.egg-info/pbr.json
--- old/os-client-config-1.6.3/os_client_config.egg-info/pbr.json 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config.egg-info/pbr.json 2015-09-22 21:42:24.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "c422fe8"}
\ No newline at end of file
+{"git_version": "512d00e", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/os_client_config.egg-info/requires.txt new/os-client-config-1.7.5/os_client_config.egg-info/requires.txt
--- old/os-client-config-1.6.3/os_client_config.egg-info/requires.txt 2015-08-13 11:15:04.000000000 +0200
+++ new/os-client-config-1.7.5/os_client_config.egg-info/requires.txt 2015-09-22 21:42:24.000000000 +0200
@@ -1,2 +1,3 @@
PyYAML>=3.1.0
appdirs>=1.3.0
+keystoneauth1>=1.0.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-client-config-1.6.3/requirements.txt new/os-client-config-1.7.5/requirements.txt
--- old/os-client-config-1.6.3/requirements.txt 2015-08-13 11:14:33.000000000 +0200
+++ new/os-client-config-1.7.5/requirements.txt 2015-09-22 21:41:42.000000000 +0200
@@ -3,3 +3,4 @@
# process, which may cause wedges in the gate later.
PyYAML>=3.1.0
appdirs>=1.3.0
+keystoneauth1>=1.0.0
1
0
Hello community,
here is the log from the commit of package python-automaton for openSUSE:Factory checked in at 2015-10-30 13:42:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-automaton (Old)
and /work/SRC/openSUSE:Factory/.python-automaton.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-automaton"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-automaton/python-automaton.changes 2015-08-27 08:55:26.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-automaton.new/python-automaton.changes 2015-10-30 13:42:33.000000000 +0100
@@ -1,0 +2,7 @@
+Wed Sep 9 06:37:10 UTC 2015 - tbechtold(a)suse.com
+
+- update to 0.7.0:
+ * Updated from global requirements
+ * Activate pep8 check that _ is imported
+
+-------------------------------------------------------------------
Old:
----
automaton-0.5.0.tar.gz
New:
----
automaton-0.7.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-automaton.spec ++++++
--- /var/tmp/diff_new_pack.x1d5jl/_old 2015-10-30 13:42:33.000000000 +0100
+++ /var/tmp/diff_new_pack.x1d5jl/_new 2015-10-30 13:42:33.000000000 +0100
@@ -17,7 +17,7 @@
Name: python-automaton
-Version: 0.5.0
+Version: 0.7.0
Release: 0
Summary: Friendly state machines for python
License: Apache-2.0
++++++ automaton-0.5.0.tar.gz -> automaton-0.7.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/AUTHORS new/automaton-0.7.0/AUTHORS
--- old/automaton-0.5.0/AUTHORS 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/AUTHORS 2015-09-08 17:30:24.000000000 +0200
@@ -1,3 +1,4 @@
Joshua Harlow <harlowja(a)gmail.com>
Joshua Harlow <harlowja(a)yahoo-inc.com>
Ruby Loo <rloo(a)yahoo-inc.com>
+Tom Cocozzello <tjcocozz(a)us.ibm.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/ChangeLog new/automaton-0.7.0/ChangeLog
--- old/automaton-0.5.0/ChangeLog 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/ChangeLog 2015-09-08 17:30:24.000000000 +0200
@@ -1,6 +1,19 @@
CHANGES
=======
+0.7.0
+-----
+
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+
+0.6.0
+-----
+
+* Activate pep8 check that _ is imported
+* Updated from global requirements
+
0.5.0
-----
@@ -9,6 +22,7 @@
* Remove setup.cfg 'requires-python' incorrect entry
* Document `process_event` return and expose return namedtuple type
* Allow providing and using a 'nested_start_state_fetcher'
+* Allow providing a state-name translation dict
0.4.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/PKG-INFO new/automaton-0.7.0/PKG-INFO
--- old/automaton-0.5.0/PKG-INFO 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/PKG-INFO 2015-09-08 17:30:25.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: automaton
-Version: 0.5.0
+Version: 0.7.0
Summary: Friendly state machines for python.
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/automaton/converters/pydot.py new/automaton-0.7.0/automaton/converters/pydot.py
--- old/automaton-0.5.0/automaton/converters/pydot.py 2015-07-27 21:55:33.000000000 +0200
+++ new/automaton-0.7.0/automaton/converters/pydot.py 2015-09-08 17:29:47.000000000 +0200
@@ -25,7 +25,7 @@
def convert(machine, graph_name,
graph_attrs=None, node_attrs_cb=None, edge_attrs_cb=None,
- add_start_state=True):
+ add_start_state=True, name_translations=None):
"""Translates the state machine into a pydot graph.
:param machine: state machine to convert
@@ -55,11 +55,16 @@
``default_start_state`` then this does nothing,
even if enabled)
:type add_start_state: bool
+ :param name_translations: a dict that provides alternative ``state``
+ string names for each state
+ :type name_translations: dict
"""
if not PYDOT_AVAILABLE:
raise RuntimeError("pydot (or pydot2 or equivalent) is required"
" to convert a state machine into a pydot"
" graph")
+ if not name_translations:
+ name_translations = {}
graph_kwargs = {
'rankdir': 'LR',
'nodesep': '0.25',
@@ -82,14 +87,17 @@
start_node_attrs = node_attrs.copy()
if node_attrs_cb is not None:
start_node_attrs.update(node_attrs_cb(start_state))
- nodes[start_state] = pydot.Node(start_state,
+ pretty_start_state = name_translations.get(start_state,
+ start_state)
+ nodes[start_state] = pydot.Node(pretty_start_state,
**start_node_attrs)
g.add_node(nodes[start_state])
if end_state not in nodes:
end_node_attrs = node_attrs.copy()
if node_attrs_cb is not None:
end_node_attrs.update(node_attrs_cb(end_state))
- nodes[end_state] = pydot.Node(end_state, **end_node_attrs)
+ pretty_end_state = name_translations.get(end_state, end_state)
+ nodes[end_state] = pydot.Node(pretty_end_state, **end_node_attrs)
g.add_node(nodes[end_state])
edge_attrs = {}
if edge_attrs_cb is not None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/automaton.egg-info/PKG-INFO new/automaton-0.7.0/automaton.egg-info/PKG-INFO
--- old/automaton-0.5.0/automaton.egg-info/PKG-INFO 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/automaton.egg-info/PKG-INFO 2015-09-08 17:30:24.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: automaton
-Version: 0.5.0
+Version: 0.7.0
Summary: Friendly state machines for python.
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/automaton.egg-info/pbr.json new/automaton-0.7.0/automaton.egg-info/pbr.json
--- old/automaton-0.5.0/automaton.egg-info/pbr.json 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/automaton.egg-info/pbr.json 2015-09-08 17:30:24.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "d434212"}
\ No newline at end of file
+{"git_version": "e5d9c91", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/automaton.egg-info/requires.txt new/automaton-0.7.0/automaton.egg-info/requires.txt
--- old/automaton-0.5.0/automaton.egg-info/requires.txt 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/automaton.egg-info/requires.txt 2015-09-08 17:30:24.000000000 +0200
@@ -1,4 +1,4 @@
-pbr<2.0,>=1.3
+pbr<2.0,>=1.6
six>=1.9.0
-debtcollector>=0.3.0 # Apache-2.0
+debtcollector>=0.3.0
PrettyTable<0.8,>=0.7
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/requirements.txt new/automaton-0.7.0/requirements.txt
--- old/automaton-0.5.0/requirements.txt 2015-07-27 21:55:34.000000000 +0200
+++ new/automaton-0.7.0/requirements.txt 2015-09-08 17:29:47.000000000 +0200
@@ -3,7 +3,7 @@
# process, which may cause wedges in the gate later.
# See: https://bugs.launchpad.net/pbr/+bug/1384919 for why this is here...
-pbr<2.0,>=1.3
+pbr<2.0,>=1.6
# Python 2->3 compatibility library.
six>=1.9.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/setup.cfg new/automaton-0.7.0/setup.cfg
--- old/automaton-0.5.0/setup.cfg 2015-07-27 21:56:01.000000000 +0200
+++ new/automaton-0.7.0/setup.cfg 2015-09-08 17:30:25.000000000 +0200
@@ -41,7 +41,7 @@
upload-dir = doc/build/html
[egg_info]
-tag_build =
tag_date = 0
tag_svn_revision = 0
+tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/test-requirements.txt new/automaton-0.7.0/test-requirements.txt
--- old/automaton-0.5.0/test-requirements.txt 2015-07-27 21:55:34.000000000 +0200
+++ new/automaton-0.7.0/test-requirements.txt 2015-09-08 17:29:47.000000000 +0200
@@ -10,7 +10,7 @@
python-subunit>=0.0.18
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
oslosphinx>=2.5.0 # Apache-2.0
-oslotest>=1.7.0 # Apache-2.0
+oslotest>=1.10.0 # Apache-2.0
testrepository>=0.0.18
testscenarios>=0.4
testtools>=1.4.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/automaton-0.5.0/tox.ini new/automaton-0.7.0/tox.ini
--- old/automaton-0.5.0/tox.ini 2015-07-27 21:55:34.000000000 +0200
+++ new/automaton-0.7.0/tox.ini 2015-09-08 17:29:47.000000000 +0200
@@ -33,5 +33,4 @@
[flake8]
show-source = True
-builtins = _
exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build
1
0
Hello community,
here is the log from the commit of package python-tempest-lib for openSUSE:Factory checked in at 2015-10-30 13:42:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-tempest-lib (Old)
and /work/SRC/openSUSE:Factory/.python-tempest-lib.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-tempest-lib"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-tempest-lib/python-tempest-lib.changes 2015-08-27 08:55:13.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-tempest-lib.new/python-tempest-lib.changes 2015-10-30 13:42:31.000000000 +0100
@@ -1,0 +2,20 @@
+Mon Sep 21 14:00:26 UTC 2015 - tbechtold(a)suse.com
+
+- update to 0.9.0:
+ * Migrated agents_client.py, test_agents_client.py, agents.py from tempest
+ * Write the latest change_id on migration commit
+ * Keep original pathes of source files
+
+-------------------------------------------------------------------
+Wed Sep 9 09:03:52 UTC 2015 - tbechtold(a)suse.com
+
+- update to 0.8.0:
+ * Add HTTP30X checks for validate_response(
+ * Make TokenClientJSON deprecated
+ * Add the resp to RestClientExceptions
+ * Add std out to ssh exception
+ * Properly decode body before calling json.loads()
+ * Updated from global requirements
+- Adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
tempest-lib-0.6.1.tar.gz
New:
----
tempest-lib-0.9.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-tempest-lib.spec ++++++
--- /var/tmp/diff_new_pack.ITUeEb/_old 2015-10-30 13:42:31.000000000 +0100
+++ /var/tmp/diff_new_pack.ITUeEb/_new 2015-10-30 13:42:31.000000000 +0100
@@ -17,7 +17,7 @@
Name: python-tempest-lib
-Version: 0.6.1
+Version: 0.9.0
Release: 0
Summary: OpenStack Functional Testing Library
License: Apache-2.0
@@ -45,12 +45,13 @@
BuildRequires: python-testtools
BuildRoot: %{_tmppath}/%{name}-%{version}-build
Requires: python-Babel >= 1.3
-Requires: python-fixtures >= 0.3.14
+Requires: python-fixtures >= 1.3.1
Requires: python-httplib2 >= 0.7.5
Requires: python-iso8601 >= 0.1.9
-Requires: python-jsonschema >= 2
-Requires: python-oslo.log >= 0.4.0
-Requires: python-six >= 1.9
+Requires: python-jsonschema >= 2.0.0
+Requires: python-os-testr >= 0.1.0
+Requires: python-oslo.log >= 1.8.0
+Requires: python-six >= 1.9.0
%if 0%{?suse_version} && 0%{?suse_version} <= 1110
%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
%else
++++++ tempest-lib-0.6.1.tar.gz -> tempest-lib-0.9.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/AUTHORS new/tempest-lib-0.9.0/AUTHORS
--- old/tempest-lib-0.6.1/AUTHORS 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/AUTHORS 2015-09-16 12:30:44.000000000 +0200
@@ -29,6 +29,7 @@
Joe Gordon <joe.gordon0(a)gmail.com>
JordanP <jordan.pittier(a)cloudwatt.com>
Katherine Elliott <katherine.elliott(a)hp.com>
+Ken'ichi Ohmichi <ken-oomichi(a)wx.jp.nec.com>
Ken'ichi Ohmichi <oomichi(a)mxs.nes.nec.co.jp>
Lilywei123 <xiao-li.wei(a)hp.com>
Marc Koderer <m.koderer(a)telekom.de>
@@ -42,8 +43,10 @@
Matthew Treinish <treinish(a)linux.vnet.ibm.com>
Mauro S. M. Rodrigues <maurosr(a)linux.vnet.ibm.com>
Mehdi Abaakouk <mehdi.abaakouk(a)enovance.com>
+Mehdi Abaakouk <sileht(a)sileht.net>
Mikhail S Medvedev <msmedved(a)us.ibm.com>
Mitsuhiko Yamazaki <yamazaki-mitsuhiko(a)cnt.mxc.nes.nec.co.jp>
+Paul Glass <paul.glass(a)rackspace.com>
Pavel Sedlák <psedlak(a)redhat.com>
Rohan Kanade <rohan.kanade(a)izeltech.com>
Ryan Hsu <rhsu(a)vmware.com>
@@ -63,6 +66,7 @@
Yuxing wang <yuxingw(a)cn.ibm.com>
Zhi Kun Liu <zhikunli(a)cn.ibm.com>
ZhiQiang Fan <aji.zqfan(a)gmail.com>
+afazekas <afazekas(a)redhat.com>
andreaf <andrea.frittoli(a)gmail.com>
ekhugen <ekhugen(a)us.ibm.com>
ghanshyam <ghanshyam.mann(a)nectechnologies.in>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/ChangeLog new/tempest-lib-0.9.0/ChangeLog
--- old/tempest-lib-0.6.1/ChangeLog 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/ChangeLog 2015-09-16 12:30:44.000000000 +0200
@@ -1,6 +1,33 @@
CHANGES
=======
+0.9.0
+-----
+
+* Migrated agents_client.py, test_agents_client.py, agents.py from tempest
+* Write the latest change_id on migration commit
+* Keep original pathes of source files
+
+0.8.0
+-----
+
+* Add HTTP30X checks for validate_response(
+* Make TokenClientJSON deprecated
+* Fix cli.base.execute with py34
+* Updated from global requirements
+* Updated from global requirements
+* Updated from global requirements
+* Add the resp to RestClientExceptions
+* Add std out to ssh exception
+* Updated from global requirements
+
+0.7.0
+-----
+
+* Updated from global requirements
+* Properly decode body before calling json.loads()
+* Updated from global requirements
+
0.6.1
-----
@@ -11,6 +38,7 @@
* Revert "Adding support for neutron-debug CLI."
* Updated from global requirements
+* Categorize rest client exceptions
* Remove unnecessary oslo-incubator code
* Allows any valid ISO8601 timestamp in token expiry time format
* Explicitly add json schema validator for schema validation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/PKG-INFO new/tempest-lib-0.9.0/PKG-INFO
--- old/tempest-lib-0.6.1/PKG-INFO 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/PKG-INFO 2015-09-16 12:30:44.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: tempest-lib
-Version: 0.6.1
+Version: 0.9.0
Summary: OpenStack Functional Testing Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/requirements.txt new/tempest-lib-0.9.0/requirements.txt
--- old/tempest-lib-0.6.1/requirements.txt 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/requirements.txt 2015-09-16 12:29:59.000000000 +0200
@@ -1,13 +1,13 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr<2.0,>=0.11
+pbr<2.0,>=1.6
Babel>=1.3
-fixtures>=0.3.14
+fixtures>=1.3.1
iso8601>=0.1.9
jsonschema!=2.5.0,<3.0.0,>=2.0.0
httplib2>=0.7.5
paramiko>=1.13.0
six>=1.9.0
-oslo.log>=1.2.0 # Apache-2.0
+oslo.log>=1.8.0 # Apache-2.0
os-testr>=0.1.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/setup.cfg new/tempest-lib-0.9.0/setup.cfg
--- old/tempest-lib-0.6.1/setup.cfg 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/setup.cfg 2015-09-16 12:30:44.000000000 +0200
@@ -50,7 +50,7 @@
output_file = tempest_lib/locale/tempest-lib.pot
[egg_info]
-tag_build =
-tag_date = 0
tag_svn_revision = 0
+tag_date = 0
+tag_build =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/setup.py new/tempest-lib-0.9.0/setup.py
--- old/tempest-lib-0.6.1/setup.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/setup.py 2015-09-16 12:29:59.000000000 +0200
@@ -25,5 +25,5 @@
pass
setuptools.setup(
- setup_requires=['pbr'],
+ setup_requires=['pbr>=1.3'],
pbr=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/api_schema/response/compute/v2_1/agents.py new/tempest-lib-0.9.0/tempest_lib/api_schema/response/compute/v2_1/agents.py
--- old/tempest-lib-0.6.1/tempest_lib/api_schema/response/compute/v2_1/agents.py 1970-01-01 01:00:00.000000000 +0100
+++ new/tempest-lib-0.9.0/tempest_lib/api_schema/response/compute/v2_1/agents.py 2015-09-16 12:30:00.000000000 +0200
@@ -0,0 +1,60 @@
+# Copyright 2014 NEC Corporation. All rights reserved.
+#
+# 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.
+
+common_agent_info = {
+ 'type': 'object',
+ 'properties': {
+ 'agent_id': {'type': ['integer', 'string']},
+ 'hypervisor': {'type': 'string'},
+ 'os': {'type': 'string'},
+ 'architecture': {'type': 'string'},
+ 'version': {'type': 'string'},
+ 'url': {'type': 'string', 'format': 'uri'},
+ 'md5hash': {'type': 'string'}
+ },
+ 'additionalProperties': False,
+ 'required': ['agent_id', 'hypervisor', 'os', 'architecture',
+ 'version', 'url', 'md5hash']
+}
+
+list_agents = {
+ 'status_code': [200],
+ 'response_body': {
+ 'type': 'object',
+ 'properties': {
+ 'agents': {
+ 'type': 'array',
+ 'items': common_agent_info
+ }
+ },
+ 'additionalProperties': False,
+ 'required': ['agents']
+ }
+}
+
+create_agent = {
+ 'status_code': [200],
+ 'response_body': {
+ 'type': 'object',
+ 'properties': {
+ 'agent': common_agent_info
+ },
+ 'additionalProperties': False,
+ 'required': ['agent']
+ }
+}
+
+delete_agent = {
+ 'status_code': [200]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/auth.py new/tempest-lib-0.9.0/tempest_lib/auth.py
--- old/tempest-lib-0.6.1/tempest_lib/auth.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/auth.py 2015-09-16 12:29:59.000000000 +0200
@@ -248,7 +248,7 @@
class KeystoneV2AuthProvider(KeystoneAuthProvider):
def _auth_client(self, auth_url):
- return json_v2id.TokenClientJSON(
+ return json_v2id.TokenClient(
auth_url, disable_ssl_certificate_validation=self.dsvm,
ca_certs=self.ca_certs, trace_requests=self.trace_requests)
@@ -326,7 +326,7 @@
class KeystoneV3AuthProvider(KeystoneAuthProvider):
def _auth_client(self, auth_url):
- return json_v3id.V3TokenClientJSON(
+ return json_v3id.V3TokenClient(
auth_url, disable_ssl_certificate_validation=self.dsvm,
ca_certs=self.ca_certs, trace_requests=self.trace_requests)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/cli/base.py new/tempest-lib-0.9.0/tempest_lib/cli/base.py
--- old/tempest-lib-0.6.1/tempest_lib/cli/base.py 2015-06-24 07:55:35.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/cli/base.py 2015-09-16 12:30:00.000000000 +0200
@@ -16,6 +16,7 @@
import logging
import os
import shlex
+import six
import subprocess
from tempest_lib import base
@@ -50,7 +51,9 @@
cmd = ' '.join([os.path.join(cli_dir, cmd),
flags, action, params])
LOG.info("running: '%s'" % cmd)
- cmd = shlex.split(cmd.encode('utf-8'))
+ if six.PY2:
+ cmd = cmd.encode('utf-8')
+ cmd = shlex.split(cmd)
result = ''
result_err = ''
stdout = subprocess.PIPE
@@ -62,7 +65,10 @@
cmd,
result,
result_err)
- return result
+ if six.PY2:
+ return result
+ else:
+ return os.fsdecode(result)
class CLIClient(object):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/common/rest_client.py new/tempest-lib-0.9.0/tempest_lib/common/rest_client.py
--- old/tempest-lib-0.6.1/tempest_lib/common/rest_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/common/rest_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -34,6 +34,9 @@
# All the successful HTTP status codes from RFC 7231 & 4918
HTTP_SUCCESS = (200, 201, 202, 203, 204, 205, 206, 207)
+# All the redirection HTTP status codes from RFC 7231 & 4918
+HTTP_REDIRECTION = (300, 301, 302, 303, 304, 305, 306, 307)
+
# JSON Schema validator and format checker used for JSON Schema validation
JSONSCHEMA_VALIDATOR = jsonschema.Draft4Validator
FORMAT_CHECKER = jsonschema.draft4_format_checker
@@ -223,9 +226,9 @@
).format(expected_code)
if isinstance(expected_code, list):
for code in expected_code:
- assert code in HTTP_SUCCESS, assert_msg
+ assert code in HTTP_SUCCESS + HTTP_REDIRECTION, assert_msg
else:
- assert expected_code in HTTP_SUCCESS, assert_msg
+ assert expected_code in HTTP_SUCCESS + HTTP_REDIRECTION, assert_msg
# NOTE(afazekas): the http status code above 400 is processed by
# the _error_checker method
@@ -439,9 +442,16 @@
self._log_request_full(method, req_url, resp, secs, req_headers,
req_body, resp_body, caller_name, extra)
+ def _json_loads(self, resp_body):
+ if isinstance(resp_body, bytes):
+ resp_body = json.loads(resp_body.decode('utf8'))
+ else:
+ resp_body = json.loads(resp_body)
+ return resp_body
+
def _parse_resp(self, body):
try:
- body = json.loads(body)
+ body = self._json_loads(body)
except ValueError:
return body
@@ -583,9 +593,8 @@
:rtype: tuple
:return: a tuple with the first entry containing the response headers
and the second the response body
- :raises InvalidContentType: If the content-type of the response isn't
- an expect type or a 415 response code is
- received
+ :raises UnexpectedContentType: If the content-type of the response
+ isn't an expect type
:raises Unauthorized: If a 401 response code is received
:raises Forbidden: If a 403 response code is received
:raises NotFound: If a 404 response code is received
@@ -595,6 +604,7 @@
not in the response body
:raises RateLimitExceeded: If a 413 response code is received and
over_limit is in the response body
+ :raises InvalidContentType: If a 415 response code is received
:raises UnprocessableEntity: If a 422 response code is received
:raises InvalidHTTPResponseBody: The response body wasn't valid JSON
and couldn't be parsed
@@ -670,50 +680,51 @@
elif ctype.lower() in TXT_ENC:
parse_resp = False
else:
- raise exceptions.InvalidContentType(str(resp.status))
+ raise exceptions.UnexpectedContentType(str(resp.status),
+ resp=resp)
if resp.status == 401:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.Unauthorized(resp_body)
+ raise exceptions.Unauthorized(resp_body, resp=resp)
if resp.status == 403:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.Forbidden(resp_body)
+ raise exceptions.Forbidden(resp_body, resp=resp)
if resp.status == 404:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.NotFound(resp_body)
+ raise exceptions.NotFound(resp_body, resp=resp)
if resp.status == 400:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.BadRequest(resp_body)
+ raise exceptions.BadRequest(resp_body, resp=resp)
if resp.status == 409:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.Conflict(resp_body)
+ raise exceptions.Conflict(resp_body, resp=resp)
if resp.status == 413:
if parse_resp:
resp_body = self._parse_resp(resp_body)
if self.is_absolute_limit(resp, resp_body):
- raise exceptions.OverLimit(resp_body)
+ raise exceptions.OverLimit(resp_body, resp=resp)
else:
- raise exceptions.RateLimitExceeded(resp_body)
+ raise exceptions.RateLimitExceeded(resp_body, resp=resp)
if resp.status == 415:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.InvalidContentType(resp_body)
+ raise exceptions.InvalidContentType(resp_body, resp=resp)
if resp.status == 422:
if parse_resp:
resp_body = self._parse_resp(resp_body)
- raise exceptions.UnprocessableEntity(resp_body)
+ raise exceptions.UnprocessableEntity(resp_body, resp=resp)
if resp.status in (500, 501):
message = resp_body
@@ -742,12 +753,15 @@
message = resp_body
if resp.status == 501:
- raise exceptions.NotImplemented(message)
+ raise exceptions.NotImplemented(resp_body, resp=resp,
+ message=message)
else:
- raise exceptions.ServerFault(resp_body, message=message)
+ raise exceptions.ServerFault(resp_body, resp=resp,
+ message=message)
if resp.status >= 400:
- raise exceptions.UnexpectedResponseCode(str(resp.status))
+ raise exceptions.UnexpectedResponseCode(str(resp.status),
+ resp=resp)
def is_absolute_limit(self, resp, resp_body):
if (not isinstance(resp_body, collections.Mapping) or
@@ -802,7 +816,7 @@
# code if it exists is something that we expect. This is explicitly
# declared in the V3 API and so we should be able to export this in
# the response schema. For now we'll ignore it.
- if resp.status in HTTP_SUCCESS:
+ if resp.status in HTTP_SUCCESS + HTTP_REDIRECTION:
cls.expected_success(schema['status_code'], resp.status)
# Check the body of a response
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/common/ssh.py new/tempest-lib-0.9.0/tempest_lib/common/ssh.py
--- old/tempest-lib-0.6.1/tempest_lib/common/ssh.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/common/ssh.py 2015-09-16 12:29:59.000000000 +0200
@@ -143,7 +143,7 @@
if 0 != exit_status:
raise exceptions.SSHExecCommandFailed(
command=cmd, exit_status=exit_status,
- strerror=''.join(err_data))
+ stderr=err_data, stdout=out_data)
return ''.join(out_data)
def test_connection_auth(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/exceptions.py new/tempest-lib-0.9.0/tempest_lib/exceptions.py
--- old/tempest-lib-0.6.1/tempest_lib/exceptions.py 2015-06-24 07:55:35.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/exceptions.py 2015-09-16 12:29:59.000000000 +0200
@@ -48,82 +48,100 @@
class RestClientException(TempestException,
testtools.TestCase.failureException):
def __init__(self, resp_body=None, *args, **kwargs):
+ if 'resp' in kwargs:
+ self.resp = kwargs.get('resp')
self.resp_body = resp_body
message = kwargs.get("message", resp_body)
super(RestClientException, self).__init__(message, *args, **kwargs)
-class InvalidHttpSuccessCode(RestClientException):
+class OtherRestClientException(RestClientException):
+ pass
+
+
+class ServerRestClientException(RestClientException):
+ pass
+
+
+class ClientRestClientException(RestClientException):
+ pass
+
+
+class InvalidHttpSuccessCode(OtherRestClientException):
message = "The success code is different than the expected one"
-class NotFound(RestClientException):
+class NotFound(ClientRestClientException):
message = "Object not found"
-class Unauthorized(RestClientException):
+class Unauthorized(ClientRestClientException):
message = 'Unauthorized'
-class Forbidden(RestClientException):
+class Forbidden(ClientRestClientException):
message = "Forbidden"
-class TimeoutException(RestClientException):
+class TimeoutException(OtherRestClientException):
message = "Request timed out"
-class BadRequest(RestClientException):
+class BadRequest(ClientRestClientException):
message = "Bad request"
-class UnprocessableEntity(RestClientException):
+class UnprocessableEntity(ClientRestClientException):
message = "Unprocessable entity"
-class RateLimitExceeded(RestClientException):
+class RateLimitExceeded(ClientRestClientException):
message = "Rate limit exceeded"
-class OverLimit(RestClientException):
+class OverLimit(ClientRestClientException):
message = "Quota exceeded"
-class ServerFault(RestClientException):
+class ServerFault(ServerRestClientException):
message = "Got server fault"
-class NotImplemented(RestClientException):
+class NotImplemented(ServerRestClientException):
message = "Got NotImplemented error"
-class Conflict(RestClientException):
+class Conflict(ClientRestClientException):
message = "An object with that identifier already exists"
-class ResponseWithNonEmptyBody(RestClientException):
+class ResponseWithNonEmptyBody(OtherRestClientException):
message = ("RFC Violation! Response with %(status)d HTTP Status Code "
"MUST NOT have a body")
-class ResponseWithEntity(RestClientException):
+class ResponseWithEntity(OtherRestClientException):
message = ("RFC Violation! Response with 205 HTTP Status Code "
"MUST NOT have an entity")
-class InvalidHTTPResponseBody(RestClientException):
+class InvalidHTTPResponseBody(OtherRestClientException):
message = "HTTP response body is invalid json or xml"
-class InvalidHTTPResponseHeader(RestClientException):
+class InvalidHTTPResponseHeader(OtherRestClientException):
message = "HTTP response header is invalid"
-class InvalidContentType(RestClientException):
+class InvalidContentType(ClientRestClientException):
message = "Invalid content type provided"
-class UnexpectedResponseCode(RestClientException):
+class UnexpectedContentType(OtherRestClientException):
+ message = "Unexpected content type provided"
+
+
+class UnexpectedResponseCode(OtherRestClientException):
message = "Unexpected response code received"
@@ -168,4 +186,5 @@
class SSHExecCommandFailed(TempestException):
"""Raised when remotely executed command returns nonzero status."""
message = ("Command '%(command)s', exit status: %(exit_status)d, "
- "Error:\n%(strerror)s")
+ "stderr:\n%(stderr)s\n"
+ "stdout:\n%(stdout)s")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/services/compute/agents_client.py new/tempest-lib-0.9.0/tempest_lib/services/compute/agents_client.py
--- old/tempest-lib-0.6.1/tempest_lib/services/compute/agents_client.py 1970-01-01 01:00:00.000000000 +0100
+++ new/tempest-lib-0.9.0/tempest_lib/services/compute/agents_client.py 2015-09-16 12:30:00.000000000 +0200
@@ -0,0 +1,54 @@
+# Copyright 2014 NEC Corporation. All rights reserved.
+#
+# 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.
+
+from oslo_serialization import jsonutils as json
+from six.moves.urllib import parse as urllib
+
+from tempest_lib.api_schema.response.compute.v2_1 import agents as schema
+from tempest_lib.common import rest_client
+
+
+class AgentsClient(rest_client.RestClient):
+ """Tests Agents API"""
+
+ def list_agents(self, **params):
+ """List all agent builds."""
+ url = 'os-agents'
+ if params:
+ url += '?%s' % urllib.urlencode(params)
+ resp, body = self.get(url)
+ body = json.loads(body)
+ self.validate_response(schema.list_agents, resp, body)
+ return rest_client.ResponseBody(resp, body)
+
+ def create_agent(self, **kwargs):
+ """Create an agent build."""
+ post_body = json.dumps({'agent': kwargs})
+ resp, body = self.post('os-agents', post_body)
+ body = json.loads(body)
+ self.validate_response(schema.create_agent, resp, body)
+ return rest_client.ResponseBody(resp, body)
+
+ def delete_agent(self, agent_id):
+ """Delete an existing agent build."""
+ resp, body = self.delete("os-agents/%s" % agent_id)
+ self.validate_response(schema.delete_agent, resp, body)
+ return rest_client.ResponseBody(resp, body)
+
+ def update_agent(self, agent_id, **kwargs):
+ """Update an agent build."""
+ put_body = json.dumps({'para': kwargs})
+ resp, body = self.put('os-agents/%s' % agent_id, put_body)
+ body = json.loads(body)
+ return rest_client.ResponseBody(resp, body)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/services/identity/v2/token_client.py new/tempest-lib-0.9.0/tempest_lib/services/identity/v2/token_client.py
--- old/tempest-lib-0.6.1/tempest_lib/services/identity/v2/token_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/services/identity/v2/token_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -13,16 +13,19 @@
# under the License.
import json
+
+from oslo_log import log as logging
+
from tempest_lib.common import rest_client
from tempest_lib import exceptions
-class TokenClientJSON(rest_client.RestClient):
+class TokenClient(rest_client.RestClient):
def __init__(self, auth_url, disable_ssl_certificate_validation=None,
ca_certs=None, trace_requests=None):
dscv = disable_ssl_certificate_validation
- super(TokenClientJSON, self).__init__(
+ super(TokenClient, self).__init__(
None, None, None, disable_ssl_certificate_validation=dscv,
ca_certs=ca_certs, trace_requests=trace_requests)
@@ -85,15 +88,13 @@
self._log_request(method, url, resp)
if resp.status in [401, 403]:
- resp_body = json.loads(resp_body)
+ resp_body = self._json_loads(resp_body)
raise exceptions.Unauthorized(resp_body['error']['message'])
elif resp.status not in [200, 201]:
raise exceptions.IdentityError(
'Unexpected status code {0}'.format(resp.status))
- if isinstance(resp_body, str):
- resp_body = json.loads(resp_body)
- return resp, resp_body
+ return resp, self._json_loads(resp_body)
def get_token(self, user, password, tenant, auth_data=False):
"""Returns (token id, token data) for supplied credentials."""
@@ -103,3 +104,15 @@
return body['token']['id'], body
else:
return body['token']['id']
+
+
+class TokenClientJSON(TokenClient):
+ LOG = logging.getLogger(__name__)
+
+ def _warn(self):
+ self.LOG.warning("%s class was deprecated and renamed to %s" %
+ (self.__class__.__name__, 'TokenClient'))
+
+ def __init__(self, *args, **kwargs):
+ self._warn()
+ super(TokenClientJSON, self).__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/services/identity/v3/token_client.py new/tempest-lib-0.9.0/tempest_lib/services/identity/v3/token_client.py
--- old/tempest-lib-0.6.1/tempest_lib/services/identity/v3/token_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/services/identity/v3/token_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -13,16 +13,19 @@
# under the License.
import json
+
+from oslo_log import log as logging
+
from tempest_lib.common import rest_client
from tempest_lib import exceptions
-class V3TokenClientJSON(rest_client.RestClient):
+class V3TokenClient(rest_client.RestClient):
def __init__(self, auth_url, disable_ssl_certificate_validation=None,
ca_certs=None, trace_requests=None):
dscv = disable_ssl_certificate_validation
- super(V3TokenClientJSON, self).__init__(
+ super(V3TokenClient, self).__init__(
None, None, None, disable_ssl_certificate_validation=dscv,
ca_certs=ca_certs, trace_requests=trace_requests)
@@ -135,13 +138,13 @@
self._log_request(method, url, resp)
if resp.status in [401, 403]:
- resp_body = json.loads(resp_body)
+ resp_body = self._json_loads(resp_body)
raise exceptions.Unauthorized(resp_body['error']['message'])
elif resp.status not in [200, 201, 204]:
raise exceptions.IdentityError(
'Unexpected status code {0}'.format(resp.status))
- return resp, json.loads(resp_body)
+ return resp, self._json_loads(resp_body)
def get_token(self, **kwargs):
"""Returns (token id, token data) for supplied credentials"""
@@ -163,3 +166,15 @@
return token, body['token']
else:
return token
+
+
+class V3TokenClientJSON(V3TokenClient):
+ LOG = logging.getLogger(__name__)
+
+ def _warn(self):
+ self.LOG.warning("%s class was deprecated and renamed to %s" %
+ (self.__class__.__name__, 'V3TokenClient'))
+
+ def __init__(self, *args, **kwargs):
+ self._warn()
+ super(V3TokenClientJSON, self).__init__(*args, **kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/cli/test_execute.py new/tempest-lib-0.9.0/tempest_lib/tests/cli/test_execute.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/cli/test_execute.py 1970-01-01 01:00:00.000000000 +0100
+++ new/tempest-lib-0.9.0/tempest_lib/tests/cli/test_execute.py 2015-09-16 12:30:00.000000000 +0200
@@ -0,0 +1,31 @@
+#
+# 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.
+
+
+from tempest_lib.cli import base as cli_base
+from tempest_lib.tests import base
+
+
+class TestExecute(base.TestCase):
+ def test_execute_success(self):
+ result = cli_base.execute("/bin/ls", action="tempest_lib",
+ flags="-l -a")
+ self.assertIsInstance(result, str)
+ self.assertIn("__init__.py", result)
+
+ def test_execute_failure(self):
+ result = cli_base.execute("/bin/ls", action="tempest_lib",
+ flags="--foobar", merge_stderr=True,
+ fail_ok=True)
+ self.assertIsInstance(result, str)
+ self.assertIn("--foobar", result)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/services/compute/base.py new/tempest-lib-0.9.0/tempest_lib/tests/services/compute/base.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/services/compute/base.py 1970-01-01 01:00:00.000000000 +0100
+++ new/tempest-lib-0.9.0/tempest_lib/tests/services/compute/base.py 2015-09-16 12:30:00.000000000 +0200
@@ -0,0 +1,43 @@
+# Copyright 2015 Deutsche Telekom AG. All rights reserved.
+#
+# 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 httplib2
+
+from oslo_serialization import jsonutils as json
+from oslotest import mockpatch
+
+from tempest_lib.tests import base
+
+
+class BaseComputeServiceTest(base.TestCase):
+ def create_response(self, body, to_utf=False, status=200):
+ json_body = {}
+ if body:
+ json_body = json.dumps(body)
+ if to_utf:
+ json_body = json_body.encode('utf-8')
+ response = (httplib2.Response({'status': status}), json_body)
+ return response
+
+ def check_service_client_function(self, function, function2mock,
+ body, to_utf=False, status=200,
+ **kwargs):
+ mocked_response = self.create_response(body, to_utf, status)
+ self.useFixture(mockpatch.Patch(
+ function2mock, return_value=mocked_response))
+ if kwargs:
+ resp = function(**kwargs)
+ else:
+ resp = function()
+ self.assertEqual(body, resp)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/services/compute/test_agents_client.py new/tempest-lib-0.9.0/tempest_lib/tests/services/compute/test_agents_client.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/services/compute/test_agents_client.py 1970-01-01 01:00:00.000000000 +0100
+++ new/tempest-lib-0.9.0/tempest_lib/tests/services/compute/test_agents_client.py 2015-09-16 12:30:00.000000000 +0200
@@ -0,0 +1,106 @@
+# Copyright 2015 NEC Corporation. All rights reserved.
+#
+# 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.
+
+from tempest_lib.services.compute import agents_client
+from tempest_lib.tests import fake_auth_provider
+from tempest_lib.tests.services.compute import base
+
+
+class TestAgentsClient(base.BaseComputeServiceTest):
+ FAKE_CREATE_AGENT = {
+ "agent": {
+ "url": "http://foo.com",
+ "hypervisor": "kvm",
+ "md5hash": "md5",
+ "version": "2",
+ "architecture": "x86_64",
+ "os": "linux",
+ "agent_id": 1
+ }
+ }
+
+ FAKE_UPDATE_AGENT = {
+ "agent": {
+ "url": "http://foo.com",
+ "hypervisor": "kvm",
+ "md5hash": "md5",
+ "version": "2",
+ "architecture": "x86_64",
+ "os": "linux",
+ "agent_id": 1
+ }
+ }
+
+ def setUp(self):
+ super(TestAgentsClient, self).setUp()
+ fake_auth = fake_auth_provider.FakeAuthProvider()
+ self.client = agents_client.AgentsClient(fake_auth,
+ 'compute', 'regionOne')
+
+ def _test_list_agents(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.list_agents,
+ 'tempest_lib.common.rest_client.RestClient.get',
+ {"agents": []},
+ bytes_body)
+ self.check_service_client_function(
+ self.client.list_agents,
+ 'tempest_lib.common.rest_client.RestClient.get',
+ {"agents": []},
+ bytes_body,
+ hypervisor="kvm")
+
+ def _test_create_agent(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.create_agent,
+ 'tempest_lib.common.rest_client.RestClient.post',
+ self.FAKE_CREATE_AGENT,
+ bytes_body,
+ url="http://foo.com", hypervisor="kvm", md5hash="md5",
+ version="2", architecture="x86_64", os="linux")
+
+ def _test_delete_agent(self):
+ self.check_service_client_function(
+ self.client.delete_agent,
+ 'tempest_lib.common.rest_client.RestClient.delete',
+ {}, agent_id="1")
+
+ def _test_update_agent(self, bytes_body=False):
+ self.check_service_client_function(
+ self.client.update_agent,
+ 'tempest_lib.common.rest_client.RestClient.put',
+ self.FAKE_UPDATE_AGENT,
+ bytes_body,
+ agent_id="1", url="http://foo.com", md5hash="md5", version="2")
+
+ def test_list_agents_with_str_body(self):
+ self._test_list_agents()
+
+ def test_list_agents_with_bytes_body(self):
+ self._test_list_agents(bytes_body=True)
+
+ def test_create_agent_with_str_body(self):
+ self._test_create_agent()
+
+ def test_create_agent_with_bytes_body(self):
+ self._test_create_agent(bytes_body=True)
+
+ def test_delete_agent(self):
+ self._test_delete_agent()
+
+ def test_update_agent_with_str_body(self):
+ self._test_update_agent()
+
+ def test_update_agent_with_bytes_body(self):
+ self._test_update_agent(bytes_body=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/services/identity/v2/test_token_client.py new/tempest-lib-0.9.0/tempest_lib/tests/services/identity/v2/test_token_client.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/services/identity/v2/test_token_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/tests/services/identity/v2/test_token_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -14,6 +14,7 @@
import json
+import httplib2
from oslotest import mockpatch
from tempest_lib.common import rest_client
@@ -29,7 +30,7 @@
self.fake_200_http = fake_http.fake_httplib2(return_type=200)
def test_auth(self):
- token_client_v2 = token_client.TokenClientJSON('fake_url')
+ token_client_v2 = token_client.TokenClient('fake_url')
post_mock = self.useFixture(mockpatch.PatchObject(
token_client_v2, 'post', return_value=self.fake_200_http.request(
'fake_url', body={'access': {'token': 'fake_token'}})))
@@ -47,7 +48,7 @@
body=req_dict)
def test_auth_with_tenant(self):
- token_client_v2 = token_client.TokenClientJSON('fake_url')
+ token_client_v2 = token_client.TokenClient('fake_url')
post_mock = self.useFixture(mockpatch.PatchObject(
token_client_v2, 'post', return_value=self.fake_200_http.request(
'fake_url', body={'access': {'token': 'fake_token'}})))
@@ -64,3 +65,23 @@
})
post_mock.mock.assert_called_once_with('fake_url/tokens',
body=req_dict)
+
+ def test_request_with_str_body(self):
+ token_client_v2 = token_client.TokenClient('fake_url')
+ self.useFixture(mockpatch.PatchObject(
+ token_client_v2, 'raw_request', return_value=(
+ httplib2.Response({'status': '200'}),
+ str('{"access": {"token": "fake_token"}}'))))
+ resp, body = token_client_v2.request('GET', 'fake_uri')
+ self.assertIsInstance(resp, httplib2.Response)
+ self.assertIsInstance(body, dict)
+
+ def test_request_with_bytes_body(self):
+ token_client_v2 = token_client.TokenClient('fake_url')
+ self.useFixture(mockpatch.PatchObject(
+ token_client_v2, 'raw_request', return_value=(
+ httplib2.Response({'status': '200'}),
+ bytes(b'{"access": {"token": "fake_token"}}'))))
+ resp, body = token_client_v2.request('GET', 'fake_uri')
+ self.assertIsInstance(resp, httplib2.Response)
+ self.assertIsInstance(body, dict)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/services/identity/v3/test_token_client.py new/tempest-lib-0.9.0/tempest_lib/tests/services/identity/v3/test_token_client.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/services/identity/v3/test_token_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/tests/services/identity/v3/test_token_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -14,6 +14,7 @@
import json
+import httplib2
from oslotest import mockpatch
from tempest_lib.common import rest_client
@@ -29,7 +30,7 @@
self.fake_201_http = fake_http.fake_httplib2(return_type=201)
def test_auth(self):
- token_client_v3 = token_client.V3TokenClientJSON('fake_url')
+ token_client_v3 = token_client.V3TokenClient('fake_url')
post_mock = self.useFixture(mockpatch.PatchObject(
token_client_v3, 'post', return_value=self.fake_201_http.request(
'fake_url', body={'access': {'token': 'fake_token'}})))
@@ -52,7 +53,7 @@
body=req_dict)
def test_auth_with_tenant(self):
- token_client_v2 = token_client.V3TokenClientJSON('fake_url')
+ token_client_v2 = token_client.V3TokenClient('fake_url')
post_mock = self.useFixture(mockpatch.PatchObject(
token_client_v2, 'post', return_value=self.fake_201_http.request(
'fake_url', body={'access': {'token': 'fake_token'}})))
@@ -79,3 +80,23 @@
post_mock.mock.assert_called_once_with('fake_url/auth/tokens',
body=req_dict)
+
+ def test_request_with_str_body(self):
+ token_client_v3 = token_client.V3TokenClient('fake_url')
+ self.useFixture(mockpatch.PatchObject(
+ token_client_v3, 'raw_request', return_value=(
+ httplib2.Response({"status": "200"}),
+ str('{"access": {"token": "fake_token"}}'))))
+ resp, body = token_client_v3.request('GET', 'fake_uri')
+ self.assertIsInstance(resp, httplib2.Response)
+ self.assertIsInstance(body, dict)
+
+ def test_request_with_bytes_body(self):
+ token_client_v3 = token_client.V3TokenClient('fake_url')
+ self.useFixture(mockpatch.PatchObject(
+ token_client_v3, 'raw_request', return_value=(
+ httplib2.Response({"status": "200"}),
+ bytes(b'{"access": {"token": "fake_token"}}'))))
+ resp, body = token_client_v3.request('GET', 'fake_uri')
+ self.assertIsInstance(resp, httplib2.Response)
+ self.assertIsInstance(body, dict)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/test_auth.py new/tempest-lib-0.9.0/tempest_lib/tests/test_auth.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/test_auth.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/tests/test_auth.py 2015-09-16 12:29:59.000000000 +0200
@@ -120,7 +120,7 @@
def setUp(self):
super(TestKeystoneV2AuthProvider, self).setUp()
- self.stubs.Set(v2_client.TokenClientJSON, 'raw_request',
+ self.stubs.Set(v2_client.TokenClient, 'raw_request',
fake_identity._fake_v2_response)
self.target_url = 'test_api'
@@ -341,7 +341,7 @@
def setUp(self):
super(TestKeystoneV3AuthProvider, self).setUp()
- self.stubs.Set(v3_client.V3TokenClientJSON, 'raw_request',
+ self.stubs.Set(v3_client.V3TokenClient, 'raw_request',
fake_identity._fake_v3_response)
def _get_fake_alt_identity(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/test_credentials.py new/tempest-lib-0.9.0/tempest_lib/tests/test_credentials.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/test_credentials.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/tests/test_credentials.py 2015-09-16 12:29:59.000000000 +0200
@@ -67,7 +67,7 @@
identity_response = fake_identity._fake_v2_response
credentials_class = auth.KeystoneV2Credentials
- tokenclient_class = v2_client.TokenClientJSON
+ tokenclient_class = v2_client.TokenClient
identity_version = 'v2'
def setUp(self):
@@ -147,7 +147,7 @@
credentials_class = auth.KeystoneV3Credentials
identity_response = fake_identity._fake_v3_response
- tokenclient_class = v3_client.V3TokenClientJSON
+ tokenclient_class = v3_client.V3TokenClient
identity_version = 'v3'
def test_is_not_valid(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib/tests/test_rest_client.py new/tempest-lib-0.9.0/tempest_lib/tests/test_rest_client.py
--- old/tempest-lib-0.6.1/tempest_lib/tests/test_rest_client.py 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib/tests/test_rest_client.py 2015-09-16 12:29:59.000000000 +0200
@@ -12,6 +12,7 @@
# License for the specific language governing permissions and limitations
# under the License.
+import copy
import json
import httplib2
@@ -306,67 +307,56 @@
def test_response_less_than_400(self):
self.rest_client._error_checker(**self.set_data("399"))
+ def _test_error_checker(self, exception_type, data):
+ e = self.assertRaises(exception_type,
+ self.rest_client._error_checker,
+ **data)
+ self.assertEqual(e.resp, data['resp'])
+ self.assertTrue(hasattr(e, 'resp_body'))
+ return e
+
def test_response_400(self):
- self.assertRaises(exceptions.BadRequest,
- self.rest_client._error_checker,
- **self.set_data("400"))
+ self._test_error_checker(exceptions.BadRequest, self.set_data("400"))
def test_response_401(self):
- self.assertRaises(exceptions.Unauthorized,
- self.rest_client._error_checker,
- **self.set_data("401"))
+ self._test_error_checker(exceptions.Unauthorized, self.set_data("401"))
def test_response_403(self):
- self.assertRaises(exceptions.Forbidden,
- self.rest_client._error_checker,
- **self.set_data("403"))
+ self._test_error_checker(exceptions.Forbidden, self.set_data("403"))
def test_response_404(self):
- self.assertRaises(exceptions.NotFound,
- self.rest_client._error_checker,
- **self.set_data("404"))
+ self._test_error_checker(exceptions.NotFound, self.set_data("404"))
def test_response_409(self):
- self.assertRaises(exceptions.Conflict,
- self.rest_client._error_checker,
- **self.set_data("409"))
+ self._test_error_checker(exceptions.Conflict, self.set_data("409"))
def test_response_413(self):
- self.assertRaises(exceptions.OverLimit,
- self.rest_client._error_checker,
- **self.set_data("413"))
+ self._test_error_checker(exceptions.OverLimit, self.set_data("413"))
def test_response_413_without_absolute_limit(self):
- self.assertRaises(exceptions.RateLimitExceeded,
- self.rest_client._error_checker,
- **self.set_data("413", absolute_limit=False))
+ self._test_error_checker(exceptions.RateLimitExceeded,
+ self.set_data("413", absolute_limit=False))
def test_response_415(self):
- self.assertRaises(exceptions.InvalidContentType,
- self.rest_client._error_checker,
- **self.set_data("415"))
+ self._test_error_checker(exceptions.InvalidContentType,
+ self.set_data("415"))
def test_response_422(self):
- self.assertRaises(exceptions.UnprocessableEntity,
- self.rest_client._error_checker,
- **self.set_data("422"))
+ self._test_error_checker(exceptions.UnprocessableEntity,
+ self.set_data("422"))
def test_response_500_with_text(self):
# _parse_resp is expected to return 'str'
- self.assertRaises(exceptions.ServerFault,
- self.rest_client._error_checker,
- **self.set_data("500"))
+ self._test_error_checker(exceptions.ServerFault, self.set_data("500"))
def test_response_501_with_text(self):
- self.assertRaises(exceptions.NotImplemented,
- self.rest_client._error_checker,
- **self.set_data("501"))
+ self._test_error_checker(exceptions.NotImplemented,
+ self.set_data("501"))
def test_response_400_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.BadRequest,
- self.rest_client._error_checker,
- **self.set_data("400", r_body=r_body))
+ e = self._test_error_checker(exceptions.BadRequest,
+ self.set_data("400", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -376,9 +366,8 @@
def test_response_401_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.Unauthorized,
- self.rest_client._error_checker,
- **self.set_data("401", r_body=r_body))
+ e = self._test_error_checker(exceptions.Unauthorized,
+ self.set_data("401", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -388,9 +377,8 @@
def test_response_403_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.Forbidden,
- self.rest_client._error_checker,
- **self.set_data("403", r_body=r_body))
+ e = self._test_error_checker(exceptions.Forbidden,
+ self.set_data("403", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -400,9 +388,8 @@
def test_response_404_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.NotFound,
- self.rest_client._error_checker,
- **self.set_data("404", r_body=r_body))
+ e = self._test_error_checker(exceptions.NotFound,
+ self.set_data("404", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -412,18 +399,16 @@
def test_response_404_with_invalid_dict(self):
r_body = '{"foo": "bar"]'
- e = self.assertRaises(exceptions.NotFound,
- self.rest_client._error_checker,
- **self.set_data("404", r_body=r_body))
+ e = self._test_error_checker(exceptions.NotFound,
+ self.set_data("404", r_body=r_body))
expected = r_body
self.assertEqual(expected, e.resp_body)
def test_response_409_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.Conflict,
- self.rest_client._error_checker,
- **self.set_data("409", r_body=r_body))
+ e = self._test_error_checker(exceptions.Conflict,
+ self.set_data("409", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -433,9 +418,8 @@
def test_response_500_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- e = self.assertRaises(exceptions.ServerFault,
- self.rest_client._error_checker,
- **self.set_data("500", r_body=r_body))
+ e = self._test_error_checker(exceptions.ServerFault,
+ self.set_data("500", r_body=r_body))
if self.c_type == 'application/json':
expected = {"err": "fake_resp_body"}
@@ -445,16 +429,14 @@
def test_response_501_with_dict(self):
r_body = '{"resp_body": {"err": "fake_resp_body"}}'
- self.assertRaises(exceptions.NotImplemented,
- self.rest_client._error_checker,
- **self.set_data("501", r_body=r_body))
+ self._test_error_checker(exceptions.NotImplemented,
+ self.set_data("501", r_body=r_body))
def test_response_bigger_than_400(self):
# Any response code, that bigger than 400, and not in
# (401, 403, 404, 409, 413, 422, 500, 501)
- self.assertRaises(exceptions.UnexpectedResponseCode,
- self.rest_client._error_checker,
- **self.set_data("402"))
+ self._test_error_checker(exceptions.UnexpectedResponseCode,
+ self.set_data("402"))
class TestRestClientErrorCheckerTEXT(TestRestClientErrorCheckerJSON):
@@ -464,9 +446,8 @@
# This test is required only in one exemplar
# Any response code, that bigger than 400, and not in
# (401, 403, 404, 409, 413, 422, 500, 501)
- self.assertRaises(exceptions.InvalidContentType,
- self.rest_client._error_checker,
- **self.set_data("405", enc="fake_enc"))
+ self._test_error_checker(exceptions.UnexpectedContentType,
+ self.set_data("405", enc="fake_enc"))
def test_response_413_without_absolute_limit(self):
# Skip this test because rest_client cannot get overLimit message
@@ -691,9 +672,15 @@
}
}
- def test_validate_pass(self):
+ def test_validate_pass_with_http_success_code(self):
+ body = {'foo': 12}
+ self._test_validate_pass(self.schema, body, status=200)
+
+ def test_validate_pass_with_http_redirect_code(self):
body = {'foo': 12}
- self._test_validate_pass(self.schema, body)
+ schema = copy.deepcopy(self.schema)
+ schema['status_code'] = 300
+ self._test_validate_pass(schema, body, status=300)
def test_validate_not_http_success_code(self):
schema = {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib.egg-info/PKG-INFO new/tempest-lib-0.9.0/tempest_lib.egg-info/PKG-INFO
--- old/tempest-lib-0.6.1/tempest_lib.egg-info/PKG-INFO 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib.egg-info/PKG-INFO 2015-09-16 12:30:44.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: tempest-lib
-Version: 0.6.1
+Version: 0.9.0
Summary: OpenStack Functional Testing Library
Home-page: http://www.openstack.org/
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib.egg-info/SOURCES.txt new/tempest-lib-0.9.0/tempest_lib.egg-info/SOURCES.txt
--- old/tempest-lib-0.6.1/tempest_lib.egg-info/SOURCES.txt 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib.egg-info/SOURCES.txt 2015-09-16 12:30:44.000000000 +0200
@@ -37,6 +37,11 @@
tempest_lib.egg-info/pbr.json
tempest_lib.egg-info/requires.txt
tempest_lib.egg-info/top_level.txt
+tempest_lib/api_schema/__init__.py
+tempest_lib/api_schema/response/__init__.py
+tempest_lib/api_schema/response/compute/__init__.py
+tempest_lib/api_schema/response/compute/v2_1/__init__.py
+tempest_lib/api_schema/response/compute/v2_1/agents.py
tempest_lib/cli/__init__.py
tempest_lib/cli/base.py
tempest_lib/cli/output_parser.py
@@ -50,6 +55,8 @@
tempest_lib/common/utils/data_utils.py
tempest_lib/common/utils/misc.py
tempest_lib/services/__init__.py
+tempest_lib/services/compute/__init__.py
+tempest_lib/services/compute/agents_client.py
tempest_lib/services/identity/__init__.py
tempest_lib/services/identity/v2/__init__.py
tempest_lib/services/identity/v2/token_client.py
@@ -70,12 +77,16 @@
tempest_lib/tests/test_tempest_lib.py
tempest_lib/tests/cli/__init__.py
tempest_lib/tests/cli/test_command_failed.py
+tempest_lib/tests/cli/test_execute.py
tempest_lib/tests/cli/test_output_parser.py
tempest_lib/tests/common/__init__.py
tempest_lib/tests/common/utils/__init__.py
tempest_lib/tests/common/utils/test_data_utils.py
tempest_lib/tests/common/utils/test_misc.py
tempest_lib/tests/services/__init__.py
+tempest_lib/tests/services/compute/__init__.py
+tempest_lib/tests/services/compute/base.py
+tempest_lib/tests/services/compute/test_agents_client.py
tempest_lib/tests/services/identity/v2/__init__.py
tempest_lib/tests/services/identity/v2/test_token_client.py
tempest_lib/tests/services/identity/v3/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib.egg-info/pbr.json new/tempest-lib-0.9.0/tempest_lib.egg-info/pbr.json
--- old/tempest-lib-0.6.1/tempest_lib.egg-info/pbr.json 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib.egg-info/pbr.json 2015-09-16 12:30:44.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "31662ca"}
\ No newline at end of file
+{"git_version": "b501a03", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tempest_lib.egg-info/requires.txt new/tempest-lib-0.9.0/tempest_lib.egg-info/requires.txt
--- old/tempest-lib-0.6.1/tempest_lib.egg-info/requires.txt 2015-06-24 07:56:19.000000000 +0200
+++ new/tempest-lib-0.9.0/tempest_lib.egg-info/requires.txt 2015-09-16 12:30:44.000000000 +0200
@@ -1,10 +1,10 @@
-pbr<2.0,>=0.11
+pbr<2.0,>=1.6
Babel>=1.3
-fixtures>=0.3.14
+fixtures>=1.3.1
iso8601>=0.1.9
jsonschema!=2.5.0,<3.0.0,>=2.0.0
httplib2>=0.7.5
paramiko>=1.13.0
six>=1.9.0
-oslo.log>=1.2.0 # Apache-2.0
+oslo.log>=1.8.0
os-testr>=0.1.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/test-requirements.txt new/tempest-lib-0.9.0/test-requirements.txt
--- old/tempest-lib-0.6.1/test-requirements.txt 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/test-requirements.txt 2015-09-16 12:29:59.000000000 +0200
@@ -9,9 +9,9 @@
python-subunit>=0.0.18
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2
oslosphinx>=2.5.0 # Apache-2.0
-oslotest>=1.5.1 # Apache-2.0
+oslotest>=1.10.0 # Apache-2.0
testrepository>=0.0.18
testscenarios>=0.4
testtools>=1.4.0
-mock>=1.0
+mock>=1.2
ddt>=0.7.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tempest-lib-0.6.1/tools/migrate_from_tempest.sh new/tempest-lib-0.9.0/tools/migrate_from_tempest.sh
--- old/tempest-lib-0.6.1/tools/migrate_from_tempest.sh 2015-06-24 07:55:34.000000000 +0200
+++ new/tempest-lib-0.9.0/tools/migrate_from_tempest.sh 2015-09-16 12:30:00.000000000 +0200
@@ -49,28 +49,23 @@
cd $tmpdir
for file in $files; do
- # get only commits that touch our files
- commits="$commits $(git log --format=format:%h --no-merges --follow -- $file)"
- # then their merge commits - which works fina since we merge commits
- # individually.
- merge_commits="$merge_commits $(git log --format=format:%h --merges --first-parent -- $file)"
+ # Get the latest change-id for each file
+ change_id=`git log -n1 --grep "Change-Id: " -- $file | grep "Change-Id: " | awk '{print $2}'`
+ CHANGE_LIST=`echo -e "$CHANGE_LIST\n * $file: $change_id"`
done
-pattern="\n$(echo $commits $merge_commits | sed -e 's/ /\\|/g')"
-
-# order them by filtering each one in the order it appears on rev-list
-SHA1_LIST=$(git rev-list --oneline HEAD | grep $pattern)
-
# Move files and commit
cd -
file_list=''
for file in $files; do
filename=`basename $file`
+ dirname=`dirname $file`
if [ -n "$output_dir" ]; then
- dest_file="$output_dir/$filename"
+ dirname="$output_dir"
else
- dest_file="tempest_lib/$filename"
+ dirname=`echo $dirname | sed s@tempest\/@tempest_lib/\@`
fi
+ dest_file="$dirname/$filename"
cp -r "$tmpdir/$file" "$dest_file"
git add "$dest_file"
if [[ -z "$file_list" ]]; then
@@ -86,4 +81,4 @@
commit_message="Migrated $file_list from tempest"
pre_list=$"This migrates the above files from tempest. This includes tempest commits:"
post_list=$"to see the commit history for these files refer to the above sha1s in the tempest repository"
-git commit -m "$commit_message" -m "$pre_list" -m "$SHA1_LIST" -m "$post_list"
+git commit -m "$commit_message" -m "$pre_list" -m "$CHANGE_LIST" -m "$post_list"
1
0
Hello community,
here is the log from the commit of package python-oslo.concurrency for openSUSE:Factory checked in at 2015-10-30 13:42:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-oslo.concurrency (Old)
and /work/SRC/openSUSE:Factory/.python-oslo.concurrency.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-oslo.concurrency"
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-oslo.concurrency/python-oslo.concurrency.changes 2015-08-29 20:05:07.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-oslo.concurrency.new/python-oslo.concurrency.changes 2015-10-30 13:42:30.000000000 +0100
@@ -1,0 +2,8 @@
+Wed Sep 9 06:59:22 UTC 2015 - tbechtold(a)suse.com
+
+- update to 2.6.0:
+ * Removes unused posix-ipc requirement
+ * Updated from global requirements
+- Adjust Requires according to requirements.txt
+
+-------------------------------------------------------------------
Old:
----
oslo.concurrency-2.5.0.tar.gz
New:
----
oslo.concurrency-2.6.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-oslo.concurrency.spec ++++++
--- /var/tmp/diff_new_pack.OUsbat/_old 2015-10-30 13:42:30.000000000 +0100
+++ /var/tmp/diff_new_pack.OUsbat/_new 2015-10-30 13:42:30.000000000 +0100
@@ -17,7 +17,7 @@
Name: python-oslo.concurrency
-Version: 2.5.0
+Version: 2.6.0
Release: 0
Summary: OpenStack Oslo concurrency library
License: Apache-2.0
@@ -43,10 +43,9 @@
Requires: python-Babel >= 1.3
Requires: python-fasteners >= 0.7
Requires: python-iso8601 >= 0.1.9
-Requires: python-oslo.config >= 2.1.0
+Requires: python-oslo.config >= 2.3.0
Requires: python-oslo.i18n >= 1.5.0
Requires: python-oslo.utils >= 2.0.0
-Requires: python-posix_ipc
Requires: python-retrying >= 1.2.3
Requires: python-six >= 1.9.0
BuildRoot: %{_tmppath}/%{name}-%{version}-build
++++++ oslo.concurrency-2.5.0.tar.gz -> oslo.concurrency-2.6.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/AUTHORS new/oslo.concurrency-2.6.0/AUTHORS
--- old/oslo.concurrency-2.5.0/AUTHORS 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/AUTHORS 2015-09-08 17:37:50.000000000 +0200
@@ -13,6 +13,7 @@
ChangBo Guo(gcb) <eric.guo(a)easystack.cn>
Christian Berendt <berendt(a)b1-systems.de>
Chuck Short <chuck.short(a)canonical.com>
+Claudiu Belu <cbelu(a)cloudbasesolutions.com>
Csaba Henk <chenk(a)redhat.com>
Dan Prince <dprince(a)redhat.com>
Daniel P. Berrange <berrange(a)redhat.com>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/ChangeLog new/oslo.concurrency-2.6.0/ChangeLog
--- old/oslo.concurrency-2.5.0/ChangeLog 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/ChangeLog 2015-09-08 17:37:50.000000000 +0200
@@ -1,6 +1,13 @@
CHANGES
=======
+2.6.0
+-----
+
+* Removes unused posix-ipc requirement
+* Updated from global requirements
+* Updated from global requirements
+
2.5.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/PKG-INFO new/oslo.concurrency-2.6.0/PKG-INFO
--- old/oslo.concurrency-2.5.0/PKG-INFO 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/PKG-INFO 2015-09-08 17:37:50.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.concurrency
-Version: 2.5.0
+Version: 2.6.0
Summary: Oslo Concurrency library
Home-page: http://launchpad.net/oslo
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/PKG-INFO new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/PKG-INFO
--- old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/PKG-INFO 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/PKG-INFO 2015-09-08 17:37:50.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: oslo.concurrency
-Version: 2.5.0
+Version: 2.6.0
Summary: Oslo Concurrency library
Home-page: http://launchpad.net/oslo
Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/pbr.json new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/pbr.json
--- old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/pbr.json 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/pbr.json 2015-09-08 17:37:50.000000000 +0200
@@ -1 +1 @@
-{"is_release": true, "git_version": "03df698"}
\ No newline at end of file
+{"git_version": "efb6c06", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/requires.txt new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/requires.txt
--- old/oslo.concurrency-2.5.0/oslo.concurrency.egg-info/requires.txt 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/oslo.concurrency.egg-info/requires.txt 2015-09-08 17:37:50.000000000 +0200
@@ -1,10 +1,9 @@
-pbr<2.0,>=1.4
+pbr<2.0,>=1.6
Babel>=1.3
iso8601>=0.1.9
-oslo.config>=2.1.0 # Apache-2.0
-oslo.i18n>=1.5.0 # Apache-2.0
-oslo.utils>=2.0.0 # Apache-2.0
-posix-ipc
+oslo.config>=2.3.0
+oslo.i18n>=1.5.0
+oslo.utils>=2.0.0
six>=1.9.0
-fasteners>=0.7 # Apache-2.0
-retrying!=1.3.0,>=1.2.3 # Apache-2.0
+fasteners>=0.7
+retrying!=1.3.0,>=1.2.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/requirements.txt new/oslo.concurrency-2.6.0/requirements.txt
--- old/oslo.concurrency-2.5.0/requirements.txt 2015-08-24 23:32:00.000000000 +0200
+++ new/oslo.concurrency-2.6.0/requirements.txt 2015-09-08 17:37:16.000000000 +0200
@@ -2,13 +2,12 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
-pbr<2.0,>=1.4
+pbr<2.0,>=1.6
Babel>=1.3
iso8601>=0.1.9
-oslo.config>=2.1.0 # Apache-2.0
+oslo.config>=2.3.0 # Apache-2.0
oslo.i18n>=1.5.0 # Apache-2.0
oslo.utils>=2.0.0 # Apache-2.0
-posix-ipc
six>=1.9.0
fasteners>=0.7 # Apache-2.0
retrying!=1.3.0,>=1.2.3 # Apache-2.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/oslo.concurrency-2.5.0/setup.cfg new/oslo.concurrency-2.6.0/setup.cfg
--- old/oslo.concurrency-2.5.0/setup.cfg 2015-08-24 23:32:31.000000000 +0200
+++ new/oslo.concurrency-2.6.0/setup.cfg 2015-09-08 17:37:50.000000000 +0200
@@ -59,7 +59,7 @@
universal = 1
[egg_info]
+tag_date = 0
tag_build =
tag_svn_revision = 0
-tag_date = 0
1
0