Merge ~jugmac00/lpci:fix-run-clean into lpci:main

Proposed by Jürgen Gmach
Status: Merged
Merged at revision: 96275f5072e76f857f692ae5ae62931bad293248
Proposed branch: ~jugmac00/lpci:fix-run-clean
Merge into: lpci:main
Diff against target: 248 lines (+101/-105)
2 files modified
lpcraft/commands/run.py (+54/-57)
lpcraft/commands/tests/test_run.py (+47/-48)
Reviewer Review Type Date Requested Status
Guruprasad Approve
Review via email: mp+428857@code.launchpad.net

Commit message

Fix `lpcraft run --clean`

To post a comment you must log in.
Revision history for this message
Guruprasad (lgp171188) :
Revision history for this message
Guruprasad (lgp171188) :
review: Approve
Revision history for this message
Jürgen Gmach (jugmac00) wrote :

Thanks for the review!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lpcraft/commands/run.py b/lpcraft/commands/run.py
index 8012ad4..3c31054 100644
--- a/lpcraft/commands/run.py
+++ b/lpcraft/commands/run.py
@@ -634,69 +634,66 @@ class RunCommand(BaseCommand):
634634
635 provider = get_provider()635 provider = get_provider()
636 provider.ensure_provider_is_available()636 provider.ensure_provider_is_available()
637 launched_instances = []
638637
639 secrets = {}638 secrets = {}
640 if args.secrets_file:639 if args.secrets_file:
641 with open(args.secrets_file) as f:640 with open(args.secrets_file) as f:
642 content = f.read()641 content = f.read()
643 secrets = yaml.safe_load(content)642 secrets = yaml.safe_load(content)
644643 for stage in config.pipeline:
645 try:644 stage_failed = False
646 for stage in config.pipeline:645 for job_name in stage:
647 stage_failed = False646 try:
648 for job_name in stage:647 jobs = config.jobs.get(job_name, [])
649 try:648 if not jobs:
650 jobs = config.jobs.get(job_name, [])649 raise CommandError(
651 if not jobs:650 f"No job definition for {job_name!r}"
652 raise CommandError(651 )
653 f"No job definition for {job_name!r}"652 for job_index, job in enumerate(jobs):
654 )653 # we prefer package repositories via CLI more
655 for job_index, job in enumerate(jobs):654 # so they need to come first
656 launched_instances.append(655 # also see sources.list(5)
657 _get_job_instance_name(provider, job)656 package_repositories = args.package_repositories
658 )657 for group in job.package_repositories:
659 # we prefer package repositories via CLI more658 for repository in group.sources_list_lines():
660 # so they need to come first659 package_repositories.append(repository)
661 # also see sources.list(5)660 _run_job(
662 package_repositories = args.package_repositories661 config,
663 for group in job.package_repositories:662 job_name,
664 for repository in group.sources_list_lines():663 job_index,
665 package_repositories.append(repository)664 provider,
666 _run_job(665 args.output_directory,
667 config,666 replace_package_repositories=(
668 job_name,667 args.apt_replace_repositories
669 job_index,668 + args.replace_package_repositories
670 provider,669 ),
671 args.output_directory,670 package_repositories=package_repositories,
672 replace_package_repositories=(671 env_from_cli=args.set_env,
673 args.apt_replace_repositories672 plugin_settings=args.plugin_setting,
674 + args.replace_package_repositories673 secrets=secrets,
675 ),674 )
676 package_repositories=package_repositories,675
677 env_from_cli=args.set_env,676 except CommandError as e:
678 plugin_settings=args.plugin_setting,677 if len(stage) == 1:
679 secrets=secrets,678 # Single-job stage, so just reraise this
680 )679 # in order to get simpler error messages.
681 except CommandError as e:680 raise
682 if len(stage) == 1:681 else:
683 # Single-job stage, so just reraise this682 emit.error(e)
684 # in order to get simpler error messages.683 stage_failed = True
685 raise684 finally:
686 else:685 if args.clean:
687 emit.error(e)686 cwd = Path.cwd()
688 stage_failed = True687 provider.clean_project_environments(
689 if stage_failed:688 project_name=cwd.name,
690 raise CommandError(689 project_path=cwd,
691 f"Some jobs in {stage} failed; stopping.", retcode=1690 instances=[
692 )691 _get_job_instance_name(provider, job),
693 finally:692 ],
694 if args.clean:693 )
695 cwd = Path.cwd()694 if stage_failed:
696 provider.clean_project_environments(695 raise CommandError(
697 project_name=cwd.name,696 f"Some jobs in {stage} failed; stopping.", retcode=1
698 project_path=cwd,
699 instances=launched_instances,
700 )697 )
701 return 0698 return 0
702699
diff --git a/lpcraft/commands/tests/test_run.py b/lpcraft/commands/tests/test_run.py
index e06a28e..93c5fcd 100644
--- a/lpcraft/commands/tests/test_run.py
+++ b/lpcraft/commands/tests/test_run.py
@@ -2113,46 +2113,20 @@ class TestRun(RunBaseTestCase):
2113 expected_instance_names = self.get_instance_names(2113 expected_instance_names = self.get_instance_names(
2114 provider, ("focal", "bionic")2114 provider, ("focal", "bionic")
2115 )2115 )
2116 mock_clean_project_environments.assert_called_with(2116 self.assertEqual(
2117 project_name=self.tmp_project_path.name,2117 mock_clean_project_environments.call_args_list,
2118 project_path=self.tmp_project_path,2118 [
2119 instances=expected_instance_names,2119 call(
2120 )2120 project_name=self.tmp_project_path.name,
21212121 project_path=self.tmp_project_path,
2122 @patch("lpcraft.commands.run.get_provider")2122 instances=[expected_instance_names[0]],
2123 @patch("lpcraft.commands.run.get_host_architecture", return_value="amd64")2123 ),
2124 @patch("lpcraft.providers._lxd.LXDProvider.clean_project_environments")2124 call(
2125 def test_clean_flag_cleans_up_even_when_there_are_errors(2125 project_name=self.tmp_project_path.name,
2126 self,2126 project_path=self.tmp_project_path,
2127 mock_clean_project_environments,2127 instances=[expected_instance_names[1]],
2128 mock_get_host_architecture,2128 ),
2129 mock_get_provider,2129 ],
2130 ):
2131 mock_get_provider.return_value = makeLXDProvider()
2132 # There are no jobs defined. So there will be an error.
2133 config = dedent(
2134 """
2135 pipeline:
2136 - test
2137
2138 jobs: {}
2139 """
2140 )
2141 Path(".launchpad.yaml").write_text(config)
2142
2143 result = self.run_command("run", "--clean")
2144
2145 self.assertThat(
2146 result,
2147 MatchesStructure.byEquality(
2148 exit_code=1,
2149 errors=[CommandError("No job definition for 'test'")],
2150 ),
2151 )
2152 mock_clean_project_environments.assert_called_with(
2153 project_name=self.tmp_project_path.name,
2154 project_path=self.tmp_project_path,
2155 instances=[],
2156 )2130 )
21572131
2158 @patch("lpcraft.commands.run._run_job")2132 @patch("lpcraft.commands.run._run_job")
@@ -2216,10 +2190,25 @@ class TestRun(RunBaseTestCase):
2216 expected_instance_names = self.get_instance_names(2190 expected_instance_names = self.get_instance_names(
2217 provider, ("focal", "bionic", "jammy")2191 provider, ("focal", "bionic", "jammy")
2218 )2192 )
2219 mock_clean_project_environments.assert_called_with(2193 self.assertEqual(
2220 project_name=self.tmp_project_path.name,2194 mock_clean_project_environments.call_args_list,
2221 project_path=self.tmp_project_path,2195 [
2222 instances=expected_instance_names,2196 call(
2197 project_name=self.tmp_project_path.name,
2198 project_path=self.tmp_project_path,
2199 instances=[expected_instance_names[0]],
2200 ),
2201 call(
2202 project_name=self.tmp_project_path.name,
2203 project_path=self.tmp_project_path,
2204 instances=[expected_instance_names[1]],
2205 ),
2206 call(
2207 project_name=self.tmp_project_path.name,
2208 project_path=self.tmp_project_path,
2209 instances=[expected_instance_names[2]],
2210 ),
2211 ],
2223 )2212 )
22242213
2225 @patch("lpcraft.commands.run._run_job")2214 @patch("lpcraft.commands.run._run_job")
@@ -2269,10 +2258,20 @@ class TestRun(RunBaseTestCase):
2269 provider,2258 provider,
2270 ("focal", "bionic"),2259 ("focal", "bionic"),
2271 )2260 )
2272 mock_clean_project_environments.assert_called_with(2261 self.assertEqual(
2273 project_name=self.tmp_project_path.name,2262 mock_clean_project_environments.call_args_list,
2274 project_path=self.tmp_project_path,2263 [
2275 instances=expected_instance_names,2264 call(
2265 project_name=self.tmp_project_path.name,
2266 project_path=self.tmp_project_path,
2267 instances=[expected_instance_names[0]],
2268 ),
2269 call(
2270 project_name=self.tmp_project_path.name,
2271 project_path=self.tmp_project_path,
2272 instances=[expected_instance_names[1]],
2273 ),
2274 ],
2276 )2275 )
22772276
2278 @patch("lpcraft.commands.run.get_provider")2277 @patch("lpcraft.commands.run.get_provider")

Subscribers

People subscribed via source and target branches