Hello community,

here is the log from the commit of package python-cinderclient for 
openSUSE:Factory checked in at 2013-07-10 17:30:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cinderclient (Old)
 and      /work/SRC/openSUSE:Factory/.python-cinderclient.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-cinderclient"

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cinderclient/python-cinderclient.changes  
2013-07-03 16:52:38.000000000 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-cinderclient.new/python-cinderclient.changes 
    2013-07-10 17:30:36.000000000 +0200
@@ -1,0 +2,19 @@
+Fri Jul  5 23:42:47 UTC 2013 - [email protected]
+
+- Update to version 1.0.4.56:
+  + Implement ability to extend volume.
+  + Enable ability to reset state on snapshots.
+
+-------------------------------------------------------------------
+Wed Jul  3 08:38:49 UTC 2013 - [email protected]
+
+- Update to version 1.0.4.52:
+  + Use exceptions from oslo
+
+-------------------------------------------------------------------
+Tue Jul  2 23:44:53 UTC 2013 - [email protected]
+
+- Update to version 1.0.4.50:
+  + Fix volume info display error on create with v2.
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-cinderclient.spec ++++++
--- /var/tmp/diff_new_pack.jKNere/_old  2013-07-10 17:30:37.000000000 +0200
+++ /var/tmp/diff_new_pack.jKNere/_new  2013-07-10 17:30:37.000000000 +0200
@@ -19,7 +19,7 @@
 %define component cinderclient
 
 Name:           python-%{component}
-Version:        1.0.4.49
+Version:        1.0.4.56
 Release:        0
 Summary:        Openstack Block Storage (Cinder) API Client
 License:        Apache-2.0
@@ -84,7 +84,7 @@
 This package contains testsuite files for %{name}.
 
 %prep
-%setup -q -n python-cinderclient-1.0.4.49.g273a829
+%setup -q -n python-cinderclient-1.0.4.56.ga3985ee
 %openstack_cleanup_prep
 echo %{version} > cinderclient/versioninfo
 

++++++ python-cinderclient-master.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-cinderclient-1.0.4.49.g273a829/ChangeLog 
new/python-cinderclient-1.0.4.56.ga3985ee/ChangeLog
--- old/python-cinderclient-1.0.4.49.g273a829/ChangeLog 2013-06-25 
22:37:03.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/ChangeLog 2013-07-05 
18:45:44.000000000 +0200
@@ -1,3 +1,72 @@
+commit a3985eeb63506b48e2d71143b4b9060442d0bc61
+Merge: a7a48b8 ee9f035
+Author: Jenkins <[email protected]>
+Date:   Fri Jul 5 16:45:06 2013 +0000
+
+    Merge "Enable ability to reset state on snapshots."
+
+commit a7a48b8fee1654cdd9a4e24fc061cc36d2702ce8
+Merge: 14108c1 10df5be
+Author: Jenkins <[email protected]>
+Date:   Fri Jul 5 16:37:03 2013 +0000
+
+    Merge "Implement ability to extend volume."
+
+commit ee9f0354ec7c0084c0f8cfe2b670589e0d326421
+Author: John Griffith <[email protected]>
+Date:   Mon Jul 1 21:17:30 2013 -0600
+
+    Enable ability to reset state on snapshots.
+    
+    Implement the ability to reset-state on snapshots,
+    exposes os-reset_status from snapshot actions.
+    
+    Change-Id: I605f41e39fde46ccfe6a53222b798f32c14bc1f8
+
+commit 14108c1e7881021c68989ca71e1e2709ab80de03
+Merge: 8e7cc89 a7cce08
+Author: Jenkins <[email protected]>
+Date:   Wed Jul 3 07:53:47 2013 +0000
+
+    Merge "Use exceptions from oslo"
+
+commit 10df5beb397dee9f0bde20b87aa23035cc53ede7
+Author: John Griffith <[email protected]>
+Date:   Mon Jun 10 14:52:57 2013 -0600
+
+    Implement ability to extend volume.
+    
+    Implements ability to call extend volume in Version 2 API.
+    
+    This change includes the needed support in cinderlcient to
+    utilize/access changes made in the volume-resize change.
+    
+    Change-Id: Ifc7e2969b885a60e8105b5f3908ac452d0a61fa7
+
+commit a7cce08eab5e2e42275b84bd56127bd09b00f5bf
+Author: Alessio Ababilov <[email protected]>
+Date:   Sun May 19 18:12:27 2013 +0300
+
+    Use exceptions from oslo
+    
+    These exceptions can be used in novaclient, keystoneclient,
+    glanceclient, and other client projects.
+    
+    Partially implements: blueprint common-client-library
+    
+    Change-Id: I43918316622b1c1d722872fe30199db6a3a7bb76
+
+commit 8e7cc89d058d773ada13d615c1d978ae9d73917c
+Author: Avishay Traeger <[email protected]>
+Date:   Fri Jun 14 08:42:49 2013 +0300
+
+    Fix volume info display error on create with v2.
+    
+    Error due to popping 'links' when it does not exist.
+    
+    Change-Id: I3f25b97f16699373ef12d9ac47905900b4b631f8
+    Fixes: bug 1190853
+
 commit 273a82967170ecf4d44973d0dd7baf9c21f4da08
 Merge: dcc2f67 7571232
 Author: Jenkins <[email protected]>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-cinderclient-1.0.4.49.g273a829/PKG-INFO 
