Merge "Add plugin to extract ostree playbooks from load"

This commit is contained in:
Zuul 2023-04-12 17:51:05 +00:00 committed by Gerrit Code Review
commit f53555fa63
4 changed files with 270 additions and 5 deletions

View File

@ -3794,3 +3794,51 @@ def extract_rpm_package(rpm_package, target_dir):
raise exception.SysinvException(
"Error extracting rpm %s: %s" % (rpm_package, error),
)
def get_ostree_commit(ostree_repo):
repo_arg = "--repo=%s" % ostree_repo
try:
refs = subprocess.run(
["ostree", repo_arg, "refs"],
capture_output=True,
check=True,
text=True,
)
commit = subprocess.run(
["ostree", repo_arg, "log", refs.stdout],
capture_output=True,
check=True,
text=True,
)
except Exception as error:
raise exception.SysinvException(
"Error getting ostree commit: %s" % (error),
)
result = commit.stdout.split()
if result[0] != "commit":
return None
return result[1]
def checkout_ostree(ostree_repo, commit, target_dir, subpath):
repo_arg = "--repo=%s" % ostree_repo
path_arg = None
if subpath:
path_arg = "--subpath=%s" % subpath
try:
subprocess.run(
["ostree", repo_arg, path_arg, "--union", "checkout", commit, target_dir],
check=True,
)
except Exception as error:
raise exception.SysinvException(
"Error checkout ostree commit: %s" % (error),
)

View File

@ -24,6 +24,8 @@ class ExtractFiles(base.BaseLoadImport):
if os_version == constants.OS_CENTOS:
self._extract_centos_playbooks(load_version, target_dir)
elif os_version == constants.OS_DEBIAN:
self._extract_debian_playbooks(load_version, target_dir)
def _extract_centos_playbooks(self, load_version, target_dir):
package_name = "playbookconfig"
@ -48,3 +50,14 @@ class ExtractFiles(base.BaseLoadImport):
for file_name in file_names:
file_path = os.path.join(source_dir, file_name)
shutil.move(file_path, target_dir)
def _extract_debian_playbooks(self, load_version, target_dir):
ostree_repo = "/var/www/pages/feed/rel-%s/ostree_repo/" % load_version
repo_commit = utils.get_ostree_commit(ostree_repo)
if not repo_commit:
raise exception.SysinvException(
"Commit ostree not found for repo: %s" % ostree_repo
)
utils.checkout_ostree(ostree_repo, repo_commit, target_dir, subpath=PLAYBOOKS_PATH)

View File

@ -335,3 +335,81 @@ class TestCommonUtils(base.TestCase):
)
self.assertTrue(mock_subprocess.method_calls)
@mock.patch("sysinv.common.utils.subprocess")
def test_get_ostree_commit(self, mock_subprocess):
commit = "c1bb601e1dc78b4a1ad7b687badd16edeb5ca59e28413902d1b3"
refs_return = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="starlingx",
stderr=None,
)
commit_return = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="""
commit c1bb601e1dc78b4a1ad7b687badd16edeb5ca59e28413902d1b3
ContentChecksum: 4aacd1c71b056f8e28a8be27c508f21f62afba955
Date: 2022-12-18 18:55:09 +0000
Commit-id: starlingx-intel-x86-64-20221218185325
""",
stderr=None,
)
mock_subprocess.run.side_effect = [
refs_return,
commit_return,
]
result = utils.get_ostree_commit("/tmp/ostree_repo")
self.assertTrue(mock_subprocess.method_calls)
self.assertEqual(result, commit)
@mock.patch("sysinv.common.utils.subprocess")
def test_get_ostree_commit_without_commit(self, mock_subprocess):
refs_return = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="starlingx",
stderr=None,
)
commit_return = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="No metadata header found",
stderr=None,
)
mock_subprocess.run.side_effect = [
refs_return,
commit_return,
]
result = utils.get_ostree_commit("/tmp/ostree_repo")
self.assertTrue(mock_subprocess.method_calls)
self.assertIsNone(result)
@mock.patch("sysinv.common.utils.subprocess")
def test_get_ostree_commit_exception(self, mock_subprocess):
mock_subprocess.CalledProcessError = \
subprocess.CalledProcessError
mock_subprocess.run.side_effect = \
subprocess.CalledProcessError(1, "Generic error")
self.assertRaises(
exception.SysinvException,
utils.get_ostree_commit,
"/tmp/ostree_repo",
)
self.assertTrue(mock_subprocess.method_calls)

