Locality support for clusters
In order to allow clusters to be all on the same hypervisor (affinity) or all on different hypervisors (anti-affinity) a new argument (locality) needed to be added to the Trove cluster-create API. This changeset addresses the Trove client part of this feature. A --locality flag is now available on the 'cluster-create' command and is passed to the server for processing. Partially implements: blueprint replication-cluster-locality Change-Id: Ie46cfa69ffe6a64760aca38c495563f5724bd0d0
This commit is contained in:
parent
358dbf3c80
commit
db85939433
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- A --locality flag was added to the trove cluster-create
|
||||||
|
command to allow a user to specify whether instances in
|
||||||
|
a cluster should be on the same hypervisor (affinity)
|
||||||
|
or on different hypervisors (anti-affinity).
|
@ -70,17 +70,19 @@ class ClustersTest(testtools.TestCase):
|
|||||||
|
|
||||||
clusters_test = self.get_clusters()
|
clusters_test = self.get_clusters()
|
||||||
clusters_test._create = mock.Mock(side_effect=side_effect_func)
|
clusters_test._create = mock.Mock(side_effect=side_effect_func)
|
||||||
instance = [{'flavor-id': 11, 'volume': 2}]
|
instances = [{'flavor-id': 11, 'volume': 2}]
|
||||||
|
locality = 'affinity'
|
||||||
path, body, resp_key = clusters_test.create("test-name", "datastore",
|
path, body, resp_key = clusters_test.create("test-name", "datastore",
|
||||||
"datastore-version",
|
"datastore-version",
|
||||||
instance)
|
instances, locality)
|
||||||
self.assertEqual("/clusters", path)
|
self.assertEqual("/clusters", path)
|
||||||
self.assertEqual("cluster", resp_key)
|
self.assertEqual("cluster", resp_key)
|
||||||
self.assertEqual("test-name", body["cluster"]["name"])
|
self.assertEqual("test-name", body["cluster"]["name"])
|
||||||
self.assertEqual("datastore", body["cluster"]["datastore"]["type"])
|
self.assertEqual("datastore", body["cluster"]["datastore"]["type"])
|
||||||
self.assertEqual("datastore-version",
|
self.assertEqual("datastore-version",
|
||||||
body["cluster"]["datastore"]["version"])
|
body["cluster"]["datastore"]["version"])
|
||||||
self.assertEqual(instance, body["cluster"]["instances"])
|
self.assertEqual(instances, body["cluster"]["instances"])
|
||||||
|
self.assertEqual(locality, body["cluster"]["locality"])
|
||||||
|
|
||||||
def test_list(self):
|
def test_list(self):
|
||||||
page_mock = mock.Mock()
|
page_mock = mock.Mock()
|
||||||
|
@ -439,6 +439,27 @@ class ShellTest(utils.TestCase):
|
|||||||
self.run_command(cmd)
|
self.run_command(cmd)
|
||||||
self.assert_called('POST', '/clusters/cls-1234')
|
self.assert_called('POST', '/clusters/cls-1234')
|
||||||
|
|
||||||
|
def test_cluster_create_with_locality(self):
|
||||||
|
cmd = ('cluster-create test-clstr2 redis 3.0 --locality=affinity '
|
||||||
|
'--instance flavor=2,volume=1 '
|
||||||
|
'--instance flavor=2,volume=1 '
|
||||||
|
'--instance flavor=2,volume=1 ')
|
||||||
|
self.run_command(cmd)
|
||||||
|
self.assert_called_anytime(
|
||||||
|
'POST', '/clusters',
|
||||||
|
{'cluster': {
|
||||||
|
'instances': [
|
||||||
|
{'flavorRef': '2',
|
||||||
|
'volume': {'size': '1'}},
|
||||||
|
{'flavorRef': '2',
|
||||||
|
'volume': {'size': '1'}},
|
||||||
|
{'flavorRef': '2',
|
||||||
|
'volume': {'size': '1'}},
|
||||||
|
],
|
||||||
|
'datastore': {'version': '3.0', 'type': 'redis'},
|
||||||
|
'name': 'test-clstr2',
|
||||||
|
'locality': 'affinity'}})
|
||||||
|
|
||||||
def test_cluster_create_with_nic_az(self):
|
def test_cluster_create_with_nic_az(self):
|
||||||
cmd = ('cluster-create test-clstr1 vertica 7.1 '
|
cmd = ('cluster-create test-clstr1 vertica 7.1 '
|
||||||
'--instance flavor=2,volume=2,nic=\'net-id=some-id\','
|
'--instance flavor=2,volume=2,nic=\'net-id=some-id\','
|
||||||
|
@ -31,7 +31,8 @@ class Clusters(base.ManagerWithFind):
|
|||||||
"""Manage :class:`Cluster` resources."""
|
"""Manage :class:`Cluster` resources."""
|
||||||
resource_class = Cluster
|
resource_class = Cluster
|
||||||
|
|
||||||
def create(self, name, datastore, datastore_version, instances=None):
|
def create(self, name, datastore, datastore_version, instances=None,
|
||||||
|
locality=None):
|
||||||
"""Create (boot) a new cluster."""
|
"""Create (boot) a new cluster."""
|
||||||
body = {"cluster": {
|
body = {"cluster": {
|
||||||
"name": name
|
"name": name
|
||||||
@ -43,6 +44,8 @@ class Clusters(base.ManagerWithFind):
|
|||||||
body["cluster"]["datastore"] = datastore_obj
|
body["cluster"]["datastore"] = datastore_obj
|
||||||
if instances:
|
if instances:
|
||||||
body["cluster"]["instances"] = instances
|
body["cluster"]["instances"] = instances
|
||||||
|
if locality:
|
||||||
|
body["cluster"]["locality"] = locality
|
||||||
|
|
||||||
return self._create("/clusters", body, "cluster")
|
return self._create("/clusters", body, "cluster")
|
||||||
|
|
||||||
|
@ -688,6 +688,12 @@ def _strip_option(opts_str, opt_name, is_required=True,
|
|||||||
"(where net-id=network_id, v4-fixed-ip=IPv4r_fixed_address, "
|
"(where net-id=network_id, v4-fixed-ip=IPv4r_fixed_address, "
|
||||||
"port-id=port_id), availability_zone=<AZ_hint_for_Nova>, "
|
"port-id=port_id), availability_zone=<AZ_hint_for_Nova>, "
|
||||||
"module=<module_name_or_id>.")
|
"module=<module_name_or_id>.")
|
||||||
|
@utils.arg('--locality',
|
||||||
|
metavar='<policy>',
|
||||||
|
default=None,
|
||||||
|
choices=LOCALITY_DOMAIN,
|
||||||
|
help='Locality policy to use when creating cluster. Choose '
|
||||||
|
'one of %(choices)s.')
|
||||||
@utils.service_type('database')
|
@utils.service_type('database')
|
||||||
def do_cluster_create(cs, args):
|
def do_cluster_create(cs, args):
|
||||||
"""Creates a new cluster."""
|
"""Creates a new cluster."""
|
||||||
@ -726,7 +732,8 @@ def do_cluster_create(cs, args):
|
|||||||
cluster = cs.clusters.create(args.name,
|
cluster = cs.clusters.create(args.name,
|
||||||
args.datastore,
|
args.datastore,
|
||||||
args.datastore_version,
|
args.datastore_version,
|
||||||
instances=instances)
|
instances=instances,
|
||||||
|
locality=args.locality)
|
||||||
_print_cluster(cluster)
|
_print_cluster(cluster)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user