Add tests for preupgrade compute

* test for preuepgrade_compute command was added
* test for util functions for change_repositories was added

Change-Id: Id302c0b49022a5ff322f9c52dee2140dcff1b722
This commit is contained in:
Anastasiya 2016-08-25 11:25:04 +03:00
parent d5d9e9b486
commit ed841dbf39
2 changed files with 257 additions and 1 deletions

View File

@ -0,0 +1,225 @@
# 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.
import mock
import pytest
from octane.commands import preupgrade_compute
from octane import magic_consts
@pytest.mark.parametrize("cmd,release_id,node_ids", [
(["preupgrade-compute", "1", "1", "2"], 1, [1, 2]),
(["preupgrade-compute", "1", "1"], 1, [1]),
])
def test_parser(mocker, octane_app, cmd, release_id, node_ids):
m = mocker.patch("octane.commands.preupgrade_compute.preupgrade_compute")
octane_app.run(cmd)
assert not octane_app.stdout.getvalue()
assert not octane_app.stderr.getvalue()
m.assert_called_once_with(release_id, node_ids)
@pytest.mark.parametrize("release_id,node_ids,env_id", [
(1, [1, 2], 1),
(1, [1], 1),
])
@pytest.mark.parametrize("version", ["liberty-8.0"])
def test_preupgrade_compute(mocker, release_id, node_ids, env_id, version):
def _create_node(node_id):
node = mock.Mock()
node.id = node_id
node.env.id = env_id
node.data = {}
node.data['roles'] = 'compute'
mock_nodes_list.append(node)
return node
mock_nodes_list = []
mock_node = mocker.patch("fuelclient.objects.node.Node")
mock_node.side_effect = _create_node
mock_release_class = mocker.patch("fuelclient.objects.Release")
mock_release = mock_release_class.return_value
mock_release.data = {}
mock_release.data["version"] = version
mock_release.data['state'] = "available"
mock_get_astute_dict = mocker.patch("octane.util.helpers.get_astute_dict")
mock_get_repos = mocker.patch(
"octane.commands.preupgrade_compute.get_repos"
)
mock_change_repos = mocker.patch(
"octane.commands.preupgrade_compute.change_repositories"
)
mock_stop_services = mocker.patch(
"octane.commands.preupgrade_compute.stop_compute_services"
)
mock_upgrade_packages = mocker.patch("octane.util.apt.upgrade_packages")
preupgrade_compute.preupgrade_compute(release_id, node_ids)
assert mock_node.call_args_list == [
mock.call(node_id) for node_id in node_ids]
mock_get_astute_dict.assert_called_once_with()
assert mock_change_repos.call_args_list == [
mock.call(node, mock_get_repos.return_value)
for node in mock_nodes_list]
assert mock_stop_services.call_args_list == [
mock.call(node) for node in mock_nodes_list]
assert mock_upgrade_packages.call_args_list == [
mock.call(node, magic_consts.COMPUTE_PREUPGRADE_PACKAGES.get(version))
for node in mock_nodes_list]
@pytest.mark.parametrize("release_id,node_ids,env_ids,roles,state,err", [
(1, [1, 2], [1, 1], ["compute", "compute"], "available", None),
(1, [1, 3], [1, 1], ["compute", "compute"], "unavailable", Exception),
(1, [1, 2], [1, 2], ["compute", "compute"], "available", Exception),
(1, [1, 2], [1, 1], ["compute", "controller"], "available", Exception),
])
def test_check_sanity(release_id, node_ids, env_ids, roles, state, err):
node_list = []
release = mock.Mock()
release.id = release_id
release.data = {}
release.data["state"] = state
for node_id, env_id, role in zip(node_ids, env_ids, roles):
node = mock.Mock()
node.id = node_id
node.env.id = env_id
node.data = {}
node.data['roles'] = role
node_list.append(node)
if err:
with pytest.raises(err) as exc_info:
preupgrade_compute.check_sanity(node_list, release)
if state != "available":
assert "Release with id {0} is not available.".format(release_id)\
in exc_info.value.args[0]
elif env_ids[0] != env_ids[1]:
assert "Nodes have different clusters." in exc_info.value.args[0]
else:
assert "Preupgrade procedure is available only for " \
"compute nodes. Node with id {0} " \
"is not a compute.".format(node_ids[1])
else:
assert preupgrade_compute.check_sanity(node_list, release) is None
@pytest.mark.parametrize("repos,has_priority", [
([{'name': 'test_1', 'priority': None},
{'name': 'test_2', 'priority': None}], False),
([{'name': 'test_1', 'priority': None}, {'priority': 1050}], True),
])
def test_change_repositories(mocker, repos, has_priority):
node = mock.Mock()
dirs = ['/etc/apt/sources.list.d', '/etc/apt/preferences.d']
mock_remove = mocker.patch("octane.util.ssh.remove_all_files_from_dirs")
mock_sftp = mocker.patch("octane.util.ssh.sftp")
mock_source = mocker.patch("octane.util.apt.create_repo_source")
mock_source.return_value = 'filename_source', 'content_source'
mock_preferences = mocker.patch("octane.util.apt.create_repo_preferences")
mock_preferences.return_value = 'filename_pref', 'content_pref'
mock_write_content = mocker.patch("octane.util.ssh.write_content_to_file")
mock_call = mocker.patch("octane.util.ssh.call")
preupgrade_compute.change_repositories(node, repos)
mock_remove.assert_called_once_with(dirs, node)
mock_source.call_args_list == [mock.call(repo) for repo in repos]
calls_write = [
mock.call(mock_sftp, mock_source.return_value) for repo in repos
]
if has_priority:
mock_preferences.call_args_list == [
mock.call(repo) for repo in repos if repo['priority']
]
calls_write.append(
mock.call(mock_sftp, mock_source.return_value)
for repo in repos if repo['priority']
)
mock_write_content.call_args_list == calls_write
mock_call.assert_called_once_with(['apt-get', 'update'], node=node)
def test_stop_compute_services(mocker):
node = mock.Mock()
mock_call = mocker.patch("octane.util.ssh.call")
preupgrade_compute.stop_compute_services(node)
mock_call.call_args_list == [
mock.call(['stop', 'nova-compute'], node=node),
mock.call(['stop', 'neutron-plugin-openvswitch-agent'], node=node)
]
REPOS = [
{'name': 'ubuntu-security',
'priority': None,
'section': 'main universe multiverse',
'suite': 'trusty-security',
'type': 'deb',
'uri': 'http://archive.ubuntu.com/ubuntu/'},
{'name': 'mos',
'priority': 1050,
'section': 'main restricted',
'suite': 'mos8.0',
'type': 'deb',
'uri': 'http://{settings.MASTER_IP}:8080/{cluster.release.version}/'
'ubuntu/x86_64'},
{'name': 'mos-updates',
'priority': 1050,
'section': 'main restricted',
'suite': 'mos8.0-updates',
'type': 'deb',
'uri': 'http://mirror.fuel-infra.org/mos-repos/'
'ubuntu/{cluster.release.environment_version}/'},
]
REPOS_WITH_REPLACE_URI = [
{'name': 'ubuntu-security',
'priority': None,
'section': 'main universe multiverse',
'suite': 'trusty-security',
'type': 'deb',
'uri': 'http://archive.ubuntu.com/ubuntu/'},
{'name': 'mos',
'priority': 1050,
'section': 'main restricted',
'suite': 'mos8.0',
'type': 'deb',
'uri': 'http://10.20.0.2:8080/liberty-8.0/ubuntu/x86_64'},
{'name': 'mos-updates',
'priority': 1050,
'section': 'main restricted',
'suite': 'mos8.0-updates',
'type': 'deb',
'uri': 'http://mirror.fuel-infra.org/mos-repos/ubuntu/8.0/'},
]
RELEASE_DATA = {
'attributes_metadata': {
'editable': {
'repo_setup': {
'repos': {
'value': REPOS
}
}
}
},
'version': "liberty-8.0",
}
@pytest.mark.parametrize("ip,release_data,repos_with_replace_uri", [
("10.20.0.2", RELEASE_DATA, REPOS_WITH_REPLACE_URI)
])
def test_get_repos(ip, release_data, repos_with_replace_uri):
release = mock.Mock()
release.data = release_data
assert preupgrade_compute.get_repos(release, ip) == repos_with_replace_uri

