Validate network roles for new cluster

Checks that network roles mapping from original release is a subset of
network roles mapping of new cluster's release.

Change-Id: I521e70bf3df289abf3e71c5c1558faf7126db964
Partial-Bug: #1619162
This commit is contained in:
Nikita Zubkov 2016-09-12 19:03:43 +03:00
parent 821f8373ab
commit 4150121e8a
3 changed files with 33 additions and 0 deletions

View File

@ -18,6 +18,7 @@ import copy
import six import six
from nailgun.api.v1.handlers import base from nailgun.api.v1.handlers import base
from nailgun import errors
from nailgun import objects from nailgun import objects
from nailgun.task import manager from nailgun.task import manager
@ -53,6 +54,13 @@ class ClusterUpgradeCloneHandler(base.BaseHandler):
request_data = self.checked_data(cluster=orig_cluster) request_data = self.checked_data(cluster=orig_cluster)
new_cluster = upgrade.UpgradeHelper.clone_cluster(orig_cluster, new_cluster = upgrade.UpgradeHelper.clone_cluster(orig_cluster,
request_data) request_data)
valid = upgrade.UpgradeHelper.validate_network_roles(
orig_cluster, new_cluster,
)
if not valid:
raise errors.InvalidData("Network changes during upgrade"
" is not supported.")
return new_cluster.to_dict() return new_cluster.to_dict()

View File

@ -98,6 +98,9 @@ class NailgunClusterAdapter(object):
def get_admin_network_group(self): def get_admin_network_group(self):
return objects.NetworkGroup.get_admin_network_group() return objects.NetworkGroup.get_admin_network_group()
def get_network_roles(self):
return objects.Cluster.get_network_roles(self.cluster)
class NailgunReleaseAdapter(object): class NailgunReleaseAdapter(object):
def __init__(self, release): def __init__(self, release):

View File

@ -319,3 +319,25 @@ class UpgradeHelper(object):
seed_ng_dict = dict((ng.name, ng.id) for ng in seed_ng) 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) mapping = dict((ng.id, seed_ng_dict[ng.name]) for ng in orig_ng)
return mapping return mapping
@classmethod
def validate_network_roles(cls, orig_cluster, seed_cluster):
if not orig_cluster.network_template:
return cls._compare_releases_roles(orig_cluster, seed_cluster)
else:
# TODO network template case
return True
@classmethod
def _compare_releases_roles(cls, orig_cluster, seed_cluster):
orig_roles = orig_cluster.get_network_roles()
new_roles = seed_cluster.get_network_roles()
orig_mapping = cls._get_release_mapping(orig_roles)
new_mapping = cls._get_release_mapping(new_roles)
return orig_mapping.issubset(new_mapping)
@staticmethod
def _get_release_mapping(roles):
return {(role['id'], role['default_mapping']) for role in roles}