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 a40e4e4073)
This commit is contained in:
Sergey Abramov 2016-05-04 16:53:27 +03:00
parent 8defa232ca
commit 03a5c7bc0f
2 changed files with 67 additions and 1 deletions

View File

@ -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",

View File

@ -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):