View File

@ -9,7 +9,7 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import mock
import pytest
@ -150,3 +150,34 @@ def test_get_client_credentials(mocker, editable, result):
mocker.patch('paramiko.SSHClient')
client = ssh.get_client.new(node)
client.connect.assert_called_with(ip, **result)
@pytest.mark.parametrize("dir_names,lists_files", [
(["test_dir_1", "test_dir_2"], [["file_1", "file_2"], ["file_3"]]),
(["test_dir_3", "test_dir_4"], [[], []])
])
def test_remove_all_files_from_dirs(mocker, dir_names, lists_files):
node = mock.Mock()
mock_sftp = mocker.patch("octane.util.ssh.sftp")
mock_list_dir = mocker.patch('paramiko.SFTPClient.listdir')
mock_list_dir.side_effect = lists_files
mock_unlink = mocker.patch("paramiko.SFTPClient.unlink")
ssh.remove_all_files_from_dirs(dir_names, node)
mock_sftp.assert_called_once_with(node)
mock_list_dir.call_args_list == [
mock.call(dir_name) for dir_name in dir_names
]
mock_unlink.call_args_list == [
mock.call(os.path.join(dir_name, file)
for dir_name, files in zip(dir_names, lists_files)
for file in files)
]
def test_write_content_to_file(mocker):
filename = "filename"
content = "content"
sftp = mocker.patch("paramiko.SFTPClient")
mock_open = mocker.patch("paramiko.SFTPClient.open")
ssh.write_content_to_file(sftp, filename, content)
mock_open.assert_called_once_with(filename, 'w')