new/python-cinderclient-1.0.4.56.ga3985ee/PKG-INFO
--- old/python-cinderclient-1.0.4.49.g273a829/PKG-INFO  2013-06-25 
22:37:04.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/PKG-INFO  2013-07-05 
18:45:46.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-cinderclient
-Version: 1.0.4.49.g273a829
+Version: 1.0.4.56.ga3985ee
 Summary: OpenStack Block Storage API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/base.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/base.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/base.py      
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/base.py      
2013-07-05 18:45:13.000000000 +0200
@@ -25,7 +25,7 @@
 
 import six
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import utils
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/client.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/client.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/client.py    
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/client.py    
2013-07-05 18:45:13.000000000 +0200
@@ -46,7 +46,7 @@
 
 import requests
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import service_catalog
 from cinderclient import utils
 
@@ -151,7 +151,7 @@
             body = None
 
         if resp.status_code >= 400:
-            raise exceptions.from_response(resp, body)
+            raise exceptions.from_response(resp, method, url)
 
         return resp, body
 
@@ -185,7 +185,7 @@
             except exceptions.ClientException as e:
                 if attempts > self.retries:
                     raise
-                if 500 <= e.code <= 599:
+                if 500 <= e.http_status <= 599:
                     pass
                 else:
                     raise
@@ -211,15 +211,16 @@
     def delete(self, url, **kwargs):
         return self._cs_request(url, 'DELETE', **kwargs)
 
-    def _extract_service_catalog(self, url, resp, body, extract_token=True):
+    def _extract_service_catalog(self, auth_url, url, method,
+                                 extract_token=True, **kwargs):
         """See what the auth service told us and process the response.
         We may get redirected to another site, fail or actually get
         back a service catalog with a token and our endpoints.
         """
-
+        resp, body = self.request(url, method, **kwargs)
         if resp.status_code == 200:  # content must always present
             try:
-                self.auth_url = url
+                self.auth_url = auth_url
                 self.service_catalog = \
                     service_catalog.ServiceCatalog(body)
 
@@ -248,7 +249,7 @@
         elif resp.status_code == 305:
             return resp['location']
         else:
-            raise exceptions.from_response(resp, body)
+            raise exceptions.from_response(resp, method, url)
 
     def _fetch_endpoints_from_auth(self, url):
         """We have a token, but don't know the final endpoint for
@@ -263,13 +264,14 @@
         """
 
         # GET ...:5001/v2.0/tokens/#####/endpoints
+        auth_url = url
         url = '/'.join([url, 'tokens', '%s?belongsTo=%s'
                         % (self.proxy_token, self.proxy_tenant_id)])
         self._logger.debug("Using Endpoint URL: %s" % url)
-        resp, body = self.request(url, "GET",
-                                  headers={'X-Auth-Token': self.auth_token})
-        return self._extract_service_catalog(url, resp, body,
-                                             extract_token=False)
+        return self._extract_service_catalog(
+            auth_url,
+            url, "GET", headers={'X-Auth-Token': self.auth_token},
+            extract_token=False)
 
     def authenticate(self):
         magic_tuple = urlparse.urlsplit(self.auth_url)
@@ -320,7 +322,9 @@
 
     def _v1_auth(self, url):
         if self.proxy_token:
-            raise exceptions.NoTokenLookupException()
+            raise exceptions.AuthorizationFailure(
+                "This form of authentication does not support looking up"
+                " endpoints from an existing token.")
 
         headers = {'X-Auth-User': self.user,
                    'X-Auth-Key': self.password}
@@ -339,7 +343,7 @@
         elif resp.status_code == 305:
             return resp.headers['location']
         else:
-            raise exceptions.from_response(resp, body)
+            raise exceptions.from_response(resp, "GET", url)
 
     def _v2_auth(self, url):
         """Authenticate against a v2.0 auth service."""
@@ -369,14 +373,13 @@
         token_url = url + "/tokens"
 
         # Make sure we follow redirects when trying to reach Keystone
