Hello community, here is the log from the commit of package python-heatclient for openSUSE:Factory checked in at 2013-08-18 22:40:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-heatclient (Old) and /work/SRC/openSUSE:Factory/.python-heatclient.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-heatclient" Changes: -------- --- /work/SRC/openSUSE:Factory/python-heatclient/python-heatclient.changes 2013-07-18 18:08:31.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-heatclient.new/python-heatclient.changes 2013-08-18 22:40:06.000000000 +0200 @@ -0,0 +1,53 @@ +------------------------------------------------------------------- +Wed Aug 14 00:07:28 UTC 2013 - [email protected] + +- Update to version 0.2.4.4: + + Generate a template from a resource + +------------------------------------------------------------------- +Sat Aug 10 11:08:17 UTC 2013 - [email protected] + +- Update to version 0.2.4.2: + + Fix heat event list sorted order incorrect + +------------------------------------------------------------------- +Thu Aug 8 14:40:37 UTC 2013 - [email protected] + +- Update to version 0.2.4.1: + + Updated from global requirements + +------------------------------------------------------------------- +Wed Aug 7 23:49:59 UTC 2013 - [email protected] + +- Update to version 0.2.3.15.g2c05c73: + + Add mock as a test requirement + + Fix Stack instance delete method + + Custom Stack get method to avoid lookup redirects + + Do not paginate stack list unless page_size is set + + Remove unused Stack data method + +------------------------------------------------------------------- +Tue Aug 6 23:52:13 UTC 2013 - [email protected] + +- Update to version 0.2.3.10.g9104cb0: + + Sync with global requirements + +-------------------------------------------------------------------- +Mon Aug 5 21:15:56 UTC 2013 - [email protected] + +- Update to version 0.2.3.9.g529d429: + + Implement Stack status and action properties + +-------------------------------------------------------------------- +Tue Jul 30 14:52:28 UTC 2013 - [email protected] + +- Update to version 0.2.3.8.gcae2c0f: + + Parse error object (in json format) returned by heat-api + +-------------------------------------------------------------------- +Mon Jul 22 23:46:33 UTC 2013 - [email protected] + +- Update to version 0.2.3.6.ge5d68a4: + + Validate heat url is supplied for --os-no-client-auth. + + Set credentials headers if there is no auth token. + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-heatclient.spec ++++++ --- /var/tmp/diff_new_pack.5IJlTD/_old 2013-08-18 22:40:06.000000000 +0200 +++ /var/tmp/diff_new_pack.5IJlTD/_new 2013-08-18 22:40:06.000000000 +0200 @@ -19,7 +19,7 @@ %define component heatclient Name: python-%{component} -Version: 0.2.3.2.ga49cf4c +Version: 0.2.4.4 Release: 0 Summary: Openstack Orchestration (Heat) API Client License: Apache-2.0 @@ -85,14 +85,14 @@ This package contains testsuite files for %{name}. %prep -%setup -q -n python-heatclient-0.2.3.2.ga49cf4c +%setup -q -n python-heatclient-0.2.4.4.gc0457ff %openstack_cleanup_prep echo %{version} > heatclient/versioninfo %build python setup.py build python setup.py build_sphinx -rm -rf doc/build/html/{.buildinfo,.doctrees} +rm doc/build/html/.buildinfo %install python setup.py install --prefix=%{_prefix} --root=%{buildroot} --install-data=%{python_sitelib} ++++++ _service ++++++ --- /var/tmp/diff_new_pack.5IJlTD/_old 2013-08-18 22:40:06.000000000 +0200 +++ /var/tmp/diff_new_pack.5IJlTD/_new 2013-08-18 22:40:06.000000000 +0200 @@ -2,6 +2,7 @@ <service name="git_tarballs" mode="disabled"> <param name="url">http://tarballs.openstack.org/python-heatclient/python-heatclient-master.tar.gz</param> <param name="email">[email protected]</param> + <param name="version-regexp">.*-([^-]+)\.g[a-zA-Z0-9]{7}</param> <param name="plain-version">True</param> </service> </services> ++++++ python-heatclient-master.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/.gitignore new/python-heatclient-0.2.4.4.gc0457ff/.gitignore --- old/python-heatclient-0.2.3.2.ga49cf4c/.gitignore 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -.coverage -.venv -*,cover -cover -*.pyc -.idea -*.swp -*~ -AUTHORS -build -dist -ChangeLog -run_tests.err.log -.tox -doc/source/api -*.egg -heatclient/versioninfo -python_heatclient.egg-info -*.log -.testrepository diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/.gitreview new/python-heatclient-0.2.4.4.gc0457ff/.gitreview --- old/python-heatclient-0.2.3.2.ga49cf4c/.gitreview 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/.gitreview 1970-01-01 01:00:00.000000000 +0100 @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=openstack/python-heatclient.git diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/AUTHORS new/python-heatclient-0.2.4.4.gc0457ff/AUTHORS --- old/python-heatclient-0.2.3.2.ga49cf4c/AUTHORS 2013-07-17 01:46:10.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/AUTHORS 2013-08-13 22:57:53.000000000 +0200 @@ -1,14 +1,16 @@ +Andrew Plunk <[email protected]> Angus Salkeld <[email protected]> Bryan D. Payne <[email protected]> Dan Radez <[email protected]> Dirk Mueller <[email protected]> Ian Main <[email protected]> -Jeremy Stanley <[email protected]> JUN JIE NAN <[email protected]> +Jeremy Stanley <[email protected]> +Jianing YANG <[email protected]> Lin Hua Cheng <[email protected]> Monty Taylor <[email protected]> Simon Pasquier <[email protected]> Steve Baker <[email protected]> Steven Dake <[email protected]> Steven Hardy <[email protected]> -Sulochan Acharya <[email protected]> \ No newline at end of file +Sulochan Acharya <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/ChangeLog new/python-heatclient-0.2.4.4.gc0457ff/ChangeLog --- old/python-heatclient-0.2.3.2.ga49cf4c/ChangeLog 2013-07-17 01:46:10.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/ChangeLog 2013-08-13 22:57:53.000000000 +0200 @@ -1,3 +1,193 @@ +commit c0457ff0d4f7c603dfd60101a76797e9fae92dc4 +Merge: 2d1592e 68999ba +Author: Jenkins <[email protected]> +Date: Tue Aug 13 20:57:02 2013 +0000 + + Merge "Generate a template from a resource" + +commit 2d1592e934b4313fb0582dba419fcca27819d7e4 +Author: JUN JIE NAN <[email protected]> +Date: Thu Aug 8 14:27:33 2013 +0800 + + Fix heat event list sorted order incorrect + + The order is correct already if python heat client does not recorder + it. Add option to make print_list not to reorder possible, and call it + in do_event_list. + + Change-Id: I3f0990aff27df39371c583d5aae3edd106542ad1 + Fixes: bug #1209506 + +commit cf4b5c82c4225af3c7439f8a03f928162d54a57f +Author: Monty Taylor <[email protected]> +Date: Wed Aug 7 19:02:44 2013 -0300 + + Updated from global requirements + + Change-Id: I1687d51bddb873549163dcf488fc40cdd9edcb29 + + Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6 + + Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6 + + Change-Id: Ic4a43955526fcde313ad2f2afec8fafeb87f37a6 + + Change-Id: If137689e5b9008c51cea16d41e648f0df490a247 + +commit 68999ba81fc622ab9274d26725fddda83a631f53 +Author: Andrew Plunk <[email protected]> +Date: Mon Aug 5 10:28:47 2013 -0500 + + Generate a template from a resource + + Setup the command line options and calls for generating + a template from an installed resource. + + blueprint resource-template + + Change-Id: If533bd90b1ec73bbe2603b55a0a7621879d355ec + +commit 2c05c73a6b7137a428111bb52b97087aac1c43a0 +Author: Steve Baker <[email protected]> +Date: Mon Aug 5 15:52:09 2013 +1200 + + Remove unused Stack data method + + Change-Id: Ia3fce29a58957b84f2eba33ac1b2ecfb04543939 + +commit 79dea076dbd5f35c0572b51dfcceeb5112772091 +Author: Steve Baker <[email protected]> +Date: Mon Aug 5 15:29:16 2013 +1200 + + Do not paginate stack list unless page_size is set + + Pagination on the server has not yet been implemented, however + the client assumes it is, causing infinite recursion when paginate + is called. + + With this change, no pagination is attempted unless page_size is + specified. However the 'limit' parameter is still honored, so it + is still possible to cap the total number of results returned. + + heatclient users should not set page_size until pagination has been + implemented on the server. The stack list in Horizon currently + does not attempt to paginate, so is not affected. + + Fixes: bug #1207839 + Change-Id: I4087d3a8af48206d6ebe3edc441469464e4a401a + +commit ea0e957978632b55ea48864f216e1b0b7181c6f7 +Author: Steve Baker <[email protected]> +Date: Mon Aug 5 09:02:40 2013 +1200 + + Custom Stack get method to avoid lookup redirects + + Change-Id: I15dd4e9168cba6fd05371fed097d52cbf33cb15d + +commit 6f7239f67bd189870186c71d6d3f66f6334f6133 +Author: Steve Baker <[email protected]> +Date: Mon Aug 5 08:55:52 2013 +1200 + + Fix Stack instance delete method + + The current instance delete method assumes that a Stack + instance can be passed to the manager delete method, however + the manager delete method only accepts a stack identifier. + + Change-Id: I87c30be1ea43695b7e13953531ea282fd8d386f8 + +commit 18e110dbf0ae46730c08ea7d1898a89f14afda85 +Author: Steve Baker <[email protected]> +Date: Mon Aug 5 08:19:14 2013 +1200 + + Add mock as a test requirement + + A project-wide concensus is forming that mox should be phased + out and mock should be encouraged for writing new tests. + + This change allow mock to be used for new tests. + + Change-Id: I3cdf77bbeadd419b811bddcc31f048c1c6ec38bb + +commit 9104cb00a1a1e93ff35784a7e64a95d90b04a534 +Author: Monty Taylor <[email protected]> +Date: Mon Aug 5 18:03:52 2013 -0300 + + Sync with global requirements + + Change-Id: Iad82b688da07f3aa83a9850b5ea9fe2beb51019e + +commit 529d429d49461c9ffa69bf8e90f3d00aded6603c +Author: Steve Baker <[email protected]> +Date: Fri Aug 2 14:20:36 2013 +1200 + + Implement Stack status and action properties + + This splits the stack_status back to an action and status, + as it is represented internally in heat-engine. + + It assumes there will not be an action which contains an _. + + This change is needed for code (such as tempest) which assumes a + convention of all openstack client resources having a status property. + + Change-Id: If00db5508bf8469b1106cac20b8fc10f7e1a854d + +commit cae2c0fd7b526f285b2d59f7321e9084aa9e4337 +Merge: e5d68a4 2b83260 +Author: Jenkins <[email protected]> +Date: Tue Jul 30 05:09:12 2013 +0000 + + Merge "Parse error object (in json format) returned by heat-api" + +commit 2b83260feb910a72bceed93db2f4ebd59c692022 +Author: Jianing YANG <[email protected]> +Date: Mon Jul 22 15:15:57 2013 +0800 + + Parse error object (in json format) returned by heat-api + + With this fix, heatclient will display a clear error message when + encounter an server-side error. Additionally, the corresponding + traceback will be displayed when "--verbose" is set. + + Change-Id: I99b828465f61478a3c63fcf549d044a62523be1f + +commit e5d68a48af1642d7104429a7ca0d3063f5cfdd85 +Merge: 34993c6 78c98ee +Author: Jenkins <[email protected]> +Date: Mon Jul 22 17:23:49 2013 +0000 + + Merge "Set credentials headers if there is no auth token." + +commit 34993c6b69c197041f6e21a9200758a94624eb9a +Merge: a49cf4c 0254ad5 +Author: Jenkins <[email protected]> +Date: Mon Jul 22 17:22:48 2013 +0000 + + Merge "Validate heat url is supplied for --os-no-client-auth." + +commit 78c98ee91bf0daac2337fec4474d3300417c0d40 +Author: Steve Baker <[email protected]> +Date: Fri Jul 19 14:09:34 2013 +1200 + + Set credentials headers if there is no auth token. + + Credentials will be set instead of a token for all invocations where + --os-no-client-auth is specified. + + Change-Id: I35a81a9518833ce9758228266deb36c8073f9fb8 + +commit 0254ad50a25816b80c854ea74f6a9b61cdad0e1f +Author: Steve Baker <[email protected]> +Date: Fri Jul 19 13:15:49 2013 +1200 + + Validate heat url is supplied for --os-no-client-auth. + + Currently an obscure error is returned if --heat-url is not + specified. + + Change-Id: Ia9fbb694f38e583a0cf1898f576a894d1007f697 + commit a49cf4c148bfcb4cf878afc13325f2ffcf219992 Merge: e147586 3f1b15c Author: Jenkins <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/PKG-INFO new/python-heatclient-0.2.4.4.gc0457ff/PKG-INFO --- old/python-heatclient-0.2.3.2.ga49cf4c/PKG-INFO 2013-07-17 01:46:11.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/PKG-INFO 2013-08-13 22:57:53.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: python-heatclient -Version: 0.2.3.2.ga49cf4c +Version: 0.2.4.4.gc0457ff Summary: OpenStack Orchestration API Client Library Home-page: http://www.openstack.org/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/http.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/http.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/http.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/http.py 2013-08-13 22:57:12.000000000 +0200 @@ -131,6 +131,8 @@ kwargs['headers'].setdefault('User-Agent', USER_AGENT) if self.auth_token: kwargs['headers'].setdefault('X-Auth-Token', self.auth_token) + else: + kwargs['headers'].update(self.credentials_headers()) if self.auth_url: kwargs['headers'].setdefault('X-Auth-Url', self.auth_url) @@ -175,10 +177,12 @@ return resp, body_str def credentials_headers(self): - return { - 'X-Auth-User': self.username, - 'X-Auth-Key': self.password - } + creds = {} + if self.username: + creds['X-Auth-User'] = self.username + if self.password: + creds['X-Auth-Key'] = self.password + return creds def json_request(self, method, url, **kwargs): kwargs.setdefault('headers', {}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/utils.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/utils.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/common/utils.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/common/utils.py 2013-08-13 22:57:12.000000000 +0200 @@ -19,11 +19,16 @@ import sys import textwrap import uuid - +import yaml from heatclient import exc from heatclient.openstack.common import importutils +supported_formats = { + "json": lambda x: json.dumps(x, indent=2), + "yaml": yaml.safe_dump +} + # Decorator for cli-args def arg(*args, **kwargs): @@ -51,7 +56,7 @@ return '\n'.join(r or []) -def print_list(objs, fields, field_labels=None, formatters={}, sortby=0): +def print_list(objs, fields, field_labels=None, formatters={}, sortby=None): field_labels = field_labels or fields pt = prettytable.PrettyTable([f for f in field_labels], caching=False, print_empty=False) @@ -66,7 +71,10 @@ data = getattr(o, field, None) or '' row.append(data) pt.add_row(row) - print pt.get_string(sortby=field_labels[sortby]) + if sortby is None: + print pt.get_string() + else: + print pt.get_string(sortby=field_labels[sortby]) def print_dict(d, formatters={}): @@ -151,3 +159,13 @@ parameters[n] = v return parameters + + +def format_output(output, format='yaml'): + """Format the supplied dict as specified.""" + output_format = format.lower() + try: + return supported_formats[output_format](output) + except KeyError: + raise exc.HTTPUnsupported("The format(%s) is unsupported." + % output_format) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/exc.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/exc.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/exc.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/exc.py 2013-08-13 22:57:12.000000000 +0200 @@ -12,6 +12,13 @@ import sys +verbose = 0 + +try: + import json +except ImportError: + import simplejson as json + class BaseException(Exception): """An error occurred.""" @@ -38,6 +45,30 @@ """Base exception for all HTTP-derived exceptions.""" code = 'N/A' + def __init__(self, message=None): + super(HTTPException, self).__init__(message) + try: + self.error = json.loads(message) + if 'error' not in self.error: + raise KeyError('Key "error" not exists') + except KeyError: + # NOTE(jianingy): If key 'error' happens not exist, + # self.message becomes no sense. In this case, we + # return doc of current exception class instead. + self.error = {'error': + {'message': self.__class__.__doc__}} + except Exception: + self.error = {'error': + {'message': self.message or self.__class__.__doc__}} + + def __str__(self): + message = self.error['error'].get('message', 'Internal Error') + if verbose: + traceback = self.error['error'].get('traceback', '') + return 'ERROR: %s\n%s' % (message, traceback) + else: + return 'ERROR: %s' % message + class HTTPMultipleChoices(HTTPException): code = 300 @@ -107,6 +138,10 @@ pass +class HTTPUnsupported(HTTPException): + code = 415 + + class HTTPInternalServerError(HTTPException): code = 500 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/shell.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/shell.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/shell.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/shell.py 2013-08-13 22:57:12.000000000 +0200 @@ -169,7 +169,7 @@ parser.add_argument('-t', '--token-only', default=bool(False), action='store_true', - help='DEPRECATED! Has no effect') + help=argparse.SUPPRESS) return parser @@ -236,11 +236,16 @@ httplib2.debuglevel = 1 + def _setup_verbose(self, verbose): + if verbose: + exc.verbose = 1 + def main(self, argv): # Parse args once to find version parser = self.get_base_parser() (options, args) = parser.parse_known_args(argv) self._setup_debugging(options.debug) + self._setup_verbose(options.verbose) # build available subcommands based on version api_version = options.heat_api_version @@ -278,6 +283,11 @@ raise exc.CommandError("You must provide an auth url via" " either --os-auth-url or via " "env[OS_AUTH_URL]") + if args.os_no_client_auth and not args.heat_url: + raise exc.CommandError("If you specify --os-no-client-auth" + " you must also specify a Heat API URL " + "via either --heat-url or " + "env[HEAT_URL]") kwargs = { 'username': args.os_username, 'password': args.os_password, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/fakes.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/fakes.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/fakes.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/fakes.py 2013-08-13 22:57:12.000000000 +0200 @@ -1,5 +1,19 @@ +# 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 json +from heatclient import exc from heatclient.v1 import client as v1client from keystoneclient.v2_0 import client as ksclient @@ -31,8 +45,35 @@ {'content-type': 'application/json'}, json.dumps(resp_dict)) v1client.Client.json_request('GET', - '/stacks?limit=20').AndReturn((resp, - resp_dict)) + '/stacks?').AndReturn((resp, resp_dict)) + + +def script_heat_normal_error(): + resp_dict = { + "explanation": "The resource could not be found.", + "code": 404, + "error": { + "message": "The Stack (bad) could not be found.", + "type": "StackNotFound", + "traceback": "", + }, + "title": "Not Found" + } + resp = FakeHTTPResponse(400, + 'The resource could not be found', + {'content-type': 'application/json'}, + json.dumps(resp_dict)) + v1client.Client.json_request('GET', '/stacks/bad').AndRaise( + exc.from_response(resp, json.dumps(resp_dict))) + + +def script_heat_error(resp_string): + resp = FakeHTTPResponse(400, + 'The resource could not be found', + {'content-type': 'application/json'}, + resp_string) + v1client.Client.json_request('GET', '/stacks/bad').AndRaise( + exc.from_response(resp, resp_string)) def fake_headers(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_common_http.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_common_http.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_common_http.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_common_http.py 2013-08-13 22:57:12.000000000 +0200 @@ -1,3 +1,16 @@ +# 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 mox import testtools @@ -37,6 +50,56 @@ self.assertEqual(''.join([x for x in body]), '') self.m.VerifyAll() + def test_token_or_credentials(self): + # Record a 200 + fake200 = fakes.FakeHTTPResponse( + 200, 'OK', + {'content-type': 'application/octet-stream'}, + '') + + # no token or credentials + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/octet-stream', + 'User-Agent': 'python-heatclient'}) + mock_conn.getresponse().AndReturn(fake200) + + # credentials + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/octet-stream', + 'User-Agent': 'python-heatclient', + 'X-Auth-Key': 'pass', + 'X-Auth-User': 'user'}) + mock_conn.getresponse().AndReturn(fake200) + + # token suppresses credentials + mock_conn = http.httplib.HTTPConnection('example.com', 8004, + timeout=600.0) + mock_conn.request('GET', '/', + headers={'Content-Type': 'application/octet-stream', + 'User-Agent': 'python-heatclient', + 'X-Auth-Token': 'abcd1234'}) + mock_conn.getresponse().AndReturn(fake200) + + # Replay, create client, assert + self.m.ReplayAll() + client = http.HTTPClient('http://example.com:8004') + resp, body = client.raw_request('GET', '') + self.assertEqual(resp.status, 200) + + client.username = 'user' + client.password = 'pass' + resp, body = client.raw_request('GET', '') + self.assertEqual(resp.status, 200) + + client.auth_token = 'abcd1234' + resp, body = client.raw_request('GET', '') + self.assertEqual(resp.status, 200) + self.m.VerifyAll() + def test_http_json_request(self): # Record a 200 mock_conn = http.httplib.HTTPConnection('example.com', 8004, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_shell.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_shell.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_shell.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_shell.py 2013-08-13 22:57:12.000000000 +0200 @@ -1,3 +1,16 @@ +# 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 cStringIO import httplib2 import os @@ -153,7 +166,7 @@ self.m.StubOutWithMock(v1client.Client, 'json_request') fakes.script_keystone_client() v1client.Client.json_request( - 'GET', '/stacks?limit=20').AndRaise(exc.Unauthorized) + 'GET', '/stacks?').AndRaise(exc.Unauthorized) self.m.ReplayAll() fake_env = { @@ -272,6 +285,108 @@ for r in required: self.assertRegexpMatches(list_text, r) + def test_parsable_error(self): + message = "The Stack (bad) could not be found." + resp_dict = { + "explanation": "The resource could not be found.", + "code": 404, + "error": { + "message": message, + "type": "StackNotFound", + "traceback": "", + }, + "title": "Not Found" + } + + fakes.script_keystone_client() + fakes.script_heat_error(json.dumps(resp_dict)) + + self.m.ReplayAll() + + try: + self.shell("stack-show bad") + except exc.HTTPException as e: + self.assertEqual(str(e), "ERROR: " + message) + + def test_parsable_verbose(self): + message = "The Stack (bad) could not be found." + resp_dict = { + "explanation": "The resource could not be found.", + "code": 404, + "error": { + "message": message, + "type": "StackNotFound", + "traceback": "<TRACEBACK>", + }, + "title": "Not Found" + } + + fakes.script_keystone_client() + fakes.script_heat_error(json.dumps(resp_dict)) + + self.m.ReplayAll() + + try: + exc.verbose = 1 + self.shell("stack-show bad") + except exc.HTTPException as e: + expect = 'ERROR: The Stack (bad) could not be found.\n<TRACEBACK>' + self.assertEqual(str(e), expect) + + def test_parsable_malformed_error(self): + invalid_json = "ERROR: {Invalid JSON Error." + fakes.script_keystone_client() + fakes.script_heat_error(invalid_json) + self.m.ReplayAll() + + try: + self.shell("stack-show bad") + except exc.HTTPException as e: + self.assertEqual(str(e), "ERROR: " + invalid_json) + + def test_parsable_malformed_error_missing_message(self): + missing_message = { + "explanation": "The resource could not be found.", + "code": 404, + "error": { + "type": "StackNotFound", + "traceback": "", + }, + "title": "Not Found" + } + + fakes.script_keystone_client() + fakes.script_heat_error(json.dumps(missing_message)) + self.m.ReplayAll() + + try: + self.shell("stack-show bad") + except exc.HTTPException as e: + self.assertEqual(str(e), "ERROR: Internal Error") + + def test_parsable_malformed_error_missing_traceback(self): + message = "The Stack (bad) could not be found." + resp_dict = { + "explanation": "The resource could not be found.", + "code": 404, + "error": { + "message": message, + "type": "StackNotFound", + }, + "title": "Not Found" + } + + fakes.script_keystone_client() + fakes.script_heat_error(json.dumps(resp_dict)) + self.m.ReplayAll() + + try: + exc.verbose = 1 + self.shell("stack-show bad") + except exc.HTTPException as e: + self.assertEqual(str(e), + "ERROR: The Stack (bad) could not be found.\n") + def test_describe(self): fakes.script_keystone_client() resp_dict = {"stack": { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_stacks.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_stacks.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/tests/test_stacks.py 1970-01-01 01:00:00.000000000 +0100 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/tests/test_stacks.py 2013-08-13 22:57:12.000000000 +0200 @@ -0,0 +1,284 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# +# 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 heatclient.v1.stacks import Stack +from heatclient.v1.stacks import StackManager + +from mock import MagicMock +import testscenarios +from testscenarios.scenarios import multiply_scenarios +import testtools + +load_tests = testscenarios.load_tests_apply_scenarios + + +def mock_stack(manager, stack_name, stack_id): + return Stack(manager, { + "id": stack_id, + "stack_name": stack_name, + "links": [{ + "href": "http://192.0.2.1:8004/v1/1234/stacks/%s/%s" % ( + stack_name, stack_id), + "rel": "self"}], + "description": "No description", + "stack_status_reason": "Stack create completed successfully", + "creation_time": "2013-08-04T20:57:55Z", + "updated_time": "2013-08-04T20:57:55Z", + "stack_status": "CREATE_COMPLETE" + }) + + +class StackStatusActionTest(testtools.TestCase): + + scenarios = multiply_scenarios([ + ('CREATE', dict(action='CREATE')), + ('DELETE', dict(action='DELETE')), + ('UPDATE', dict(action='UPDATE')), + ('ROLLBACK', dict(action='ROLLBACK')), + ('SUSPEND', dict(action='SUSPEND')), + ('RESUME', dict(action='RESUME')) + ], [ + ('IN_PROGRESS', dict(status='IN_PROGRESS')), + ('FAILED', dict(status='FAILED')), + ('COMPLETE', dict(status='COMPLETE')) + ]) + + def test_status_action(self): + stack_status = '%s_%s' % (self.action, self.status) + stack = mock_stack(None, 'stack_1', 'abcd1234') + stack.stack_status = stack_status + self.assertEqual(self.action, stack.action) + self.assertEqual(self.status, stack.status) + + +class StackOperationsTest(testtools.TestCase): + + def test_delete_stack(self): + manager = MagicMock() + stack = mock_stack(manager, None, 'abcd1234') + stack.delete() + manager.delete.assert_called_once_with('abcd1234') + + def test_get_stack(self): + manager = MagicMock() + stack = mock_stack(manager, 'the_stack', 'abcd1234') + stack.get() + manager.get.assert_called_once_with('the_stack/abcd1234') + + +class StackManagerNoPaginationTest(testtools.TestCase): + + scenarios = [ + ('total_0', dict(total=0)), + ('total_1', dict(total=1)), + ('total_9', dict(total=9)), + ('total_1', dict(total=10)), + ('total_11', dict(total=11)), + ('total_19', dict(total=19)), + ('total_20', dict(total=20)), + ('total_21', dict(total=21)), + ('total_49', dict(total=49)), + ('total_50', dict(total=50)), + ('total_51', dict(total=51)), + ('total_95', dict(total=95)), + ] + + # absolute limit for results returned + limit = 50 + + def mock_manager(self): + manager = StackManager(None) + manager._list = MagicMock() + + def mock_list(*args, **kwargs): + def results(): + for i in range(0, self.total): + stack_name = 'stack_%s' % (i + 1) + stack_id = 'abcd1234-%s' % (i + 1) + yield mock_stack(manager, stack_name, stack_id) + + return list(results()) + + manager._list.side_effect = mock_list + return manager + + def test_stack_list_no_pagination(self): + manager = self.mock_manager() + results = list(manager.list(limit=self.limit)) + manager._list.assert_called_once_with( + '/stacks?', 'stacks') + + last_result = min(self.limit, self.total) + # paginate is not specified, so the total + # results (up to the limit) is always returned + self.assertEqual(last_result, len(results)) + + if last_result > 0: + self.assertEqual('stack_1', results[0].stack_name) + self.assertEqual('stack_%s' % last_result, results[-1].stack_name) + + def test_stack_list_no_pagination_no_limit(self): + manager = self.mock_manager() + + results = list(manager.list()) + manager._list.assert_called_once_with( + '/stacks?', 'stacks') + + # paginate is not specified, so the total + # results is always returned + self.assertEqual(self.total, len(results)) + + if self.total > 0: + self.assertEqual('stack_1', results[0].stack_name) + self.assertEqual('stack_%s' % self.total, results[-1].stack_name) + + +class StackManagerPaginationTest(testtools.TestCase): + + scenarios = [ + ('0_offset_0', dict( + page_size=10, + offset=0, + total=0, + results=((0, 0),) + )), + ('1_offset_0', dict( + page_size=10, + offset=0, + total=1, + results=((0, 1),) + )), + ('9_offset_0', dict( + page_size=10, + offset=0, + total=9, + results=((0, 9),) + )), + ('10_offset_0', dict( + page_size=10, + offset=0, + total=10, + results=((0, 10), (10, 10)) + )), + ('11_offset_0', dict( + page_size=10, + offset=0, + total=11, + results=((0, 10), (10, 11)) + )), + ('11_offset_10', dict( + page_size=10, + offset=10, + total=11, + results=((10, 11),) + )), + ('19_offset_10', dict( + page_size=10, + offset=10, + total=19, + results=((10, 19),) + )), + ('20_offset_10', dict( + page_size=10, + offset=10, + total=20, + results=((10, 20), (20, 20)) + )), + ('21_offset_10', dict( + page_size=10, + offset=10, + total=21, + results=((10, 20), (20, 21)) + )), + ('21_offset_0', dict( + page_size=10, + offset=0, + total=21, + results=((0, 10), (10, 20), (20, 21)) + )), + ('21_offset_20', dict( + page_size=10, + offset=20, + total=21, + results=((20, 21),) + )), + ('95_offset_90', dict( + page_size=10, + offset=90, + total=95, + results=((90, 95),) + )), + ] + + # absolute limit for results returned + limit = 50 + + def mock_manager(self): + manager = StackManager(None) + manager._list = MagicMock() + + def mock_list(arg_url, arg_response_key): + try: + result = self.results[self.result_index] + except IndexError: + return + self.result_index = self.result_index + 1 + + offset = result[0] + url = '/stacks?' + if offset > 0: + url += 'marker=abcd1234-%s&' % offset + url += 'limit=%s' % self.page_size + self.assertEqual(url, arg_url) + + def results(): + + for i in range(*result): + stack_name = 'stack_%s' % (i + 1) + stack_id = 'abcd1234-%s' % (i + 1) + yield mock_stack(manager, stack_name, stack_id) + + return list(results()) + + manager._list.side_effect = mock_list + return manager + + def test_stack_list_pagination(self): + manager = self.mock_manager() + + list_params = { + 'page_size': self.page_size, + 'limit': self.limit + } + + if self.offset > 0: + marker = 'abcd1234-%s' % self.offset + list_params['marker'] = marker + + self.result_index = 0 + results = list(manager.list(**list_params)) + + # assert that the list method has been called enough times + self.assertEqual(len(self.results), self.result_index) + + last_result = min(self.limit, self.total - self.offset) + # one or more list calls have been recomposed into a single list + self.assertEqual(last_result, len(results)) + + if last_result > 0: + self.assertEqual('stack_%s' % (self.offset + 1), + results[0].stack_name) + self.assertEqual('stack_%s' % (self.offset + last_result), + results[-1].stack_name) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/resources.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/resources.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/resources.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/resources.py 2013-08-13 22:57:12.000000000 +0200 @@ -67,3 +67,9 @@ '/stacks/%s/resources/%s/metadata' % (stack_id, resource_name)) return body['metadata'] + + def generate_template(self, resource_name): + resp, body = self.api.json_request('GET', + '/resource_types/%s/template' % + resource_name) + return body diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/shell.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/shell.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/shell.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/shell.py 2013-08-13 22:57:12.000000000 +0200 @@ -368,6 +368,24 @@ utils.print_dict(resource.to_dict(), formatters=formatters) [email protected]('resource', metavar='<RESOURCE>', + help='Name of the resource to generate a template for.') [email protected]('-F', '--format', metavar='<FORMAT>', + help="The template output format. %s" % utils.supported_formats) +def do_resource_template(hc, args): + '''Generate a template based on a resource.''' + fields = {'resource_name': args.resource} + try: + template = hc.resources.generate_template(**fields) + except exc.HTTPNotFound: + raise exc.CommandError('Resource %s not found.' % args.resource) + else: + if args.format: + print utils.format_output(template, format=args.format) + else: + print utils.format_output(template) + + @utils.arg('id', metavar='<NAME or ID>', help='Name or ID of stack to show the resource metadata for.') @utils.arg('resource', metavar='<RESOURCE>', @@ -400,7 +418,7 @@ else: fields = ['logical_resource_id', 'id', 'resource_status_reason', 'resource_status', 'event_time'] - utils.print_list(events, fields, sortby=4) + utils.print_list(events, fields) @utils.arg('id', metavar='<NAME or ID>', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/stacks.py new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/stacks.py --- old/python-heatclient-0.2.3.2.ga49cf4c/heatclient/v1/stacks.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/heatclient/v1/stacks.py 2013-08-13 22:57:12.000000000 +0200 @@ -17,8 +17,6 @@ from heatclient.common import base -DEFAULT_PAGE_SIZE = 20 - class Stack(base.Resource): def __repr__(self): @@ -28,10 +26,29 @@ self.manager.update(self, **fields) def delete(self): - return self.manager.delete(self) + return self.manager.delete(self.id) - def data(self, **kwargs): - return self.manager.data(self, **kwargs) + def get(self): + # set_loaded() first ... so if we have to bail, we know we tried. + self.set_loaded(True) + if not hasattr(self.manager, 'get'): + return + + new = self.manager.get('%s/%s' % (self.stack_name, self.id)) + if new: + self._add_details(new._info) + + @property + def action(self): + s = self.stack_status + # Return everything before the first underscore + return s[:s.index('_')] + + @property + def status(self): + s = self.stack_status + # Return everything after the first underscore + return s[s.index('_') + 1:] class StackManager(base.Manager): @@ -64,10 +81,12 @@ if (page_size and len(stacks) == page_size and (absolute_limit is None or 0 < seen < absolute_limit)): qp['marker'] = stack.id - for image in paginate(qp, seen): - yield image + for stack in paginate(qp, seen): + yield stack - params = {'limit': kwargs.get('page_size', DEFAULT_PAGE_SIZE)} + params = {} + if 'page_size' in kwargs: + params['limit'] = kwargs['page_size'] if 'marker' in kwargs: params['marker'] = kwargs['marker'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/PKG-INFO new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/PKG-INFO --- old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/PKG-INFO 2013-07-17 01:46:10.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/PKG-INFO 2013-08-13 22:57:53.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: python-heatclient -Version: 0.2.3.2.ga49cf4c +Version: 0.2.4.4.gc0457ff Summary: OpenStack Orchestration API Client Library Home-page: http://www.openstack.org/ Author: OpenStack diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/SOURCES.txt new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/SOURCES.txt --- old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/SOURCES.txt 2013-07-17 01:46:11.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/SOURCES.txt 2013-08-13 22:57:53.000000000 +0200 @@ -1,5 +1,3 @@ -.gitignore -.gitreview .testr.conf AUTHORS CONTRIBUTING.rst @@ -31,6 +29,7 @@ heatclient/tests/fakes.py heatclient/tests/test_common_http.py heatclient/tests/test_shell.py +heatclient/tests/test_stacks.py heatclient/tests/test_utils.py heatclient/tests/v1/__init__.py heatclient/tests/var/minimal.template @@ -45,6 +44,7 @@ python_heatclient.egg-info/SOURCES.txt python_heatclient.egg-info/dependency_links.txt python_heatclient.egg-info/entry_points.txt +python_heatclient.egg-info/not-zip-safe python_heatclient.egg-info/requires.txt python_heatclient.egg-info/top_level.txt tools/with_venv.sh \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/not-zip-safe new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/not-zip-safe --- old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/not-zip-safe 1970-01-01 01:00:00.000000000 +0100 +++ new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/not-zip-safe 2013-08-13 22:57:14.000000000 +0200 @@ -0,0 +1 @@ + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/requires.txt new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/requires.txt --- old/python-heatclient-0.2.3.2.ga49cf4c/python_heatclient.egg-info/requires.txt 2013-07-17 01:46:10.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/python_heatclient.egg-info/requires.txt 2013-08-13 22:57:53.000000000 +0200 @@ -1,7 +1,6 @@ -d2to1>=0.2.10,<0.3 -pbr>=0.5.16,<0.6 +pbr>=0.5.21,<1.0 httplib2 iso8601>=0.1.4 -prettytable>=0.6,<0.8 -python-keystoneclient>=0.2.1 -pyyaml>=3.1.0 \ No newline at end of file +PrettyTable>=0.6,<0.8 +python-keystoneclient>=0.3.0 +PyYAML>=3.1.0 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/requirements.txt new/python-heatclient-0.2.4.4.gc0457ff/requirements.txt --- old/python-heatclient-0.2.3.2.ga49cf4c/requirements.txt 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/requirements.txt 2013-08-13 22:57:12.000000000 +0200 @@ -1,8 +1,7 @@ -d2to1>=0.2.10,<0.3 -pbr>=0.5.16,<0.6 +pbr>=0.5.21,<1.0 argparse httplib2 iso8601>=0.1.4 -prettytable>=0.6,<0.8 -python-keystoneclient>=0.2.1 -pyyaml>=3.1.0 +PrettyTable>=0.6,<0.8 +python-keystoneclient>=0.3.0 +PyYAML>=3.1.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/setup.py new/python-heatclient-0.2.4.4.gc0457ff/setup.py --- old/python-heatclient-0.2.3.2.ga49cf4c/setup.py 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/setup.py 2013-08-13 22:57:12.000000000 +0200 @@ -14,8 +14,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT import setuptools setuptools.setup( - setup_requires=['d2to1>=0.2.10,<0.3', 'pbr>=0.5.10,<0.6'], - d2to1=True) + setup_requires=['pbr>=0.5.21,<1.0'], + pbr=True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/test-requirements.txt new/python-heatclient-0.2.4.4.gc0457ff/test-requirements.txt --- old/python-heatclient-0.2.3.2.ga49cf4c/test-requirements.txt 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/test-requirements.txt 2013-08-13 22:57:12.000000000 +0200 @@ -2,12 +2,13 @@ pep8==1.4.5 pyflakes==0.7.2 flake8==2.0 -hacking>=0.5.6,<0.6 +hacking>=0.5.6,<0.7 coverage>=3.6 discover fixtures>=0.3.12 +mock>=0.8.0 mox>=0.5.3 sphinx>=1.1.2 -testscenarios<0.5 -testrepository>=0.0.15 +testscenarios>=0.4,<0.5 +testrepository>=0.0.17 testtools>=0.9.32 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-heatclient-0.2.3.2.ga49cf4c/tox.ini new/python-heatclient-0.2.4.4.gc0457ff/tox.ini --- old/python-heatclient-0.2.3.2.ga49cf4c/tox.ini 2013-07-17 01:45:28.000000000 +0200 +++ new/python-heatclient-0.2.4.4.gc0457ff/tox.ini 2013-08-13 22:57:12.000000000 +0200 @@ -22,6 +22,6 @@ [flake8] show-source = True -ignore = H302 +ignore = H233,H302,H501 builtins = _ exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
