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
from nailgun.api.v1.handlers import base
from nailgun import errors
from nailgun import objects
from nailgun.task import manager
@ -53,6 +54,13 @@ class ClusterUpgradeCloneHandler(base.BaseHandler):
request_data = self.checked_data(cluster=orig_cluster)
new_cluster = upgrade.UpgradeHelper.clone_cluster(orig_cluster,
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()

View File

@ -98,6 +98,9 @@ class NailgunClusterAdapter(object):
def get_admin_network_group(self):
return objects.NetworkGroup.get_admin_network_group()
def get_network_roles(self):
return objects.Cluster.get_network_roles(self.cluster)
class NailgunReleaseAdapter(object):
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)
mapping = dict((ng.id, seed_ng_dict[ng.name]) for ng in orig_ng)
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}