diff --git a/cluster_upgrade/handlers.py b/cluster_upgrade/handlers.py index d4b7f71..4e7f96d 100644 --- a/cluster_upgrade/handlers.py +++ b/cluster_upgrade/handlers.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +import copy import six from nailgun.api.v1.handlers import base @@ -112,6 +113,7 @@ class CopyVIPsHandler(base.BaseHandler): @base.handle_errors @base.validate + @base.serialize def POST(self, cluster_id): """Copy VIPs from original cluster to new one @@ -119,6 +121,7 @@ class CopyVIPsHandler(base.BaseHandler): clusters that is created on cluster clone operation :param cluster_id: id of cluster that VIPs must be copied to + :returns: Collection of JSON-serialised VIPs. :http: * 200 (OK) * 400 (validation failed) @@ -143,6 +146,9 @@ class CopyVIPsHandler(base.BaseHandler): upgrade.UpgradeHelper.copy_vips(orig_cluster_adapter, seed_cluster_adapter) + cluster_vips = objects.IPAddrCollection.get_vips_by_cluster_id( + cluster.id) + return objects.IPAddrCollection.to_list(cluster_vips) class CreateUpgradeReleaseHandler(base.BaseHandler): @@ -152,13 +158,14 @@ class CreateUpgradeReleaseHandler(base.BaseHandler): Overwrite base default_mapping by orig default_maping values. """ + base_nets = copy.deepcopy(base_nets) + orig_nets = copy.deepcopy(orig_nets) orig_network_dict = {n['id']: n for n in orig_nets} for base_net in base_nets: orig_net = orig_network_dict.get(base_net['id']) - if orig_net is None: - orig_net = base_net - base_net['default_mapping'] = orig_net['default_mapping'] - return base_net + if orig_net is not None: + base_net['default_mapping'] = orig_net['default_mapping'] + return base_nets @base.serialize def POST(self, cluster_id, release_id): @@ -174,14 +181,15 @@ class CreateUpgradeReleaseHandler(base.BaseHandler): base_release = self.get_object_or_404(objects.Release, release_id) orig_cluster = self.get_object_or_404(objects.Cluster, cluster_id) orig_release = orig_cluster.release - network_metadata = self.merge_network_roles( base_release.network_roles_metadata, orig_release.network_roles_metadata) - data = objects.Release.to_dict(base_release) + data = dict(base_release) data['network_roles_metadata'] = network_metadata data['name'] = '{0} Upgrade ({1})'.format( base_release.name, orig_release.id) + deployment_tasks = objects.Release.get_deployment_tasks(base_release) + data['deployment_tasks'] = deployment_tasks del data['id'] new_release = objects.Release.create(data) - return new_release.to_dict() + return objects.Release.to_dict(new_release) diff --git a/cluster_upgrade/tests/test_handlers.py b/cluster_upgrade/tests/test_handlers.py index ad7239a..6e4382d 100644 --- a/cluster_upgrade/tests/test_handlers.py +++ b/cluster_upgrade/tests/test_handlers.py @@ -23,6 +23,7 @@ from nailgun.test import base from nailgun.utils import reverse from . import base as tests_base +from ..objects import adapters class TestClusterUpgradeCloneHandler(tests_base.BaseCloneClusterTest): @@ -224,26 +225,44 @@ class TestNodeReassignHandler(base.BaseIntegrationTest): self.assertEqual(400, resp.status_code) -class TestCopyVipsHandler(base.BaseIntegrationTest): +class TestCopyVipsHandler(tests_base.BaseCloneClusterTest): + def test_copy_vips(self): + node_db = self.env.create_node(cluster_id=self.src_cluster.id, + roles=["controller"]) + node = adapters.NailgunNodeAdapter(node_db) - def test_copy_vips_called(self): - from ..objects import relations + src_net_manager = self.src_cluster.get_network_manager() + orig_vips = src_net_manager.assign_vips_for_net_groups() - orig_cluster = self.env.create_cluster(api=False) - new_cluster = self.env.create_cluster(api=False) + new_cluster = self.helper.clone_cluster(self.src_cluster, self.data) + self.helper.assign_node_to_cluster(node, new_cluster, node.roles, []) - relations.UpgradeRelationObject.create_relation( - orig_cluster.id, new_cluster.id) + resp = self.app.post( + reverse( + 'CopyVIPsHandler', + kwargs={'cluster_id': new_cluster.id} + ), + headers=self.default_headers, + ) - with mock.patch('cluster_upgrade.handlers' - '.upgrade.UpgradeHelper.copy_vips') as copy_vips_mc: - resp = self.app.post( - reverse( - 'CopyVIPsHandler', - kwargs={'cluster_id': new_cluster.id} - ), - headers=self.default_headers, - ) + orig_vips_addrs = set(orig_vips.values()) + new_vips_addrs = {vip["ip_addr"] for vip in resp.json_body} self.assertEqual(resp.status_code, 200) - self.assertTrue(copy_vips_mc.called) + self.assertEqual(orig_vips_addrs, new_vips_addrs) + + +class TestCreateUpgradeReleaseHandler(base.BaseIntegrationTest): + + def test_clone_release(self): + new_cluster = self.env.create_cluster(api=False) + release = self.env.create_release( + operating_system=consts.RELEASE_OS.ubuntu, version="new_version") + uri = reverse( + 'CreateUpgradeReleaseHandler', + kwargs={'cluster_id': new_cluster.id, 'release_id': release.id}) + resp = self.app.post(uri, headers=self.default_headers) + self.assertEqual(resp.status_code, 200) + self.assertEqual( + '{0} Upgrade ({1})'.format(release.name, new_cluster.release.id), + resp.json_body['name'])