From 03a5c7bc0fee08f57f95fec706f1fca9f68a52d5 Mon Sep 17 00:00:00 2001 From: Sergey Abramov Date: Wed, 4 May 2016 16:53:27 +0300 Subject: [PATCH] Change environment settings on upgrade-env cmd set up provision image_data uri based on release version (before that them copied from original env) Change-Id: Ibb7400d2b98ca81fd2a58ca76b04a3e80d4e76a5 Closes-bug: 1582231 (cherry picked from commit a40e4e4073b05e825daa11fccf1c2735dc1f6cb4) --- octane/tests/test_env.py | 43 +++++++++++++++++++++++++++++++++++++++- octane/util/env.py | 25 +++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/octane/tests/test_env.py b/octane/tests/test_env.py index 41cdd651..91e842c6 100644 --- a/octane/tests/test_env.py +++ b/octane/tests/test_env.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import json import mock import pytest @@ -237,9 +238,42 @@ ENV_SETTINGS = { @pytest.mark.parametrize("env_id,master_ip", [(1, '10.0.0.1')]) -def test_change_env_settings(mocker, env_id, master_ip): +@pytest.mark.parametrize("format_tuples", [ + [ + # (path, release_template, expected_result) + ('/boot', "{settings.MASTER_IP}_{cluster.id}", "10.0.0.1_1"), + ( + '/', + "{cluster.id}_{settings.MASTER_IP}_blabal.tar.gz", + "1_10.0.0.1_blabal.tar.gz" + ), + ] +]) +def test_change_env_settings(mocker, env_id, master_ip, format_tuples): env = mocker.patch("fuelclient.objects.environment.Environment") + env_dict = { + 'provision': { + 'image_data': {f[0]: {'uri': 'bad_value'} for f in format_tuples}} + } + expected_dict = { + 'provision': { + 'image_data': {f[0]: {'uri': f[2]} for f in format_tuples}} + } + release_dict = { + 'generated': { + 'provision': { + 'image_data': {f[0]: {'uri': f[1]} for f in format_tuples}} + } + } + sql_call_mock = mocker.patch( + "octane.util.sql.run_psql_in_container", + side_effect=[ + [json.dumps(env_dict)], [json.dumps(release_dict)], 1 + ] + ) + mock_json_dumps = mocker.patch("json.dumps", return_value="generated_json") mock_env = env.return_value = mock.Mock() + mock_env.data = {"release_id": 1} mock_env.get_attributes.return_value = ENV_SETTINGS env_util.change_env_settings(env_id, master_ip) mock_env.update_attributes.assert_called_once_with({ @@ -269,6 +303,13 @@ def test_change_env_settings(mocker, env_id, master_ip): } } }) + mock_json_dumps.assert_called_once_with(expected_dict) + sql_call_mock.assert_called_with( + "update attributes set generated='{0}' where cluster_id={1}".format( + mock_json_dumps.return_value, env_id + ), + 'nailgun' + ) @pytest.mark.parametrize("mock_method,version,expected_result", diff --git a/octane/util/env.py b/octane/util/env.py index caaab00c..269196b4 100644 --- a/octane/util/env.py +++ b/octane/util/env.py @@ -11,6 +11,8 @@ # under the License. import fuelclient + +import collections import json import logging import os.path @@ -27,6 +29,7 @@ from fuelclient.objects import task as task_obj from octane.helpers import tasks as tasks_helpers from octane.helpers import transformations from octane import magic_consts +from octane.util import sql from octane.util import ssh from octane.util import subprocess @@ -78,6 +81,28 @@ def change_env_settings(env_id, master_ip=''): if get_env_provision_method(env) != 'image': attrs['editable']['provision']['method']['value'] = 'image' env.update_attributes(attrs) + generated_data = sql.run_psql_in_container( + "select generated from attributes where cluster_id={0}".format(env_id), + "nailgun" + )[0] + generated_json = json.loads(generated_data) + release_data = sql.run_psql_in_container( + "select attributes_metadata from releases where id={0}".format( + env.data['release_id']), + "nailgun" + )[0] + release_json = json.loads(release_data) + release_image_dict = release_json['generated']['provision']['image_data'] + settings_cls = collections.namedtuple("settings", ["MASTER_IP", "id"]) + settings = settings_cls(master_ip, env_id) + for key, value in generated_json['provision']['image_data'].iteritems(): + value['uri'] = release_image_dict[key]['uri'].format(settings=settings, + cluster=settings) + sql.run_psql_in_container( + "update attributes set generated='{0}' where cluster_id={1}".format( + json.dumps(generated_json), env_id), + "nailgun" + ) def clone_env(env_id, release):