diff --git a/octane/commands/install_node.py b/octane/commands/install_node.py index 856b2c01..e359ca0b 100644 --- a/octane/commands/install_node.py +++ b/octane/commands/install_node.py @@ -30,12 +30,12 @@ LOG = logging.getLogger(__name__) def isolate(nodes, env): nodes.sort(key=lambda node: node.id, reverse=True) hub = nodes[0] - deployment_info = env.get_default_facts( - 'deployment', nodes=[hub.data['id']]) + deployment_info = env_util.get_node_default_facts( + env, nodes=[hub.data['id']]) network.create_bridges(hub, env, deployment_info) for node in nodes[1:]: - deployment_info = env.get_default_facts( - 'deployment', nodes=[node.data['id']]) + deployment_info = env_util.get_node_default_facts( + env, nodes=[node.data['id']]) network.setup_isolation(hub, node, env, deployment_info) for node in nodes: network.flush_arp(node) diff --git a/octane/handlers/upgrade/controller.py b/octane/handlers/upgrade/controller.py index 4b96d06a..d7ebfb92 100644 --- a/octane/handlers/upgrade/controller.py +++ b/octane/handlers/upgrade/controller.py @@ -31,7 +31,7 @@ class ControllerUpgrade(upgrade.UpgradeHandler): self.gateway = None def predeploy(self): - default_info = self.env.get_default_facts('deployment') + default_info = env_util.get_node_default_facts(self.env) deployment_info = [] network_data = self.env.get_network_data() gw_admin = transformations.get_network_gw(network_data, diff --git a/octane/tests/test_env.py b/octane/tests/test_env.py index 88b0807d..c533e51b 100644 --- a/octane/tests/test_env.py +++ b/octane/tests/test_env.py @@ -316,3 +316,35 @@ def test_wait_for_node_stopped(mocker): ) in excinfo.args) sleep.assert_called_once_with(60) time.assert_has_calls((mock.call(), mock.call())) + + +@pytest.mark.parametrize("api,modified", [ + ([], []), + ( + [ + {'uid': 'common', 'common_key': 'common_value'}, + {'uid': 'master'}, + {'uid': 'node-1', 'common_key': 'uncommon_value'}, + ], + [ + {'uid': 'master', 'common_key': 'common_value'}, + {'uid': 'node-1', 'common_key': 'uncommon_value'}, + ] + ), + ( + [ + {'uid': 'master', 'common_key': 'common_value'}, + {'uid': 'node-1', 'common_key': 'uncommon_value'}, + ], + [ + {'uid': 'master', 'common_key': 'common_value'}, + {'uid': 'node-1', 'common_key': 'uncommon_value'}, + ] + ), +]) +@pytest.mark.parametrize("nodes", [None, [1, 2, 3]]) +def test_util_env(mocker, api, modified, nodes): + env = mock.Mock() + env.get_default_facts.return_value = api + assert modified == env_util.get_node_default_facts(env, nodes) + env.get_default_facts.assert_called_once_with('deployment', nodes=nodes) diff --git a/octane/util/env.py b/octane/util/env.py index 4df2267a..293184a7 100644 --- a/octane/util/env.py +++ b/octane/util/env.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import copy import json import logging import os.path @@ -237,6 +238,8 @@ def deploy_changes(env, nodes): def prepare_net_info(info): + if "quantum_settings" not in info: + return quantum_settings = info["quantum_settings"] pred_nets = quantum_settings["predefined_networks"] phys_nets = quantum_settings["L2"]["phys_nets"] @@ -259,8 +262,22 @@ def get_admin_password(env, node=None): return get_astute_yaml(env, node)['access']['password'] +def get_node_default_facts(env, nodes=None): + facts = env.get_default_facts('deployment', nodes=nodes) + common = None + node_facts = [] + for fact in facts: + if fact.get("uid") == "common": + common = fact + else: + node_facts.append(fact) + if not common: + return node_facts + return [helpers.merge_dicts(copy.deepcopy(common), n) for n in node_facts] + + def update_deployment_info(env, isolated): - default_info = env.get_default_facts('deployment') + default_info = get_node_default_facts(env) network_data = env.get_network_data() gw_admin = transformations.get_network_gw(network_data, "fuelweb_admin")