qontract-reconcile 0.10.1rc1114__py3-none-any.whl → 0.10.1rc1116__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qontract-reconcile
3
- Version: 0.10.1rc1114
3
+ Version: 0.10.1rc1116
4
4
  Summary: Collection of tools to reconcile services with their desired state as defined in the app-interface DB.
5
5
  Home-page: https://github.com/app-sre/qontract-reconcile
6
6
  Author: Red Hat App-SRE Team
@@ -30,7 +30,7 @@ reconcile/github_repo_permissions_validator.py,sha256=dcbXdUx6imjNchjp3pg9-z1i7l
30
30
  reconcile/github_users.py,sha256=nfTq78QRONIfDVj-5O3bD6psllJjzWFnog-EJ1WqFPU,3672
31
31
  reconcile/github_validator.py,sha256=cVTVxJIGR4a1Jz8wrdXEAb_CMpXUzvykVmUURX4cook,917
32
32
  reconcile/gitlab_fork_compliance.py,sha256=5joAIGOOLhHme1ipa7ZQeQkUOVe3dKbRO1wJtTwyNR4,4178
33
- reconcile/gitlab_housekeeping.py,sha256=fgmR_Q-RHchGhYky-Q78f0Wzx4xQ_mk8-0mpDgfFsMI,22193
33
+ reconcile/gitlab_housekeeping.py,sha256=YAzwk7tZDlw918PjokQksqYJQBUkjouhMpDxIwDdTY0,22208
34
34
  reconcile/gitlab_labeler.py,sha256=4xJHmVX155fclrHqkR926sL1GH6RTN5XfZ8PnqNXbRA,4534
35
35
  reconcile/gitlab_members.py,sha256=PrJE9OhDRdGG_gHM_77nQojLb4B18jtUu8DxgLsRS88,8417
36
36
  reconcile/gitlab_mr_sqs_consumer.py,sha256=O46mdziPgGOndbU-0_UJKJVUaiEoVzJPEgKm4_UvYoI,2571
@@ -467,12 +467,12 @@ reconcile/skupper_network/site_controller.py,sha256=FHVJ72h88VUEga4WH-WltkqovddN
467
467
  reconcile/statuspage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
468
468
  reconcile/statuspage/atlassian.py,sha256=41uE77ZeV0M98k_xVmrXUQ33iVG8Lb3TwrWq2pRc84U,18617
469
469
  reconcile/statuspage/integration.py,sha256=hsazrQMceJbr61nEkJLxJbHhudTGtFuH0mlCo66-2ug,711
470
- reconcile/statuspage/page.py,sha256=k2CeosPG3EhTMSD_OFGm7AfDNX7zqWiibhraYqIIklg,5257
470
+ reconcile/statuspage/page.py,sha256=EWzu7rYjS6QJzgjKmfSV5pGmCAzFR3U5HGiN9ytblog,5375
471
471
  reconcile/statuspage/state.py,sha256=wjX9by5Yy7nobxiE-xNhf6GyNwMVATd0O37jBckJm5M,1591
472
472
  reconcile/statuspage/status.py,sha256=5nYtMaxOqMYdM7n_Glss3ZcaPKQe_nUUQKH6xCTE9rI,2741
473
473
  reconcile/statuspage/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
474
474
  reconcile/statuspage/integrations/components.py,sha256=49KHd_E9AdRvcEA6n75q1McZv2LfN-hRsW-WA7dgw9g,2651
475
- reconcile/statuspage/integrations/maintenances.py,sha256=sAFkZ6CvmA5L391SY80igzTktjE8Z4C12Vzcr_9h0xY,4158
475
+ reconcile/statuspage/integrations/maintenances.py,sha256=8vM0cComM1m-VKIW7NrgprZrix-zLta8-muqriEF09o,4310
476
476
  reconcile/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
477
477
  reconcile/templates/aws_access_key_email.j2,sha256=2MUr1ERmyISzKgHqsWYLd-1Wbl-peUa-FsGUS-JLUFc,238
478
478
  reconcile/templates/email.yml.j2,sha256=OZgczNRgXPj2gVYTgwQyHAQrMGu7xp-e4W1rX19GcrU,690
@@ -869,8 +869,8 @@ tools/test/test_qontract_cli.py,sha256=_D61RFGAN5x44CY1tYbouhlGXXABwYfxKSWSQx3Jr
869
869
  tools/test/test_saas_promotion_state.py,sha256=dy4kkSSAQ7bC0Xp2CociETGN-2aABEfL6FU5D9Jl00Y,6056
