From d53d2efbc638586c5db8d8d6de269d6d4c266898 Mon Sep 17 00:00:00 2001 From: Ali Adil Date: Tue, 16 Aug 2016 16:35:25 -0400 Subject: [PATCH] Add nic to cluster grow Added nic field to grow add instance form, the summary added instance table, cached object and the api. Change-Id: I927b3a233f9e6a97535dd9882d23393e8197b75a Closes-bug: #1613449 --- trove_dashboard/api/trove.py | 2 ++ .../database_clusters/cluster_manager.py | 8 +++-- .../content/database_clusters/forms.py | 29 ++++++++++++++++++- .../content/database_clusters/tables.py | 6 ++-- .../content/database_clusters/tests.py | 16 ++++++---- 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/trove_dashboard/api/trove.py b/trove_dashboard/api/trove.py index 5ee69b8..acacff6 100644 --- a/trove_dashboard/api/trove.py +++ b/trove_dashboard/api/trove.py @@ -89,6 +89,8 @@ def cluster_grow(request, cluster_id, new_instances): instance["type"] = new_instance.type if new_instance.related_to: instance["related_to"] = new_instance.related_to + if new_instance.nics: + instance["nics"] = [{'net-id': new_instance.nics}] instances.append(instance) return troveclient(request).clusters.grow(cluster_id, instances) diff --git a/trove_dashboard/content/database_clusters/cluster_manager.py b/trove_dashboard/content/database_clusters/cluster_manager.py index e4f039e..50f60d9 100644 --- a/trove_dashboard/content/database_clusters/cluster_manager.py +++ b/trove_dashboard/content/database_clusters/cluster_manager.py @@ -58,9 +58,9 @@ class ClusterInstanceManager(object): return None def add_instance(self, id, name, flavor_id, - flavor, volume, type, related_to): + flavor, volume, type, related_to, nics): instance = ClusterInstance(id, name, flavor_id, flavor, - volume, type, related_to) + volume, type, related_to, nics) self.instances.append(instance) update(self.cluster_id, self) return self.instances @@ -76,7 +76,8 @@ class ClusterInstanceManager(object): class ClusterInstance(object): - def __init__(self, id, name, flavor_id, flavor, volume, type, related_to): + def __init__(self, id, name, flavor_id, flavor, volume, type, + related_to, nics): self.id = id self.name = name self.flavor_id = flavor_id @@ -84,3 +85,4 @@ class ClusterInstance(object): self.volume = volume self.type = type self.related_to = related_to + self.nics = nics diff --git a/trove_dashboard/content/database_clusters/forms.py b/trove_dashboard/content/database_clusters/forms.py index 18960f3..baed072 100644 --- a/trove_dashboard/content/database_clusters/forms.py +++ b/trove_dashboard/content/database_clusters/forms.py @@ -343,11 +343,17 @@ class ClusterAddInstanceForm(forms.SelfHandlingForm): help_text=_("Optional datastore specific value that defines the " "relationship from one instance in the cluster to " "another.")) + network = forms.ChoiceField( + label=_("Network"), + help_text=_("Network attached to instance."), + required=False) def __init__(self, request, *args, **kwargs): super(ClusterAddInstanceForm, self).__init__(request, *args, **kwargs) self.fields['flavor'].choices = self.populate_flavor_choices(request) + self.fields['network'].choices = self.populate_network_choices( + request) @memoized.memoized_method def flavors(self, request): @@ -374,6 +380,26 @@ class ClusterAddInstanceForm(forms.SelfHandlingForm): flavor_list = [(f.id, "%s" % f.name) for f in self.flavors(request)] return sorted(flavor_list) + @memoized.memoized_method + def populate_network_choices(self, request): + network_list = [] + try: + if api.base.is_service_enabled(request, 'network'): + tenant_id = self.request.user.tenant_id + networks = api.neutron.network_list_for_tenant(request, + tenant_id) + network_list = [(network.id, network.name_or_id) + for network in networks] + else: + self.fields['network'].widget = forms.HiddenInput() + except exceptions.ServiceCatalogException: + network_list = [] + redirect = reverse('horizon:project:database_clusters:index') + exceptions.handle(request, + _('Unable to retrieve networks.'), + redirect=redirect) + return network_list + def handle(self, request, data): try: flavor = trove_api.trove.flavor_get(request, data['flavor']) @@ -384,7 +410,8 @@ class ClusterAddInstanceForm(forms.SelfHandlingForm): flavor.name, data['volume'], data.get('type', None), - data.get('related_to', None)) + data.get('related_to', None), + data.get('network', None)) except Exception as e: redirect = reverse("horizon:project:database_clusters:index") exceptions.handle(request, diff --git a/trove_dashboard/content/database_clusters/tables.py b/trove_dashboard/content/database_clusters/tables.py index d2be2bd..d80c134 100644 --- a/trove_dashboard/content/database_clusters/tables.py +++ b/trove_dashboard/content/database_clusters/tables.py @@ -389,10 +389,11 @@ class ClusterGrowAction(tables.Action): datum_display_objs = [] for instance in table.data: msg = _("[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, " - "type=%(type)s, related_to=%(related_to)s]") + "type=%(type)s, related_to=%(related_to)s, " + "nics=%(nics)s]") params = {"flavor": instance.flavor_id, "volume": instance.volume, "name": instance.name, "type": instance.type, - "related_to": instance.related_to} + "related_to": instance.related_to, "nics": instance.nics} datum_display_objs.append(msg % params) display_str = functions.lazy_join(", ", datum_display_objs) @@ -423,6 +424,7 @@ class ClusterGrowInstancesTable(tables.DataTable): volume = tables.Column("volume", verbose_name=_("Volume")) type = tables.Column("type", verbose_name=_("Instance Type")) related_to = tables.Column("related_to", verbose_name=_("Related To")) + nics = tables.Column("nics", verbose_name=_("Network")) class Meta(object): name = "cluster_grow_instances_table" diff --git a/trove_dashboard/content/database_clusters/tests.py b/trove_dashboard/content/database_clusters/tests.py index 9fbb301..0efc715 100644 --- a/trove_dashboard/content/database_clusters/tests.py +++ b/trove_dashboard/content/database_clusters/tests.py @@ -395,13 +395,15 @@ class ClustersTests(test.TestCase): instances = [ cluster_manager.ClusterInstance("id1", "name1", cluster_flavor, cluster_flavor_name, - cluster_volume, "master", None), + cluster_volume, "master", None, + None), cluster_manager.ClusterInstance("id2", "name2", cluster_flavor, cluster_flavor_name, - cluster_volume, "slave", "master"), + cluster_volume, "slave", + "master", None), cluster_manager.ClusterInstance("id3", None, cluster_flavor, cluster_flavor_name, - cluster_volume, None, None), + cluster_volume, None, None, None), ] manager = cluster_manager.ClusterInstanceManager(cluster.id) @@ -468,13 +470,15 @@ class ClustersTests(test.TestCase): instances = [ cluster_manager.ClusterInstance("id1", "name1", cluster_flavor, cluster_flavor_name, - cluster_volume, "master", None), + cluster_volume, "master", None, + None), cluster_manager.ClusterInstance("id2", "name2", cluster_flavor, cluster_flavor_name, - cluster_volume, "slave", "master"), + cluster_volume, "slave", + "master", None), cluster_manager.ClusterInstance("id3", None, cluster_flavor, cluster_flavor_name, - cluster_volume, None, None), + cluster_volume, None, None, None), ] manager = cluster_manager.ClusterInstanceManager(cluster.id)