Remove flavor API
Change-Id: I5a35911b5658fdf6bc08844b31cc1325b749526a
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
.. toctree::
|
|
||||||
|
|
||||||
trove.rst
|
|
File diff suppressed because it is too large
Load Diff
@@ -16,8 +16,7 @@
|
|||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
This is a client for the OpenStack Trove API. There's a Python API (the
|
This is a client for the OpenStack Trove API. There's a Python API (the
|
||||||
``troveclient`` module), and a command-line script (``trove``). Each
|
``troveclient`` module), and an ``openstack`` command-line plugin.
|
||||||
implements 100% of the OpenStack Trove API.
|
|
||||||
|
|
||||||
Contents
|
Contents
|
||||||
--------
|
--------
|
||||||
@@ -26,7 +25,6 @@ Contents
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
user/index
|
user/index
|
||||||
cli/index
|
|
||||||
reference/index
|
reference/index
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
|
@@ -2,42 +2,16 @@
|
|||||||
Trove Client User Guide
|
Trove Client User Guide
|
||||||
=========================
|
=========================
|
||||||
|
|
||||||
Command-line API
|
Command-line Interface
|
||||||
----------------
|
----------------------
|
||||||
|
|
||||||
Installing this package gets you a shell command, ``trove``, that you
|
Installing this package allows you to use ``openstack`` command to interact
|
||||||
can use to interact with any OpenStack cloud.
|
with Trove. Refer to
|
||||||
|
https://docs.openstack.org/python-openstackclient/latest
|
||||||
|
for how to install ``openstack`` command and configuration.
|
||||||
|
|
||||||
You'll need to provide your OpenStack username and password. You can do this
|
You can find all supported Trove commands in ``openstack.database.v1``
|
||||||
with the ``--os-username``, ``--os-password`` and ``--os-tenant-name``
|
entry_points section in ``setup.cfg`` file of the repo.
|
||||||
params, but it's easier to just set them as environment variables::
|
|
||||||
|
|
||||||
export OS_USERNAME=openstack
|
|
||||||
export OS_PASSWORD=yadayada
|
|
||||||
export OS_TENANT_NAME=myproject
|
|
||||||
|
|
||||||
You will also need to define the authentication url with ``--os-auth-url`` and
|
|
||||||
the version of the API with ``--os-database-api-version`` (default is version
|
|
||||||
1.0). Or set them as an environment variables as well::
|
|
||||||
|
|
||||||
export OS_AUTH_URL=http://example.com:5000/v2.0/
|
|
||||||
export OS_AUTH_URL=1.0
|
|
||||||
|
|
||||||
If you are using Keystone, you need to set the OS_AUTH_URL to the keystone
|
|
||||||
endpoint::
|
|
||||||
|
|
||||||
export OS_AUTH_URL=http://example.com:5000/v2.0/
|
|
||||||
|
|
||||||
Since Keystone can return multiple regions in the Service Catalog, you
|
|
||||||
can specify the one you want with ``--os-region-name`` (or
|
|
||||||
``export OS_REGION_NAME``). It defaults to the first in the list returned.
|
|
||||||
|
|
||||||
Argument ``--profile`` is available only when the osprofiler lib is installed.
|
|
||||||
|
|
||||||
You'll find complete documentation on the shell by running
|
|
||||||
``trove help``.
|
|
||||||
|
|
||||||
For more details, refer to :doc:`../cli/index`.
|
|
||||||
|
|
||||||
Python API
|
Python API
|
||||||
----------
|
----------
|
||||||
@@ -46,14 +20,11 @@ There's also a complete Python API.
|
|||||||
|
|
||||||
Quick-start using keystone::
|
Quick-start using keystone::
|
||||||
|
|
||||||
# use v2.0 auth with http://example.com:5000/v2.0/
|
>>> from troveclient import client
|
||||||
>>> from troveclient.v1 import client
|
>>> trove_client = client.Client('1.0', session=keystone_session, endpoint_type='public', service_type='database', region_name='RegionOne')
|
||||||
>>> nt = client.Client(USERNAME, PASSWORD, TENANT_NAME, AUTH_URL)
|
>>> trove_client.datastores.list()
|
||||||
>>> nt.datastores.list()
|
|
||||||
[...]
|
[...]
|
||||||
>>> nt.flavors.list()
|
>>> trove_client.instances.list()
|
||||||
[...]
|
|
||||||
>>> nt.instances.list()
|
|
||||||
[...]
|
[...]
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
|
@@ -62,8 +62,6 @@ openstack.database.v1 =
|
|||||||
database_db_create = troveclient.osc.v1.databases:CreateDatabase
|
database_db_create = troveclient.osc.v1.databases:CreateDatabase
|
||||||
database_db_delete = troveclient.osc.v1.databases:DeleteDatabase
|
database_db_delete = troveclient.osc.v1.databases:DeleteDatabase
|
||||||
database_db_list = troveclient.osc.v1.databases:ListDatabases
|
database_db_list = troveclient.osc.v1.databases:ListDatabases
|
||||||
database_flavor_list = troveclient.osc.v1.database_flavors:ListDatabaseFlavors
|
|
||||||
database_flavor_show = troveclient.osc.v1.database_flavors:ShowDatabaseFlavor
|
|
||||||
database_instance_create = troveclient.osc.v1.database_instances:CreateDatabaseInstance
|
database_instance_create = troveclient.osc.v1.database_instances:CreateDatabaseInstance
|
||||||
database_instance_delete = troveclient.osc.v1.database_instances:DeleteDatabaseInstance
|
database_instance_delete = troveclient.osc.v1.database_instances:DeleteDatabaseInstance
|
||||||
database_instance_detach_replica = troveclient.osc.v1.database_instances:DetachDatabaseInstanceReplica
|
database_instance_detach_replica = troveclient.osc.v1.database_instances:DetachDatabaseInstanceReplica
|
||||||
|
@@ -21,11 +21,9 @@ from troveclient.v1.accounts import Accounts # noqa
|
|||||||
from troveclient.v1.databases import Databases # noqa
|
from troveclient.v1.databases import Databases # noqa
|
||||||
from troveclient.v1.diagnostics import DiagnosticsInterrogator # noqa
|
from troveclient.v1.diagnostics import DiagnosticsInterrogator # noqa
|
||||||
from troveclient.v1.diagnostics import HwInfoInterrogator # noqa
|
from troveclient.v1.diagnostics import HwInfoInterrogator # noqa
|
||||||
from troveclient.v1.flavors import Flavors # noqa
|
|
||||||
from troveclient.v1.hosts import Hosts # noqa
|
from troveclient.v1.hosts import Hosts # noqa
|
||||||
from troveclient.v1.instances import Instances # noqa
|
from troveclient.v1.instances import Instances # noqa
|
||||||
from troveclient.v1.management import Management # noqa
|
from troveclient.v1.management import Management # noqa
|
||||||
from troveclient.v1.management import MgmtFlavors # noqa
|
|
||||||
from troveclient.v1.management import RootHistory # noqa
|
from troveclient.v1.management import RootHistory # noqa
|
||||||
from troveclient.v1.root import Root # noqa
|
from troveclient.v1.root import Root # noqa
|
||||||
from troveclient.v1.storage import StorageInfo # noqa
|
from troveclient.v1.storage import StorageInfo # noqa
|
||||||
|
@@ -129,16 +129,6 @@ class InstanceCommands(common.AuthedCommandsBase):
|
|||||||
self._pretty_print(self.dbaas.instances.configuration, self.id)
|
self._pretty_print(self.dbaas.instances.configuration, self.id)
|
||||||
|
|
||||||
|
|
||||||
class FlavorsCommands(common.AuthedCommandsBase):
|
|
||||||
"""Command for listing Flavors."""
|
|
||||||
|
|
||||||
params = []
|
|
||||||
|
|
||||||
def list(self):
|
|
||||||
"""List the available flavors."""
|
|
||||||
self._pretty_list(self.dbaas.flavors.list)
|
|
||||||
|
|
||||||
|
|
||||||
class DatabaseCommands(common.AuthedCommandsBase):
|
class DatabaseCommands(common.AuthedCommandsBase):
|
||||||
"""Database CRUD operations on an instance."""
|
"""Database CRUD operations on an instance."""
|
||||||
|
|
||||||
@@ -436,7 +426,6 @@ class MetadataCommands(common.AuthedCommandsBase):
|
|||||||
COMMANDS = {
|
COMMANDS = {
|
||||||
'auth': common.Auth,
|
'auth': common.Auth,
|
||||||
'instance': InstanceCommands,
|
'instance': InstanceCommands,
|
||||||
'flavor': FlavorsCommands,
|
|
||||||
'database': DatabaseCommands,
|
'database': DatabaseCommands,
|
||||||
'limit': LimitsCommands,
|
'limit': LimitsCommands,
|
||||||
'backup': BackupsCommands,
|
'backup': BackupsCommands,
|
||||||
|
@@ -309,7 +309,6 @@ class Dbaas(object):
|
|||||||
from troveclient.v1 import databases
|
from troveclient.v1 import databases
|
||||||
from troveclient.v1 import datastores
|
from troveclient.v1 import datastores
|
||||||
from troveclient.v1 import diagnostics
|
from troveclient.v1 import diagnostics
|
||||||
from troveclient.v1 import flavors
|
|
||||||
from troveclient.v1 import hosts
|
from troveclient.v1 import hosts
|
||||||
from troveclient.v1 import instances
|
from troveclient.v1 import instances
|
||||||
from troveclient.v1 import limits
|
from troveclient.v1 import limits
|
||||||
@@ -331,7 +330,6 @@ class Dbaas(object):
|
|||||||
region_name=region_name)
|
region_name=region_name)
|
||||||
self.versions = versions.Versions(self)
|
self.versions = versions.Versions(self)
|
||||||
self.databases = databases.Databases(self)
|
self.databases = databases.Databases(self)
|
||||||
self.flavors = flavors.Flavors(self)
|
|
||||||
self.instances = instances.Instances(self)
|
self.instances = instances.Instances(self)
|
||||||
self.limits = limits.Limits(self)
|
self.limits = limits.Limits(self)
|
||||||
self.users = users.Users(self)
|
self.users = users.Users(self)
|
||||||
@@ -349,7 +347,6 @@ class Dbaas(object):
|
|||||||
self.storage = storage.StorageInfo(self)
|
self.storage = storage.StorageInfo(self)
|
||||||
self.management = management.Management(self)
|
self.management = management.Management(self)
|
||||||
self.mgmt_cluster = management.MgmtClusters(self)
|
self.mgmt_cluster = management.MgmtClusters(self)
|
||||||
self.mgmt_flavor = management.MgmtFlavors(self)
|
|
||||||
self.accounts = accounts.Accounts(self)
|
self.accounts = accounts.Accounts(self)
|
||||||
self.diagnostics = diagnostics.DiagnosticsInterrogator(self)
|
self.diagnostics = diagnostics.DiagnosticsInterrogator(self)
|
||||||
self.hwinfo = diagnostics.HwInfoInterrogator(self)
|
self.hwinfo = diagnostics.HwInfoInterrogator(self)
|
||||||
|
@@ -181,31 +181,6 @@ class StorageCommands(common.AuthedCommandsBase):
|
|||||||
self._pretty_list(self.dbaas.storage.index)
|
self._pretty_list(self.dbaas.storage.index)
|
||||||
|
|
||||||
|
|
||||||
class FlavorsCommands(common.AuthedCommandsBase):
|
|
||||||
"""Commands for managing Flavors."""
|
|
||||||
|
|
||||||
params = [
|
|
||||||
'name',
|
|
||||||
'ram',
|
|
||||||
'disk',
|
|
||||||
'vcpus',
|
|
||||||
'flavor_id',
|
|
||||||
'ephemeral',
|
|
||||||
'swap',
|
|
||||||
'rxtx_factor',
|
|
||||||
'service_type'
|
|
||||||
]
|
|
||||||
|
|
||||||
def create(self):
|
|
||||||
"""Create a new flavor."""
|
|
||||||
self._require('name', 'ram', 'disk', 'vcpus',
|
|
||||||
'flavor_id', 'service_type')
|
|
||||||
self._pretty_print(self.dbaas.mgmt_flavor.create, self.name,
|
|
||||||
self.ram, self.disk, self.vcpus, self.flavor_id,
|
|
||||||
self.ephemeral, self.swap, self.rxtx_factor,
|
|
||||||
self.service_type)
|
|
||||||
|
|
||||||
|
|
||||||
def config_options(oparser):
|
def config_options(oparser):
|
||||||
oparser.add_option("-u", "--url", default="http://localhost:5000/v1.1",
|
oparser.add_option("-u", "--url", default="http://localhost:5000/v1.1",
|
||||||
help="Auth API endpoint URL with port and version. \
|
help="Auth API endpoint URL with port and version. \
|
||||||
@@ -219,7 +194,6 @@ COMMANDS = {
|
|||||||
'root': RootCommands,
|
'root': RootCommands,
|
||||||
'storage': StorageCommands,
|
'storage': StorageCommands,
|
||||||
'quota': QuotaCommands,
|
'quota': QuotaCommands,
|
||||||
'flavor': FlavorsCommands,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,97 +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.
|
|
||||||
|
|
||||||
"""Database v1 Flavors action implementations"""
|
|
||||||
|
|
||||||
from osc_lib.command import command
|
|
||||||
from osc_lib import utils
|
|
||||||
import six
|
|
||||||
|
|
||||||
from troveclient import exceptions
|
|
||||||
from troveclient.i18n import _
|
|
||||||
|
|
||||||
|
|
||||||
def set_attributes_for_print_detail(flavor):
|
|
||||||
info = flavor._info.copy()
|
|
||||||
# Get rid of those ugly links
|
|
||||||
if info.get('links'):
|
|
||||||
del(info['links'])
|
|
||||||
|
|
||||||
# Fallback to str_id for flavors, where necessary
|
|
||||||
if hasattr(flavor, 'str_id'):
|
|
||||||
info['id'] = flavor.id
|
|
||||||
del(info['str_id'])
|
|
||||||
return info
|
|
||||||
|
|
||||||
|
|
||||||
class ListDatabaseFlavors(command.Lister):
|
|
||||||
|
|
||||||
_description = _("List database flavors")
|
|
||||||
columns = ['ID', 'Name', 'RAM', 'vCPUs', 'Disk', 'Ephemeral']
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ListDatabaseFlavors, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'--datastore-type',
|
|
||||||
dest='datastore_type',
|
|
||||||
metavar='<datastore-type>',
|
|
||||||
help=_('Type of the datastore. For eg: mysql.')
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'--datastore-version-id',
|
|
||||||
dest='datastore_version_id',
|
|
||||||
metavar='<datastore-version-id>',
|
|
||||||
help=_('ID of the datastore version.')
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
db_flavors = self.app.client_manager.database.flavors
|
|
||||||
if parsed_args.datastore_type and parsed_args.datastore_version_id:
|
|
||||||
flavors = db_flavors.list_datastore_version_associated_flavors(
|
|
||||||
datastore=parsed_args.datastore_type,
|
|
||||||
version_id=parsed_args.datastore_version_id)
|
|
||||||
elif (not parsed_args.datastore_type and not
|
|
||||||
parsed_args.datastore_version_id):
|
|
||||||
flavors = db_flavors.list()
|
|
||||||
else:
|
|
||||||
raise exceptions.MissingArgs(['datastore-type',
|
|
||||||
'datastore-version-id'])
|
|
||||||
|
|
||||||
# Fallback to str_id where necessary.
|
|
||||||
_flavors = []
|
|
||||||
for f in flavors:
|
|
||||||
if not f.id and hasattr(f, 'str_id'):
|
|
||||||
f.id = f.str_id
|
|
||||||
_flavors.append(utils.get_item_properties(f, self.columns))
|
|
||||||
|
|
||||||
return self.columns, _flavors
|
|
||||||
|
|
||||||
|
|
||||||
class ShowDatabaseFlavor(command.ShowOne):
|
|
||||||
_description = _("Shows details of a database flavor")
|
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(ShowDatabaseFlavor, self).get_parser(prog_name)
|
|
||||||
parser.add_argument(
|
|
||||||
'flavor',
|
|
||||||
metavar='<flavor>',
|
|
||||||
help=_('ID or name of the flavor'),
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
|
||||||
db_flavors = self.app.client_manager.database.flavors
|
|
||||||
flavor = utils.find_resource(db_flavors,
|
|
||||||
parsed_args.flavor)
|
|
||||||
flavor = set_attributes_for_print_detail(flavor)
|
|
||||||
return zip(*sorted(six.iteritems(flavor)))
|
|
@@ -225,7 +225,7 @@ class CreateDatabaseInstance(command.ShowOne):
|
|||||||
'flavor',
|
'flavor',
|
||||||
metavar='<flavor>',
|
metavar='<flavor>',
|
||||||
type=str,
|
type=str,
|
||||||
help=_("A flavor name or ID."),
|
help=_("A flavor ID."),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--size',
|
'--size',
|
||||||
@@ -348,8 +348,8 @@ class CreateDatabaseInstance(command.ShowOne):
|
|||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
database = self.app.client_manager.database
|
database = self.app.client_manager.database
|
||||||
db_instances = database.instances
|
db_instances = database.instances
|
||||||
flavor_id = osc_utils.find_resource(database.flavors,
|
flavor_id = parsed_args.flavor
|
||||||
parsed_args.flavor).id
|
|
||||||
volume = None
|
volume = None
|
||||||
if parsed_args.size is not None and parsed_args.size <= 0:
|
if parsed_args.size is not None and parsed_args.size <= 0:
|
||||||
raise exceptions.ValidationError(
|
raise exceptions.ValidationError(
|
||||||
|
@@ -20,7 +20,6 @@ from troveclient.v1 import clusters
|
|||||||
from troveclient.v1 import configurations
|
from troveclient.v1 import configurations
|
||||||
from troveclient.v1 import databases
|
from troveclient.v1 import databases
|
||||||
from troveclient.v1 import datastores
|
from troveclient.v1 import datastores
|
||||||
from troveclient.v1 import flavors
|
|
||||||
from troveclient.v1 import instances
|
from troveclient.v1 import instances
|
||||||
from troveclient.v1 import limits
|
from troveclient.v1 import limits
|
||||||
from troveclient.v1 import modules
|
from troveclient.v1 import modules
|
||||||
@@ -34,13 +33,6 @@ class TestDatabasev1(utils.TestCommand):
|
|||||||
self.app.client_manager.database = mock.MagicMock()
|
self.app.client_manager.database = mock.MagicMock()
|
||||||
|
|
||||||
|
|
||||||
class FakeFlavors(object):
|
|
||||||
fake_flavors = fakes.FakeHTTPClient().get_flavors()[2]['flavors']
|
|
||||||
|
|
||||||
def get_flavors_1(self):
|
|
||||||
return flavors.Flavor(None, self.fake_flavors[0])
|
|
||||||
|
|
||||||
|
|
||||||
class FakeBackups(object):
|
class FakeBackups(object):
|
||||||
fake_backups = fakes.FakeHTTPClient().get_backups()[2]['backups']
|
fake_backups = fakes.FakeHTTPClient().get_backups()[2]['backups']
|
||||||
|
|
||||||
|
@@ -1,78 +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 troveclient.osc.v1 import database_flavors
|
|
||||||
from troveclient.tests.osc.v1 import fakes
|
|
||||||
|
|
||||||
|
|
||||||
class TestFlavors(fakes.TestDatabasev1):
|
|
||||||
fake_flavors = fakes.FakeFlavors()
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestFlavors, self).setUp()
|
|
||||||
self.mock_client = self.app.client_manager.database
|
|
||||||
self.flavor_client = self.app.client_manager.database.flavors
|
|
||||||
|
|
||||||
|
|
||||||
class TestFlavorList(TestFlavors):
|
|
||||||
columns = database_flavors.ListDatabaseFlavors.columns
|
|
||||||
values = (1, 'm1.tiny', 512, '', '', '')
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestFlavorList, self).setUp()
|
|
||||||
self.cmd = database_flavors.ListDatabaseFlavors(self.app, None)
|
|
||||||
self.data = [self.fake_flavors.get_flavors_1()]
|
|
||||||
self.flavor_client.list.return_value = self.data
|
|
||||||
self.flavor_client.list_datastore_version_associated_flavors. \
|
|
||||||
return_value = self.data
|
|
||||||
|
|
||||||
def test_flavor_list_defaults(self):
|
|
||||||
parsed_args = self.check_parser(self.cmd, [], [])
|
|
||||||
columns, values = self.cmd.take_action(parsed_args)
|
|
||||||
self.flavor_client.list.assert_called_once_with()
|
|
||||||
self.assertEqual(self.columns, columns)
|
|
||||||
self.assertEqual([self.values], values)
|
|
||||||
|
|
||||||
def test_flavor_list_with_optional_args(self):
|
|
||||||
args = ['--datastore-type', 'mysql',
|
|
||||||
'--datastore-version-id', '5.6']
|
|
||||||
parsed_args = self.check_parser(self.cmd, args, [])
|
|
||||||
list_flavor_dict = {'datastore': 'mysql',
|
|
||||||
'version_id': '5.6'}
|
|
||||||
columns, values = self.cmd.take_action(parsed_args)
|
|
||||||
self.flavor_client.list_datastore_version_associated_flavors. \
|
|
||||||
assert_called_once_with(**list_flavor_dict)
|
|
||||||
self.assertEqual(self.columns, columns)
|
|
||||||
self.assertEqual([self.values], values)
|
|
||||||
|
|
||||||
|
|
||||||
class TestFlavorShow(TestFlavors):
|
|
||||||
|
|
||||||
values = (1, 'm1.tiny', 512)
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestFlavorShow, self).setUp()
|
|
||||||
self.cmd = database_flavors.ShowDatabaseFlavor(self.app, None)
|
|
||||||
self.data = self.fake_flavors.get_flavors_1()
|
|
||||||
self.flavor_client.get.return_value = self.data
|
|
||||||
self.columns = (
|
|
||||||
'id',
|
|
||||||
'name',
|
|
||||||
'ram',
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_flavor_show_defaults(self):
|
|
||||||
args = ['m1.tiny']
|
|
||||||
parsed_args = self.check_parser(self.cmd, args, [])
|
|
||||||
columns, data = self.cmd.take_action(parsed_args)
|
|
||||||
self.assertEqual(self.columns, columns)
|
|
||||||
self.assertEqual(self.values, data)
|
|
@@ -197,7 +197,7 @@ class TestDatabaseInstanceCreate(TestInstances):
|
|||||||
|
|
||||||
@mock.patch.object(utils, 'find_resource')
|
@mock.patch.object(utils, 'find_resource')
|
||||||
def test_instance_create(self, mock_find):
|
def test_instance_create(self, mock_find):
|
||||||
mock_find.id.side_effect = ['103', 'test', 'mod_id']
|
mock_find.id.side_effect = ['test', 'mod_id']
|
||||||
args = ['test-name', '103',
|
args = ['test-name', '103',
|
||||||
'--size', '1',
|
'--size', '1',
|
||||||
'--databases', 'db1', 'db2',
|
'--databases', 'db1', 'db2',
|
||||||
|
@@ -165,38 +165,6 @@ class ManagementTest(testtools.TestCase):
|
|||||||
self.assertEqual({'reset-task-status': {}}, self.body_)
|
self.assertEqual({'reset-task-status': {}}, self.body_)
|
||||||
|
|
||||||
|
|
||||||
class MgmtFlavorsTest(testtools.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(MgmtFlavorsTest, self).setUp()
|
|
||||||
self.orig__init = management.MgmtFlavors.__init__
|
|
||||||
management.MgmtFlavors.__init__ = mock.Mock(return_value=None)
|
|
||||||
self.flavors = management.MgmtFlavors()
|
|
||||||
self.flavors.api = mock.Mock()
|
|
||||||
self.flavors.api.client = mock.Mock()
|
|
||||||
self.flavors.resource_class = mock.Mock(return_value="flavor-1")
|
|
||||||
self.orig_base_getid = base.getid
|
|
||||||
base.getid = mock.Mock(return_value="flavor1")
|
|
||||||
|
|
||||||
def tearDown(self):
|
|
||||||
super(MgmtFlavorsTest, self).tearDown()
|
|
||||||
management.MgmtFlavors.__init__ = self.orig__init
|
|
||||||
base.getid = self.orig_base_getid
|
|
||||||
|
|
||||||
def test_create(self):
|
|
||||||
def side_effect_func(path, body, inst):
|
|
||||||
return path, body, inst
|
|
||||||
|
|
||||||
self.flavors._create = mock.Mock(side_effect=side_effect_func)
|
|
||||||
p, b, i = self.flavors.create("test-name", 1024, 30, 2, 1)
|
|
||||||
self.assertEqual("/mgmt/flavors", p)
|
|
||||||
self.assertEqual("flavor", i)
|
|
||||||
self.assertEqual("test-name", b["flavor"]["name"])
|
|
||||||
self.assertEqual(1024, b["flavor"]["ram"])
|
|
||||||
self.assertEqual(2, b["flavor"]["vcpu"])
|
|
||||||
self.assertEqual(1, b["flavor"]["flavor_id"])
|
|
||||||
|
|
||||||
|
|
||||||
class MgmtDatastoreVersionsTest(testtools.TestCase):
|
class MgmtDatastoreVersionsTest(testtools.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@@ -209,41 +209,6 @@ class ShellTest(utils.TestCase):
|
|||||||
self.run_command('eject-replica-source 1234')
|
self.run_command('eject-replica-source 1234')
|
||||||
self.assert_called('POST', '/instances/1234/action')
|
self.assert_called('POST', '/instances/1234/action')
|
||||||
|
|
||||||
def test_flavor_list(self):
|
|
||||||
self.run_command('flavor-list')
|
|
||||||
self.assert_called('GET', '/flavors')
|
|
||||||
|
|
||||||
def test_flavor_list_with_datastore(self):
|
|
||||||
cmd = ('flavor-list --datastore_type mysql '
|
|
||||||
'--datastore_version_id some-version-id')
|
|
||||||
self.run_command(cmd)
|
|
||||||
self.assert_called(
|
|
||||||
'GET', '/datastores/mysql/versions/some-version-id/flavors')
|
|
||||||
|
|
||||||
def test_flavor_list_error(self):
|
|
||||||
cmd = 'flavor-list --datastore_type mysql'
|
|
||||||
exepcted_error_msg = (r'Missing argument\(s\): '
|
|
||||||
'datastore_type, datastore_version_id')
|
|
||||||
self.assertRaisesRegex(
|
|
||||||
exceptions.MissingArgs, exepcted_error_msg, self.run_command,
|
|
||||||
cmd)
|
|
||||||
|
|
||||||
def test_flavor_show(self):
|
|
||||||
self.run_command('flavor-show 1')
|
|
||||||
self.assert_called('GET', '/flavors/1')
|
|
||||||
|
|
||||||
def test_flavor_show_leading_zero(self):
|
|
||||||
self.run_command('flavor-show 02')
|
|
||||||
self.assert_called('GET', '/flavors/02')
|
|
||||||
|
|
||||||
def test_flavor_show_by_name(self):
|
|
||||||
self.run_command('flavor-show m1.tiny') # defined in fakes.py
|
|
||||||
self.assert_called('GET', '/flavors/m1.tiny')
|
|
||||||
|
|
||||||
def test_flavor_show_uuid(self):
|
|
||||||
self.run_command('flavor-show m1.uuid')
|
|
||||||
self.assert_called('GET', '/flavors/m1.uuid')
|
|
||||||
|
|
||||||
def test_volume_type_list(self):
|
def test_volume_type_list(self):
|
||||||
self.run_command('volume-type-list')
|
self.run_command('volume-type-list')
|
||||||
self.assert_called('GET', '/volume-types')
|
self.assert_called('GET', '/volume-types')
|
||||||
@@ -301,7 +266,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': 'lvm'},
|
'volume': {'size': 1, 'type': 'lvm'},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'test-member-1'
|
'name': 'test-member-1'
|
||||||
}})
|
}})
|
||||||
|
|
||||||
@@ -312,19 +277,19 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': 'lvm'},
|
'volume': {'size': 1, 'type': 'lvm'},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'test-member-1',
|
'name': 'test-member-1',
|
||||||
'modules': [{'id': '4321'}, {'id': '8765'}]
|
'modules': [{'id': '4321'}, {'id': '8765'}]
|
||||||
}})
|
}})
|
||||||
|
|
||||||
def test_boot_by_flavor_name(self):
|
def test_boot_by_flavor_name(self):
|
||||||
self.run_command(
|
self.run_command(
|
||||||
'create test-member-1 m1.tiny --size 1 --volume_type lvm')
|
'create test-member-1 1 --size 1 --volume_type lvm')
|
||||||
self.assert_called_anytime(
|
self.assert_called_anytime(
|
||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': 'lvm'},
|
'volume': {'size': 1, 'type': 'lvm'},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'test-member-1'
|
'name': 'test-member-1'
|
||||||
}})
|
}})
|
||||||
|
|
||||||
@@ -346,7 +311,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'repl-1',
|
'name': 'repl-1',
|
||||||
'replica_count': 4,
|
'replica_count': 4,
|
||||||
'locality': 'anti-affinity'
|
'locality': 'anti-affinity'
|
||||||
@@ -358,7 +323,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'slave-1',
|
'name': 'slave-1',
|
||||||
'replica_of': 'myid',
|
'replica_of': 'myid',
|
||||||
'replica_count': 1
|
'replica_count': 1
|
||||||
@@ -371,7 +336,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'slave-1',
|
'name': 'slave-1',
|
||||||
'replica_of': 'myid',
|
'replica_of': 'myid',
|
||||||
'replica_count': 3
|
'replica_count': 3
|
||||||
@@ -383,7 +348,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'master-1',
|
'name': 'master-1',
|
||||||
'locality': 'affinity'
|
'locality': 'affinity'
|
||||||
}})
|
}})
|
||||||
@@ -411,7 +376,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'test-restore-1',
|
'name': 'test-restore-1',
|
||||||
'restorePoint': {'backupRef': 'bk-1234'},
|
'restorePoint': {'backupRef': 'bk-1234'},
|
||||||
}})
|
}})
|
||||||
@@ -422,7 +387,7 @@ class ShellTest(utils.TestCase):
|
|||||||
'POST', '/instances',
|
'POST', '/instances',
|
||||||
{'instance': {
|
{'instance': {
|
||||||
'volume': {'size': 1, 'type': None},
|
'volume': {'size': 1, 'type': None},
|
||||||
'flavorRef': 1,
|
'flavorRef': '1',
|
||||||
'name': 'test-restore-1',
|
'name': 'test-restore-1',
|
||||||
'restorePoint': {'backupRef': 'bk-1234'},
|
'restorePoint': {'backupRef': 'bk-1234'},
|
||||||
}})
|
}})
|
||||||
@@ -454,8 +419,8 @@ class ShellTest(utils.TestCase):
|
|||||||
|
|
||||||
def test_cluster_create_by_flavor_name(self):
|
def test_cluster_create_by_flavor_name(self):
|
||||||
cmd = ('cluster-create test-clstr vertica 7.1 '
|
cmd = ('cluster-create test-clstr vertica 7.1 '
|
||||||
'--instance flavor=m1.small,volume=2 '
|
'--instance flavor=2,volume=2 '
|
||||||
'--instance flavor=m1.leading-zero,volume=1')
|
'--instance flavor=02,volume=1')
|
||||||
self.run_command(cmd)
|
self.run_command(cmd)
|
||||||
self.assert_called_anytime(
|
self.assert_called_anytime(
|
||||||
'POST', '/clusters',
|
'POST', '/clusters',
|
||||||
|
@@ -20,7 +20,6 @@ from troveclient.v1 import clusters
|
|||||||
from troveclient.v1 import configurations
|
from troveclient.v1 import configurations
|
||||||
from troveclient.v1 import databases
|
from troveclient.v1 import databases
|
||||||
from troveclient.v1 import datastores
|
from troveclient.v1 import datastores
|
||||||
from troveclient.v1 import flavors
|
|
||||||
from troveclient.v1 import instances
|
from troveclient.v1 import instances
|
||||||
from troveclient.v1 import limits
|
from troveclient.v1 import limits
|
||||||
from troveclient.v1 import management
|
from troveclient.v1 import management
|
||||||
@@ -64,7 +63,6 @@ class Client(object):
|
|||||||
# self.limits = limits.LimitsManager(self)
|
# self.limits = limits.LimitsManager(self)
|
||||||
|
|
||||||
# extensions
|
# extensions
|
||||||
self.flavors = flavors.Flavors(self)
|
|
||||||
self.volume_types = volume_types.VolumeTypes(self)
|
self.volume_types = volume_types.VolumeTypes(self)
|
||||||
self.users = users.Users(self)
|
self.users = users.Users(self)
|
||||||
self.databases = databases.Databases(self)
|
self.databases = databases.Databases(self)
|
||||||
|
@@ -1,58 +0,0 @@
|
|||||||
# Copyright 2011 OpenStack Foundation
|
|
||||||
# Copyright 2013 Rackspace Hosting
|
|
||||||
# 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 troveclient import base
|
|
||||||
|
|
||||||
|
|
||||||
class Flavor(base.Resource):
|
|
||||||
"""A Flavor is an Instance type, specifying other things, like RAM size."""
|
|
||||||
|
|
||||||
def __init__(self, manager, info, loaded=False):
|
|
||||||
super(Flavor, self).__init__(manager, info, loaded)
|
|
||||||
if self.id is None and self.str_id is not None:
|
|
||||||
self.id = self.str_id
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<Flavor: %s>" % self.name
|
|
||||||
|
|
||||||
|
|
||||||
class Flavors(base.ManagerWithFind):
|
|
||||||
"""Manage :class:`Flavor` resources."""
|
|
||||||
resource_class = Flavor
|
|
||||||
|
|
||||||
def list(self):
|
|
||||||
"""Get a list of all flavors.
|
|
||||||
:rtype: list of :class:`Flavor`.
|
|
||||||
"""
|
|
||||||
return self._list("/flavors", "flavors")
|
|
||||||
|
|
||||||
def list_datastore_version_associated_flavors(self, datastore,
|
|
||||||
version_id):
|
|
||||||
"""Get a list of all flavors for the specified datastore type
|
|
||||||
and datastore version .
|
|
||||||
:rtype: list of :class:`Flavor`.
|
|
||||||
"""
|
|
||||||
return self._list("/datastores/%s/versions/%s/flavors" %
|
|
||||||
(datastore, version_id),
|
|
||||||
"flavors")
|
|
||||||
|
|
||||||
def get(self, flavor):
|
|
||||||
"""Get a specific flavor.
|
|
||||||
|
|
||||||
:rtype: :class:`Flavor`
|
|
||||||
"""
|
|
||||||
return self._get("/flavors/%s" % base.getid(flavor),
|
|
||||||
"flavor")
|
|
@@ -21,7 +21,6 @@ from troveclient import common
|
|||||||
from troveclient.v1 import clusters
|
from troveclient.v1 import clusters
|
||||||
from troveclient.v1 import configurations
|
from troveclient.v1 import configurations
|
||||||
from troveclient.v1 import datastores
|
from troveclient.v1 import datastores
|
||||||
from troveclient.v1 import flavors
|
|
||||||
from troveclient.v1 import instances
|
from troveclient.v1 import instances
|
||||||
|
|
||||||
|
|
||||||
@@ -145,44 +144,6 @@ class MgmtClusters(base.ManagerWithFind):
|
|||||||
self._action(cluster_id, body)
|
self._action(cluster_id, body)
|
||||||
|
|
||||||
|
|
||||||
class MgmtFlavors(base.ManagerWithFind):
|
|
||||||
"""Manage :class:`Flavor` resources."""
|
|
||||||
resource_class = flavors.Flavor
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return "<Flavors Manager at %s>" % id(self)
|
|
||||||
|
|
||||||
# Appease the abc gods
|
|
||||||
def list(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def create(self, name, ram, disk, vcpus,
|
|
||||||
flavorid="auto", ephemeral=None, swap=None, rxtx_factor=None,
|
|
||||||
service_type=None):
|
|
||||||
"""Create a new flavor."""
|
|
||||||
body = {"flavor": {
|
|
||||||
"flavor_id": flavorid,
|
|
||||||
"name": name,
|
|
||||||
"ram": ram,
|
|
||||||
"disk": disk,
|
|
||||||
"vcpu": vcpus,
|
|
||||||
"ephemeral": 0,
|
|
||||||
"swap": 0,
|
|
||||||
"rxtx_factor": "1.0",
|
|
||||||
"is_public": "True"
|
|
||||||
}}
|
|
||||||
if ephemeral:
|
|
||||||
body["flavor"]["ephemeral"] = ephemeral
|
|
||||||
if swap:
|
|
||||||
body["flavor"]["swap"] = swap
|
|
||||||
if rxtx_factor:
|
|
||||||
body["flavor"]["rxtx_factor"] = rxtx_factor
|
|
||||||
if service_type:
|
|
||||||
body["flavor"]["service_type"] = service_type
|
|
||||||
|
|
||||||
return self._create("/mgmt/flavors", body, "flavor")
|
|
||||||
|
|
||||||
|
|
||||||
class MgmtConfigurationParameters(configurations.ConfigurationParameters):
|
class MgmtConfigurationParameters(configurations.ConfigurationParameters):
|
||||||
def create(self, version, name, restart_required, data_type,
|
def create(self, version, name, restart_required, data_type,
|
||||||
max_size=None, min_size=None):
|
max_size=None, min_size=None):
|
||||||
|
@@ -189,11 +189,6 @@ def _find_cluster(cs, cluster):
|
|||||||
return utils.find_resource(cs.clusters, cluster)
|
return utils.find_resource(cs.clusters, cluster)
|
||||||
|
|
||||||
|
|
||||||
def _find_flavor(cs, flavor):
|
|
||||||
"""Get a flavor by ID."""
|
|
||||||
return utils.find_resource(cs.flavors, flavor)
|
|
||||||
|
|
||||||
|
|
||||||
def _find_volume_type(cs, volume_type):
|
def _find_volume_type(cs, volume_type):
|
||||||
"""Get a volume type by ID."""
|
"""Get a volume type by ID."""
|
||||||
return utils.find_resource(cs.volume_types, volume_type)
|
return utils.find_resource(cs.volume_types, volume_type)
|
||||||
@@ -224,46 +219,6 @@ def _find_configuration(cs, configuration):
|
|||||||
return utils.find_resource(cs.configurations, configuration)
|
return utils.find_resource(cs.configurations, configuration)
|
||||||
|
|
||||||
|
|
||||||
# Flavor related calls
|
|
||||||
@utils.arg('--datastore_type', metavar='<datastore_type>',
|
|
||||||
default=None,
|
|
||||||
help=_('Type of the datastore. For eg: mysql.'))
|
|
||||||
@utils.arg("--datastore_version_id", metavar="<datastore_version_id>",
|
|
||||||
default=None, help=_("ID of the datastore version."))
|
|
||||||
@utils.service_type('database')
|
|
||||||
def do_flavor_list(cs, args):
|
|
||||||
"""Lists available flavors."""
|
|
||||||
if args.datastore_type and args.datastore_version_id:
|
|
||||||
flavors = cs.flavors.list_datastore_version_associated_flavors(
|
|
||||||
args.datastore_type, args.datastore_version_id)
|
|
||||||
elif not args.datastore_type and not args.datastore_version_id:
|
|
||||||
flavors = cs.flavors.list()
|
|
||||||
else:
|
|
||||||
raise exceptions.MissingArgs(['datastore_type',
|
|
||||||
'datastore_version_id'])
|
|
||||||
|
|
||||||
# Fallback to str_id where necessary.
|
|
||||||
_flavors = []
|
|
||||||
for f in flavors:
|
|
||||||
if not f.id and hasattr(f, 'str_id'):
|
|
||||||
f.id = f.str_id
|
|
||||||
_flavors.append(f)
|
|
||||||
|
|
||||||
utils.print_list(_flavors, ['id', 'name', 'ram', 'vcpus', 'disk',
|
|
||||||
'ephemeral'],
|
|
||||||
labels={'ram': 'RAM', 'vcpus': 'vCPUs', 'disk': 'Disk'},
|
|
||||||
order_by='ram')
|
|
||||||
|
|
||||||
|
|
||||||
@utils.arg('flavor', metavar='<flavor>', type=str,
|
|
||||||
help=_('ID or name of the flavor.'))
|
|
||||||
@utils.service_type('database')
|
|
||||||
def do_flavor_show(cs, args):
|
|
||||||
"""Shows details of a flavor."""
|
|
||||||
flavor = _find_flavor(cs, args.flavor)
|
|
||||||
_print_object(flavor)
|
|
||||||
|
|
||||||
|
|
||||||
# Volume type related calls
|
# Volume type related calls
|
||||||
@utils.arg('--datastore_type', metavar='<datastore_type>',
|
@utils.arg('--datastore_type', metavar='<datastore_type>',
|
||||||
default=None,
|
default=None,
|
||||||
@@ -555,7 +510,7 @@ def do_update(cs, args):
|
|||||||
@utils.arg('flavor',
|
@utils.arg('flavor',
|
||||||
metavar='<flavor>',
|
metavar='<flavor>',
|
||||||
type=str,
|
type=str,
|
||||||
help=_('A flavor name or ID.'))
|
help=_('A flavor ID.'))
|
||||||
@utils.arg('--databases', metavar='<database>',
|
@utils.arg('--databases', metavar='<database>',
|
||||||
help=_('Optional list of databases.'),
|
help=_('Optional list of databases.'),
|
||||||
nargs="+", default=[])
|
nargs="+", default=[])
|
||||||
@@ -623,7 +578,7 @@ def do_update(cs, args):
|
|||||||
@utils.service_type('database')
|
@utils.service_type('database')
|
||||||
def do_create(cs, args):
|
def do_create(cs, args):
|
||||||
"""Creates a new instance."""
|
"""Creates a new instance."""
|
||||||
flavor_id = _find_flavor(cs, args.flavor).id
|
flavor_id = args.flavor
|
||||||
volume = None
|
volume = None
|
||||||
if args.size is not None and args.size <= 0:
|
if args.size is not None and args.size <= 0:
|
||||||
raise exceptions.ValidationError(
|
raise exceptions.ValidationError(
|
||||||
@@ -686,8 +641,7 @@ def _validate_nic_info(nic_info, nic_str):
|
|||||||
|
|
||||||
|
|
||||||
def _get_flavor(cs, opts_str):
|
def _get_flavor(cs, opts_str):
|
||||||
flavor_name, opts_str = _strip_option(opts_str, 'flavor', True)
|
flavor_id, opts_str = _strip_option(opts_str, 'flavor', True)
|
||||||
flavor_id = _find_flavor(cs, flavor_name).id
|
|
||||||
return str(flavor_id), opts_str
|
return str(flavor_id), opts_str
|
||||||
|
|
||||||
|
|
||||||
@@ -929,12 +883,12 @@ def do_cluster_create(cs, args):
|
|||||||
@utils.arg('flavor',
|
@utils.arg('flavor',
|
||||||
metavar='<flavor>',
|
metavar='<flavor>',
|
||||||
type=str,
|
type=str,
|
||||||
help=_('New flavor of the instance.'))
|
help=_('New flavor ID for the instance.'))
|
||||||
@utils.service_type('database')
|
@utils.service_type('database')
|
||||||
def do_resize_instance(cs, args):
|
def do_resize_instance(cs, args):
|
||||||
"""Resizes an instance with a new flavor."""
|
"""Resizes an instance with a new flavor."""
|
||||||
instance = _find_instance(cs, args.instance)
|
instance = _find_instance(cs, args.instance)
|
||||||
flavor_id = _find_flavor(cs, args.flavor).id
|
flavor_id = args.flavor
|
||||||
cs.instances.resize_instance(instance, flavor_id)
|
cs.instances.resize_instance(instance, flavor_id)
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user