Remove volume v1 service clients
Cinder has removed the volume v1 APIs in queens cycle: I03bf2db5bd7e2fdfb4f6032758ccaf2b348a82ba Tempest does not support queens release so we are good to remove the volume v1 service clients also. Change-Id: I297f230de51e0ef4f35eb33ddbaaab53c230713f
This commit is contained in:
parent
393e94a604
commit
08d5376e5b
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
prelude: >
|
||||||
|
Tempest Service clients for volume v1 APIs are removed.
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
Cinder removed the volume v1 APIs in queens release and Tempest
|
||||||
|
now support only stable train onwards release so all the Tempest
|
||||||
|
service clients for volume v1 APIs are now removed.
|
@ -52,7 +52,6 @@ def tempest_modules():
|
|||||||
'image.v2': image.v2,
|
'image.v2': image.v2,
|
||||||
'network': network,
|
'network': network,
|
||||||
'object-storage': object_storage,
|
'object-storage': object_storage,
|
||||||
'volume.v1': volume.v1,
|
|
||||||
'volume.v2': volume.v2,
|
'volume.v2': volume.v2,
|
||||||
'volume.v3': volume.v3
|
'volume.v3': volume.v3
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,7 @@
|
|||||||
# License for the specific language governing permissions and limitations under
|
# License for the specific language governing permissions and limitations under
|
||||||
# the License.
|
# the License.
|
||||||
|
|
||||||
from tempest.lib.services.volume import v1
|
|
||||||
from tempest.lib.services.volume import v2
|
from tempest.lib.services.volume import v2
|
||||||
from tempest.lib.services.volume import v3
|
from tempest.lib.services.volume import v3
|
||||||
|
|
||||||
__all__ = ['v1', 'v2', 'v3']
|
__all__ = ['v2', 'v3']
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
||||||
# use this file except in compliance with the License. You may obtain a copy of
|
|
||||||
# the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations under
|
|
||||||
# the License.
|
|
||||||
|
|
||||||
from tempest.lib.services.volume.v1.availability_zone_client \
|
|
||||||
import AvailabilityZoneClient
|
|
||||||
from tempest.lib.services.volume.v1.backups_client import BackupsClient
|
|
||||||
from tempest.lib.services.volume.v1.encryption_types_client import \
|
|
||||||
EncryptionTypesClient
|
|
||||||
from tempest.lib.services.volume.v1.extensions_client import ExtensionsClient
|
|
||||||
from tempest.lib.services.volume.v1.hosts_client import HostsClient
|
|
||||||
from tempest.lib.services.volume.v1.limits_client import LimitsClient
|
|
||||||
from tempest.lib.services.volume.v1.qos_client import QosSpecsClient
|
|
||||||
from tempest.lib.services.volume.v1.quotas_client import QuotasClient
|
|
||||||
from tempest.lib.services.volume.v1.services_client import ServicesClient
|
|
||||||
from tempest.lib.services.volume.v1.snapshots_client import SnapshotsClient
|
|
||||||
from tempest.lib.services.volume.v1.types_client import TypesClient
|
|
||||||
from tempest.lib.services.volume.v1.volumes_client import VolumesClient
|
|
||||||
|
|
||||||
__all__ = ['AvailabilityZoneClient', 'BackupsClient', 'EncryptionTypesClient',
|
|
||||||
'ExtensionsClient', 'HostsClient', 'QosSpecsClient', 'QuotasClient',
|
|
||||||
'ServicesClient', 'SnapshotsClient', 'TypesClient', 'VolumesClient',
|
|
||||||
'LimitsClient']
|
|
@ -1,28 +0,0 @@
|
|||||||
# Copyright 2014 NEC Corporation.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class AvailabilityZoneClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 availability zone client."""
|
|
||||||
|
|
||||||
def list_availability_zones(self):
|
|
||||||
resp, body = self.get('os-availability-zone')
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,112 +0,0 @@
|
|||||||
# Copyright 2014 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.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class BackupsClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 Backups client"""
|
|
||||||
api_version = "v1"
|
|
||||||
|
|
||||||
def create_backup(self, **kwargs):
|
|
||||||
"""Creates a backup of volume.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-backup
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'backup': kwargs})
|
|
||||||
resp, body = self.post('backups', post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def restore_backup(self, backup_id, **kwargs):
|
|
||||||
"""Restore volume from backup.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#restore-backup
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'restore': kwargs})
|
|
||||||
resp, body = self.post('backups/%s/restore' % (backup_id), post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_backup(self, backup_id):
|
|
||||||
"""Delete a backup of volume."""
|
|
||||||
resp, body = self.delete('backups/%s' % backup_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_backup(self, backup_id):
|
|
||||||
"""Returns the details of a single backup."""
|
|
||||||
url = "backups/%s" % backup_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def list_backups(self, detail=False):
|
|
||||||
"""Information for all the tenant's backups."""
|
|
||||||
url = "backups"
|
|
||||||
if detail:
|
|
||||||
url += "/detail"
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def export_backup(self, backup_id):
|
|
||||||
"""Export backup metadata record."""
|
|
||||||
url = "backups/%s/export_record" % backup_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def import_backup(self, **kwargs):
|
|
||||||
"""Import backup metadata record."""
|
|
||||||
# TODO(linanbj): Current api-site doesn't contain this API description.
|
|
||||||
# After fixing the api-site, we need to fix here also for putting the
|
|
||||||
# link to api-site.
|
|
||||||
post_body = json.dumps({'backup-record': kwargs})
|
|
||||||
resp, body = self.post("backups/import_record", post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(201, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def reset_backup_status(self, backup_id, status):
|
|
||||||
"""Reset the specified backup's status."""
|
|
||||||
post_body = json.dumps({'os-reset_status': {"status": status}})
|
|
||||||
resp, body = self.post('backups/%s/action' % backup_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def is_resource_deleted(self, id):
|
|
||||||
try:
|
|
||||||
self.show_backup(id)
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'backup'
|
|
@ -1,68 +0,0 @@
|
|||||||
# Copyright 2012 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.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class EncryptionTypesClient(rest_client.RestClient):
|
|
||||||
|
|
||||||
def is_resource_deleted(self, id):
|
|
||||||
try:
|
|
||||||
body = self.show_encryption_type(id)
|
|
||||||
if not body:
|
|
||||||
return True
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'encryption-type'
|
|
||||||
|
|
||||||
def show_encryption_type(self, volume_type_id):
|
|
||||||
"""Get the volume encryption type for the specified volume type.
|
|
||||||
|
|
||||||
:param volume_type_id: Id of volume type.
|
|
||||||
"""
|
|
||||||
url = "/types/%s/encryption" % volume_type_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_encryption_type(self, volume_type_id, **kwargs):
|
|
||||||
"""Create encryption type.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-an-encryption-type-for-v2
|
|
||||||
"""
|
|
||||||
url = "/types/%s/encryption" % volume_type_id
|
|
||||||
post_body = json.dumps({'encryption': kwargs})
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_encryption_type(self, volume_type_id):
|
|
||||||
"""Delete the encryption type for the specified volume type."""
|
|
||||||
resp, body = self.delete(
|
|
||||||
"/types/%s/encryption/provider" % volume_type_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,29 +0,0 @@
|
|||||||
# Copyright 2012 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.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class ExtensionsClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 extensions client."""
|
|
||||||
|
|
||||||
def list_extensions(self):
|
|
||||||
url = 'extensions'
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,40 +0,0 @@
|
|||||||
# 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.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class HostsClient(rest_client.RestClient):
|
|
||||||
"""Client class to send CRUD Volume Host API V1 requests"""
|
|
||||||
|
|
||||||
def list_hosts(self, **params):
|
|
||||||
"""Lists all hosts.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-all-hosts
|
|
||||||
"""
|
|
||||||
url = 'os-hosts'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,32 +0,0 @@
|
|||||||
# Copyright 2016 Red Hat, Inc.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class LimitsClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 limits client."""
|
|
||||||
|
|
||||||
api_version = "v1"
|
|
||||||
|
|
||||||
def show_limits(self):
|
|
||||||
"""Returns the details of a volume absolute limits."""
|
|
||||||
url = "limits"
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,133 +0,0 @@
|
|||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class QosSpecsClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 QoS client.
|
|
||||||
|
|
||||||
Client class to send CRUD QoS API requests
|
|
||||||
"""
|
|
||||||
|
|
||||||
api_version = "v1"
|
|
||||||
|
|
||||||
def is_resource_deleted(self, qos_id):
|
|
||||||
try:
|
|
||||||
self.show_qos(qos_id)
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'qos'
|
|
||||||
|
|
||||||
def create_qos(self, **kwargs):
|
|
||||||
"""Create a QoS Specification.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-qos-specification
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'qos_specs': kwargs})
|
|
||||||
resp, body = self.post('qos-specs', post_body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
body = json.loads(body)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_qos(self, qos_id, force=False):
|
|
||||||
"""Delete the specified QoS specification."""
|
|
||||||
resp, body = self.delete(
|
|
||||||
"qos-specs/%s?force=%s" % (qos_id, force))
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def list_qos(self):
|
|
||||||
"""List all the QoS specifications created."""
|
|
||||||
url = 'qos-specs'
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_qos(self, qos_id):
|
|
||||||
"""Get the specified QoS specification."""
|
|
||||||
url = "qos-specs/%s" % qos_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def set_qos_key(self, qos_id, **kwargs):
|
|
||||||
"""Set the specified keys/values of QoS specification.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#set-keys-in-qos-specification
|
|
||||||
"""
|
|
||||||
put_body = json.dumps({"qos_specs": kwargs})
|
|
||||||
resp, body = self.put('qos-specs/%s' % qos_id, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def unset_qos_key(self, qos_id, keys):
|
|
||||||
"""Unset the specified keys of QoS specification.
|
|
||||||
|
|
||||||
:param keys: keys to delete from the QoS specification.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#unset-keys-in-qos-specification
|
|
||||||
"""
|
|
||||||
put_body = json.dumps({'keys': keys})
|
|
||||||
resp, body = self.put('qos-specs/%s/delete_keys' % qos_id, put_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def associate_qos(self, qos_id, vol_type_id):
|
|
||||||
"""Associate the specified QoS with specified volume-type."""
|
|
||||||
url = "qos-specs/%s/associate" % qos_id
|
|
||||||
url += "?vol_type_id=%s" % vol_type_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_association_qos(self, qos_id):
|
|
||||||
"""Get the association of the specified QoS specification."""
|
|
||||||
url = "qos-specs/%s/associations" % qos_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def disassociate_qos(self, qos_id, vol_type_id):
|
|
||||||
"""Disassociate the specified QoS with specified volume-type."""
|
|
||||||
url = "qos-specs/%s/disassociate" % qos_id
|
|
||||||
url += "?vol_type_id=%s" % vol_type_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def disassociate_all_qos(self, qos_id):
|
|
||||||
"""Disassociate the specified QoS with all associations."""
|
|
||||||
url = "qos-specs/%s/disassociate_all" % qos_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,63 +0,0 @@
|
|||||||
# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class QuotasClient(rest_client.RestClient):
|
|
||||||
"""Client class to send CRUD Volume Quotas API V1 requests"""
|
|
||||||
|
|
||||||
def show_default_quota_set(self, tenant_id):
|
|
||||||
"""List the default volume quota set for a tenant."""
|
|
||||||
|
|
||||||
url = 'os-quota-sets/%s/defaults' % tenant_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
body = jsonutils.loads(body)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_quota_set(self, tenant_id, params=None):
|
|
||||||
"""List the quota set for a tenant."""
|
|
||||||
|
|
||||||
url = 'os-quota-sets/%s' % tenant_id
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
body = jsonutils.loads(body)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_quota_set(self, tenant_id, **kwargs):
|
|
||||||
"""Updates quota set
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-quotas
|
|
||||||
"""
|
|
||||||
put_body = jsonutils.dumps({'quota_set': kwargs})
|
|
||||||
resp, body = self.put('os-quota-sets/%s' % tenant_id, put_body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
body = jsonutils.loads(body)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_quota_set(self, tenant_id):
|
|
||||||
"""Delete the tenant's quota set."""
|
|
||||||
resp, body = self.delete('os-quota-sets/%s' % tenant_id)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,34 +0,0 @@
|
|||||||
# Copyright 2014 NEC Corporation
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
|
|
||||||
|
|
||||||
class ServicesClient(rest_client.RestClient):
|
|
||||||
"""Volume V1 volume services client"""
|
|
||||||
|
|
||||||
def list_services(self, **params):
|
|
||||||
url = 'os-services'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,188 +0,0 @@
|
|||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class SnapshotsClient(rest_client.RestClient):
|
|
||||||
"""Client class to send CRUD Volume V1 API requests."""
|
|
||||||
|
|
||||||
create_resp = 200
|
|
||||||
|
|
||||||
def list_snapshots(self, detail=False, **params):
|
|
||||||
"""List all the snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-snapshots
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-snapshots-with-details
|
|
||||||
"""
|
|
||||||
url = 'snapshots'
|
|
||||||
if detail:
|
|
||||||
url += '/detail'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_snapshot(self, snapshot_id):
|
|
||||||
"""Returns the details of a single snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#show-snapshot-details
|
|
||||||
"""
|
|
||||||
url = "snapshots/%s" % snapshot_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_snapshot(self, **kwargs):
|
|
||||||
"""Creates a new snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-snapshot
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'snapshot': kwargs})
|
|
||||||
resp, body = self.post('snapshots', post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(self.create_resp, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_snapshot(self, snapshot_id):
|
|
||||||
"""Delete Snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#delete-snapshot
|
|
||||||
"""
|
|
||||||
resp, body = self.delete("snapshots/%s" % snapshot_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def is_resource_deleted(self, id):
|
|
||||||
try:
|
|
||||||
self.show_snapshot(id)
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'volume-snapshot'
|
|
||||||
|
|
||||||
def reset_snapshot_status(self, snapshot_id, status):
|
|
||||||
"""Reset the specified snapshot's status."""
|
|
||||||
post_body = json.dumps({'os-reset_status': {"status": status}})
|
|
||||||
resp, body = self.post('snapshots/%s/action' % snapshot_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_snapshot_status(self, snapshot_id, **kwargs):
|
|
||||||
"""Update the specified snapshot's status."""
|
|
||||||
# TODO(gmann): api-site doesn't contain doc ref
|
|
||||||
# for this API. After fixing the api-site, we need to
|
|
||||||
# add the link here.
|
|
||||||
# Bug https://bugs.launchpad.net/openstack-api-site/+bug/1532645
|
|
||||||
|
|
||||||
post_body = json.dumps({'os-update_snapshot_status': kwargs})
|
|
||||||
url = 'snapshots/%s/action' % snapshot_id
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_snapshot_metadata(self, snapshot_id, metadata):
|
|
||||||
"""Create metadata for the snapshot."""
|
|
||||||
put_body = json.dumps({'metadata': metadata})
|
|
||||||
url = "snapshots/%s/metadata" % snapshot_id
|
|
||||||
resp, body = self.post(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_snapshot(self, snapshot_id, **kwargs):
|
|
||||||
"""Updates a snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-snapshot
|
|
||||||
"""
|
|
||||||
put_body = json.dumps({'snapshot': kwargs})
|
|
||||||
resp, body = self.put('snapshots/%s' % snapshot_id, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_snapshot_metadata(self, snapshot_id):
|
|
||||||
"""Get metadata of the snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#show-snapshot-metadata
|
|
||||||
"""
|
|
||||||
url = "snapshots/%s/metadata" % snapshot_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_snapshot_metadata(self, snapshot_id, **kwargs):
|
|
||||||
"""Update metadata for the snapshot.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-snapshot-metadata
|
|
||||||
"""
|
|
||||||
put_body = json.dumps(kwargs)
|
|
||||||
url = "snapshots/%s/metadata" % snapshot_id
|
|
||||||
resp, body = self.put(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_snapshot_metadata_item(self, snapshot_id, id, **kwargs):
|
|
||||||
"""Update metadata item for the snapshot."""
|
|
||||||
# TODO(piyush): Current api-site doesn't contain this API description.
|
|
||||||
# After fixing the api-site, we need to fix here also for putting the
|
|
||||||
# link to api-site.
|
|
||||||
# LP: https://bugs.launchpad.net/openstack-api-site/+bug/1529064
|
|
||||||
put_body = json.dumps(kwargs)
|
|
||||||
url = "snapshots/%s/metadata/%s" % (snapshot_id, id)
|
|
||||||
resp, body = self.put(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_snapshot_metadata_item(self, snapshot_id, id):
|
|
||||||
"""Delete metadata item for the snapshot."""
|
|
||||||
url = "snapshots/%s/metadata/%s" % (snapshot_id, id)
|
|
||||||
resp, body = self.delete(url)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def force_delete_snapshot(self, snapshot_id):
|
|
||||||
"""Force Delete Snapshot."""
|
|
||||||
post_body = json.dumps({'os-force_delete': {}})
|
|
||||||
resp, body = self.post('snapshots/%s/action' % snapshot_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,167 +0,0 @@
|
|||||||
# Copyright 2012 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.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class TypesClient(rest_client.RestClient):
|
|
||||||
"""Client class to send CRUD Volume Types API requests"""
|
|
||||||
|
|
||||||
def is_resource_deleted(self, id):
|
|
||||||
try:
|
|
||||||
self.show_volume_type(id)
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'volume-type'
|
|
||||||
|
|
||||||
def list_volume_types(self, **params):
|
|
||||||
"""List all the volume_types created.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-all-volume-types-for-v2
|
|
||||||
"""
|
|
||||||
url = 'types'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_volume_type(self, volume_type_id):
|
|
||||||
"""Returns the details of a single volume_type.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#show-volume-type-details-for-v2
|
|
||||||
"""
|
|
||||||
url = "types/%s" % volume_type_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_volume_type(self, **kwargs):
|
|
||||||
"""Create volume type.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-volume-type-for-v2
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'volume_type': kwargs})
|
|
||||||
resp, body = self.post('types', post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_volume_type(self, volume_type_id):
|
|
||||||
"""Deletes the Specified Volume_type.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#delete-volume-type
|
|
||||||
"""
|
|
||||||
resp, body = self.delete("types/%s" % volume_type_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def list_volume_types_extra_specs(self, volume_type_id, **params):
|
|
||||||
"""List all the volume_types extra specs created.
|
|
||||||
|
|
||||||
TODO: Current api-site doesn't contain this API description.
|
|
||||||
After fixing the api-site, we need to fix here also for putting
|
|
||||||
the link to api-site.
|
|
||||||
"""
|
|
||||||
url = 'types/%s/extra_specs' % volume_type_id
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_volume_type_extra_specs(self, volume_type_id, extra_specs_name):
|
|
||||||
"""Returns the details of a single volume_type extra spec."""
|
|
||||||
url = "types/%s/extra_specs/%s" % (volume_type_id, extra_specs_name)
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_volume_type_extra_specs(self, volume_type_id, extra_specs):
|
|
||||||
"""Creates a new Volume_type extra spec.
|
|
||||||
|
|
||||||
volume_type_id: Id of volume_type.
|
|
||||||
extra_specs: A dictionary of values to be used as extra_specs.
|
|
||||||
"""
|
|
||||||
url = "types/%s/extra_specs" % volume_type_id
|
|
||||||
post_body = json.dumps({'extra_specs': extra_specs})
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_volume_type_extra_specs(self, volume_type_id, extra_spec_name):
|
|
||||||
"""Deletes the Specified Volume_type extra spec."""
|
|
||||||
resp, body = self.delete("types/%s/extra_specs/%s" % (
|
|
||||||
volume_type_id, extra_spec_name))
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume_type(self, volume_type_id, **kwargs):
|
|
||||||
"""Updates volume type name, description, and/or is_public.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-volume-type
|
|
||||||
"""
|
|
||||||
put_body = json.dumps({'volume_type': kwargs})
|
|
||||||
resp, body = self.put('types/%s' % volume_type_id, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume_type_extra_specs(self, volume_type_id, extra_spec_name,
|
|
||||||
extra_specs):
|
|
||||||
"""Update a volume_type extra spec.
|
|
||||||
|
|
||||||
:param volume_type_id: Id of volume_type.
|
|
||||||
:param extra_spec_name: Name of the extra spec to be updated.
|
|
||||||
:param extra_specs: A dictionary of with key as extra_spec_name and the
|
|
||||||
updated value.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-extra-specs-for-a-volume-type
|
|
||||||
"""
|
|
||||||
url = "types/%s/extra_specs/%s" % (volume_type_id, extra_spec_name)
|
|
||||||
put_body = json.dumps(extra_specs)
|
|
||||||
resp, body = self.put(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
@ -1,306 +0,0 @@
|
|||||||
# Copyright 2012 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.
|
|
||||||
|
|
||||||
from urllib import parse as urllib
|
|
||||||
|
|
||||||
from oslo_serialization import jsonutils as json
|
|
||||||
|
|
||||||
from tempest.lib.common import rest_client
|
|
||||||
from tempest.lib import exceptions as lib_exc
|
|
||||||
|
|
||||||
|
|
||||||
class VolumesClient(rest_client.RestClient):
|
|
||||||
"""Client class to send CRUD Volume V1 API requests"""
|
|
||||||
|
|
||||||
def _prepare_params(self, params):
|
|
||||||
"""Prepares params for use in get or _ext_get methods.
|
|
||||||
|
|
||||||
If params is a string it will be left as it is, but if it's not it will
|
|
||||||
be urlencoded.
|
|
||||||
"""
|
|
||||||
if isinstance(params, str):
|
|
||||||
return params
|
|
||||||
return urllib.urlencode(params)
|
|
||||||
|
|
||||||
def list_volumes(self, detail=False, params=None):
|
|
||||||
"""List all the volumes created.
|
|
||||||
|
|
||||||
Params can be a string (must be urlencoded) or a dictionary.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-volumes
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-volumes-with-details
|
|
||||||
"""
|
|
||||||
url = 'volumes'
|
|
||||||
if detail:
|
|
||||||
url += '/detail'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % self._prepare_params(params)
|
|
||||||
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_volume(self, volume_id):
|
|
||||||
"""Returns the details of a single volume."""
|
|
||||||
url = "volumes/%s" % volume_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_volume(self, **kwargs):
|
|
||||||
"""Creates a new Volume.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-volume
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'volume': kwargs})
|
|
||||||
resp, body = self.post('volumes', post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume(self, volume_id, **kwargs):
|
|
||||||
"""Updates the Specified Volume.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#update-volume
|
|
||||||
"""
|
|
||||||
put_body = json.dumps({'volume': kwargs})
|
|
||||||
resp, body = self.put('volumes/%s' % volume_id, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_volume(self, volume_id):
|
|
||||||
"""Deletes the Specified Volume."""
|
|
||||||
resp, body = self.delete("volumes/%s" % volume_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def upload_volume(self, volume_id, **kwargs):
|
|
||||||
"""Uploads a volume in Glance."""
|
|
||||||
post_body = json.dumps({'os-volume_upload_image': kwargs})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def attach_volume(self, volume_id, **kwargs):
|
|
||||||
"""Attaches a volume to a given instance on a given mountpoint.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#attach-volume-to-server
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'os-attach': kwargs})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def set_bootable_volume(self, volume_id, **kwargs):
|
|
||||||
"""set a bootable flag for a volume - true or false."""
|
|
||||||
post_body = json.dumps({'os-set_bootable': kwargs})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def detach_volume(self, volume_id):
|
|
||||||
"""Detaches a volume from an instance."""
|
|
||||||
post_body = json.dumps({'os-detach': {}})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def reserve_volume(self, volume_id):
|
|
||||||
"""Reserves a volume."""
|
|
||||||
post_body = json.dumps({'os-reserve': {}})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def unreserve_volume(self, volume_id):
|
|
||||||
"""Restore a reserved volume ."""
|
|
||||||
post_body = json.dumps({'os-unreserve': {}})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def is_resource_deleted(self, id):
|
|
||||||
try:
|
|
||||||
self.show_volume(id)
|
|
||||||
except lib_exc.NotFound:
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def resource_type(self):
|
|
||||||
"""Returns the primary type of resource this client works with."""
|
|
||||||
return 'volume'
|
|
||||||
|
|
||||||
def extend_volume(self, volume_id, **kwargs):
|
|
||||||
"""Extend a volume.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#extend-volume-size
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'os-extend': kwargs})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def reset_volume_status(self, volume_id, **kwargs):
|
|
||||||
"""Reset the Specified Volume's Status.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#reset-volume-statuses
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'os-reset_status': kwargs})
|
|
||||||
resp, body = self.post('volumes/%s/action' % volume_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_volume_transfer(self, **kwargs):
|
|
||||||
"""Create a volume transfer.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#create-volume-transfer
|
|
||||||
"""
|
|
||||||
post_body = json.dumps({'transfer': kwargs})
|
|
||||||
resp, body = self.post('os-volume-transfer', post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_volume_transfer(self, transfer_id):
|
|
||||||
"""Returns the details of a volume transfer."""
|
|
||||||
url = "os-volume-transfer/%s" % transfer_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def list_volume_transfers(self, **params):
|
|
||||||
"""List all the volume transfers created.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#list-volume-transfers
|
|
||||||
"""
|
|
||||||
url = 'os-volume-transfer'
|
|
||||||
if params:
|
|
||||||
url += '?%s' % urllib.urlencode(params)
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_volume_transfer(self, transfer_id):
|
|
||||||
"""Delete a volume transfer."""
|
|
||||||
resp, body = self.delete("os-volume-transfer/%s" % transfer_id)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def accept_volume_transfer(self, transfer_id, **kwargs):
|
|
||||||
"""Accept a volume transfer.
|
|
||||||
|
|
||||||
For a full list of available parameters, please refer to the official
|
|
||||||
API reference:
|
|
||||||
https://docs.openstack.org/api-ref/block-storage/v2/#accept-volume-transfer
|
|
||||||
"""
|
|
||||||
url = 'os-volume-transfer/%s/accept' % transfer_id
|
|
||||||
post_body = json.dumps({'accept': kwargs})
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume_readonly(self, volume_id, **kwargs):
|
|
||||||
"""Update the Specified Volume readonly."""
|
|
||||||
post_body = json.dumps({'os-update_readonly_flag': kwargs})
|
|
||||||
url = 'volumes/%s/action' % (volume_id)
|
|
||||||
resp, body = self.post(url, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def force_delete_volume(self, volume_id):
|
|
||||||
"""Force Delete Volume."""
|
|
||||||
post_body = json.dumps({'os-force_delete': {}})
|
|
||||||
resp, body = self.post('volumes/%s/action' % volume_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def create_volume_metadata(self, volume_id, metadata):
|
|
||||||
"""Create metadata for the volume."""
|
|
||||||
put_body = json.dumps({'metadata': metadata})
|
|
||||||
url = "volumes/%s/metadata" % volume_id
|
|
||||||
resp, body = self.post(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def show_volume_metadata(self, volume_id):
|
|
||||||
"""Get metadata of the volume."""
|
|
||||||
url = "volumes/%s/metadata" % volume_id
|
|
||||||
resp, body = self.get(url)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume_metadata(self, volume_id, metadata):
|
|
||||||
"""Update metadata for the volume."""
|
|
||||||
put_body = json.dumps({'metadata': metadata})
|
|
||||||
url = "volumes/%s/metadata" % volume_id
|
|
||||||
resp, body = self.put(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def update_volume_metadata_item(self, volume_id, id, meta_item):
|
|
||||||
"""Update metadata item for the volume."""
|
|
||||||
put_body = json.dumps({'meta': meta_item})
|
|
||||||
url = "volumes/%s/metadata/%s" % (volume_id, id)
|
|
||||||
resp, body = self.put(url, put_body)
|
|
||||||
body = json.loads(body)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def delete_volume_metadata_item(self, volume_id, id):
|
|
||||||
"""Delete metadata item for the volume."""
|
|
||||||
url = "volumes/%s/metadata/%s" % (volume_id, id)
|
|
||||||
resp, body = self.delete(url)
|
|
||||||
self.expected_success(200, resp.status)
|
|
||||||
return rest_client.ResponseBody(resp, body)
|
|
||||||
|
|
||||||
def retype_volume(self, volume_id, **kwargs):
|
|
||||||
"""Updates volume with new volume type."""
|
|
||||||
post_body = json.dumps({'os-retype': kwargs})
|
|
||||||
resp, _ = self.post('volumes/%s/action' % volume_id, post_body)
|
|
||||||
self.expected_success(202, resp.status)
|
|
@ -38,8 +38,7 @@ class RegistryFixture(fixtures.Fixture):
|
|||||||
"""Initialise the registry fixture"""
|
"""Initialise the registry fixture"""
|
||||||
self.services = set(['compute', 'identity.v2', 'identity.v3',
|
self.services = set(['compute', 'identity.v2', 'identity.v3',
|
||||||
'image.v1', 'image.v2', 'network', 'placement',
|
'image.v1', 'image.v2', 'network', 'placement',
|
||||||
'volume.v1', 'volume.v2', 'volume.v3',
|
'volume.v2', 'volume.v3', 'object-storage'])
|
||||||
'object-storage'])
|
|
||||||
|
|
||||||
def _setUp(self):
|
def _setUp(self):
|
||||||
# Cleanup the registry
|
# Cleanup the registry
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
# Copyright 2016 NEC Corporation. All rights reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from tempest.lib.services.volume.v1 import encryption_types_client
|
|
||||||
from tempest.tests.lib import fake_auth_provider
|
|
||||||
from tempest.tests.lib.services import base
|
|
||||||
|
|
||||||
|
|
||||||
class TestEncryptionTypesClient(base.BaseServiceTest):
|
|
||||||
FAKE_CREATE_ENCRYPTION_TYPE = {
|
|
||||||
"encryption": {
|
|
||||||
"id": "cbc36478b0bd8e67e89",
|
|
||||||
"name": "FakeEncryptionType",
|
|
||||||
"type": "fakeType",
|
|
||||||
"provider": "LuksEncryptor",
|
|
||||||
"cipher": "aes-xts-plain64",
|
|
||||||
"key_size": "512",
|
|
||||||
"control_location": "front-end"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FAKE_INFO_ENCRYPTION_TYPE = {
|
|
||||||
"encryption": {
|
|
||||||
"name": "FakeEncryptionType",
|
|
||||||
"type": "fakeType",
|
|
||||||
"description": "test_description",
|
|
||||||
"volume_type": "fakeType",
|
|
||||||
"provider": "LuksEncryptor",
|
|
||||||
"cipher": "aes-xts-plain64",
|
|
||||||
"key_size": "512",
|
|
||||||
"control_location": "front-end"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestEncryptionTypesClient, self).setUp()
|
|
||||||
fake_auth = fake_auth_provider.FakeAuthProvider()
|
|
||||||
self.client = encryption_types_client.EncryptionTypesClient(fake_auth,
|
|
||||||
'volume',
|
|
||||||
'regionOne'
|
|
||||||
)
|
|
||||||
|
|
||||||
def _test_create_encryption(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.create_encryption_type,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.post',
|
|
||||||
self.FAKE_CREATE_ENCRYPTION_TYPE,
|
|
||||||
bytes_body, volume_type_id="cbc36478b0bd8e67e89")
|
|
||||||
|
|
||||||
def _test_show_encryption_type(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.show_encryption_type,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_INFO_ENCRYPTION_TYPE,
|
|
||||||
bytes_body, volume_type_id="cbc36478b0bd8e67e89")
|
|
||||||
|
|
||||||
def test_create_encryption_type_with_str_body(self):
|
|
||||||
self._test_create_encryption()
|
|
||||||
|
|
||||||
def test_create_encryption_type_with_bytes_body(self):
|
|
||||||
self._test_create_encryption(bytes_body=True)
|
|
||||||
|
|
||||||
def test_show_encryption_type_with_str_body(self):
|
|
||||||
self._test_show_encryption_type()
|
|
||||||
|
|
||||||
def test_show_encryption_type_with_bytes_body(self):
|
|
||||||
self._test_show_encryption_type(bytes_body=True)
|
|
||||||
|
|
||||||
def test_delete_encryption_type(self):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.delete_encryption_type,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.delete',
|
|
||||||
{},
|
|
||||||
volume_type_id="cbc36478b0bd8e67e89",
|
|
||||||
status=202)
|
|
@ -1,96 +0,0 @@
|
|||||||
# Copyright 2016 NEC Corporation. All rights reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from tempest.lib.services.volume.v1 import quotas_client
|
|
||||||
from tempest.tests.lib import fake_auth_provider
|
|
||||||
from tempest.tests.lib.services import base
|
|
||||||
|
|
||||||
|
|
||||||
class TestQuotasClient(base.BaseServiceTest):
|
|
||||||
FAKE_QUOTAS = {
|
|
||||||
"quota_set": {
|
|
||||||
"cores": 20,
|
|
||||||
"fixed_ips": -1,
|
|
||||||
"floating_ips": 10,
|
|
||||||
"id": "fake_tenant",
|
|
||||||
"injected_file_content_bytes": 10240,
|
|
||||||
"injected_file_path_bytes": 255,
|
|
||||||
"injected_files": 5,
|
|
||||||
"instances": 10,
|
|
||||||
"key_pairs": 100,
|
|
||||||
"metadata_items": 128,
|
|
||||||
"ram": 51200,
|
|
||||||
"security_group_rules": 20,
|
|
||||||
"security_groups": 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FAKE_UPDATE_QUOTAS_REQUEST = {
|
|
||||||
"quota_set": {
|
|
||||||
"security_groups": 45
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestQuotasClient, self).setUp()
|
|
||||||
fake_auth = fake_auth_provider.FakeAuthProvider()
|
|
||||||
self.client = quotas_client.QuotasClient(fake_auth,
|
|
||||||
'volume',
|
|
||||||
'regionOne')
|
|
||||||
|
|
||||||
def _test_show_default_quota_set(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.show_default_quota_set,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_QUOTAS,
|
|
||||||
bytes_body, tenant_id="fake_tenant")
|
|
||||||
|
|
||||||
def _test_show_quota_set(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.show_quota_set,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_QUOTAS,
|
|
||||||
bytes_body, tenant_id="fake_tenant")
|
|
||||||
|
|
||||||
def _test_update_quota_set(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.update_quota_set,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.put',
|
|
||||||
self.FAKE_UPDATE_QUOTAS_REQUEST,
|
|
||||||
bytes_body, tenant_id="fake_tenant")
|
|
||||||
|
|
||||||
def test_show_default_quota_set_with_str_body(self):
|
|
||||||
self._test_show_default_quota_set()
|
|
||||||
|
|
||||||
def test_show_default_quota_set_with_bytes_body(self):
|
|
||||||
self._test_show_default_quota_set(bytes_body=True)
|
|
||||||
|
|
||||||
def test_show_quota_set_with_str_body(self):
|
|
||||||
self._test_show_quota_set()
|
|
||||||
|
|
||||||
def test_show_quota_set_with_bytes_body(self):
|
|
||||||
self._test_show_quota_set(bytes_body=True)
|
|
||||||
|
|
||||||
def test_update_quota_set_with_str_body(self):
|
|
||||||
self._test_update_quota_set()
|
|
||||||
|
|
||||||
def test_update_quota_set_with_bytes_body(self):
|
|
||||||
self._test_update_quota_set(bytes_body=True)
|
|
||||||
|
|
||||||
def test_delete_quota_set(self):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.delete_quota_set,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.delete',
|
|
||||||
{},
|
|
||||||
tenant_id="fake_tenant")
|
|
@ -1,200 +0,0 @@
|
|||||||
# Copyright 2016 NEC Corporation. All rights reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
from tempest.lib.services.volume.v1 import snapshots_client
|
|
||||||
from tempest.tests.lib import fake_auth_provider
|
|
||||||
from tempest.tests.lib.services import base
|
|
||||||
|
|
||||||
|
|
||||||
class TestSnapshotsClient(base.BaseServiceTest):
|
|
||||||
FAKE_CREATE_SNAPSHOT = {
|
|
||||||
"snapshot": {
|
|
||||||
"display_name": "snap-001",
|
|
||||||
"display_description": "Daily backup",
|
|
||||||
"volume_id": "521752a6-acf6-4b2d-bc7a-119f9148cd8c",
|
|
||||||
"force": True
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FAKE_UPDATE_SNAPSHOT_REQUEST = {
|
|
||||||
"metadata": {
|
|
||||||
"key": "v1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FAKE_INFO_SNAPSHOT = {
|
|
||||||
"snapshot": {
|
|
||||||
"id": "3fbbcccf-d058-4502-8844-6feeffdf4cb5",
|
|
||||||
"display_name": "snap-001",
|
|
||||||
"display_description": "Daily backup",
|
|
||||||
"volume_id": "521752a6-acf6-4b2d-bc7a-119f9148cd8c",
|
|
||||||
"status": "available",
|
|
||||||
"size": 30,
|
|
||||||
"created_at": "2012-02-29T03:50:07Z"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FAKE_LIST_SNAPSHOTS = {
|
|
||||||
"snapshots": [
|
|
||||||
{
|
|
||||||
"id": "3fbbcccf-d058-4502-8844-6feeffdf4cb5",
|
|
||||||
"display_name": "snap-001",
|
|
||||||
"display_description": "Daily backup",
|
|
||||||
"volume_id": "521752a6-acf6-4b2d-bc7a-119f9148cd8c",
|
|
||||||
"status": "available",
|
|
||||||
"size": 30,
|
|
||||||
"created_at": "2012-02-29T03:50:07Z",
|
|
||||||
"metadata": {
|
|
||||||
"contents": "junk"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "e479997c-650b-40a4-9dfe-77655818b0d2",
|
|
||||||
"display_name": "snap-002",
|
|
||||||
"display_description": "Weekly backup",
|
|
||||||
"volume_id": "76b8950a-8594-4e5b-8dce-0dfa9c696358",
|
|
||||||
"status": "available",
|
|
||||||
"size": 25,
|
|
||||||
"created_at": "2012-03-19T01:52:47Z",
|
|
||||||
"metadata": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestSnapshotsClient, self).setUp()
|
|
||||||
fake_auth = fake_auth_provider.FakeAuthProvider()
|
|
||||||
self.client = snapshots_client.SnapshotsClient(fake_auth,
|
|
||||||
'volume',
|
|
||||||
'regionOne')
|
|
||||||
|
|
||||||
def _test_create_snapshot(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.create_snapshot,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.post',
|
|
||||||
self.FAKE_CREATE_SNAPSHOT,
|
|
||||||
bytes_body)
|
|
||||||
|
|
||||||
def _test_show_snapshot(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.show_snapshot,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_INFO_SNAPSHOT,
|
|
||||||
bytes_body,
|
|
||||||
snapshot_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5")
|
|
||||||
|
|
||||||
def _test_list_snapshots(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.list_snapshots,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_LIST_SNAPSHOTS,
|
|
||||||
bytes_body,
|
|
||||||
detail=True)
|
|
||||||
|
|
||||||
def _test_create_snapshot_metadata(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.create_snapshot_metadata,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.post',
|
|
||||||
self.FAKE_INFO_SNAPSHOT,
|
|
||||||
bytes_body,
|
|
||||||
snapshot_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5",
|
|
||||||
metadata={"key": "v1"})
|
|
||||||
|
|
||||||
def _test_update_snapshot(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.update_snapshot,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.put',
|
|
||||||
self.FAKE_UPDATE_SNAPSHOT_REQUEST,
|
|
||||||
bytes_body,
|
|
||||||
snapshot_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5")
|
|
||||||
|
|
||||||
def _test_show_snapshot_metadata(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.show_snapshot_metadata,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.get',
|
|
||||||
self.FAKE_UPDATE_SNAPSHOT_REQUEST,
|
|
||||||
bytes_body,
|
|
||||||
snapshot_id="3fbbcccf-d058-4502-8844-6feeffdf4cb5")
|
|
||||||
|
|
||||||
def _test_update_snapshot_metadata(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.update_snapshot_metadata,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.put',
|
|
||||||
self.FAKE_UPDATE_SNAPSHOT_REQUEST,
|
|
||||||
bytes_body, snapshot_id="cbc36478b0bd8e67e89")
|
|
||||||
|
|
||||||
def _test_update_snapshot_metadata_item(self, bytes_body=False):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.update_snapshot_metadata_item,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.put',
|
|
||||||
self.FAKE_INFO_SNAPSHOT,
|
|
||||||
bytes_body, volume_type_id="cbc36478b0bd8e67e89")
|
|
||||||
|
|
||||||
def test_create_snapshot_with_str_body(self):
|
|
||||||
self._test_create_snapshot()
|
|
||||||
|
|
||||||
def test_create_snapshot_with_bytes_body(self):
|
|
||||||
self._test_create_snapshot(bytes_body=True)
|
|
||||||
|
|
||||||
def test_show_snapshot_with_str_body(self):
|
|
||||||
self._test_show_snapshot()
|
|
||||||
|
|
||||||
def test_show_snapshot_with_bytes_body(self):
|
|
||||||
self._test_show_snapshot(bytes_body=True)
|
|
||||||
|
|
||||||
def test_list_snapshots_with_str_body(self):
|
|
||||||
self._test_list_snapshots()
|
|
||||||
|
|
||||||
def test_list_snapshots_with_bytes_body(self):
|
|
||||||
self._test_list_snapshots(bytes_body=True)
|
|
||||||
|
|
||||||
def test_create_snapshot_metadata_with_str_body(self):
|
|
||||||
self._test_create_snapshot_metadata()
|
|
||||||
|
|
||||||
def test_create_snapshot_metadata_with_bytes_body(self):
|
|
||||||
self._test_create_snapshot_metadata(bytes_body=True)
|
|
||||||
|
|
||||||
def test_update_snapshot_with_str_body(self):
|
|
||||||
self._test_update_snapshot()
|
|
||||||
|
|
||||||
def test_update_snapshot_with_bytes_body(self):
|
|
||||||
self._test_update_snapshot(bytes_body=True)
|
|
||||||
|
|
||||||
def test_show_snapshot_metadata_with_str_body(self):
|
|
||||||
self._test_show_snapshot_metadata()
|
|
||||||
|
|
||||||
def test_show_snapshot_metadata_with_bytes_body(self):
|
|
||||||
self._test_show_snapshot_metadata(bytes_body=True)
|
|
||||||
|
|
||||||
def test_update_snapshot_metadata_with_str_body(self):
|
|
||||||
self._test_update_snapshot_metadata()
|
|
||||||
|
|
||||||
def test_update_snapshot_metadata_with_bytes_body(self):
|
|
||||||
self._test_update_snapshot_metadata(bytes_body=True)
|
|
||||||
|
|
||||||
def test_force_delete_snapshot(self):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.force_delete_snapshot,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.post',
|
|
||||||
{},
|
|
||||||
snapshot_id="521752a6-acf6-4b2d-bc7a-119f9148cd8c",
|
|
||||||
status=202)
|
|
||||||
|
|
||||||
def test_delete_snapshot(self):
|
|
||||||
self.check_service_client_function(
|
|
||||||
self.client.delete_snapshot,
|
|
||||||
'tempest.lib.common.rest_client.RestClient.delete',
|
|
||||||
{},
|
|
||||||
snapshot_id="521752a6-acf6-4b2d-bc7a-119f9148cd8c",
|
|
||||||
status=202)
|
|
@ -21,21 +21,6 @@ class TestVersionsClient(base.BaseServiceTest):
|
|||||||
|
|
||||||
FAKE_VERSIONS_INFO = {
|
FAKE_VERSIONS_INFO = {
|
||||||
"versions": [
|
"versions": [
|
||||||
{
|
|
||||||
"status": "DEPRECATED", "updated": "2016-05-02T20:25:19Z",
|
|
||||||
"links": [
|
|
||||||
{"href": "http://docs.openstack.org/", "type": "text/html",
|
|
||||||
"rel": "describedby"},
|
|
||||||
{"href": "https://10.30.197.39:8776/v1/", "rel": "self"}
|
|
||||||
],
|
|
||||||
"min_version": "",
|
|
||||||
"version": "",
|
|
||||||
"media-types": [
|
|
||||||
{"base": "application/json",
|
|
||||||
"type": "application/vnd.openstack.volume+json;version=1"}
|
|
||||||
],
|
|
||||||
"id": "v1.0"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"status": "DEPRECATED", "updated": "2017-02-25T12:00:00Z",
|
"status": "DEPRECATED", "updated": "2017-02-25T12:00:00Z",
|
||||||
"links": [
|
"links": [
|
||||||
@ -134,8 +119,6 @@ class TestVersionsClient(base.BaseServiceTest):
|
|||||||
self._test_show_version('v3', bytes_body=True)
|
self._test_show_version('v3', bytes_body=True)
|
||||||
|
|
||||||
def test_get_base_version_url_app_name(self):
|
def test_get_base_version_url_app_name(self):
|
||||||
self._test_get_base_version_url('https://bar.org/volume/v1/123',
|
|
||||||
'https://bar.org/volume/')
|
|
||||||
self._test_get_base_version_url('https://bar.org/volume/v2/123',
|
self._test_get_base_version_url('https://bar.org/volume/v2/123',
|
||||||
'https://bar.org/volume/')
|
'https://bar.org/volume/')
|
||||||
self._test_get_base_version_url('https://bar.org/volume/v3/123',
|
self._test_get_base_version_url('https://bar.org/volume/v3/123',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user