View File

@ -17,6 +17,11 @@ class TestExtractFiles(base.TestCase):
self.mock_subprocess.return_value = mock.MagicMock()
self.addCleanup(subprocess_patch.stop)
os_patch = \
mock.patch("sysinv.loads.extract_files.os", mock.MagicMock())
self.mock_os = os_patch.start()
self.addCleanup(os_patch.stop)
self.plugin = ExtractFiles()
@ -31,11 +36,6 @@ class TestExtractFilesCentos(TestExtractFiles):
self.mock_utils_patch.listdir.return_value = ["playbookconfig"]
self.addCleanup(utils_patch.stop)
os_patch = \
mock.patch("sysinv.loads.extract_files.os", mock.MagicMock())
self.mock_os = os_patch.start()
self.addCleanup(os_patch.stop)
shutil_patch = \
mock.patch("sysinv.loads.extract_files.shutil", mock.MagicMock())
self.mock_shutil = shutil_patch.start()
@ -77,3 +77,129 @@ class TestExtractFilesCentos(TestExtractFiles):
self.assertTrue(self.mock_os.method_calls)
self.assertTrue(self.mock_subprocess.method_calls)
self.assertFalse(self.mock_shutil.method_calls)
@mock.patch.object(utils, "get_os_target", lambda x: constants.OS_DEBIAN)
class TestExtractFilesDebian(TestExtractFiles):
def test_extract_files_debian(self):
refs = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="starlingx",
stderr=None,
)
commit = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="""
commit c1bb601e1dc78b4a1ad7b687badd16edeb5ca59e28413902d1b3
ContentChecksum: 4aacd1c71b056f8e28a8be27c508f21f62afba955
Date: 2022-12-18 18:55:09 +0000
Commit-id: starlingx-intel-x86-64-20221218185325
""",
stderr=None,
)
result = subprocess.CompletedProcess(
args="",
returncode=0,
stdout=None,
stderr=None,
)
self.mock_subprocess.run.side_effect = [
refs,
commit,
result,
]
self.plugin.extract_files("1.0")
self.assertTrue(self.mock_os.method_calls)
self.assertTrue(self.mock_subprocess.method_calls)
def test_extract_files_debian_without_commit(self):
refs = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="",
stderr=None,
)
commit = subprocess.CompletedProcess(
args="",
returncode=1,
stdout="Usage: ostree log [OPTION...] REF",
stderr=None,
)
self.mock_subprocess.run.side_effect = [
refs,
commit,
]
self.assertRaises(
exception.SysinvException,
self.plugin.extract_files,
"1.0",
)
self.assertTrue(self.mock_os.method_calls)
self.assertTrue(self.mock_subprocess.method_calls)
def test_extract_files_debian_get_commit_error(self):
self.mock_subprocess.CalledProcessError = \
subprocess.CalledProcessError
self.mock_subprocess.run.side_effect = \
subprocess.CalledProcessError(1, "Generic error")
self.assertRaises(
exception.SysinvException,
self.plugin.extract_files,
"1.0",
)
self.assertTrue(self.mock_os.method_calls)
self.assertTrue(self.mock_subprocess.method_calls)
def test_extract_files_debian_checkout_commit_error(self):
refs = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="starlingx",
stderr=None,
)
commit = subprocess.CompletedProcess(
args="",
returncode=0,
stdout="""
commit c1bb601e1dc78b4a1ad7b687badd16edeb5ca59e28413902d1b3
ContentChecksum: 4aacd1c71b056f8e28a8be27c508f21f62afba955
Date: 2022-12-18 18:55:09 +0000
Commit-id: starlingx-intel-x86-64-20221218185325
""",
stderr=None,
)
self.mock_subprocess.run.side_effect = [
refs,
commit,
subprocess.CalledProcessError(1, "error: Invalid refspec"),
]
self.mock_subprocess.CalledProcessError = \
subprocess.CalledProcessError
self.assertRaises(
exception.SysinvException,
self.plugin.extract_files,
"1.0",
)
self.assertTrue(self.mock_os.method_calls)
self.assertTrue(self.mock_subprocess.method_calls)