From b54f9d4c29808c4561b20af508b85b9e40fa72b6 Mon Sep 17 00:00:00 2001 From: Nikita Zubkov Date: Wed, 24 Aug 2016 17:51:39 +0300 Subject: [PATCH] Move partition info transformation to extension octane have some dirty hacks to change volumes attributes using nailgun as a library, such modifications should be done in a extension Change-Id: I422bb368916f3a319e286edcc6103a2834097a87 --- cluster_upgrade/objects/adapters.py | 9 ++++ cluster_upgrade/transformations/__init__.py | 4 +- cluster_upgrade/transformations/volumes.py | 53 +++++++++++++++++++++ cluster_upgrade/upgrade.py | 9 ++++ setup.cfg | 2 + 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 cluster_upgrade/transformations/volumes.py diff --git a/cluster_upgrade/objects/adapters.py b/cluster_upgrade/objects/adapters.py index 7a00c0c..cc2d169 100644 --- a/cluster_upgrade/objects/adapters.py +++ b/cluster_upgrade/objects/adapters.py @@ -14,6 +14,7 @@ # License for the specific language governing permissions and limitations # under the License. +from nailgun.extensions.volume_manager import extension as volume_ext from nailgun import objects @@ -200,6 +201,14 @@ class NailgunNodeAdapter(object): def add_pending_change(self, change): objects.Node.add_pending_change(self.node, change) + def get_volumes(self): + return volume_ext.VolumeManagerExtension.get_node_volumes(self.node) + + def set_volumes(self, volumes): + return volume_ext.VolumeManagerExtension.set_node_volumes( + self.node, volumes + ) + class NailgunNetworkGroupAdapter(object): diff --git a/cluster_upgrade/transformations/__init__.py b/cluster_upgrade/transformations/__init__.py index 64c14d7..7e1d861 100644 --- a/cluster_upgrade/transformations/__init__.py +++ b/cluster_upgrade/transformations/__init__.py @@ -64,8 +64,8 @@ class Manager(object): def apply(self, from_version, to_version, data): strict_from = distutils.version.StrictVersion(from_version) strict_to = distutils.version.StrictVersion(to_version) - assert strict_from < strict_to, \ - "from_version must be smaller than to_version" + assert strict_from <= strict_to, \ + "from_version must not be greater than to_version" data = copy.deepcopy(data) for version, transformers in self.transformers: if version <= strict_from: diff --git a/cluster_upgrade/transformations/volumes.py b/cluster_upgrade/transformations/volumes.py new file mode 100644 index 0000000..cb9dca7 --- /dev/null +++ b/cluster_upgrade/transformations/volumes.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from cluster_upgrade import transformations + + +def transform_node_volumes(volumes): + try: + os_vg = next(vol for vol in volumes + if 'id' in vol and vol['id'] == 'os') + except StopIteration: + return volumes + + other_volumes = [vol for vol in volumes + if 'id' not in vol or vol['id'] != 'os'] + + for disk in other_volumes: + disk_volumes = disk['volumes'] + disk['volumes'] = [] + + for v in disk_volumes: + if v['type'] == 'pv' and v['vg'] == 'os' and v['size'] > 0: + for vv in os_vg['volumes']: + partition = {'name': vv['name'], + 'size': vv['size'], + 'type': 'partition', + 'mount': vv['mount'], + 'file_system': vv['file_system']} + disk['volumes'].append(partition) + else: + if v['type'] == 'lvm_meta_pool' or v['type'] == 'boot': + v['size'] = 0 + disk['volumes'].append(v) + + return volumes + + +class Manager(transformations.Manager): + default_config = { + '6.1': ['node_volumes'] + } + name = 'volumes' diff --git a/cluster_upgrade/upgrade.py b/cluster_upgrade/upgrade.py index e1b9ec8..bd2c580 100644 --- a/cluster_upgrade/upgrade.py +++ b/cluster_upgrade/upgrade.py @@ -28,6 +28,7 @@ from nailgun import utils from . import transformations # That's weird, but that's how hacking likes from .objects import adapters from .transformations import cluster as cluster_trs +from .transformations import volumes as volumes_trs def merge_attributes(a, b): @@ -75,6 +76,7 @@ class UpgradeHelper(object): network_configuration.NovaNetworkConfigurationSerializer, } cluster_transformations = transformations.Lazy(cluster_trs.Manager) + volumes_transformations = transformations.Lazy(volumes_trs.Manager) @classmethod def clone_cluster(cls, orig_cluster, data): @@ -215,6 +217,13 @@ class UpgradeHelper(object): orig_cluster = adapters.NailgunClusterAdapter.get_by_uid( node.cluster_id) + volumes = cls.volumes_transformations.apply( + orig_cluster.release.environment_version, + seed_cluster.release.environment_version, + node.get_volumes(), + ) + node.set_volumes(volumes) + orig_manager = orig_cluster.get_network_manager() netgroups_id_mapping = cls.get_netgroups_id_mapping( diff --git a/setup.cfg b/setup.cfg index aa902e4..ea69fea 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,6 +25,8 @@ packages = [entry_points] nailgun.extensions = cluster_upgrade = cluster_upgrade.extension:ClusterUpgradeExtension +nailgun.cluster_upgrade.transformations.volumes.6.1 = + node_volumes = cluster_upgrade.transformations.volumes:transform_node_volumes nailgun.cluster_upgrade.transformations.cluster.9.0 = dns_list = cluster_upgrade.transformations.cluster:transform_dns_list ntp_list = cluster_upgrade.transformations.cluster:transform_ntp_list