870
870
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
871
871
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
872
- qontract_reconcile-0.10.1rc1114.dist-info/METADATA,sha256=vn63-28mfgbBR3tbkdYLhiq552vpOX4DGe0LqDP4rZQ,2213
873
- qontract_reconcile-0.10.1rc1114.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
874
- qontract_reconcile-0.10.1rc1114.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
875
- qontract_reconcile-0.10.1rc1114.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
876
- qontract_reconcile-0.10.1rc1114.dist-info/RECORD,,
872
+ qontract_reconcile-0.10.1rc1116.dist-info/METADATA,sha256=FuJrNLTiKxo9O9hatAzIX5lB3r7V_KZNiDDpnB1OuCw,2213
873
+ qontract_reconcile-0.10.1rc1116.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
874
+ qontract_reconcile-0.10.1rc1116.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
875
+ qontract_reconcile-0.10.1rc1116.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
876
+ qontract_reconcile-0.10.1rc1116.dist-info/RECORD,,
@@ -99,7 +99,7 @@ merge_requests_waiting = Gauge(
99
99
  gitlab_token_expiration = Gauge(
100
100
  name="qontract_reconcile_gitlab_token_expiration_days",
101
101
  documentation="Time until personal access tokens expire",
102
- labelnames=["name", "active"],
102
+ labelnames=["name"],
103
103
  )
104
104
 
105
105
 
@@ -557,12 +557,14 @@ def get_app_sre_usernames(gl: GitLabApi) -> set[str]:
557
557
 
558
558
  def publish_access_token_expiration_metrics(gl: GitLabApi) -> None:
559
559
  pats = gl.get_personal_access_tokens()
560
+
560
561
  for pat in pats:
561
- expiration_date = datetime.strptime(pat.expires_at, EXPIRATION_DATE_FORMAT)
562
- days_until_expiration = expiration_date.date() - datetime.now(UTC).date()
563
- gitlab_token_expiration.labels(name=pat.name, active=pat.active).set(
564
- days_until_expiration.days
565
- )
562
+ if pat.active:
563
+ expiration_date = datetime.strptime(pat.expires_at, EXPIRATION_DATE_FORMAT)
564
+ days_until_expiration = expiration_date.date() - datetime.now(UTC).date()
565
+ gitlab_token_expiration.labels(name=pat.name).set(
566
+ days_until_expiration.days
567
+ )
566
568
 
567
569
 
568
570
  def run(dry_run, wait_for_pipeline):
@@ -80,6 +80,7 @@ class StatusPageMaintenancesIntegration(QontractReconcileIntegration[NoParams]):
80
80
  for m in p.maintenances or []
81
81
  if datetime.fromisoformat(m.scheduled_start) > now
82
82
  ]
83
+ desired_state = sorted(desired_state, key=lambda d: d.name)
83
84
  page_provider = AtlassianStatusPageProvider.init_from_page(
84
85
  page=p,
85
86
  token=self.secret_reader.read_secret(p.credentials),
@@ -90,6 +91,7 @@ class StatusPageMaintenancesIntegration(QontractReconcileIntegration[NoParams]):
90
91
  for m in page_provider.scheduled_maintenances
91
92
  if page_provider.has_component_binding_for(m.name)
92
93
  ]
94
+ current_state = sorted(current_state, key=lambda c: c.name)
93
95
  self.reconcile(
94
96
  dry_run=dry_run,
95
97
  desired_state=desired_state,
@@ -146,20 +146,24 @@ class StatusMaintenance(BaseModel):
146
146
  for c in page_components
147
147
  if c.app.name in affected_services
148
148
  ]
149
- if affected_components:
150
- statuspage_announcements = [
151
- StatusMaintenanceAnnouncement.init_from_announcement(
152
- cast(MaintenanceStatuspageAnnouncementV1, m)
153
- )
154
- for m in maintenance.announcements or []
155
- if m.provider == PROVIDER_NAME
156
- ]
157
- else:
158
- statuspage_announcements = [StatusMaintenanceAnnouncement()]
149
+ if not affected_components:
150
+ raise ValueError(
151
+ f"No StatusPage component found for maintenance '{maintenance.name}'"
152
+ f"via apps {affected_services}. Please define at least one StatusPage component."
153
+ )
154
+
155
+ statuspage_announcements = [
156
+ StatusMaintenanceAnnouncement.init_from_announcement(
157
+ cast(MaintenanceStatuspageAnnouncementV1, m)
158
+ )
159
+ for m in maintenance.announcements or []
160
+ if m.provider == PROVIDER_NAME
161
+ ]
159
162
  if len(statuspage_announcements) != 1:
160
163
  raise ValueError(
161
- f"Maintenanace announcements must include exactly one item of provider {PROVIDER_NAME}"
164
+ f"Maintenance announcements must include exactly one item of provider {PROVIDER_NAME}"
162
165
  )
166
+
163
167
  return cls(
164
168
  name=maintenance.name,
165
169
  message=maintenance.message.rstrip("\n"),