-        resp, body = self.request(
+        return self._extract_service_catalog(
+            url,
             token_url,
             "POST",
             body=body,
             allow_redirects=True)
 
-        return self._extract_service_catalog(url, resp, body)
-
     def get_volume_api_version_from_endpoint(self):
         magic_tuple = urlparse.urlsplit(self.management_url)
         scheme, netloc, path, query, frag = magic_tuple
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/exceptions.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/exceptions.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/exceptions.py        
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/exceptions.py        
2013-07-05 18:45:13.000000000 +0200
@@ -1,156 +1,6 @@
-# Copyright 2010 Jacob Kaplan-Moss
 """
-Exception definitions.
+Backwards compatible exceptions module.
 """
 
-
-class UnsupportedVersion(Exception):
-    """Indicates that the user is trying to use an unsupported
-    version of the API.
-    """
-    pass
-
-
-class InvalidAPIVersion(Exception):
-    pass
-
-
-class CommandError(Exception):
-    pass
-
-
-class AuthorizationFailure(Exception):
-    pass
-
-
-class NoUniqueMatch(Exception):
-    pass
-
-
-class NoTokenLookupException(Exception):
-    """This form of authentication does not support looking up
-       endpoints from an existing token.
-    """
-    pass
-
-
-class EndpointNotFound(Exception):
-    """Could not find Service or Region in Service Catalog."""
-    pass
-
-
-class AmbiguousEndpoints(Exception):
-    """Found more than one matching endpoint in Service Catalog."""
-    def __init__(self, endpoints=None):
-        self.endpoints = endpoints
-
-    def __str__(self):
-        return "AmbiguousEndpoints: %s" % repr(self.endpoints)
-
-
-class ClientException(Exception):
-    """
-    The base exception class for all exceptions this library raises.
-    """
-    def __init__(self, code, message=None, details=None, request_id=None):
-        self.code = code
-        self.message = message or self.__class__.message
-        self.details = details
-        self.request_id = request_id
-
-    def __str__(self):
-        formatted_string = "%s (HTTP %s)" % (self.message, self.code)
-        if self.request_id:
-            formatted_string += " (Request-ID: %s)" % self.request_id
-
-        return formatted_string
-
-
-class BadRequest(ClientException):
-    """
-    HTTP 400 - Bad request: you sent some malformed data.
-    """
-    http_status = 400
-    message = "Bad request"
-
-
-class Unauthorized(ClientException):
-    """
-    HTTP 401 - Unauthorized: bad credentials.
-    """
-    http_status = 401
-    message = "Unauthorized"
-
-
-class Forbidden(ClientException):
-    """
-    HTTP 403 - Forbidden: your credentials don't give you access to this
-    resource.
-    """
-    http_status = 403
-    message = "Forbidden"
-
-
-class NotFound(ClientException):
-    """
-    HTTP 404 - Not found
-    """
-    http_status = 404
-    message = "Not found"
-
-
-class OverLimit(ClientException):
-    """
-    HTTP 413 - Over limit: you're over the API limits for this time period.
-    """
-    http_status = 413
-    message = "Over limit"
-
-
-# NotImplemented is a python keyword.
-class HTTPNotImplemented(ClientException):
-    """
-    HTTP 501 - Not Implemented: the server does not support this operation.
-    """
-    http_status = 501
-    message = "Not Implemented"
-
-
-# In Python 2.4 Exception is old-style and thus doesn't have a __subclasses__()
-# so we can do this:
-#     _code_map = dict((c.http_status, c)
-#                      for c in ClientException.__subclasses__())
-#
-# Instead, we have to hardcode it:
-_code_map = dict((c.http_status, c) for c in [BadRequest, Unauthorized,
-                                              Forbidden, NotFound,
-                                              OverLimit, HTTPNotImplemented])
-
-
-def from_response(response, body):
-    """
-    Return an instance of an ClientException or subclass
-    based on an requests response.
-
-    Usage::
-
-        resp, body = requests.request(...)
-        if resp.status_code != 200:
-            raise exception_from_response(resp, rest.text)
-    """
-    cls = _code_map.get(response.status_code, ClientException)
-    if response.headers:
-        request_id = response.headers.get('x-compute-request-id')
-    else:
-        request_id = None
-    if body:
-        message = "n/a"
-        details = "n/a"
-        if hasattr(body, 'keys'):
-            error = body[list(body.keys())[0]]
-            message = error.get('message', None)
-            details = error.get('details', None)
-        return cls(code=response.status_code, message=message, details=details,
-                   request_id=request_id)
-    else:
-        return cls(code=response.status_code, request_id=request_id)
+# flake8: noqa
+from cinderclient.openstack.common.apiclient.exceptions import *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/openstack/common/apiclient/__init__.py
 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/openstack/common/apiclient/__init__.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/openstack/common/apiclient/__init__.py
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/openstack/common/apiclient/__init__.py
       2013-07-05 18:45:13.000000000 +0200
@@ -0,0 +1,16 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2013 OpenStack Foundation
+# 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.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/openstack/common/apiclient/exceptions.py
 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/openstack/common/apiclient/exceptions.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/openstack/common/apiclient/exceptions.py
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/openstack/common/apiclient/exceptions.py
     2013-07-05 18:45:13.000000000 +0200
@@ -0,0 +1,446 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright 2010 Jacob Kaplan-Moss
+# Copyright 2011 Nebula, Inc.
+# Copyright 2013 Alessio Ababilov
+# Copyright 2013 OpenStack Foundation
+# 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.
+
+"""
+Exception definitions.
+"""
+
+import sys
+
+
+class ClientException(Exception):
+    """The base exception class for all exceptions this library raises.
+    """
+    pass
+
+
+class MissingArgs(ClientException):
+    """Supplied arguments are not sufficient for calling a function."""
+    def __init__(self, missing):
+        self.missing = missing
+        msg = "Missing argument(s): %s" % ", ".join(missing)
+        super(MissingArgs, self).__init__(msg)
+
+
+class ValidationError(ClientException):
+    """Error in validation on API client side."""
+    pass
+
+
+class UnsupportedVersion(ClientException):
+    """User is trying to use an unsupported version of the API."""
+    pass
+
+
+class CommandError(ClientException):
+    """Error in CLI tool."""
+    pass
+
+
+class AuthorizationFailure(ClientException):
+    """Cannot authorize API client."""
+    pass
+
+
+class AuthPluginOptionsMissing(AuthorizationFailure):
+    """Auth plugin misses some options."""
+    def __init__(self, opt_names):
+        super(AuthPluginOptionsMissing, self).__init__(
+            "Authentication failed. Missing options: %s" %
+            ", ".join(opt_names))
+        self.opt_names = opt_names
+
+
+class AuthSystemNotFound(AuthorizationFailure):
+    """User has specified a AuthSystem that is not installed."""
+    def __init__(self, auth_system):
+        super(AuthSystemNotFound, self).__init__(
+            "AuthSystemNotFound: %s" % repr(auth_system))
+        self.auth_system = auth_system
+
+
+class NoUniqueMatch(ClientException):
+    """Multiple entities found instead of one."""
+    pass
+
+
+class EndpointException(ClientException):
+    """Something is rotten in Service Catalog."""
+    pass
+
+
+class EndpointNotFound(EndpointException):
+    """Could not find requested endpoint in Service Catalog."""
+    pass
+
+
+class AmbiguousEndpoints(EndpointException):
+    """Found more than one matching endpoint in Service Catalog."""
+    def __init__(self, endpoints=None):
+        super(AmbiguousEndpoints, self).__init__(
+            "AmbiguousEndpoints: %s" % repr(endpoints))
+        self.endpoints = endpoints
+
+
+class HttpError(ClientException):
+    """The base exception class for all HTTP exceptions.
+    """
+    http_status = 0
+    message = "HTTP Error"
+
+    def __init__(self, message=None, details=None,
+                 response=None, request_id=None,
+                 url=None, method=None, http_status=None):
+        self.http_status = http_status or self.http_status
+        self.message = message or self.message
+        self.details = details
+        self.request_id = request_id
+        self.response = response
+        self.url = url
+        self.method = method
+        formatted_string = "%s (HTTP %s)" % (self.message, self.http_status)
+        if request_id:
+            formatted_string += " (Request-ID: %s)" % request_id
+        super(HttpError, self).__init__(formatted_string)
+
+
+class HttpClientError(HttpError):
+    """Client-side HTTP error.
+
+    Exception for cases in which the client seems to have erred.
+    """
+    message = "HTTP Client Error"
+
+
+class HttpServerError(HttpError):
+    """Server-side HTTP error.
+
+    Exception for cases in which the server is aware that it has
+    erred or is incapable of performing the request.
+    """
+    message = "HTTP Server Error"
+
+
+class BadRequest(HttpClientError):
+    """HTTP 400 - Bad Request.
+
+    The request cannot be fulfilled due to bad syntax.
+    """
+    http_status = 400
+    message = "Bad Request"
+
+
+class Unauthorized(HttpClientError):
+    """HTTP 401 - Unauthorized.
+
+    Similar to 403 Forbidden, but specifically for use when authentication
+    is required and has failed or has not yet been provided.
+    """
+    http_status = 401
+    message = "Unauthorized"
+
+
+class PaymentRequired(HttpClientError):
+    """HTTP 402 - Payment Required.
+
+    Reserved for future use.
+    """
+    http_status = 402
+    message = "Payment Required"
+
+
+class Forbidden(HttpClientError):
+    """HTTP 403 - Forbidden.
+
+    The request was a valid request, but the server is refusing to respond
+    to it.
+    """
+    http_status = 403
+    message = "Forbidden"
+
+
+class NotFound(HttpClientError):
+    """HTTP 404 - Not Found.
+
+    The requested resource could not be found but may be available again
+    in the future.
+    """
+    http_status = 404
+    message = "Not Found"
+
+
+class MethodNotAllowed(HttpClientError):
+    """HTTP 405 - Method Not Allowed.
+
+    A request was made of a resource using a request method not supported
+    by that resource.
+    """
+    http_status = 405
+    message = "Method Not Allowed"
+
+
+class NotAcceptable(HttpClientError):
+    """HTTP 406 - Not Acceptable.
+
+    The requested resource is only capable of generating content not
+    acceptable according to the Accept headers sent in the request.
+    """
+    http_status = 406
+    message = "Not Acceptable"
+
+
+class ProxyAuthenticationRequired(HttpClientError):
+    """HTTP 407 - Proxy Authentication Required.
+
+    The client must first authenticate itself with the proxy.
+    """
+    http_status = 407
+    message = "Proxy Authentication Required"
+
+
+class RequestTimeout(HttpClientError):
+    """HTTP 408 - Request Timeout.
+
+    The server timed out waiting for the request.
+    """
+    http_status = 408
+    message = "Request Timeout"
+
+
+class Conflict(HttpClientError):
+    """HTTP 409 - Conflict.
+
+    Indicates that the request could not be processed because of conflict
+    in the request, such as an edit conflict.
+    """
+    http_status = 409
+    message = "Conflict"
+
+
+class Gone(HttpClientError):
+    """HTTP 410 - Gone.
+
+    Indicates that the resource requested is no longer available and will
+    not be available again.
+    """
+    http_status = 410
+    message = "Gone"
+
+
+class LengthRequired(HttpClientError):
+    """HTTP 411 - Length Required.
+
+    The request did not specify the length of its content, which is
+    required by the requested resource.
+    """
+    http_status = 411
+    message = "Length Required"
+
+
+class PreconditionFailed(HttpClientError):
+    """HTTP 412 - Precondition Failed.
+
+    The server does not meet one of the preconditions that the requester
+    put on the request.
+    """
+    http_status = 412
+    message = "Precondition Failed"
+
+
+class RequestEntityTooLarge(HttpClientError):
+    """HTTP 413 - Request Entity Too Large.
+
+    The request is larger than the server is willing or able to process.
+    """
+    http_status = 413
+    message = "Request Entity Too Large"
+
+    def __init__(self, *args, **kwargs):
+        try:
+            self.retry_after = int(kwargs.pop('retry_after'))
+        except (KeyError, ValueError):
+            self.retry_after = 0
+
+        super(RequestEntityTooLarge, self).__init__(*args, **kwargs)
+
+
+class RequestUriTooLong(HttpClientError):
+    """HTTP 414 - Request-URI Too Long.
+
+    The URI provided was too long for the server to process.
+    """
+    http_status = 414
+    message = "Request-URI Too Long"
+
+
+class UnsupportedMediaType(HttpClientError):
+    """HTTP 415 - Unsupported Media Type.
+
+    The request entity has a media type which the server or resource does
+    not support.
+    """
+    http_status = 415
+    message = "Unsupported Media Type"
+
+
+class RequestedRangeNotSatisfiable(HttpClientError):
+    """HTTP 416 - Requested Range Not Satisfiable.
+
+    The client has asked for a portion of the file, but the server cannot
+    supply that portion.
+    """
+    http_status = 416
+    message = "Requested Range Not Satisfiable"
+
+
+class ExpectationFailed(HttpClientError):
+    """HTTP 417 - Expectation Failed.
+
+    The server cannot meet the requirements of the Expect request-header field.
+    """
+    http_status = 417
+    message = "Expectation Failed"
+
+
+class UnprocessableEntity(HttpClientError):
+    """HTTP 422 - Unprocessable Entity.
+
+    The request was well-formed but was unable to be followed due to semantic
+    errors.
+    """
+    http_status = 422
+    message = "Unprocessable Entity"
+
+
+class InternalServerError(HttpServerError):
+    """HTTP 500 - Internal Server Error.
+
+    A generic error message, given when no more specific message is suitable.
+    """
+    http_status = 500
+    message = "Internal Server Error"
+
+
+# NotImplemented is a python keyword.
+class HttpNotImplemented(HttpServerError):
+    """HTTP 501 - Not Implemented.
+
+    The server either does not recognize the request method, or it lacks
+    the ability to fulfill the request.
+    """
+    http_status = 501
+    message = "Not Implemented"
+
+
+class BadGateway(HttpServerError):
+    """HTTP 502 - Bad Gateway.
+
+    The server was acting as a gateway or proxy and received an invalid
+    response from the upstream server.
+    """
+    http_status = 502
+    message = "Bad Gateway"
+
+
+class ServiceUnavailable(HttpServerError):
+    """HTTP 503 - Service Unavailable.
+
+    The server is currently unavailable.
+    """
+    http_status = 503
+    message = "Service Unavailable"
+
+
+class GatewayTimeout(HttpServerError):
+    """HTTP 504 - Gateway Timeout.
+
+    The server was acting as a gateway or proxy and did not receive a timely
+    response from the upstream server.
+    """
+    http_status = 504
+    message = "Gateway Timeout"
+
+
+class HttpVersionNotSupported(HttpServerError):
+    """HTTP 505 - HttpVersion Not Supported.
+
+    The server does not support the HTTP protocol version used in the request.
+    """
+    http_status = 505
+    message = "HTTP Version Not Supported"
+
+
+# In Python 2.4 Exception is old-style and thus doesn't have a __subclasses__()
+# so we can do this:
+#     _code_map = dict((c.http_status, c)
+#                      for c in HttpError.__subclasses__())
+_code_map = {}
+for obj in sys.modules[__name__].__dict__.values():
+    if isinstance(obj, type):
+        try:
+            http_status = obj.http_status
+        except AttributeError:
+            pass
+        else:
+            if http_status:
+                _code_map[http_status] = obj
+
+
+def from_response(response, method, url):
+    """Returns an instance of :class:`HttpError` or subclass based on response.
+
+    :param response: instance of `requests.Response` class
+    :param method: HTTP method used for request
+    :param url: URL used for request
+    """
+    kwargs = {
+        "http_status": response.status_code,
+        "response": response,
+        "method": method,
+        "url": url,
+        "request_id": response.headers.get("x-compute-request-id"),
+    }
+    if "retry-after" in response.headers:
+        kwargs["retry_after"] = response.headers["retry-after"]
+
+    content_type = response.headers.get("Content-Type", "")
+    if content_type.startswith("application/json"):
+        try:
+            body = response.json()
+        except ValueError:
+            pass
+        else:
+            if hasattr(body, "keys"):
+                error = body[body.keys()[0]]
+                kwargs["message"] = error.get("message", None)
+                kwargs["details"] = error.get("details", None)
+    elif content_type.startswith("text/"):
+        kwargs["details"] = response.text
+
+    try:
+        cls = _code_map[response.status_code]
+    except KeyError:
+        if 500 <= response.status_code < 600:
+            cls = HttpServerError
+        elif 400 <= response.status_code < 500:
+            cls = HttpClientError
+        else:
+            cls = HttpError
+    return cls(**kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/shell.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/shell.py     
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/shell.py     
2013-07-05 18:45:13.000000000 +0200
@@ -32,8 +32,8 @@
 import six
 
 from cinderclient import client
-from cinderclient import exceptions as exc
 import cinderclient.extension
+from cinderclient.openstack.common.apiclient import exceptions as exc
 from cinderclient.openstack.common import strutils
 from cinderclient import utils
 from cinderclient.v1 import shell as shell_v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_base.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_base.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_base.py   
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_base.py   
2013-07-05 18:45:13.000000000 +0200
@@ -1,5 +1,5 @@
 from cinderclient import base
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient.v1 import volumes
 from cinderclient.tests import utils
 from cinderclient.tests.v1 import fakes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_http.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_http.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_http.py   
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_http.py   
2013-07-05 18:45:13.000000000 +0200
@@ -3,7 +3,7 @@
 import requests
 
 from cinderclient import client
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient.tests import utils
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_service_catalog.py
 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_service_catalog.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_service_catalog.py
        2013-06-25 22:36:29.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_service_catalog.py
        2013-07-05 18:45:13.000000000 +0200
@@ -1,4 +1,4 @@
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import service_catalog
 from cinderclient.tests import utils
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_shell.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_shell.py  
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_shell.py  
2013-07-05 18:45:13.000000000 +0200
@@ -5,7 +5,7 @@
 from six import moves
 from testtools import matchers
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 import cinderclient.shell
 from cinderclient.tests import utils
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_utils.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_utils.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/test_utils.py  
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/test_utils.py  
2013-07-05 18:45:13.000000000 +0200
@@ -3,7 +3,7 @@
 
 from six import moves
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import utils
 from cinderclient import base
 from cinderclient.tests import utils as test_utils
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/utils.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/utils.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/utils.py       
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/utils.py       
2013-07-05 18:45:13.000000000 +0200
@@ -29,10 +29,11 @@
 
     def __init__(self, data):
         self._text = None
+        self.headers = {}
         super(TestResponse, self)
         if isinstance(data, dict):
             self.status_code = data.get('status_code', None)
-            self.headers = data.get('headers', None)
+            self.headers = data.get('headers') or {}
             # Fake the text attribute to streamline Response creation
             self._text = data.get('text', None)
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/fakes.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/fakes.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/fakes.py    
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/fakes.py    
2013-07-05 18:45:13.000000000 +0200
@@ -231,6 +231,17 @@
         snapshot.update(kw['body']['snapshot'])
         return (200, {}, {'snapshot': snapshot})
 
+    def post_snapshots_1234_action(self, body, **kw):
+        _body = None
+        resp = 202
+        assert len(body.keys()) == 1
+        action = body.keys()[0]
+        if action == 'os-reset_status':
+            assert 'status' in body['os-reset_status']
+        else:
+            raise AssertionError('Unexpected action: %s" % action')
+        return (resp, {}, _body)
+
     #
     # Volumes
     #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/test_auth.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/test_auth.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/test_auth.py    
    2013-06-25 22:36:29.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/test_auth.py    
    2013-07-05 18:45:13.000000000 +0200
@@ -4,7 +4,7 @@
 import requests
 
 from cinderclient.v1 import client
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient.tests import utils
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/test_shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/test_shell.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v1/test_shell.py   
    2013-06-25 22:36:31.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v1/test_shell.py   
    2013-07-05 18:45:13.000000000 +0200
@@ -189,3 +189,13 @@
         self.run_command('reset-state --state error 1234')
         expected = {'os-reset_status': {'status': 'error'}}
         self.assert_called('POST', '/volumes/1234/action', body=expected)
+
+    def test_snapshot_reset_state(self):
+        self.run_command('snapshot-reset-state 1234')
+        expected = {'os-reset_status': {'status': 'available'}}
+        self.assert_called('POST', '/snapshots/1234/action', body=expected)
+
+    def test_snapshot_reset_state_with_flag(self):
+        self.run_command('snapshot-reset-state --state error 1234')
+        expected = {'os-reset_status': {'status': 'error'}}
+        self.assert_called('POST', '/snapshots/1234/action', body=expected)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/fakes.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/fakes.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/fakes.py    
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/fakes.py    
2013-07-05 18:45:13.000000000 +0200
@@ -159,6 +159,10 @@
     }
 
 
+def _stub_extend(id, new_size):
+    return {'volume_id': '712f4980-5ac1-41e5-9383-390aa7c9f58b'}
+
+
 class FakeClient(fakes.FakeClient, client.Client):
 
     def __init__(self, *args, **kwargs):
@@ -238,6 +242,17 @@
         snapshot.update(kw['body']['snapshot'])
         return (200, {}, {'snapshot': snapshot})
 
+    def post_snapshots_1234_action(self, body, **kw):
+        _body = None
+        resp = 202
+        assert len(body.keys()) == 1
+        action = body.keys()[0]
+        if action == 'os-reset_status':
+            assert 'status' in body['os-reset_status']
+        else:
+            raise AssertionError('Unexpected action: %s" % action')
+        return (resp, {}, _body)
+
     #
     # Volumes
     #
@@ -290,6 +305,8 @@
             assert body[action] is None
         elif action == 'os-reset_status':
             assert 'status' in body[action]
+        elif action == 'os-extend':
+            assert body[action].keys() == ['new_size']
         else:
             raise AssertionError("Unexpected action: %s" % action)
         return (resp, {}, _body)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_auth.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_auth.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_auth.py    
    2013-06-25 22:36:29.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_auth.py    
    2013-07-05 18:45:13.000000000 +0200
@@ -19,7 +19,7 @@
 import mock
 import requests
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient.v2 import client
 from cinderclient.tests import utils
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_shell.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_shell.py   
    2013-06-25 22:36:31.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_shell.py   
    2013-07-05 18:45:13.000000000 +0200
@@ -167,3 +167,13 @@
         self.run_command('reset-state --state error 1234')
         expected = {'os-reset_status': {'status': 'error'}}
         self.assert_called('POST', '/volumes/1234/action', body=expected)
+
+    def test_snapshot_reset_state(self):
+        self.run_command('snapshot-reset-state 1234')
+        expected = {'os-reset_status': {'status': 'available'}}
+        self.assert_called('POST', '/snapshots/1234/action', body=expected)
+
+    def test_snapshot_reset_state_with_flag(self):
+        self.run_command('snapshot-reset-state --state error 1234')
+        expected = {'os-reset_status': {'status': 'error'}}
+        self.assert_called('POST', '/snapshots/1234/action', body=expected)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_volumes.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_volumes.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/tests/v2/test_volumes.py 
    2013-06-25 22:36:29.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/tests/v2/test_volumes.py 
    2013-07-05 18:45:13.000000000 +0200
@@ -85,3 +85,8 @@
         keys = ['key1']
         cs.volumes.delete_metadata(1234, keys)
         cs.assert_called('DELETE', '/volumes/1234/metadata/key1')
+
+    def test_extend(self):
+        v = cs.volumes.get('1234')
+        cs.volumes.extend(v, 2)
+        cs.assert_called('POST', '/volumes/1234/action')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/utils.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/utils.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/utils.py     
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/utils.py     
2013-07-05 18:45:13.000000000 +0200
@@ -23,7 +23,7 @@
 import six
 import prettytable
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient.openstack.common import strutils
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v1/shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v1/shell.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v1/shell.py  
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v1/shell.py  
2013-07-05 18:45:13.000000000 +0200
@@ -22,7 +22,7 @@
 import sys
 import time
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import utils
 
 
@@ -443,6 +443,21 @@
     _find_volume_snapshot(cs, args.snapshot).update(**kwargs)
 
 
[email protected]('snapshot', metavar='<snapshot>',
+           help='ID of the snapshot to modify.')
[email protected]('--state', metavar='<state>',
+           default='available',
+           help=('Indicate which state to assign the snapshot. '
+                 'Options include available, error, creating, deleting, '
+                 'error_deleting. If no state is provided, '
+                 'available will be used.'))
[email protected]_type('volume')
+def do_snapshot_reset_state(cs, args):
+    """Explicitly update the state of a snapshot."""
+    snapshot = _find_volume_snapshot(cs, args.snapshot)
+    snapshot.reset_state(args.state)
+
+
 def _print_volume_type_list(vtypes):
     utils.print_list(vtypes, ['ID', 'Name'])
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v1/volume_snapshots.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v1/volume_snapshots.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v1/volume_snapshots.py   
    2013-06-25 22:36:31.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v1/volume_snapshots.py   
    2013-07-05 18:45:13.000000000 +0200
@@ -53,6 +53,10 @@
     def project_id(self):
         return self._info.get('os-extended-snapshot-attributes:project_id')
 
+    def reset_state(self, state):
+        """Update the snapshot with the privided state."""
+        self.manager.reset_state(self, state)
+
 
 class SnapshotManager(base.ManagerWithFind):
     """
@@ -133,3 +137,14 @@
         body = {"snapshot": kwargs}
 
         self._update("/snapshots/%s" % base.getid(snapshot), body)
+
+    def reset_state(self, snapshot, state):
+        """Update the specified volume with the provided state."""
+        return self._action('os-reset_status', snapshot, {'status': state})
+
+    def _action(self, action, snapshot, info=None, **kwargs):
+        """Perform a snapshot action."""
+        body = {action: info}
+        self.run_hooks('modify_body_for_action', body, **kwargs)
+        url = '/snapshots/%s/action' % base.getid(snapshot)
+        return self.api.client.post(url, body=body)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/shell.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/shell.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/shell.py  
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/shell.py  
2013-07-05 18:45:13.000000000 +0200
@@ -22,7 +22,7 @@
 
 import six
 
-from cinderclient import exceptions
+from cinderclient.openstack.common.apiclient import exceptions
 from cinderclient import utils
 
 
@@ -170,9 +170,7 @@
     volume = _find_volume(cs, args.volume)
     info.update(volume._info)
 
-    if 'links' in info:
-        info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
 
 
@@ -282,8 +280,7 @@
     volume = cs.volumes.get(volume.id)
     info.update(volume._info)
 
-    info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
 
 
@@ -512,6 +509,21 @@
     _find_volume_snapshot(cs, args.snapshot).update(**kwargs)
 
 
[email protected]('snapshot', metavar='<snapshot>',
+           help='ID of the snapshot to modify.')
[email protected]('--state', metavar='<state>',
+           default='available',
+           help=('Indicate which state to assign the snapshot. '
+                 'Options include available, error, creating, '
+                 'deleting, error_deleting. If no state is provided, '
+                 'available will be used.'))
[email protected]_type('snapshot')
+def do_snapshot_reset_state(cs, args):
+    """Explicitly update the state of a snapshot."""
+    snapshot = _find_volume_snapshot(cs, args.snapshot)
+    snapshot.reset_state(args.state)
+
+
 def _print_volume_type_list(vtypes):
     utils.print_list(vtypes, ['ID', 'Name'])
 
@@ -792,9 +804,7 @@
     info = dict()
     info.update(backup._info)
 
-    if 'links' in info:
-        info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
 
 
@@ -847,9 +857,7 @@
     info = dict()
     info.update(transfer._info)
 
-    if 'links' in info:
-        info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
 
 
@@ -873,9 +881,7 @@
     info = dict()
     info.update(transfer._info)
 
-    if 'links' in info:
-        info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
 
 
@@ -896,7 +902,17 @@
     info = dict()
     info.update(transfer._info)
 
-    if 'links' in info:
-        info.pop('links')
-
+    info.pop('links', None)
     utils.print_dict(info)
+
+
[email protected]('volume', metavar='<volume>', help='ID of the volume to extend.')
[email protected]('new-size',
+           metavar='<new_size>',
+           type=int,
+           help='New size of volume in GB')
[email protected]_type('volume')
+def do_extend(cs, args):
+    """Attempt to extend the size of an existing volume."""
+    volume = _find_volume(cs, args.volume)
+    cs.volumes.extend_volume(volume, args.new_size)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/volume_snapshots.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/volume_snapshots.py
--- 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/volume_snapshots.py   
    2013-06-25 22:36:31.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/volume_snapshots.py   
    2013-07-05 18:45:13.000000000 +0200
@@ -45,6 +45,10 @@
     def project_id(self):
         return self._info.get('os-extended-snapshot-attributes:project_id')
 
+    def reset_state(self, state):
+        """Update the snapshot with the provided state."""
+        self.manager.reset_state(self, state)
+
 
 class SnapshotManager(base.ManagerWithFind):
     """Manage :class:`Snapshot` resources."""
@@ -118,3 +122,14 @@
         body = {"snapshot": kwargs}
 
         self._update("/snapshots/%s" % base.getid(snapshot), body)
+
+    def reset_state(self, snapshot, state):
+        """Update the specified snapshot with the provided state."""
+        return self._action('os-reset_status', snapshot, {'status': state})
+
+    def _action(self, action, snapshot, info=None, **kwargs):
+        """Perform a snapshot action."""
+        body = {action: info}
+        self.run_hooks('modify_body_for_action', body, **kwargs)
+        url = '/snapshots/%s/action' % base.getid(snapshot)
+        return self.api.client.post(url, body=body)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/volumes.py 
new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/volumes.py
--- old/python-cinderclient-1.0.4.49.g273a829/cinderclient/v2/volumes.py        
2013-06-25 22:36:31.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/cinderclient/v2/volumes.py        
2013-07-05 18:45:13.000000000 +0200
@@ -104,6 +104,14 @@
         """Update the volume with the provided state."""
         self.manager.reset_state(self, state)
 
+    def extend(self, volume, new_size):
+        """Extend the size of the specified volume.
+        :param volume: The UUID of the volume to extend
+        :param new_size: The desired size to extend volume to.
+        """
+
+        self.manager.extend(self, volume, new_size)
+
 
 class VolumeManager(base.ManagerWithFind):
     """Manage :class:`Volume` resources."""
@@ -321,3 +329,8 @@
     def reset_state(self, volume, state):
         """Update the provided volume with the provided state."""
         return self._action('os-reset_status', volume, {'status': state})
+
+    def extend(self, volume, new_size):
+        return self._action('os-extend',
+                            base.getid(volume),
+                            {'new_size': new_size})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/openstack-common.conf 
new/python-cinderclient-1.0.4.56.ga3985ee/openstack-common.conf
--- old/python-cinderclient-1.0.4.49.g273a829/openstack-common.conf     
2013-06-25 22:36:29.000000000 +0200
+++ new/python-cinderclient-1.0.4.56.ga3985ee/openstack-common.conf     
2013-07-05 18:45:13.000000000 +0200
@@ -1,7 +1,7 @@
 [DEFAULT]
 
 # The list of modules to copy from openstack-common
-modules=strutils
+modules=apiclient,strutils
 
 # The base module to hold the copy of openstack.common
 base=cinderclient
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/python_cinderclient.egg-info/PKG-INFO 
new/python-cinderclient-1.0.4.56.ga3985ee/python_cinderclient.egg-info/PKG-INFO
--- 
old/python-cinderclient-1.0.4.49.g273a829/python_cinderclient.egg-info/PKG-INFO 
    2013-06-25 22:37:03.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/python_cinderclient.egg-info/PKG-INFO 
    2013-07-05 18:45:44.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-cinderclient
-Version: 1.0.4.49.g273a829
+Version: 1.0.4.56.ga3985ee
 Summary: OpenStack Block Storage API Client Library
 Home-page: http://www.openstack.org/
 Author: OpenStack
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/python-cinderclient-1.0.4.49.g273a829/python_cinderclient.egg-info/SOURCES.txt
 
new/python-cinderclient-1.0.4.56.ga3985ee/python_cinderclient.egg-info/SOURCES.txt
--- 
old/python-cinderclient-1.0.4.49.g273a829/python_cinderclient.egg-info/SOURCES.txt
  2013-06-25 22:37:04.000000000 +0200
+++ 
new/python-cinderclient-1.0.4.56.ga3985ee/python_cinderclient.egg-info/SOURCES.txt
  2013-07-05 18:45:46.000000000 +0200
@@ -25,6 +25,8 @@
 cinderclient/openstack/__init__.py
 cinderclient/openstack/common/__init__.py
 cinderclient/openstack/common/strutils.py
+cinderclient/openstack/common/apiclient/__init__.py
+cinderclient/openstack/common/apiclient/exceptions.py
 cinderclient/tests/__init__.py
 cinderclient/tests/fakes.py
 cinderclient/tests/test_base.py

-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to