Merge "Remove deprecated volume(snapshot) commands/bindings"
This commit is contained in:
commit
0193797fcf
@ -259,18 +259,6 @@ class Manager(HookableMixin):
|
||||
for res in data if res]
|
||||
return ListWithMeta(items, resp)
|
||||
|
||||
@contextlib.contextmanager
|
||||
def alternate_service_type(self, default, allowed_types=()):
|
||||
original_service_type = self.api.client.service_type
|
||||
if original_service_type in allowed_types:
|
||||
yield
|
||||
else:
|
||||
self.api.client.service_type = default
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
self.api.client.service_type = original_service_type
|
||||
|
||||
@contextlib.contextmanager
|
||||
def completion_cache(self, cache_type, obj_class, mode):
|
||||
"""The completion cache for bash autocompletion.
|
||||
|
@ -14,6 +14,7 @@ import os
|
||||
import time
|
||||
import uuid
|
||||
|
||||
from cinderclient.v2 import client as cinderclient
|
||||
import fixtures
|
||||
from keystoneclient.v2_0 import client as keystoneclient
|
||||
import os_client_config
|
||||
@ -206,6 +207,7 @@ class ClientTestBase(testtools.TestCase):
|
||||
password=passwd,
|
||||
tenant_name=tenant,
|
||||
auth_url=auth_url)
|
||||
self.cinder = cinderclient.Client(user, passwd, tenant, auth_url)
|
||||
|
||||
def nova(self, action, flags='', params='', fail_ok=False,
|
||||
endpoint_type='publicURL', merge_stderr=False):
|
||||
@ -218,14 +220,14 @@ class ClientTestBase(testtools.TestCase):
|
||||
poll_interval=1):
|
||||
"""Wait until volume reaches given status.
|
||||
|
||||
:param volume_id: uuid4 id of given volume
|
||||
:param volume: volume resource
|
||||
:param status: expected status of volume
|
||||
:param timeout: timeout in seconds
|
||||
:param poll_interval: poll interval in seconds
|
||||
"""
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < timeout:
|
||||
volume = self.client.volumes.get(volume.id)
|
||||
volume = self.cinder.volumes.get(volume.id)
|
||||
if volume.status == status:
|
||||
break
|
||||
time.sleep(poll_interval)
|
||||
|
@ -22,8 +22,8 @@ class TestExtAttrNovaClient(base.ClientTestBase):
|
||||
|
||||
def _create_server_and_attach_volume(self):
|
||||
server = self._create_server()
|
||||
volume = self.client.volumes.create(1)
|
||||
self.addCleanup(self.nova, 'volume-delete', params=volume.id)
|
||||
volume = self.cinder.volumes.create(1)
|
||||
self.addCleanup(volume.delete)
|
||||
self.wait_for_volume_status(volume, 'available')
|
||||
self.nova('volume-attach', params="%s %s" % (server.name, volume.id))
|
||||
self.addCleanup(self._release_volume, server, volume)
|
||||
|
@ -52,10 +52,9 @@ class TestInstanceCLI(base.ClientTestBase):
|
||||
server = servers[0]
|
||||
self.addCleanup(server.delete)
|
||||
|
||||
# create a volume for attachment. We use the CLI because it
|
||||
# magic routes to cinder, however the low level API does not.
|
||||
volume = self.client.volumes.create(1)
|
||||
self.addCleanup(self.nova, 'volume-delete', params=volume.id)
|
||||
# create a volume for attachment
|
||||
volume = self.cinder.volumes.create(1)
|
||||
self.addCleanup(volume.delete)
|
||||
|
||||
# allow volume to become available
|
||||
self.wait_for_volume_status(volume, 'available')
|
||||
@ -69,4 +68,3 @@ class TestInstanceCLI(base.ClientTestBase):
|
||||
# clean up on success
|
||||
self.nova('volume-detach', params="%s %s" % (name, volume.id))
|
||||
self.wait_for_volume_status(volume, 'available')
|
||||
self.nova('volume-delete', params=volume.id)
|
||||
|
@ -131,17 +131,6 @@ class SimpleReadOnlyNovaClientTest(base.ClientTestBase):
|
||||
def test_admin_usage_list(self):
|
||||
self.nova('usage-list')
|
||||
|
||||
def test_admin_volume_list(self):
|
||||
self.nova('volume-list')
|
||||
|
||||
def test_admin_volume_snapshot_list(self):
|
||||
out = self.nova('volume-snapshot-list', merge_stderr=True)
|
||||
self.assertIn('Command volume-snapshot-list is deprecated', out)
|
||||
|
||||
def test_admin_volume_type_list(self):
|
||||
out = self.nova('volume-type-list', merge_stderr=True)
|
||||
self.assertIn('Command volume-type-list is deprecated', out)
|
||||
|
||||
def test_admin_help(self):
|
||||
self.nova('help')
|
||||
|
||||
|
@ -24,8 +24,8 @@ class TestServersBootNovaClient(base.ClientTestBase):
|
||||
def _boot_server_with_legacy_bdm(self, bdm_params=()):
|
||||
volume_size = 1
|
||||
volume_name = str(uuid.uuid4())
|
||||
volume = self.client.volumes.create(size=volume_size,
|
||||
display_name=volume_name,
|
||||
volume = self.cinder.volumes.create(size=volume_size,
|
||||
name=volume_name,
|
||||
imageRef=self.image.id)
|
||||
self.wait_for_volume_status(volume, "available")
|
||||
|
||||
|
@ -1,92 +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.
|
||||
|
||||
import time
|
||||
|
||||
import six.moves
|
||||
|
||||
from novaclient import exceptions
|
||||
from novaclient.tests.functional import base
|
||||
|
||||
|
||||
def wait_for_delete(test, name, thing, get_func):
|
||||
thing.delete()
|
||||
for x in six.moves.range(60):
|
||||
try:
|
||||
thing = get_func(thing.id)
|
||||
except exceptions.NotFound:
|
||||
break
|
||||
time.sleep(1)
|
||||
else:
|
||||
test.fail('%s %s still not deleted after 60s' % (name, thing.id))
|
||||
|
||||
|
||||
class TestVolumesAPI(base.ClientTestBase):
|
||||
|
||||
COMPUTE_API_VERSION = "2.1"
|
||||
|
||||
def test_volumes_snapshots_types_create_get_list_delete(self):
|
||||
# Create a volume
|
||||
volume = self.client.volumes.create(1)
|
||||
|
||||
# Make sure we can still list servers after using the volume endpoint
|
||||
self.client.servers.list()
|
||||
|
||||
# This cleanup tests volume delete
|
||||
self.addCleanup(volume.delete)
|
||||
|
||||
# Wait for the volume to become available
|
||||
self.wait_for_volume_status(volume, 'available')
|
||||
|
||||
# List all volumes
|
||||
self.client.volumes.list()
|
||||
|
||||
# Create a volume snapshot
|
||||
snapshot = self.client.volume_snapshots.create(volume.id)
|
||||
|
||||
# This cleanup tests volume snapshot delete. The volume
|
||||
# can't be deleted until the dependent snapshot is gone
|
||||
self.addCleanup(wait_for_delete, self, 'Snapshot', snapshot,
|
||||
self.client.volume_snapshots.get)
|
||||
|
||||
# Wait for the snapshot to become available
|
||||
for x in six.moves.range(60):
|
||||
snapshot = self.client.volume_snapshots.get(snapshot.id)
|
||||
if snapshot.status == 'available':
|
||||
break
|
||||
elif snapshot.status == 'error':
|
||||
self.fail('Snapshot %s is in error state' % snapshot.id)
|
||||
time.sleep(1)
|
||||
else:
|
||||
self.fail('Snapshot %s not available after 60s' % snapshot.id)
|
||||
|
||||
# List snapshots
|
||||
self.client.volume_snapshots.list()
|
||||
|
||||
# List servers again to make sure things are still good
|
||||
self.client.servers.list()
|
||||
|
||||
# Create a volume type
|
||||
name = self.name_generate('VolumeType')
|
||||
volume_type = self.client.volume_types.create(name)
|
||||
|
||||
# This cleanup tests volume type delete
|
||||
self.addCleanup(self.client.volume_types.delete, volume_type.id)
|
||||
|
||||
# Get the volume type
|
||||
volume_type = self.client.volume_types.get(volume_type.id)
|
||||
|
||||
# List all volume types
|
||||
self.client.volume_types.list()
|
||||
|
||||
# One more servers list
|
||||
self.client.servers.list()
|
@ -1,18 +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 novaclient.tests.functional.v2.legacy import test_volumes_api
|
||||
|
||||
|
||||
class TestVolumesAPI(test_volumes_api.TestVolumesAPI):
|
||||
|
||||
COMPUTE_API_VERSION = "2.latest"
|
@ -58,16 +58,3 @@ class ServiceCatalogTest(utils.TestCase):
|
||||
# Matching south (and catalog has South).
|
||||
self.assertRaises(exceptions.AmbiguousEndpoints, sc.url_for,
|
||||
'region', 'south', service_type='volume')
|
||||
|
||||
def test_alternate_service_type(self):
|
||||
sc = service_catalog.ServiceCatalog(SERVICE_CATALOG)
|
||||
|
||||
self.assertRaises(exceptions.AmbiguousEndpoints, sc.url_for,
|
||||
service_type='volume')
|
||||
self.assertEqual("https://volume1.host/v1/1",
|
||||
sc.url_for('tenantId', '1', service_type='volume'))
|
||||
self.assertEqual("https://volume1.host/v1.1/2",
|
||||
sc.url_for('tenantId', '2', service_type='volume'))
|
||||
|
||||
self.assertRaises(exceptions.EndpointNotFound, sc.url_for,
|
||||
"region", "North", service_type='volume')
|
||||
|
@ -2488,53 +2488,10 @@ class ShellTest(utils.TestCase):
|
||||
self.run_command('interface-detach 1234 port_id')
|
||||
self.assert_called('DELETE', '/servers/1234/os-interface/port_id')
|
||||
|
||||
def test_volume_list(self):
|
||||
_, err = self.run_command('volume-list')
|
||||
self.assertIn('Command volume-list is deprecated', err)
|
||||
self.assert_called('GET', '/volumes/detail')
|
||||
|
||||
def test_volume_show(self):
|
||||
_, err = self.run_command('volume-show Work')
|
||||
self.assertIn('Command volume-show is deprecated', err)
|
||||
self.assert_called('GET', '/volumes?display_name=Work', pos=-2)
|
||||
self.assert_called(
|
||||
'GET',
|
||||
'/volumes/15e59938-07d5-11e1-90e3-e3dffe0c5983',
|
||||
pos=-1
|
||||
)
|
||||
|
||||
def test_volume_attachments(self):
|
||||
self.run_command('volume-attachments 1234')
|
||||
self.assert_called('GET', '/servers/1234/os-volume_attachments')
|
||||
|
||||
def test_volume_create(self):
|
||||
_, err = self.run_command('volume-create 2 --display-name Work')
|
||||
self.assertIn('Command volume-create is deprecated', err)
|
||||
self.assert_called('POST', '/volumes',
|
||||
{'volume':
|
||||
{'display_name': 'Work',
|
||||
'imageRef': None,
|
||||
'availability_zone': None,
|
||||
'volume_type': None,
|
||||
'display_description': None,
|
||||
'snapshot_id': None,
|
||||
'size': 2}})
|
||||
|
||||
def test_volume_delete(self):
|
||||
_, err = self.run_command('volume-delete Work')
|
||||
self.assertIn('Command volume-delete is deprecated', err)
|
||||
self.assert_called('DELETE',
|
||||
'/volumes/15e59938-07d5-11e1-90e3-e3dffe0c5983')
|
||||
|
||||
def test_volume_delete_multiple(self):
|
||||
self.run_command('volume-delete Work Work2')
|
||||
self.assert_called('DELETE',
|
||||
'/volumes/15e59938-07d5-11e1-90e3-e3dffe0c5983',
|
||||
pos=-4)
|
||||
self.assert_called('DELETE',
|
||||
'/volumes/15e59938-07d5-11e1-90e3-ee32ba30feaa',
|
||||
pos=-1)
|
||||
|
||||
def test_volume_attach(self):
|
||||
self.run_command('volume-attach sample-server Work /dev/vdb')
|
||||
self.assert_called('POST', '/servers/1234/os-volume_attachments',
|
||||
|
@ -13,10 +13,6 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import warnings
|
||||
|
||||
import mock
|
||||
|
||||
from novaclient.tests.unit import utils
|
||||
from novaclient.tests.unit.v2 import fakes
|
||||
from novaclient.v2 import volumes
|
||||
@ -27,61 +23,6 @@ cs = fakes.FakeClient()
|
||||
|
||||
class VolumesTest(utils.TestCase):
|
||||
|
||||
@mock.patch.object(warnings, 'warn')
|
||||
def test_list_volumes(self, mock_warn):
|
||||
vl = cs.volumes.list()
|
||||
self.assert_request_id(vl, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('GET', '/volumes/detail')
|
||||
for v in vl:
|
||||
self.assertIsInstance(v, volumes.Volume)
|
||||
self.assertEqual(1, mock_warn.call_count)
|
||||
|
||||
@mock.patch.object(warnings, 'warn')
|
||||
def test_list_volumes_undetailed(self, mock_warn):
|
||||
vl = cs.volumes.list(detailed=False)
|
||||
self.assert_request_id(vl, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('GET', '/volumes')
|
||||
for v in vl:
|
||||
self.assertIsInstance(v, volumes.Volume)
|
||||
self.assertEqual(1, mock_warn.call_count)
|
||||
|
||||
@mock.patch.object(warnings, 'warn')
|
||||
def test_get_volume_details(self, mock_warn):
|
||||
vol_id = '15e59938-07d5-11e1-90e3-e3dffe0c5983'
|
||||
v = cs.volumes.get(vol_id)
|
||||
self.assert_request_id(v, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('GET', '/volumes/%s' % vol_id)
|
||||
self.assertIsInstance(v, volumes.Volume)
|
||||
self.assertEqual(v.id, vol_id)
|
||||
self.assertEqual(1, mock_warn.call_count)
|
||||
|
||||
@mock.patch.object(warnings, 'warn')
|
||||
def test_create_volume(self, mock_warn):
|
||||
v = cs.volumes.create(
|
||||
size=2,
|
||||
display_name="My volume",
|
||||
display_description="My volume desc",
|
||||
)
|
||||
self.assert_request_id(v, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('POST', '/volumes')
|
||||
self.assertIsInstance(v, volumes.Volume)
|
||||
self.assertEqual(1, mock_warn.call_count)
|
||||
|
||||
@mock.patch.object(warnings, 'warn')
|
||||
def test_delete_volume(self, mock_warn):
|
||||
vol_id = '15e59938-07d5-11e1-90e3-e3dffe0c5983'
|
||||
v = cs.volumes.get(vol_id)
|
||||
ret = v.delete()
|
||||
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('DELETE', '/volumes/%s' % vol_id)
|
||||
ret = cs.volumes.delete(vol_id)
|
||||
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('DELETE', '/volumes/%s' % vol_id)
|
||||
ret = cs.volumes.delete(v)
|
||||
self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST)
|
||||
cs.assert_called('DELETE', '/volumes/%s' % vol_id)
|
||||
self.assertEqual(4, mock_warn.call_count)
|
||||
|
||||
def test_create_server_volume(self):
|
||||
v = cs.volumes.create_server_volume(
|
||||
server_id=1234,
|
||||
|
@ -47,8 +47,6 @@ from novaclient.v2 import services
|
||||
from novaclient.v2 import usage
|
||||
from novaclient.v2 import versions
|
||||
from novaclient.v2 import virtual_interfaces
|
||||
from novaclient.v2 import volume_snapshots
|
||||
from novaclient.v2 import volume_types
|
||||
from novaclient.v2 import volumes
|
||||
|
||||
|
||||
@ -143,8 +141,6 @@ class Client(object):
|
||||
self.floating_ip_pools = floating_ip_pools.FloatingIPPoolManager(self)
|
||||
self.fping = fping.FpingManager(self)
|
||||
self.volumes = volumes.VolumeManager(self)
|
||||
self.volume_snapshots = volume_snapshots.SnapshotManager(self)
|
||||
self.volume_types = volume_types.VolumeTypeManager(self)
|
||||
self.keypairs = keypairs.KeypairManager(self)
|
||||
self.networks = networks.NetworkManager(self)
|
||||
self.quota_classes = quota_classes.QuotaClassSetManager(self)
|
||||
|
@ -66,14 +66,6 @@ CLIENT_BDM2_KEYS = {
|
||||
}
|
||||
|
||||
|
||||
# NOTE(mriedem): Remove this along with the deprecated commands in the first
|
||||
# python-novaclient release AFTER the nova server 13.0.0 'M' release.
|
||||
def emit_volume_deprecation_warning(command_name):
|
||||
print('WARNING: Command %s is deprecated and will be removed after Nova '
|
||||
'13.0.0 is released. Use python-cinderclient or openstackclient '
|
||||
'instead.' % command_name, file=sys.stderr)
|
||||
|
||||
|
||||
def _key_value_pairing(text):
|
||||
try:
|
||||
(k, v) = text.split('=', 1)
|
||||
@ -2249,137 +2241,6 @@ def _translate_volume_attachments_keys(collection):
|
||||
('volumeId', 'volume_id')])
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'--all-tenants',
|
||||
dest='all_tenants',
|
||||
metavar='<0|1>',
|
||||
nargs='?',
|
||||
type=int,
|
||||
const=1,
|
||||
default=int(strutils.bool_from_string(
|
||||
os.environ.get("ALL_TENANTS", 'false'), True)),
|
||||
help=_('Display information from all tenants (Admin only).'))
|
||||
@utils.arg(
|
||||
'--all_tenants',
|
||||
nargs='?',
|
||||
type=int,
|
||||
const=1,
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--all-tenants',
|
||||
help=argparse.SUPPRESS)
|
||||
def do_volume_list(cs, args):
|
||||
"""DEPRECATED: List all the volumes."""
|
||||
emit_volume_deprecation_warning('volume-list')
|
||||
search_opts = {'all_tenants': args.all_tenants}
|
||||
volumes = cs.volumes.list(search_opts=search_opts)
|
||||
_translate_volume_keys(volumes)
|
||||
|
||||
# Create a list of servers to which the volume is attached
|
||||
for vol in volumes:
|
||||
servers = [s.get('server_id') for s in vol.attachments]
|
||||
setattr(vol, 'attached_to', ','.join(map(str, servers)))
|
||||
utils.print_list(volumes, ['ID', 'Status', 'Display Name',
|
||||
'Size', 'Volume Type', 'Attached to'])
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'volume',
|
||||
metavar='<volume>',
|
||||
help=_('Name or ID of the volume.'))
|
||||
def do_volume_show(cs, args):
|
||||
"""DEPRECATED: Show details about a volume."""
|
||||
emit_volume_deprecation_warning('volume-show')
|
||||
volume = _find_volume(cs, args.volume)
|
||||
_print_volume(volume)
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'size',
|
||||
metavar='<size>',
|
||||
type=int,
|
||||
help=_('Size of volume in GB'))
|
||||
@utils.arg(
|
||||
'--snapshot-id',
|
||||
metavar='<snapshot-id>',
|
||||
default=None,
|
||||
help=_('Optional snapshot ID to create the volume from. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--snapshot_id',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--snapshot-id',
|
||||
help=argparse.SUPPRESS)
|
||||
@utils.arg(
|
||||
'--image-id',
|
||||
metavar='<image-id>',
|
||||
help=_('Optional image ID to create the volume from. (Default=None)'),
|
||||
default=None)
|
||||
@utils.arg(
|
||||
'--display-name',
|
||||
metavar='<display-name>',
|
||||
default=None,
|
||||
help=_('Optional volume name. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--display_name',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--display-name',
|
||||
help=argparse.SUPPRESS)
|
||||
@utils.arg(
|
||||
'--display-description',
|
||||
metavar='<display-description>',
|
||||
default=None,
|
||||
help=_('Optional volume description. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--display_description',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--display-description',
|
||||
help=argparse.SUPPRESS)
|
||||
@utils.arg(
|
||||
'--volume-type',
|
||||
metavar='<volume-type>',
|
||||
default=None,
|
||||
help=_('Optional volume type. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--volume_type',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--volume-type',
|
||||
help=argparse.SUPPRESS)
|
||||
@utils.arg(
|
||||
'--availability-zone', metavar='<availability-zone>',
|
||||
help=_('Optional Availability Zone for volume. (Default=None)'),
|
||||
default=None)
|
||||
def do_volume_create(cs, args):
|
||||
"""DEPRECATED: Add a new volume."""
|
||||
emit_volume_deprecation_warning('volume-create')
|
||||
volume = cs.volumes.create(args.size,
|
||||
args.snapshot_id,
|
||||
args.display_name,
|
||||
args.display_description,
|
||||
args.volume_type,
|
||||
args.availability_zone,
|
||||
imageRef=args.image_id)
|
||||
_print_volume(volume)
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'volume',
|
||||
metavar='<volume>', nargs='+',
|
||||
help=_('Name or ID of the volume(s) to delete.'))
|
||||
def do_volume_delete(cs, args):
|
||||
"""DEPRECATED: Remove volume(s)."""
|
||||
emit_volume_deprecation_warning('volume-delete')
|
||||
for volume in args.volume:
|
||||
try:
|
||||
_find_volume(cs, volume).delete()
|
||||
except Exception as e:
|
||||
print(_("Delete for volume %(volume)s failed: %(e)s") %
|
||||
{'volume': volume, 'e': e})
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'server',
|
||||
metavar='<server>',
|
||||
@ -2448,111 +2309,6 @@ def do_volume_attachments(cs, args):
|
||||
utils.print_list(volumes, ['ID', 'DEVICE', 'SERVER ID', 'VOLUME ID'])
|
||||
|
||||
|
||||
def do_volume_snapshot_list(cs, _args):
|
||||
"""DEPRECATED: List all the snapshots."""
|
||||
emit_volume_deprecation_warning('volume-snapshot-list')
|
||||
snapshots = cs.volume_snapshots.list()
|
||||
_translate_volume_snapshot_keys(snapshots)
|
||||
utils.print_list(snapshots, ['ID', 'Volume ID', 'Status', 'Display Name',
|
||||
'Size'])
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'snapshot',
|
||||
metavar='<snapshot>',
|
||||
help=_('Name or ID of the snapshot.'))
|
||||
def do_volume_snapshot_show(cs, args):
|
||||
"""DEPRECATED: Show details about a snapshot."""
|
||||
emit_volume_deprecation_warning('volume-snapshot-show')
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
_print_volume_snapshot(snapshot)
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'volume_id',
|
||||
metavar='<volume-id>',
|
||||
help=_('ID of the volume to snapshot'))
|
||||
@utils.arg(
|
||||
'--force',
|
||||
metavar='<True|False>',
|
||||
help=_('Optional flag to indicate whether to snapshot a volume even if '
|
||||
'its attached to a server. (Default=False)'),
|
||||
default=False)
|
||||
@utils.arg(
|
||||
'--display-name',
|
||||
metavar='<display-name>',
|
||||
default=None,
|
||||
help=_('Optional snapshot name. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--display_name',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--display-name',
|
||||
help=argparse.SUPPRESS)
|
||||
@utils.arg(
|
||||
'--display-description',
|
||||
metavar='<display-description>',
|
||||
default=None,
|
||||
help=_('Optional snapshot description. (Default=None)'))
|
||||
@utils.arg(
|
||||
'--display_description',
|
||||
action=shell.DeprecatedAction,
|
||||
use=_('use "%s"; this option will be removed in '
|
||||
'novaclient 3.3.0.') % '--display-description',
|
||||
help=argparse.SUPPRESS)
|
||||
def do_volume_snapshot_create(cs, args):
|
||||
"""DEPRECATED: Add a new snapshot."""
|
||||
emit_volume_deprecation_warning('volume-snapshot-create')
|
||||
snapshot = cs.volume_snapshots.create(args.volume_id,
|
||||
args.force,
|
||||
args.display_name,
|
||||
args.display_description)
|
||||
_print_volume_snapshot(snapshot)
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'snapshot',
|
||||
metavar='<snapshot>',
|
||||
help=_('Name or ID of the snapshot to delete.'))
|
||||
def do_volume_snapshot_delete(cs, args):
|
||||
"""DEPRECATED: Remove a snapshot."""
|
||||
emit_volume_deprecation_warning('volume-snapshot-delete')
|
||||
snapshot = _find_volume_snapshot(cs, args.snapshot)
|
||||
snapshot.delete()
|
||||
|
||||
|
||||
def _print_volume_type_list(vtypes):
|
||||
utils.print_list(vtypes, ['ID', 'Name'])
|
||||
|
||||
|
||||
def do_volume_type_list(cs, args):
|
||||
"""DEPRECATED: Print a list of available 'volume types'."""
|
||||
emit_volume_deprecation_warning('volume-type-list')
|
||||
vtypes = cs.volume_types.list()
|
||||
_print_volume_type_list(vtypes)
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'name',
|
||||
metavar='<name>',
|
||||
help=_("Name of the new volume type"))
|
||||
def do_volume_type_create(cs, args):
|
||||
"""DEPRECATED: Create a new volume type."""
|
||||
emit_volume_deprecation_warning('volume-type-create')
|
||||
vtype = cs.volume_types.create(args.name)
|
||||
_print_volume_type_list([vtype])
|
||||
|
||||
|
||||
@utils.arg(
|
||||
'id',
|
||||
metavar='<id>',
|
||||
help=_("Unique ID of the volume type to delete."))
|
||||
def do_volume_type_delete(cs, args):
|
||||
"""DEPRECATED: Delete a specific volume type."""
|
||||
emit_volume_deprecation_warning('volume-type-delete')
|
||||
cs.volume_types.delete(args.id)
|
||||
|
||||
|
||||
@api_versions.wraps('2.0', '2.5')
|
||||
def console_dict_accessor(cs, data):
|
||||
return data['console']
|
||||
|
@ -1,120 +0,0 @@
|
||||
# Copyright 2011 Denali Systems, 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.
|
||||
|
||||
"""
|
||||
DEPRECATED: Volume snapshot interface (1.1 extension).
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
from novaclient import base
|
||||
|
||||
|
||||
class Snapshot(base.Resource):
|
||||
"""
|
||||
DEPRECATED: A Snapshot is a point-in-time snapshot of an openstack volume.
|
||||
"""
|
||||
NAME_ATTR = 'display_name'
|
||||
|
||||
def __repr__(self):
|
||||
return "<Snapshot: %s>" % self.id
|
||||
|
||||
def delete(self):
|
||||
"""
|
||||
DEPRECATED: Delete this snapshot.
|
||||
|
||||
:returns: An instance of novaclient.base.TupleWithMeta
|
||||
"""
|
||||
return self.manager.delete(self)
|
||||
|
||||
|
||||
class SnapshotManager(base.ManagerWithFind):
|
||||
"""
|
||||
DEPRECATED: Manage :class:`Snapshot` resources.
|
||||
"""
|
||||
resource_class = Snapshot
|
||||
|
||||
def create(self, volume_id, force=False, display_name=None,
|
||||
display_description=None):
|
||||
|
||||
"""
|
||||
DEPRECATED: Create a snapshot of the given volume.
|
||||
|
||||
:param volume_id: The ID of the volume to snapshot.
|
||||
:param force: If force is True, create a snapshot even if the volume is
|
||||
attached to an instance. Default is False.
|
||||
:param display_name: Name of the snapshot
|
||||
:param display_description: Description of the snapshot
|
||||
:rtype: :class:`Snapshot`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_snapshots module is '
|
||||
'deprecated and will be removed after Nova 13.0.0 is '
|
||||
'released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
body = {'snapshot': {'volume_id': volume_id,
|
||||
'force': force,
|
||||
'display_name': display_name,
|
||||
'display_description': display_description}}
|
||||
return self._create('/snapshots', body, 'snapshot')
|
||||
|
||||
def get(self, snapshot_id):
|
||||
"""
|
||||
DEPRECATED: Get a snapshot.
|
||||
|
||||
:param snapshot_id: The ID of the snapshot to get.
|
||||
:rtype: :class:`Snapshot`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_snapshots module is '
|
||||
'deprecated and will be removed after Nova 13.0.0 is '
|
||||
'released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
|
||||
return self._get("/snapshots/%s" % snapshot_id, "snapshot")
|
||||
|
||||
def list(self, detailed=True):
|
||||
"""
|
||||
DEPRECATED: Get a list of all snapshots.
|
||||
|
||||
:rtype: list of :class:`Snapshot`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_snapshots module is '
|
||||
'deprecated and will be removed after Nova 13.0.0 is '
|
||||
'released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
if detailed is True:
|
||||
return self._list("/snapshots/detail", "snapshots")
|
||||
else:
|
||||
return self._list("/snapshots", "snapshots")
|
||||
|
||||
def delete(self, snapshot):
|
||||
"""
|
||||
DEPRECATED: Delete a snapshot.
|
||||
|
||||
:param snapshot: The :class:`Snapshot` to delete.
|
||||
:returns: An instance of novaclient.base.TupleWithMeta
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_snapshots module is '
|
||||
'deprecated and will be removed after Nova 13.0.0 is '
|
||||
'released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._delete("/snapshots/%s" % base.getid(snapshot))
|
@ -1,103 +0,0 @@
|
||||
# Copyright (c) 2011 Rackspace US, Inc.
|
||||
#
|
||||
# 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.
|
||||
|
||||
|
||||
"""
|
||||
DEPRECATED: Volume Type interface.
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
from novaclient import base
|
||||
|
||||
|
||||
class VolumeType(base.Resource):
|
||||
"""
|
||||
DEPRECATED: A Volume Type is the type of volume to be created
|
||||
"""
|
||||
def __repr__(self):
|
||||
return "<Volume Type: %s>" % self.name
|
||||
|
||||
|
||||
class VolumeTypeManager(base.ManagerWithFind):
|
||||
"""
|
||||
DEPRECATED: Manage :class:`VolumeType` resources.
|
||||
"""
|
||||
resource_class = VolumeType
|
||||
|
||||
def list(self):
|
||||
"""
|
||||
DEPRECATED: Get a list of all volume types.
|
||||
|
||||
:rtype: list of :class:`VolumeType`.
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_types module is deprecated '
|
||||
'and will be removed after Nova 13.0.0 is released. Use '
|
||||
'python-cinderclient or python-openstacksdk instead.',
|
||||
DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._list("/types", "volume_types")
|
||||
|
||||
def get(self, volume_type):
|
||||
"""
|
||||
DEPRECATED: Get a specific volume type.
|
||||
|
||||
:param volume_type: The ID of the :class:`VolumeType` to get.
|
||||
:rtype: :class:`VolumeType`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_types module is deprecated '
|
||||
'and will be removed after Nova 13.0.0 is released. Use '
|
||||
'python-cinderclient or python-openstacksdk instead.',
|
||||
DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._get("/types/%s" % base.getid(volume_type),
|
||||
"volume_type")
|
||||
|
||||
def delete(self, volume_type):
|
||||
"""
|
||||
DEPRECATED: Delete a specific volume_type.
|
||||
|
||||
:param volume_type: The ID of the :class:`VolumeType` to get.
|
||||
:returns: An instance of novaclient.base.TupleWithMeta
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_types module is deprecated '
|
||||
'and will be removed after Nova 13.0.0 is released. Use '
|
||||
'python-cinderclient or python-openstacksdk instead.',
|
||||
DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._delete("/types/%s" % base.getid(volume_type))
|
||||
|
||||
def create(self, name):
|
||||
"""
|
||||
DEPRECATED: Create a volume type.
|
||||
|
||||
:param name: Descriptive name of the volume type
|
||||
:rtype: :class:`VolumeType`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volume_types module is deprecated '
|
||||
'and will be removed after Nova 13.0.0 is released. Use '
|
||||
'python-cinderclient or python-openstacksdk instead.',
|
||||
DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
body = {
|
||||
"volume_type": {
|
||||
"name": name,
|
||||
}
|
||||
}
|
||||
return self._create("/types", body, "volume_type")
|
@ -17,17 +17,12 @@
|
||||
Volume interface (1.1 extension).
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
import six
|
||||
from six.moves.urllib import parse
|
||||
|
||||
from novaclient import base
|
||||
|
||||
|
||||
class Volume(base.Resource):
|
||||
"""
|
||||
DEPRECATED: A volume is an extra block level storage to the OpenStack
|
||||
A volume is an extra block level storage to the OpenStack
|
||||
instances.
|
||||
"""
|
||||
NAME_ATTR = 'display_name'
|
||||
@ -35,109 +30,13 @@ class Volume(base.Resource):
|
||||
def __repr__(self):
|
||||
return "<Volume: %s>" % self.id
|
||||
|
||||
def delete(self):
|
||||
"""
|
||||
DEPRECATED: Delete this volume.
|
||||
|
||||
:returns: An instance of novaclient.base.TupleWithMeta
|
||||
"""
|
||||
return self.manager.delete(self)
|
||||
|
||||
|
||||
class VolumeManager(base.ManagerWithFind):
|
||||
class VolumeManager(base.Manager):
|
||||
"""
|
||||
DEPRECATED: Manage :class:`Volume` resources.
|
||||
Manage :class:`Volume` resources. This is really about volume attachments.
|
||||
"""
|
||||
resource_class = Volume
|
||||
|
||||
def create(self, size, snapshot_id=None, display_name=None,
|
||||
display_description=None, volume_type=None,
|
||||
availability_zone=None, imageRef=None):
|
||||
"""
|
||||
DEPRECATED: Create a volume.
|
||||
|
||||
:param size: Size of volume in GB
|
||||
:param snapshot_id: ID of the snapshot
|
||||
:param display_name: Name of the volume
|
||||
:param display_description: Description of the volume
|
||||
:param volume_type: Type of volume
|
||||
:param availability_zone: Availability Zone for volume
|
||||
:rtype: :class:`Volume`
|
||||
:param imageRef: reference to an image stored in glance
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volumes.VolumeManager.create() '
|
||||
'method is deprecated and will be removed after Nova '
|
||||
'13.0.0 is released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
# NOTE(melwitt): Ensure we use the volume endpoint for this call
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
body = {'volume': {'size': size,
|
||||
'snapshot_id': snapshot_id,
|
||||
'display_name': display_name,
|
||||
'display_description': display_description,
|
||||
'volume_type': volume_type,
|
||||
'availability_zone': availability_zone,
|
||||
'imageRef': imageRef}}
|
||||
return self._create('/volumes', body, 'volume')
|
||||
|
||||
def get(self, volume_id):
|
||||
"""
|
||||
DEPRECATED: Get a volume.
|
||||
|
||||
:param volume_id: The ID of the volume to get.
|
||||
:rtype: :class:`Volume`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volumes.VolumeManager.get() '
|
||||
'method is deprecated and will be removed after Nova '
|
||||
'13.0.0 is released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._get("/volumes/%s" % volume_id, "volume")
|
||||
|
||||
def list(self, detailed=True, search_opts=None):
|
||||
"""
|
||||
DEPRECATED: Get a list of all volumes.
|
||||
|
||||
:rtype: list of :class:`Volume`
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volumes.VolumeManager.list() '
|
||||
'method is deprecated and will be removed after Nova '
|
||||
'13.0.0 is released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
search_opts = search_opts or {}
|
||||
|
||||
if 'name' in search_opts.keys():
|
||||
search_opts['display_name'] = search_opts.pop('name')
|
||||
|
||||
qparams = dict((k, v) for (k, v) in
|
||||
six.iteritems(search_opts) if v)
|
||||
|
||||
query_str = '?%s' % parse.urlencode(qparams) if qparams else ''
|
||||
|
||||
if detailed is True:
|
||||
return self._list("/volumes/detail%s" % query_str, "volumes")
|
||||
else:
|
||||
return self._list("/volumes%s" % query_str, "volumes")
|
||||
|
||||
def delete(self, volume):
|
||||
"""
|
||||
DEPRECATED: Delete a volume.
|
||||
|
||||
:param volume: The :class:`Volume` to delete.
|
||||
:returns: An instance of novaclient.base.TupleWithMeta
|
||||
"""
|
||||
warnings.warn('The novaclient.v2.volumes.VolumeManager.delete() '
|
||||
'method is deprecated and will be removed after Nova '
|
||||
'13.0.0 is released. Use python-cinderclient or '
|
||||
'python-openstacksdk instead.', DeprecationWarning)
|
||||
with self.alternate_service_type(
|
||||
'volumev2', allowed_types=('volume', 'volumev2')):
|
||||
return self._delete("/volumes/%s" % base.getid(volume))
|
||||
|
||||
def create_server_volume(self, server_id, volume_id, device=None):
|
||||
"""
|
||||
Attach a volume identified by the volume ID to the given server ID
|
||||
|
@ -0,0 +1,6 @@
|
||||
---
|
||||
upgrade:
|
||||
- Volume, volume-type and volume-snapshot create/update/delete/list CLIs
|
||||
and python API bindings are removed. Use python-cinderclient or
|
||||
python-openstackclient for CLIs instead. Use python-cinderclient or
|
||||
python-openstacksdk for python API bindings instead.
|
@ -10,6 +10,7 @@ fixtures>=1.3.1 # Apache-2.0/BSD
|
||||
keyring>=5.5.1 # MIT/PSF
|
||||
mock>=1.2 # BSD
|
||||
python-keystoneclient!=1.8.0,!=2.1.0,>=1.6.0 # Apache-2.0
|
||||
python-cinderclient>=1.3.1 # Apache-2.0
|
||||
requests-mock>=0.7.0 # Apache-2.0
|
||||
sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 # BSD
|
||||
os-client-config>=1.13.1 # Apache-2.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user