Merge "Don't set up duplicate repos"

This commit is contained in:
Jenkins 2016-09-09 20:37:52 +00:00 committed by Gerrit Code Review
commit 15b1dcfa4a
2 changed files with 97 additions and 4 deletions

View File

@ -31,6 +31,28 @@ from octane.util import ssh
LOG = logging.getLogger(__name__)
PACKAGES_STR = " ".join(magic_consts.OSD_UPGRADE_REQUIRED_PACKAGES)
class Repo(dict):
SOURCE_KEY = "sources"
def __init__(self, *args, **kwargs):
super(Repo, self).__init__(*args, **kwargs)
self._cache = {}
def invalidate_cache(self):
self._cache = {}
@property
def source(self):
if self.SOURCE_KEY in self._cache:
return self._cache[self.SOURCE_KEY]
self._cache[self.SOURCE_KEY] = apt.create_repo_source(self)[1]
return self.source
def _get_backup_path(path, node):
dir_name = os.path.dirname(path)
prefix_name = os.path.basename(path)
@ -54,7 +76,7 @@ def write_content_to_tmp_file_on_node(node, content, directory, template):
def generate_source_content(repos):
return '\n\n'.join([apt.create_repo_source(r)[1] for r in repos])
return '\n\n'.join([r.source for r in repos])
def generate_preference_pin(repos, priority):
@ -149,14 +171,26 @@ def waiting_until_ceph_up(controller, delay=5, times=30):
delay * times))
def get_repos_for_upgrade(orig_env, seed_env):
seed_repos = get_env_repos(seed_env)
orig_repos_sources = {Repo(**r).source for r in get_env_repos(orig_env)}
results = []
for repo in seed_repos:
i_repo = Repo(**repo)
if i_repo.source not in orig_repos_sources:
results.append(i_repo)
return results
def upgrade_osd(orig_env_id, seed_env_id, user, password):
with fuel_client.set_auth_context(
backup_restore.NailgunCredentialsContext(user, password)):
orig_env = env_obj.Environment(orig_env_id)
nodes = list(env.get_nodes(orig_env, ["ceph-osd"]))
seed_env = env_obj.Environment(seed_env_id)
seed_repos = get_env_repos(seed_env)
preference_priority = get_repo_highest_priority(orig_env)
seed_repos = get_repos_for_upgrade(orig_env, seed_env)
if not nodes:
LOG.info("Nothing to upgrade")
return

View File

@ -15,6 +15,7 @@ import mock
import pytest
from octane.commands import osd_upgrade
from octane.util import apt
from octane.util import ssh
@ -150,7 +151,7 @@ def test_upgrade_osd(
"octane.commands.osd_upgrade.get_repo_highest_priority",
return_value=priority)
mock_get_env_repos = mocker.patch(
"octane.commands.osd_upgrade.get_env_repos")
"octane.commands.osd_upgrade.get_repos_for_upgrade")
ssh_call_mock = mocker.patch("octane.util.ssh.call")
mock_is_same_version = mocker.patch(
"octane.commands.osd_upgrade.is_same_versions_on_mon_and_osd",
@ -220,7 +221,8 @@ def test_upgrade_osd(
),
])
def test_generate_source_content(repos, result):
assert result == osd_upgrade.generate_source_content(repos)
assert result == osd_upgrade.generate_source_content(
[osd_upgrade.Repo(**r) for r in repos])
@pytest.mark.parametrize("repos,priority,call_repos", [
@ -428,3 +430,60 @@ def test_waiting_until_ceph_up(mocker, running_times, delay, times):
osd_upgrade.waiting_until_ceph_up(controller)
assert time_calls == time_mock.call_args_list
assert is_ceph_up_calls == is_ceph_up_mock.call_args_list
REPOS_TO_UPGRADE_LIST = [
{
u'name': u'ubuntu',
u'section': u'main universe multiverse',
u'uri': u'http://ubuntu/',
u'priority': None,
u'suite': u'trusty',
u'type': u'deb',
},
{
u'name': u'ubuntu-updates',
u'section': u'main universe multiverse',
u'uri': u'http://ubuntu/',
u'priority': None,
u'suite': u'trusty-updates',
u'type': u'deb',
}
]
@pytest.mark.parametrize("seed_repos,orig_repos,results", [
(REPOS_TO_UPGRADE_LIST, REPOS_TO_UPGRADE_LIST, []),
(REPOS_TO_UPGRADE_LIST,
[],
[osd_upgrade.Repo(**r) for r in REPOS_TO_UPGRADE_LIST]),
])
def test_get_repos_for_upgrade(mocker, seed_repos, orig_repos, results):
orig_env = mock.Mock(repos=orig_repos)
seed_env = mock.Mock(repos=seed_repos)
mocker.patch("octane.commands.osd_upgrade.get_env_repos",
side_effect=lambda x: x.repos)
assert results == osd_upgrade.get_repos_for_upgrade(orig_env, seed_env)
@pytest.mark.parametrize("repo_dict,source", [
(
{
u'name': u'ubuntu',
u'section': u'main universe multiverse',
u'uri': u'http://ubuntu/',
u'priority': None,
u'suite': u'trusty',
u'type': u'deb',
},
"deb http://ubuntu/ trusty main universe multiverse"
),
])
def test_repo_source(mocker, repo_dict, source):
instance = osd_upgrade.Repo(**repo_dict)
mock_get_source = mocker.patch("octane.util.apt.create_repo_source",
side_effect=apt.create_repo_source)
assert not mock_get_source.called
for _ in range(2):
assert source == instance.source
mock_get_source.assert_called_once_with(instance)