Merge "Don't set up duplicate repos"
This commit is contained in:
commit
15b1dcfa4a
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue