Add support for multiple cinder endpoints
Before v1 and v2 were set to the same service_type, so you could only have one set at a time. This assumes the catalog is setup for v1 service_type 'volume' and v2 service_type 'volumev2'. For backwards compatibility, we will allow v2 to be setup with service_type 'volume' for existing installations. Change-Id: Ife6d2cdb12d894b84ea3b276767fb93d487355d5
This commit is contained in:
		@@ -52,15 +52,22 @@ class ServiceCatalog(object):
 | 
			
		||||
        catalog = self.catalog['access']['serviceCatalog']
 | 
			
		||||
 | 
			
		||||
        for service in catalog:
 | 
			
		||||
            if service.get("type") != service_type:
 | 
			
		||||
 | 
			
		||||
            # NOTE(thingee): For backwards compatibility, if they have v2
 | 
			
		||||
            # enabled and the service_type is set to 'volume', go ahead and
 | 
			
		||||
            # accept that.
 | 
			
		||||
            skip_service_type_check = False
 | 
			
		||||
            if service_type == 'volumev2' and service['type'] == 'volume':
 | 
			
		||||
                version = service['endpoints'][0]['publicURL'].split('/')[3]
 | 
			
		||||
                if version == 'v2':
 | 
			
		||||
                    skip_service_type_check = True
 | 
			
		||||
 | 
			
		||||
            if (not skip_service_type_check
 | 
			
		||||
                    and service.get("type") != service_type):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            if (service_name and service_type == 'compute' and
 | 
			
		||||
                    service.get('name') != service_name):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            if (volume_service_name and service_type == 'volume' and
 | 
			
		||||
                    service.get('name') != volume_service_name):
 | 
			
		||||
            if (volume_service_name and service_type in ('volume', 'volumev2')
 | 
			
		||||
                    and service.get('name') != volume_service_name):
 | 
			
		||||
                continue
 | 
			
		||||
 | 
			
		||||
            endpoints = service['endpoints']
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ from cinderclient.v2 import shell as shell_v2
 | 
			
		||||
 | 
			
		||||
DEFAULT_OS_VOLUME_API_VERSION = "1"
 | 
			
		||||
DEFAULT_CINDER_ENDPOINT_TYPE = 'publicURL'
 | 
			
		||||
DEFAULT_CINDER_SERVICE_TYPE = 'compute'
 | 
			
		||||
DEFAULT_CINDER_SERVICE_TYPE = 'volume'
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
@@ -145,7 +145,7 @@ class OpenStackCinderShell(object):
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--service-type',
 | 
			
		||||
                            metavar='<service-type>',
 | 
			
		||||
                            help='Defaults to compute for most actions')
 | 
			
		||||
                            help='Defaults to volume for most actions')
 | 
			
		||||
        parser.add_argument('--service_type',
 | 
			
		||||
                            help=argparse.SUPPRESS)
 | 
			
		||||
 | 
			
		||||
@@ -173,7 +173,7 @@ class OpenStackCinderShell(object):
 | 
			
		||||
                            help=argparse.SUPPRESS)
 | 
			
		||||
 | 
			
		||||
        parser.add_argument('--os-volume-api-version',
 | 
			
		||||
                            metavar='<compute-api-ver>',
 | 
			
		||||
                            metavar='<volume-api-ver>',
 | 
			
		||||
                            default=utils.env('OS_VOLUME_API_VERSION',
 | 
			
		||||
                            default=DEFAULT_OS_VOLUME_API_VERSION),
 | 
			
		||||
                            help='Accepts 1 or 2,defaults '
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ SERVICE_CATALOG = {
 | 
			
		||||
                "endpoints_links": [],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "name": "Nova Volumes",
 | 
			
		||||
                "name": "Cinder Volume Service",
 | 
			
		||||
                "type": "volume",
 | 
			
		||||
                "endpoints": [
 | 
			
		||||
                    {
 | 
			
		||||
@@ -101,6 +101,128 @@ SERVICE_CATALOG = {
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "name": "Cinder Volume Service V2",
 | 
			
		||||
                "type": "volumev2",
 | 
			
		||||
                "endpoints": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "1",
 | 
			
		||||
                        "publicURL": "https://volume1.host/v2/1234",
 | 
			
		||||
                        "internalURL": "https://volume1.host/v2/1234",
 | 
			
		||||
                        "region": "South",
 | 
			
		||||
                        "versionId": "2.0",
 | 
			
		||||
                        "versionInfo": "uri",
 | 
			
		||||
                        "versionList": "uri"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "2",
 | 
			
		||||
                        "publicURL": "https://volume1.host/v2/3456",
 | 
			
		||||
                        "internalURL": "https://volume1.host/v2/3456",
 | 
			
		||||
                        "region": "South",
 | 
			
		||||
                        "versionId": "1.1",
 | 
			
		||||
                        "versionInfo": "https://volume1.host/v2/",
 | 
			
		||||
                        "versionList": "https://volume1.host/"
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                "endpoints_links": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "rel": "next",
 | 
			
		||||
                        "href": "https://identity1.host/v2.0/endpoints"
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
        "serviceCatalog_links": [
 | 
			
		||||
            {
 | 
			
		||||
                "rel": "next",
 | 
			
		||||
                "href": "https://identity.host/v2.0/endpoints?session=2hfh8Ar",
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SERVICE_COMPATIBILITY_CATALOG = {
 | 
			
		||||
    "access": {
 | 
			
		||||
        "token": {
 | 
			
		||||
            "id": "ab48a9efdfedb23ty3494",
 | 
			
		||||
            "expires": "2010-11-01T03:32:15-05:00",
 | 
			
		||||
            "tenant": {
 | 
			
		||||
                "id": "345",
 | 
			
		||||
                "name": "My Project"
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        "user": {
 | 
			
		||||
            "id": "123",
 | 
			
		||||
            "name": "jqsmith",
 | 
			
		||||
            "roles": [
 | 
			
		||||
                {
 | 
			
		||||
                    "id": "234",
 | 
			
		||||
                    "name": "compute:admin",
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                    "id": "235",
 | 
			
		||||
                    "name": "object-store:admin",
 | 
			
		||||
                    "tenantId": "1",
 | 
			
		||||
                }
 | 
			
		||||
            ],
 | 
			
		||||
            "roles_links": [],
 | 
			
		||||
        },
 | 
			
		||||
        "serviceCatalog": [
 | 
			
		||||
            {
 | 
			
		||||
                "name": "Cloud Servers",
 | 
			
		||||
                "type": "compute",
 | 
			
		||||
                "endpoints": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "1",
 | 
			
		||||
                        "publicURL": "https://compute1.host/v1/1234",
 | 
			
		||||
                        "internalURL": "https://compute1.host/v1/1234",
 | 
			
		||||
                        "region": "North",
 | 
			
		||||
                        "versionId": "1.0",
 | 
			
		||||
                        "versionInfo": "https://compute1.host/v1/",
 | 
			
		||||
                        "versionList": "https://compute1.host/"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "2",
 | 
			
		||||
                        "publicURL": "https://compute1.host/v1/3456",
 | 
			
		||||
                        "internalURL": "https://compute1.host/v1/3456",
 | 
			
		||||
                        "region": "North",
 | 
			
		||||
                        "versionId": "1.1",
 | 
			
		||||
                        "versionInfo": "https://compute1.host/v1/",
 | 
			
		||||
                        "versionList": "https://compute1.host/"
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                "endpoints_links": [],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                "name": "Cinder Volume Service V2",
 | 
			
		||||
                "type": "volume",
 | 
			
		||||
                "endpoints": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "1",
 | 
			
		||||
                        "publicURL": "https://volume1.host/v2/1234",
 | 
			
		||||
                        "internalURL": "https://volume1.host/v2/1234",
 | 
			
		||||
                        "region": "South",
 | 
			
		||||
                        "versionId": "2.0",
 | 
			
		||||
                        "versionInfo": "uri",
 | 
			
		||||
                        "versionList": "uri"
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "tenantId": "2",
 | 
			
		||||
                        "publicURL": "https://volume1.host/v2/3456",
 | 
			
		||||
                        "internalURL": "https://volume1.host/v2/3456",
 | 
			
		||||
                        "region": "South",
 | 
			
		||||
                        "versionId": "1.1",
 | 
			
		||||
                        "versionInfo": "https://volume1.host/v2/",
 | 
			
		||||
                        "versionList": "https://volume1.host/"
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                "endpoints_links": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "rel": "next",
 | 
			
		||||
                        "href": "https://identity1.host/v2.0/endpoints"
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
        "serviceCatalog_links": [
 | 
			
		||||
            {
 | 
			
		||||
@@ -136,5 +258,18 @@ class ServiceCatalogTest(utils.TestCase):
 | 
			
		||||
        self.assertEquals(sc.url_for('tenantId', '2', service_type='volume'),
 | 
			
		||||
                          "https://volume1.host/v1/3456")
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(sc.url_for('tenantId', '2', service_type='volumev2'),
 | 
			
		||||
                          "https://volume1.host/v2/3456")
 | 
			
		||||
        self.assertEquals(sc.url_for('tenantId', '2', service_type='volumev2'),
 | 
			
		||||
                          "https://volume1.host/v2/3456")
 | 
			
		||||
 | 
			
		||||
        self.assertRaises(exceptions.EndpointNotFound, sc.url_for,
 | 
			
		||||
                          "region", "North", service_type='volume')
 | 
			
		||||
 | 
			
		||||
    def test_compatibility_service_type(self):
 | 
			
		||||
        sc = service_catalog.ServiceCatalog(SERVICE_COMPATIBILITY_CATALOG)
 | 
			
		||||
 | 
			
		||||
        self.assertEquals(sc.url_for('tenantId', '1', service_type='volume'),
 | 
			
		||||
                          "https://volume1.host/v2/1234")
 | 
			
		||||
        self.assertEquals(sc.url_for('tenantId', '2', service_type='volume'),
 | 
			
		||||
                          "https://volume1.host/v2/3456")
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ from cinderclient.tests import utils
 | 
			
		||||
class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
    def test_authenticate_success(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v1", service_type='volume')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -33,13 +33,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": "volume",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v1/",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -89,8 +89,9 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
        test_auth_call()
 | 
			
		||||
 | 
			
		||||
    def test_authenticate_tenant_id(self):
 | 
			
		||||
        cs = client.Client("username", "password", auth_url="auth_url/v2.0",
 | 
			
		||||
                           tenant_id='tenant_id', service_type='compute')
 | 
			
		||||
        cs = client.Client("username", "password",
 | 
			
		||||
                           auth_url="http://localhost:8776/v1",
 | 
			
		||||
                           tenant_id='tenant_id', service_type='volume')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -105,13 +106,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": "volume",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v1/",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -164,7 +165,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_authenticate_failure(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0")
 | 
			
		||||
                           "http://localhost:8776/v1")
 | 
			
		||||
        resp = {"unauthorized": {"message": "Unauthorized", "code": "401"}}
 | 
			
		||||
        auth_response = utils.TestResponse({
 | 
			
		||||
            "status_code": 401,
 | 
			
		||||
@@ -181,7 +182,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_auth_redirect(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v1", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v1", service_type='volume')
 | 
			
		||||
        dict_correct_response = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -190,13 +191,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": "volume",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v1/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1/",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -265,7 +266,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_ambiguous_endpoints(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v1", service_type='volume')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -274,25 +275,25 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "adminURL": "http://localhost:8774/v1",
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "name": "Compute CLoud",
 | 
			
		||||
                        "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                        "type": "volume",
 | 
			
		||||
                        "name": "Cinder Volume Service",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v1/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "adminURL": "http://localhost:8774/v1",
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "name": "Hyper-compute Cloud",
 | 
			
		||||
                        "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                        "type": "volume",
 | 
			
		||||
                        "name": "Cinder Volume Cloud Service",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v1/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ from cinderclient.tests import utils
 | 
			
		||||
class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
    def test_authenticate_success(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v2", service_type='volumev2')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -36,13 +36,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": "volumev2",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v2/",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v2",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -92,8 +92,9 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
        test_auth_call()
 | 
			
		||||
 | 
			
		||||
    def test_authenticate_tenant_id(self):
 | 
			
		||||
        cs = client.Client("username", "password", auth_url="auth_url/v2.0",
 | 
			
		||||
                           tenant_id='tenant_id', service_type='compute')
 | 
			
		||||
        cs = client.Client("username", "password",
 | 
			
		||||
                           auth_url="http://localhost:8776/v2",
 | 
			
		||||
                           tenant_id='tenant_id', service_type='volumev2')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -108,13 +109,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": 'volumev2',
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v2/",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v2",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -167,7 +168,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_authenticate_failure(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0")
 | 
			
		||||
                           "http://localhost:8776/v2")
 | 
			
		||||
        resp = {"unauthorized": {"message": "Unauthorized", "code": "401"}}
 | 
			
		||||
        auth_response = utils.TestResponse({
 | 
			
		||||
            "status_code": 401,
 | 
			
		||||
@@ -184,7 +185,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_auth_redirect(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v2", service_type='volumev2')
 | 
			
		||||
        dict_correct_response = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -193,13 +194,13 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "type": "volumev2",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "adminURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "adminURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v2/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v2/",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
@@ -268,7 +269,7 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
 | 
			
		||||
    def test_ambiguous_endpoints(self):
 | 
			
		||||
        cs = client.Client("username", "password", "project_id",
 | 
			
		||||
                           "auth_url/v2.0", service_type='compute')
 | 
			
		||||
                           "http://localhost:8776/v2", service_type='volumev2')
 | 
			
		||||
        resp = {
 | 
			
		||||
            "access": {
 | 
			
		||||
                "token": {
 | 
			
		||||
@@ -277,25 +278,25 @@ class AuthenticateAgainstKeystoneTests(utils.TestCase):
 | 
			
		||||
                },
 | 
			
		||||
                "serviceCatalog": [
 | 
			
		||||
                    {
 | 
			
		||||
                        "adminURL": "http://localhost:8774/v2",
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "name": "Compute CLoud",
 | 
			
		||||
                        "adminURL": "http://localhost:8776/v1",
 | 
			
		||||
                        "type": "volumev2",
 | 
			
		||||
                        "name": "Cinder Volume Service",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "region": "RegionOne",
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v2/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v1",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v1",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        "adminURL": "http://localhost:8774/v2",
 | 
			
		||||
                        "type": "compute",
 | 
			
		||||
                        "name": "Hyper-compute Cloud",
 | 
			
		||||
                        "adminURL": "http://localhost:8776/v2",
 | 
			
		||||
                        "type": "volumev2",
 | 
			
		||||
                        "name": "Cinder Volume V2",
 | 
			
		||||
                        "endpoints": [
 | 
			
		||||
                            {
 | 
			
		||||
                                "internalURL": "http://localhost:8774/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8774/v2/",
 | 
			
		||||
                                "internalURL": "http://localhost:8776/v2",
 | 
			
		||||
                                "publicURL": "http://localhost:8776/v2",
 | 
			
		||||
                            },
 | 
			
		||||
                        ],
 | 
			
		||||
                    },
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class Client(object):
 | 
			
		||||
                 insecure=False, timeout=None, tenant_id=None,
 | 
			
		||||
                 proxy_tenant_id=None, proxy_token=None, region_name=None,
 | 
			
		||||
                 endpoint_type='publicURL', extensions=None,
 | 
			
		||||
                 service_type='volume', service_name=None,
 | 
			
		||||
                 service_type='volumev2', service_name=None,
 | 
			
		||||
                 volume_service_name=None, retries=None,
 | 
			
		||||
                 http_log_debug=False,
 | 
			
		||||
                 cacert=None):
 | 
			
		||||
 
 | 
			
		||||
@@ -146,7 +146,7 @@ def _extract_metadata(args):
 | 
			
		||||
           metavar='<status>',
 | 
			
		||||
           default=None,
 | 
			
		||||
           help='Filter results by status')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_list(cs, args):
 | 
			
		||||
    """List all the volumes."""
 | 
			
		||||
    # NOTE(thingee): Backwards-compatibility with v1 args
 | 
			
		||||
@@ -174,7 +174,7 @@ def do_list(cs, args):
 | 
			
		||||
@utils.arg('volume',
 | 
			
		||||
           metavar='<volume>',
 | 
			
		||||
           help='ID of the volume.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_show(cs, args):
 | 
			
		||||
    """Show details about a volume."""
 | 
			
		||||
    info = dict()
 | 
			
		||||
@@ -247,7 +247,7 @@ def do_show(cs, args):
 | 
			
		||||
           action='append',
 | 
			
		||||
           default=[],
 | 
			
		||||
           help='Scheduler hint like in nova')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_create(cs, args):
 | 
			
		||||
    """Add a new volume."""
 | 
			
		||||
    # NOTE(thingee): Backwards-compatibility with v1 args
 | 
			
		||||
@@ -298,7 +298,7 @@ def do_create(cs, args):
 | 
			
		||||
@utils.arg('volume',
 | 
			
		||||
           metavar='<volume>',
 | 
			
		||||
           help='ID of the volume to delete.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_delete(cs, args):
 | 
			
		||||
    """Remove a volume."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume)
 | 
			
		||||
@@ -308,7 +308,7 @@ def do_delete(cs, args):
 | 
			
		||||
@utils.arg('volume',
 | 
			
		||||
           metavar='<volume>',
 | 
			
		||||
           help='ID of the volume to delete.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_force_delete(cs, args):
 | 
			
		||||
    """Attempt forced removal of a volume, regardless of its state."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume)
 | 
			
		||||
@@ -320,7 +320,7 @@ def do_force_delete(cs, args):
 | 
			
		||||
           help=('Indicate which state to assign the volume. Options include '
 | 
			
		||||
                 'available, error, creating, deleting, error_deleting. If no '
 | 
			
		||||
                 'state is provided, available will be used.'))
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_reset_state(cs, args):
 | 
			
		||||
    """Explicitly update the state of a volume."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume)
 | 
			
		||||
@@ -341,7 +341,7 @@ def do_reset_state(cs, args):
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.arg('--display_description',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_rename(cs, args):
 | 
			
		||||
    """Rename a volume."""
 | 
			
		||||
    kwargs = {}
 | 
			
		||||
@@ -369,7 +369,7 @@ def do_rename(cs, args):
 | 
			
		||||
           action='append',
 | 
			
		||||
           default=[],
 | 
			
		||||
           help='Metadata to set/unset (only key is necessary on unset)')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_metadata(cs, args):
 | 
			
		||||
    """Set or Delete metadata on a volume."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume)
 | 
			
		||||
@@ -412,7 +412,7 @@ def do_metadata(cs, args):
 | 
			
		||||
           help='Filter results by volume-id')
 | 
			
		||||
@utils.arg('--volume_id',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_list(cs, args):
 | 
			
		||||
    """List all the snapshots."""
 | 
			
		||||
    all_tenants = int(os.environ.get("ALL_TENANTS", args.all_tenants))
 | 
			
		||||
@@ -436,7 +436,7 @@ def do_snapshot_list(cs, args):
 | 
			
		||||
@utils.arg('snapshot',
 | 
			
		||||
           metavar='<snapshot>',
 | 
			
		||||
           help='ID of the snapshot.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_show(cs, args):
 | 
			
		||||
    """Show details about a snapshot."""
 | 
			
		||||
    snapshot = _find_volume_snapshot(cs, args.snapshot)
 | 
			
		||||
@@ -468,7 +468,7 @@ def do_snapshot_show(cs, args):
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.arg('--display_description',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_create(cs, args):
 | 
			
		||||
    """Add a new snapshot."""
 | 
			
		||||
    if args.display_name is not None:
 | 
			
		||||
@@ -487,7 +487,7 @@ def do_snapshot_create(cs, args):
 | 
			
		||||
@utils.arg('snapshot-id',
 | 
			
		||||
           metavar='<snapshot-id>',
 | 
			
		||||
           help='ID of the snapshot to delete.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_delete(cs, args):
 | 
			
		||||
    """Remove a snapshot."""
 | 
			
		||||
    snapshot = _find_volume_snapshot(cs, args.snapshot_id)
 | 
			
		||||
@@ -504,7 +504,7 @@ def do_snapshot_delete(cs, args):
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.arg('--display_description',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_rename(cs, args):
 | 
			
		||||
    """Rename a snapshot."""
 | 
			
		||||
    kwargs = {}
 | 
			
		||||
@@ -528,7 +528,7 @@ def do_snapshot_rename(cs, args):
 | 
			
		||||
                 'Options include available, error, creating, '
 | 
			
		||||
                 'deleting, error_deleting. If no state is provided, '
 | 
			
		||||
                 'available will be used.'))
 | 
			
		||||
@utils.service_type('snapshot')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_snapshot_reset_state(cs, args):
 | 
			
		||||
    """Explicitly update the state of a snapshot."""
 | 
			
		||||
    snapshot = _find_volume_snapshot(cs, args.snapshot)
 | 
			
		||||
@@ -544,14 +544,14 @@ def _print_type_and_extra_specs_list(vtypes):
 | 
			
		||||
    utils.print_list(vtypes, ['ID', 'Name', 'extra_specs'], formatters)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_type_list(cs, args):
 | 
			
		||||
    """Print a list of available 'volume types'."""
 | 
			
		||||
    vtypes = cs.volume_types.list()
 | 
			
		||||
    _print_volume_type_list(vtypes)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_extra_specs_list(cs, args):
 | 
			
		||||
    """Print a list of current 'volume types and extra specs' (Admin Only)."""
 | 
			
		||||
    vtypes = cs.volume_types.list()
 | 
			
		||||
@@ -561,7 +561,7 @@ def do_extra_specs_list(cs, args):
 | 
			
		||||
@utils.arg('name',
 | 
			
		||||
           metavar='<name>',
 | 
			
		||||
           help="Name of the new volume type")
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_type_create(cs, args):
 | 
			
		||||
    """Create a new volume type."""
 | 
			
		||||
    vtype = cs.volume_types.create(args.name)
 | 
			
		||||
@@ -571,7 +571,7 @@ def do_type_create(cs, args):
 | 
			
		||||
@utils.arg('id',
 | 
			
		||||
           metavar='<id>',
 | 
			
		||||
           help="Unique ID of the volume type to delete")
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_type_delete(cs, args):
 | 
			
		||||
    """Delete a specific volume type."""
 | 
			
		||||
    cs.volume_types.delete(args.id)
 | 
			
		||||
@@ -590,7 +590,7 @@ def do_type_delete(cs, args):
 | 
			
		||||
           action='append',
 | 
			
		||||
           default=[],
 | 
			
		||||
           help='Extra_specs to set/unset (only key is necessary on unset)')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_type_key(cs, args):
 | 
			
		||||
    "Set or unset extra_spec for a volume type."""
 | 
			
		||||
    vtype = _find_volume_type(cs, args.vtype)
 | 
			
		||||
@@ -648,7 +648,7 @@ def _quota_update(manager, identifier, args):
 | 
			
		||||
@utils.arg('tenant',
 | 
			
		||||
           metavar='<tenant_id>',
 | 
			
		||||
           help='UUID of tenant to list the quotas for.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_quota_show(cs, args):
 | 
			
		||||
    """List the quotas for a tenant."""
 | 
			
		||||
 | 
			
		||||
@@ -658,7 +658,7 @@ def do_quota_show(cs, args):
 | 
			
		||||
@utils.arg('tenant',
 | 
			
		||||
           metavar='<tenant_id>',
 | 
			
		||||
           help='UUID of tenant to list the default quotas for.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_quota_defaults(cs, args):
 | 
			
		||||
    """List the default quotas for a tenant."""
 | 
			
		||||
 | 
			
		||||
@@ -684,7 +684,7 @@ def do_quota_defaults(cs, args):
 | 
			
		||||
           metavar='<volume_type_name>',
 | 
			
		||||
           default=None,
 | 
			
		||||
           help='Volume type (Optional, Default=None)')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_quota_update(cs, args):
 | 
			
		||||
    """Update the quotas for a tenant."""
 | 
			
		||||
 | 
			
		||||
@@ -694,7 +694,7 @@ def do_quota_update(cs, args):
 | 
			
		||||
@utils.arg('class_name',
 | 
			
		||||
           metavar='<class>',
 | 
			
		||||
           help='Name of quota class to list the quotas for.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_quota_class_show(cs, args):
 | 
			
		||||
    """List the quotas for a quota class."""
 | 
			
		||||
 | 
			
		||||
@@ -720,14 +720,14 @@ def do_quota_class_show(cs, args):
 | 
			
		||||
           metavar='<volume_type_name>',
 | 
			
		||||
           default=None,
 | 
			
		||||
           help='Volume type (Optional, Default=None)')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_quota_class_update(cs, args):
 | 
			
		||||
    """Update the quotas for a quota class."""
 | 
			
		||||
 | 
			
		||||
    _quota_update(cs.quota_classes, args.class_name, args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_absolute_limits(cs, args):
 | 
			
		||||
    """Print a list of absolute limits for a user"""
 | 
			
		||||
    limits = cs.limits.get().absolute
 | 
			
		||||
@@ -735,7 +735,7 @@ def do_absolute_limits(cs, args):
 | 
			
		||||
    utils.print_list(limits, columns)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_rate_limits(cs, args):
 | 
			
		||||
    """Print a list of rate limits for a user"""
 | 
			
		||||
    limits = cs.limits.get().rate
 | 
			
		||||
@@ -783,7 +783,7 @@ def _find_volume_type(cs, vtype):
 | 
			
		||||
           help='Name for created image')
 | 
			
		||||
@utils.arg('--image_name',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_upload_to_image(cs, args):
 | 
			
		||||
    """Upload volume to image service as image."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume_id)
 | 
			
		||||
@@ -809,7 +809,7 @@ def do_upload_to_image(cs, args):
 | 
			
		||||
           metavar='<description>',
 | 
			
		||||
           default=None,
 | 
			
		||||
           help='Options backup description (Default=None)')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_backup_create(cs, args):
 | 
			
		||||
    """Creates a backup."""
 | 
			
		||||
    if args.display_name is not None:
 | 
			
		||||
@@ -825,7 +825,7 @@ def do_backup_create(cs, args):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.arg('backup', metavar='<backup>', help='ID of the backup.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_backup_show(cs, args):
 | 
			
		||||
    """Show details about a backup."""
 | 
			
		||||
    backup = _find_backup(cs, args.backup)
 | 
			
		||||
@@ -836,7 +836,7 @@ def do_backup_show(cs, args):
 | 
			
		||||
    utils.print_dict(info)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_backup_list(cs, args):
 | 
			
		||||
    """List all the backups."""
 | 
			
		||||
    backups = cs.backups.list()
 | 
			
		||||
@@ -847,7 +847,7 @@ def do_backup_list(cs, args):
 | 
			
		||||
 | 
			
		||||
@utils.arg('backup', metavar='<backup>',
 | 
			
		||||
           help='ID of the backup to delete.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_backup_delete(cs, args):
 | 
			
		||||
    """Remove a backup."""
 | 
			
		||||
    backup = _find_backup(cs, args.backup)
 | 
			
		||||
@@ -859,7 +859,7 @@ def do_backup_delete(cs, args):
 | 
			
		||||
@utils.arg('--volume-id', metavar='<volume-id>',
 | 
			
		||||
           help='Optional ID of the volume to restore to.',
 | 
			
		||||
           default=None)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_backup_restore(cs, args):
 | 
			
		||||
    """Restore a backup."""
 | 
			
		||||
    cs.restores.restore(args.backup,
 | 
			
		||||
@@ -874,7 +874,7 @@ def do_backup_restore(cs, args):
 | 
			
		||||
           help='Optional transfer name. (Default=None)')
 | 
			
		||||
@utils.arg('--display-name',
 | 
			
		||||
           help=argparse.SUPPRESS)
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_transfer_create(cs, args):
 | 
			
		||||
    """Creates a volume transfer."""
 | 
			
		||||
    if args.display_name is not None:
 | 
			
		||||
@@ -891,7 +891,7 @@ def do_transfer_create(cs, args):
 | 
			
		||||
 | 
			
		||||
@utils.arg('transfer', metavar='<transfer>',
 | 
			
		||||
           help='ID of the transfer to delete.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_transfer_delete(cs, args):
 | 
			
		||||
    """Undo a transfer."""
 | 
			
		||||
    transfer = _find_transfer(cs, args.transfer)
 | 
			
		||||
@@ -902,7 +902,7 @@ def do_transfer_delete(cs, args):
 | 
			
		||||
           help='ID of the transfer to accept.')
 | 
			
		||||
@utils.arg('auth_key', metavar='<auth_key>',
 | 
			
		||||
           help='Auth key of the transfer to accept.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_transfer_accept(cs, args):
 | 
			
		||||
    """Accepts a volume transfer."""
 | 
			
		||||
    transfer = cs.transfers.accept(args.transfer, args.auth_key)
 | 
			
		||||
@@ -913,7 +913,7 @@ def do_transfer_accept(cs, args):
 | 
			
		||||
    utils.print_dict(info)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_transfer_list(cs, args):
 | 
			
		||||
    """List all the transfers."""
 | 
			
		||||
    transfers = cs.transfers.list()
 | 
			
		||||
@@ -923,7 +923,7 @@ def do_transfer_list(cs, args):
 | 
			
		||||
 | 
			
		||||
@utils.arg('transfer', metavar='<transfer>',
 | 
			
		||||
           help='ID of the transfer to accept.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_transfer_show(cs, args):
 | 
			
		||||
    """Show details about a transfer."""
 | 
			
		||||
    transfer = _find_transfer(cs, args.transfer)
 | 
			
		||||
@@ -939,7 +939,7 @@ def do_transfer_show(cs, args):
 | 
			
		||||
           metavar='<new_size>',
 | 
			
		||||
           type=int,
 | 
			
		||||
           help='New size of volume in GB')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_extend(cs, args):
 | 
			
		||||
    """Attempt to extend the size of an existing volume."""
 | 
			
		||||
    volume = _find_volume(cs, args.volume)
 | 
			
		||||
@@ -950,7 +950,7 @@ def do_extend(cs, args):
 | 
			
		||||
           help='Name of host.')
 | 
			
		||||
@utils.arg('--binary', metavar='<binary>', default=None,
 | 
			
		||||
           help='Service binary.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_service_list(cs, args):
 | 
			
		||||
    """List all the services. Filter by host & service binary."""
 | 
			
		||||
    result = cs.services.list(host=args.host, binary=args.binary)
 | 
			
		||||
@@ -960,7 +960,7 @@ def do_service_list(cs, args):
 | 
			
		||||
 | 
			
		||||
@utils.arg('host', metavar='<hostname>', help='Name of host.')
 | 
			
		||||
@utils.arg('binary', metavar='<binary>', help='Service binary.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_service_enable(cs, args):
 | 
			
		||||
    """Enable the service."""
 | 
			
		||||
    cs.services.enable(args.host, args.binary)
 | 
			
		||||
@@ -968,7 +968,7 @@ def do_service_enable(cs, args):
 | 
			
		||||
 | 
			
		||||
@utils.arg('host', metavar='<hostname>', help='Name of host.')
 | 
			
		||||
@utils.arg('binary', metavar='<binary>', help='Service binary.')
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_service_disable(cs, args):
 | 
			
		||||
    """Disable the service."""
 | 
			
		||||
    cs.services.disable(args.host, args.binary)
 | 
			
		||||
@@ -1016,7 +1016,7 @@ def _treeizeAvailabilityZone(zone):
 | 
			
		||||
    return result
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@utils.service_type('volume')
 | 
			
		||||
@utils.service_type('volumev2')
 | 
			
		||||
def do_availability_zone_list(cs, _args):
 | 
			
		||||
    """List all the availability zones."""
 | 
			
		||||
    try:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user