Rewrites the ClusterView.build_instances

There is a lot of similar code in build_instances versions of
normal and mgmt views for mongodb & vertica cluster strategies.

Rewrote the entire code to create a method ClusterView._build_instances
which could be used by both versions views(normal & mgmt)
and by both datastores viz. mongodb & vertica.

Change-Id: I8a63399af3d443de3e77af1202f227f71070635d
This commit is contained in:
Sushil Kumar 2015-03-27 18:52:08 +00:00
parent 7c300679d5
commit 50ffa17837
4 changed files with 77 additions and 113 deletions

View File

@ -13,12 +13,14 @@
# License for the specific language governing permissions and limitations
# under the License.
from trove.common import cfg
from trove.common.strategies.cluster import strategy
from trove.common.views import create_links
from trove.instance.views import InstanceDetailView
from trove.openstack.common import log as logging
LOG = logging.getLogger(__name__)
CONF = cfg.CONF
class ClusterView(object):
@ -51,6 +53,39 @@ class ClusterView(object):
def _build_links(self):
return create_links("clusters", self.req, self.cluster.id)
def _build_instances(self, ip_to_be_published_for=[],
instance_dict_to_be_published_for=[]):
instances = []
ip_list = []
if self.load_servers:
cluster_instances = self.cluster.instances
else:
cluster_instances = self.cluster.instances_without_server
for instance in cluster_instances:
instance_dict = {
"id": instance.id,
"name": instance.name,
"type": instance.type,
"links": create_links("instances", self.req, instance.id)
}
if instance.shard_id:
instance_dict["shard_id"] = instance.shard_id
if self.load_servers:
instance_dict["status"] = instance.status
if CONF.get(instance.datastore_version.manager).volume_support:
instance_dict["volume"] = {"size": instance.volume_size}
instance_dict["flavor"] = self._build_flavor_info(
instance.flavor_id)
instance_ips = instance.get_visible_ip_addresses()
if self.load_servers and instance_ips:
instance_dict["ip"] = instance_ips
if instance.type in ip_to_be_published_for:
ip_list.append(instance_ips[0])
if instance.type in instance_dict_to_be_published_for:
instances.append(instance_dict)
ip_list.sort()
return instances, ip_list
def build_instances(self):
raise NotImplementedError()

View File

@ -23,7 +23,6 @@ from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster import base
from trove.common import utils
from trove.common.views import create_links
from trove.common import wsgi
from trove.datastore import models as datastore_models
from trove.extensions.mgmt.clusters.views import MgmtClusterView
@ -226,66 +225,13 @@ class MongoDbCluster(models.Cluster):
class MongoDbClusterView(ClusterView):
def build_instances(self):
instances = []
ip_list = []
if self.load_servers:
cluster_instances = self.cluster.instances
else:
cluster_instances = self.cluster.instances_without_server
for instance in cluster_instances:
if self.load_servers and instance.type == 'query_router':
ip = instance.get_visible_ip_addresses()
if ip:
ip_list.append(ip[0])
if instance.type != 'member':
continue
instance_dict = {
"id": instance.id,
"name": instance.name,
"links": create_links("instances", self.req, instance.id)
}
if instance.shard_id:
instance_dict["shard_id"] = instance.shard_id
if self.load_servers:
instance_dict["status"] = instance.status
if CONF.get(instance.datastore_version.manager).volume_support:
instance_dict["volume"] = {"size": instance.volume_size}
instance_dict["flavor"] = self._build_flavor_info(
instance.flavor_id)
instances.append(instance_dict)
ip_list.sort()
return instances, ip_list
return self._build_instances(['query_router'], ['member'])
class MongoDbMgmtClusterView(MgmtClusterView):
def build_instances(self):
instances = []
ip_list = []
if self.load_servers:
cluster_instances = self.cluster.instances
else:
cluster_instances = self.cluster.instances_without_server
for instance in cluster_instances:
instance_dict = {
"id": instance.id,
"name": instance.name,
"type": instance.type,
"links": create_links("instances", self.req, instance.id)
}
instance_ips = instance.get_visible_ip_addresses()
if self.load_servers and instance_ips:
instance_dict["ip"] = instance_ips
if instance.type == 'query_router':
ip_list.append(instance_ips[0])
if instance.shard_id:
instance_dict["shard_id"] = instance.shard_id
if self.load_servers:
instance_dict["status"] = instance.status
if CONF.get(instance.datastore_version.manager).volume_support:
instance_dict["volume"] = {"size": instance.volume_size}
instance_dict["flavor"] = self._build_flavor_info(
instance.flavor_id)
instances.append(instance_dict)
ip_list.sort()
return instances, ip_list
return self._build_instances(['query_router'],
['config_server',
'member',
'query_router'])

