Merge ~lofidevops/ols-jenkaas:sn1780-refactor into ols-jenkaas:main

Proposed by David
Status: Merged
Merged at revision: 02c748d30d69c0fe2e9b597ba6e126ebec1490ba
Proposed branch: ~lofidevops/ols-jenkaas:sn1780-refactor
Merge into: ols-jenkaas:main
Diff against target: 163 lines (+77/-55)
1 file modified
olsjenkaas/commands.py (+77/-55)
Reviewer Review Type Date Requested Status
Maximiliano Bertacchini Approve
Review via email: mp+461628@code.launchpad.net

Commit message

Refactor land_proposal

Description of the change

No functional changes. SonarLint complained about the code complexity and I agree.

The major changes are decanting the logic of _run_landing_tests_on_host() and _run_landing_tests_in_container()

To post a comment you must log in.
Revision history for this message
Maximiliano Bertacchini (maxiberta) wrote :

Nice refactor!! Thanks

review: Approve
Revision history for this message
David (lofidevops) :
Revision history for this message
David (lofidevops) wrote :

Guillo confirmed our target (Python 3.6 on Bionic) which supports f-strings.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/olsjenkaas/commands.py b/olsjenkaas/commands.py
2index a6be897..16c689b 100644
3--- a/olsjenkaas/commands.py
4+++ b/olsjenkaas/commands.py
5@@ -483,81 +483,103 @@ class LandApprovedProposal(CommandWithContainer):
6 proposal.setStatus(status='Needs review',
7 revid=proposal.reviewed_revid)
8
9+ def _run_landing_tests_on_host(self, proposal, local_work_dir):
10+
11+ logger.info(f"Running {self.options.setup_cmd}")
12+ if self.run_in_host(
13+ ['cd', local_work_dir, '&&', self.options.setup_cmd]):
14+ logger.error(f"{self.options.setup_cmd} failed.")
15+ raise Rejected("Project setup failed.")
16+
17+ # commit diff right before testing so we can query for
18+ # the right revno, and still have setup command make
19+ # changes
20+ self.commit_proposal(local_work_dir, proposal)
21+
22+ logger.info(f"Running {self.options.test_cmd}")
23+ if self.run_in_host(
24+ ["cd", local_work_dir, "&&", self.options.test_cmd]):
25+ logger.error(f"{self.options.test_cmd} failed")
26+ raise Rejected("Running landing tests failed.")
27+
28+ def _run_landing_tests_in_container(self, proposal, local_work_dir):
29+ mounts, remote_work_dir = self.get_mounts_and_remote(local_work_dir)
30+
31+ logger.info("Creating worker...")
32+ with olsjenkaas.working_directory(local_work_dir):
33+ self.create_worker(self.options.container_name,
34+ mounts=mounts)
35+ logger.info(f"{self.worker.name} setup on top of {self.worker.backing_name}")
36+
37+ logger.info(f"Running {self.options.setup_cmd}")
38+ if self.run_in_container(
39+ ["cd", remote_work_dir, "&&", self.options.setup_cmd],
40+ with_creds=True):
41+ logger.error(f"{self.options.setup_cmd} failed.")
42+ raise Rejected("Project setup failed.")
43+
44+ # commit diff right before testing so we can query for
45+ # the right revno, and still have setup command make
46+ # changes
47+ self.commit_proposal(local_work_dir, proposal)
48+
49+ logger.info(f"Running {self.options.test_cmd}")
50+ if self.run_in_container(
51+ ["cd", remote_work_dir, "&&", self.options.test_cmd]):
52+ logger.error(f"{self.options.test_cmd} failed.")
53+ raise Rejected("Running landing tests failed.")
54+
55 def land_proposal(self, proposal, target_url):
56+ """
57+ Land a proposal (validate, merge, run landing tests, push upstream).
58+ Returns 0 if successful, otherwise 1.
59+ """
60
61- logger.info('Trying to land {}'.format(proposal.web_link))
62+ logger.info(f"Trying to land {proposal.web_link}")
63 try:
64+
65+ # validate proposal
66 if not proposal.commit_message:
67- raise Rejected('A commit message must be set')
68+ raise Rejected("A commit message must be set.")
69 if not launchpad.is_approved(proposal, self.target):
70- raise Rejected('Voting criteria not met')
71+ raise Rejected("Voting criteria not met.")
72+
73+ # prepare merge target
74 local_work_dir = os.path.realpath(self.options.work_dir)
75- logger.info('Getting {}'.format(target_url))
76+ logger.info(f"Getting {target_url}")
77 self.setup_merge_target(local_work_dir, proposal, target_url)
78- logger.info('Merging {}'.format(proposal.web_link))
79- logger.info(
80- 'Approved revision is {}'.format(proposal.reviewed_revid))
81+ logger.info(f"Merging {proposal.web_link}")
82+ logger.info(f"Approved revision is {proposal.reviewed_revid}")
83+
84+ # merge
85 try:
86 merged = self.merge_proposed_branch(local_work_dir, proposal)
87 except errors.CommandError:
88- raise Rejected('Merging failed')
89+ raise Rejected("Merging failed.")
90 if not merged:
91- logger.error('Nothing to merge from {}'.format(
92- proposal.web_link))
93- raise Rejected('There was nothing to merge')
94- mounts, remote_work_dir = self.get_mounts_and_remote(
95- local_work_dir)
96- if self.options.container_name == '':
97+ logger.error(f"Nothing to merge from {proposal.web_link}")
98+ raise Rejected("There was nothing to merge.")
99+
100+ # run landing tests in appropriate environment
101+ if self.options.container_name == "":
102 # no container name specified, run in host
103- logger.info('Running {}'.format(self.options.setup_cmd))
104- if self.run_in_host(
105- ['cd', local_work_dir, '&&', self.options.setup_cmd]):
106- logger.error('{} failed'.format(self.options.setup_cmd))
107- raise Rejected('Project setup failed')
108- # commit diff right before testing so we can query for
109- # the right revno, and still have setup command make
110- # changes
111- self.commit_proposal(local_work_dir, proposal)
112- logger.info('Running {}'.format(self.options.test_cmd))
113- if self.run_in_host(
114- ['cd', local_work_dir, '&&', self.options.test_cmd]):
115- logger.error('{} failed'.format(self.options.test_cmd))
116- raise Rejected('Running landing tests failed')
117+ self._run_landing_tests_on_host(proposal, local_work_dir)
118 else:
119 # run in named container
120- logger.info('Creating worker...')
121- with olsjenkaas.working_directory(local_work_dir):
122- self.create_worker(self.options.container_name,
123- mounts=mounts)
124- logger.info('{} setup on top of {}'.format(
125- self.worker.name, self.worker.backing_name))
126- logger.info('Running {}'.format(self.options.setup_cmd))
127- if self.run_in_container(
128- ['cd', remote_work_dir, '&&', self.options.setup_cmd],
129- with_creds=True):
130- logger.error('{} failed'.format(self.options.setup_cmd))
131- raise Rejected('Project setup failed')
132- # commit diff right before testing so we can query for
133- # the right revno, and still have setup command make
134- # changes
135- self.commit_proposal(local_work_dir, proposal)
136- logger.info('Running {}'.format(self.options.test_cmd))
137- if self.run_in_container(
138- ['cd', remote_work_dir, '&&', self.options.test_cmd]):
139- logger.error('{} failed'.format(self.options.test_cmd))
140- raise Rejected('Running landing tests failed')
141- # merge was already committed, and landing tests passed, so the
142- # only thing left to do is to push the branch upstream
143+ self._run_landing_tests_in_container(proposal, local_work_dir)
144+
145+ # push merged branch upstream
146 self.push_merged_proposal(local_work_dir, proposal, target_url)
147 # FIXME: Once webhooks are used, lp can be trusted to do that (with
148 # some delay), revert this once this has been verified
149 # -- vila 2017-03-30
150- proposal.setStatus(status='Merged')
151- logger.info('{} has landed'.format(proposal.web_link))
152+
153+ proposal.setStatus(status="Merged.")
154+ logger.info(f"{proposal.web_link} has landed.")
155 return 0
156+
157 except Rejected as e:
158- logger.info('{} could not be landed: {}'.format(
159- proposal.web_link, e.reason))
160+ logger.info(f"{proposal.web_link} could not be landed: {e.reason}")
161 self.reject_proposal(proposal, e.reason)
162 return 1
163 finally:

Subscribers

People subscribed via source and target branches