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
This commit is contained in:
Anastasiya 2016-09-01 12:16:06 +03:00 committed by Anastasia Balobashina
parent e2b9dbf1ca
commit 821f8373ab
3 changed files with 134 additions and 0 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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