Datastores improvements

Improvements for client:
- added datastore field in instances list
- fixed datastore and version fields in instance show output
- fixed mistakes in help texts
- add possibility to retrieve version by uuid (without specified datastore)

Implements: blueprint datastore-type-version-followon

Change-Id: Id41da29ce9732823bc4696301953e9cf8cdc82f5
This commit is contained in:
Andrey Shestakov 2013-12-06 21:14:10 +02:00
parent 36a84d3013
commit c6a54f7e1c
4 changed files with 59 additions and 7 deletions

View File

@ -127,3 +127,13 @@ class DatastoreVersionsTest(testtools.TestCase):
'version'),
self.datastore_versions.get("datastore1",
"datastore_version1"))
def test_get_by_uuid(self):
def side_effect_func(path, inst):
return path, inst
self.datastore_versions._get = mock.Mock(side_effect=side_effect_func)
self.assertEqual(('/datastores/versions/datastore_version1',
'version'),
(self.datastore_versions.
get_by_uuid("datastore_version1")))

View File

@ -259,3 +259,16 @@ def slugify(value):
Make use strutils.to_slug from openstack common
"""
return strutils.to_slug(value, incoming=None, errors="strict")
def is_uuid_like(val):
"""Returns validation of a value as a UUID.
For our purposes, a UUID is a canonical form string:
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
"""
try:
return str(uuid.UUID(val)) == val
except (TypeError, ValueError, AttributeError):
return False

View File

@ -85,3 +85,12 @@ class DatastoreVersions(base.ManagerWithFind):
return self._get("/datastores/%s/versions/%s" %
(datastore, base.getid(datastore_version)),
"version")
def get_by_uuid(self, datastore_version):
"""
Get a specific datastore version.
:rtype: :class:`DatastoreVersion`
"""
return self._get("/datastores/versions/%s" %
base.getid(datastore_version),
"version")

View File

@ -21,6 +21,7 @@ from __future__ import print_function
import sys
import time
from troveclient import exceptions
from troveclient import utils
@ -106,7 +107,10 @@ def do_list(cs, args):
setattr(instance, 'flavor_id', instance.flavor['id'])
if hasattr(instance, 'volume'):
setattr(instance, 'size', instance.volume['size'])
utils.print_list(instances, ['id', 'name', 'status', 'flavor_id', 'size'])
if hasattr(instance, 'datastore'):
setattr(instance, 'datastore', instance.datastore['type'])
utils.print_list(instances, ['id', 'name', 'datastore', 'status',
'flavor_id', 'size'])
@utils.arg('instance', metavar='<instance>', help='ID of the instance.')
@ -190,6 +194,9 @@ def do_create(cs, args):
instance._info['flavor'] = instance.flavor['id']
if hasattr(instance, 'volume'):
instance._info['volume'] = instance.volume['size']
if hasattr(instance, 'datastore'):
instance._info['datastore'] = instance.datastore['type']
instance._info['datastore_version'] = instance.datastore['version']
del(instance._info['links'])
_print_instance(instance)
@ -542,7 +549,7 @@ def do_secgroup_delete_rule(cs, args):
@utils.service_type('database')
def do_datastore_list(cs, args):
"""List all the datastores."""
"""List available datastores."""
datastores = cs.datastores.list()
utils.print_list(datastores, ['id', 'name'])
@ -553,6 +560,9 @@ def do_datastore_list(cs, args):
def do_datastore_show(cs, args):
"""Show details of a datastore."""
datastore = cs.datastores.get(args.datastore)
if hasattr(datastore, 'default_version'):
datastore._info['default_version'] = getattr(datastore,
'default_version')
_print_instance(datastore)
@ -560,18 +570,28 @@ def do_datastore_show(cs, args):
help='ID of the datastore.')
@utils.service_type('database')
def do_datastore_version_list(cs, args):
"""List all the datastore versions."""
"""List available versions for a datastore."""
datastore_versions = cs.datastore_versions.list(args.datastore)
utils.print_list(datastore_versions, ['id', 'name'])
@utils.arg('datastore', metavar='<datastore>',
help='ID of the datastore.')
@utils.arg('--datastore', metavar='<datastore>',
default=None,
help='ID or name of the datastore. Optional if UUID of the'
' datastore_version is provided.')
@utils.arg('datastore_version', metavar='<datastore_version>',
help='ID of the datastore version.')
@utils.service_type('database')
def do_datastore_version_show(cs, args):
"""Show details of a datastore version."""
datastore_version = cs.datastore_versions.get(args.datastore,
args.datastore_version)
if args.datastore:
datastore_version = cs.datastore_versions.get(args.datastore,
args.datastore_version)
elif utils.is_uuid_like(args.datastore_version):
datastore_version = cs.datastore_versions.get_by_uuid(
args.datastore_version)
else:
raise exceptions.NoUniqueMatch('The datastore name or id is required'
' to retrieve a datastore version'
' by name.')
_print_instance(datastore_version)