From 821f8373abdce04974e02ef8b20d1d8fffa2094a Mon Sep 17 00:00:00 2001 From: Anastasiya Date: Thu, 1 Sep 2016 12:16:06 +0300 Subject: [PATCH] Sync network groups during cloning environment for creating of network groups in the seed cluster such as in the original cluster Change-Id: I17f95756fa26ef0f7df0e969f9f1ba4331047c8d Closes-Bug: #1616817 --- cluster_upgrade/objects/adapters.py | 8 ++++ cluster_upgrade/tests/test_upgrade.py | 66 +++++++++++++++++++++++++++ cluster_upgrade/upgrade.py | 60 ++++++++++++++++++++++++ 3 files changed, 134 insertions(+) diff --git a/cluster_upgrade/objects/adapters.py b/cluster_upgrade/objects/adapters.py index 1adb27a..be5a00d 100644 --- a/cluster_upgrade/objects/adapters.py +++ b/cluster_upgrade/objects/adapters.py @@ -121,6 +121,10 @@ class NailgunReleaseAdapter(object): def environment_version(self): return self.release.environment_version + @property + def id(self): + return self.release.id + @property def roles_metadata(self): return self.release.roles_metadata @@ -136,6 +140,10 @@ class NailgunNetworkManager(object): self.cluster = cluster self.net_manager = net_manager + def create(self, network_configuration, group_id=None): + self.net_manager.create_network_group(self.cluster, + network_configuration, group_id) + def update(self, network_configuration): self.net_manager.update(self.cluster, network_configuration) diff --git a/cluster_upgrade/tests/test_upgrade.py b/cluster_upgrade/tests/test_upgrade.py index 3d03ec4..2b847f5 100644 --- a/cluster_upgrade/tests/test_upgrade.py +++ b/cluster_upgrade/tests/test_upgrade.py @@ -229,6 +229,72 @@ class TestUpgradeHelperCloneCluster(base_tests.BaseCloneClusterTest): self.assertEqual('image', attrs['editable']['provision']['method']['value']) + def check_different_attributes(self, orig_cluster, new_cluster): + release = new_cluster.release.id + nodegroups_id_maping = self.helper.get_nodegroups_id_mapping( + orig_cluster, new_cluster + ) + orig_ngs = self.serialize_nets(orig_cluster.cluster)['networks'] + seed_ngs = self.serialize_nets(new_cluster.cluster)['networks'] + for seed_ng in seed_ngs: + for orig_ng in orig_ngs: + if orig_ng['name'] == seed_ng['name'] \ + and orig_ng['name'] != "fuelweb_admin": + + self.assertEqual(seed_ng['group_id'], + nodegroups_id_maping[orig_ng['group_id']]) + + if seed_ng.get('release'): + self.assertEqual(seed_ng['release'], release) + + def skip_different_attributes(self, orig_cluster, new_cluster): + orig_ngs = self.serialize_nets(orig_cluster.cluster)['networks'] + seed_ngs = self.serialize_nets(new_cluster.cluster)['networks'] + keys = ['release', 'id', 'group_id'] + orig_ngs_names = {ng['name']: ng for ng in orig_ngs} + for seed_ng in seed_ngs: + if seed_ng['name'] == 'fuelweb_admin': + continue + orig_ng = orig_ngs_names.get(seed_ng['name']) + if not orig_ng: + continue + for key in keys: + orig_ng.pop(key, None) + seed_ng.pop(key, None) + return orig_ngs, seed_ngs + + def test_sync_network_groups(self): + new_cluster = self.helper.create_cluster_clone(self.src_cluster, + self.data) + self.helper.sync_network_groups(self.src_cluster, new_cluster) + self.check_different_attributes(self.src_cluster, new_cluster) + orig_ngs, seed_ngs = self.skip_different_attributes(self.src_cluster, + new_cluster) + self.assertEqual(orig_ngs, seed_ngs) + + def test_remove_network_groups(self): + new_cluster = self.helper.create_cluster_clone(self.src_cluster, + self.data) + self.helper.remove_network_groups(new_cluster) + seed_ngs = self.serialize_nets(new_cluster.cluster)['networks'] + self.assertEqual(len(seed_ngs), 1) + self.assertEqual(seed_ngs[0]['name'], 'fuelweb_admin') + + def test_copy_network_groups(self): + new_cluster = self.helper.create_cluster_clone(self.src_cluster, + self.data) + nodegroups_id_maping = self.helper.get_nodegroups_id_mapping( + self.src_cluster, new_cluster + ) + release = new_cluster.release.id + self.helper.remove_network_groups(new_cluster) + self.helper.copy_network_groups(self.src_cluster, nodegroups_id_maping, + release) + self.check_different_attributes(self.src_cluster, new_cluster) + orig_ngs, seed_ngs = self.skip_different_attributes(self.src_cluster, + new_cluster) + self.assertEqual(orig_ngs, seed_ngs) + def test_change_env_settings_no_editable_provision(self): new_cluster = self.helper.create_cluster_clone(self.src_cluster, self.data) diff --git a/cluster_upgrade/upgrade.py b/cluster_upgrade/upgrade.py index 2ade745..0b5bede 100644 --- a/cluster_upgrade/upgrade.py +++ b/cluster_upgrade/upgrade.py @@ -20,6 +20,7 @@ import collections import six from nailgun import consts +from nailgun.db import db from nailgun.extensions.network_manager.objects.serializers import \ network_configuration from nailgun import objects @@ -100,6 +101,7 @@ class UpgradeHelper(object): relations.UpgradeRelationObject.create_relation(orig_cluster.id, new_cluster.id) cls.change_env_settings(orig_cluster, new_cluster) + cls.sync_network_groups(orig_cluster, new_cluster) return new_cluster @classmethod @@ -136,6 +138,55 @@ class UpgradeHelper(object): attrs = new_cluster.attributes attrs['editable']['provision']['method']['value'] = 'image' + @classmethod + def sync_network_groups(cls, orig_cluster, new_cluster): + cls.remove_network_groups(new_cluster) + nodegroups_id_maping = cls.get_nodegroups_id_mapping(orig_cluster, + new_cluster) + release = new_cluster.release.id + cls.copy_network_groups(orig_cluster, nodegroups_id_maping, release) + + @classmethod + def remove_network_groups(cls, cluster): + seed_ng = cluster.get_network_groups() + for ng in seed_ng: + if ng.name == 'fuelweb_admin': + continue + objects.NetworkGroup.delete(ng.network_group) + + @classmethod + def copy_network_groups(cls, orig_cluster, nodegroups_id_maping, release): + nets_serializer = cls.network_serializers[orig_cluster.net_provider] + orig_net = nets_serializer.serialize_for_cluster(orig_cluster.cluster) + for ng in orig_net['networks']: + if ng['name'] == 'fuelweb_admin': + continue + meta = ng['meta'] + metadata = { + 'notation': 'cidr', + 'render_type': None, + 'map_priority': 2, + 'configurable': True, + 'use_gateway': False, + 'name': ng['name'], + 'vlan_start': ng['vlan_start'] + } + metadata.update(meta) + if metadata['notation'] == 'ip_ranges': + metadata['ip_range'] = ng['ip_ranges'][0] + metadata['cidr'] = ng['cidr'] + data = { + 'name': ng['name'], + 'release': release, + 'vlan_start': ng['vlan_start'], + 'cidr': ng['cidr'], + 'gateway': ng['gateway'], + 'group_id': nodegroups_id_maping[ng['group_id']], + 'meta': metadata + } + objects.NetworkGroup.create(data) + db().commit() + @classmethod def copy_node_groups(cls, orig_cluster, new_cluster): for ng in orig_cluster.node_groups: @@ -259,3 +310,12 @@ class UpgradeHelper(object): mapping[orig_cluster.get_admin_network_group().id] = \ seed_cluster.get_admin_network_group().id return mapping + + @classmethod + def get_nodegroups_id_mapping(cls, orig_cluster, seed_cluster): + orig_ng = orig_cluster.node_groups + seed_ng = seed_cluster.node_groups + + seed_ng_dict = dict((ng.name, ng.id) for ng in seed_ng) + mapping = dict((ng.id, seed_ng_dict[ng.name]) for ng in orig_ng) + return mapping