View File

@ -20,7 +20,6 @@ from trove.common import cfg
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster import base
from trove.common.views import create_links
from trove.extensions.mgmt.clusters.views import MgmtClusterView
from trove.instance import models as inst_models
from trove.openstack.common import log as logging
@ -130,60 +129,10 @@ class VerticaCluster(models.Cluster):
class VerticaClusterView(ClusterView):
def build_instances(self):
instances = []
ip_list = []
if self.load_servers:
cluster_instances = self.cluster.instances
else:
cluster_instances = self.cluster.instances_without_server
for instance in cluster_instances:
if instance.type != 'member':
continue
instance_dict = {
"id": instance.id,
"name": instance.name,
"links": create_links("instances", self.req, instance.id)
}
if self.load_servers:
instance_dict["status"] = instance.status
if CONF.get(instance.datastore_version.manager).volume_support:
instance_dict["volume"] = {"size": instance.volume_size}
instance_dict["flavor"] = self._build_flavor_info(
instance.flavor_id)
instance_ips = instance.get_visible_ip_addresses()
if instance_ips:
instance_dict["ip"] = instance_ips
ip_list.append(instance_ips[0])
instances.append(instance_dict)
ip_list.sort()
return instances, ip_list
return self._build_instances(['member'], ['member'])
class VerticaMgmtClusterView(MgmtClusterView):
def build_instances(self):
instances = []
ip_list = []
if self.load_servers:
cluster_instances = self.cluster.instances
else:
cluster_instances = self.cluster.instances_without_server
for instance in cluster_instances:
instance_dict = {
"id": instance.id,
"name": instance.name,
"type": instance.type,
"links": create_links("instances", self.req, instance.id)
}
instance_ips = instance.get_visible_ip_addresses()
if self.load_servers and instance_ips:
instance_dict["ip"] = instance_ips
if self.load_servers:
instance_dict["status"] = instance.status
if CONF.get(instance.datastore_version.manager).volume_support:
instance_dict["volume"] = {"size": instance.volume_size}
instance_dict["flavor"] = self._build_flavor_info(
instance.flavor_id)
instances.append(instance_dict)
ip_list.sort()
return instances, ip_list
return self._build_instances(['member'], ['member'])

View File

@ -15,6 +15,7 @@
#
from mock import Mock
from mock import MagicMock
from mock import patch
from testtools import TestCase
from trove.cluster.views import ClusterInstanceDetailView
@ -23,7 +24,6 @@ from trove.cluster.views import load_view
from trove.common import cfg
from trove.common.strategies.cluster.experimental.mongodb.api import (
MongoDbClusterView)
CONF = cfg.CONF
@ -73,6 +73,40 @@ class ClusterViewTest(TestCase):
view = load_view(cluster, Mock())
self.assertTrue(isinstance(view, MongoDbClusterView))
def test__build_instances(self, *args):
cluster = Mock()
cluster.instances = []
cluster.instances.append(Mock())
cluster.instances.append(Mock())
cluster.instances.append(Mock())
cluster.instances[0].type = 'configsvr'
cluster.instances[0].get_visible_ip_addresses = lambda: ['1.2.3.4']
cluster.instances[0].datastore_version.manager = 'mongodb'
cluster.instances[1].type = 'query_router'
cluster.instances[1].get_visible_ip_addresses = lambda: ['1.2.3.4']
cluster.instances[1].datastore_version.manager = 'mongodb'
cluster.instances[2].type = 'member'
cluster.instances[2].get_visible_ip_addresses = lambda: ['1.2.3.4']
cluster.instances[2].datastore_version.manager = 'mongodb'
def test_case(ip_to_be_published_for,
instance_dict_to_be_published_for,
number_of_ip_published,
number_of_instance_dict_published):
view = ClusterView(cluster, MagicMock())
instances, ip_list = view._build_instances(
ip_to_be_published_for, instance_dict_to_be_published_for)
self.assertEqual(len(ip_list), number_of_ip_published)
self.assertEqual(len(instances), number_of_instance_dict_published)
test_case([], [], 0, 0)
test_case(['abc'], ['def'], 0, 0)
test_case(['query_router'], ['member'], 1, 1)
test_case(['query_router'], ['query_router', 'configsvr', 'member'],
1, 3)
test_case(['query_router', 'member'], ['member'], 2, 1)
class ClusterInstanceDetailViewTest(TestCase):