qontract-reconcile 0.10.1rc823__py3-none-any.whl → 0.10.1rc825__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.1rc823
3
+ Version: 0.10.1rc825
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
@@ -438,7 +438,7 @@ reconcile/skupper_network/models.py,sha256=DNTI7HZv-rqY42GIIxyRuvroHLvdH6rJerjIq
438
438
  reconcile/skupper_network/reconciler.py,sha256=XS-1oKBr_1l3dYUAVqUH6gCHg1G5ZuOfY_7fgGVAiFA,9996
439
439
  reconcile/skupper_network/site_controller.py,sha256=A3K-62BjJ5HiFVydV0ouGoD1NwrO7XhAH15BHAcS9fk,1550
440
440
  reconcile/statuspage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
441
- reconcile/statuspage/atlassian.py,sha256=odYbYX8l3oST7AYm66Q4MiaxSbvDzsqEO6VBYJggxkc,17420
441
+ reconcile/statuspage/atlassian.py,sha256=5awxH9ovbtgis_N4aabBvrlo2ZyLNLaO6ezIYDgVq0Y,18571
442
442
  reconcile/statuspage/integration.py,sha256=hsazrQMceJbr61nEkJLxJbHhudTGtFuH0mlCo66-2ug,711
443
443
  reconcile/statuspage/page.py,sha256=WHDwV2PXEo4WwI2EgPOkS6j_T7geZEDXTgSaqpDo75U,5101
444
444
  reconcile/statuspage/state.py,sha256=HD9EOoKm_nEqCMLIwW809En3cq5VhyzKJPUbsh-bae8,1617
@@ -539,7 +539,7 @@ reconcile/test/test_terraform_tgw_attachments.py,sha256=rHZHUtDxewpKsRj3nfm2bZ2J
539
539
  reconcile/test/test_terraform_users.py,sha256=XOAfGvITCJPI1LTlISmHbA4ONMQMkxYUMTsny7pQCFw,4319
540
540
  reconcile/test/test_terraform_vpc_peerings.py,sha256=ubcsKh0TrUIwuI1-W3ETIgzsFvzAyeoFmEJFC-IK6JY,20538
541
541
  reconcile/test/test_terraform_vpc_peerings_build_desired_state.py,sha256=DAfpb12I0PlqnuVUHK2vh4LH4d1OylT3H2GE_3TGZZI,47852
542
- reconcile/test/test_three_way_diff_strategy.py,sha256=2fjEqE2w4pIzKq18PRcADTSe01aGwsZfMGloU8xfNaE,3346
542
+ reconcile/test/test_three_way_diff_strategy.py,sha256=0QY2hzOrTVnQxDFbdOJBOIIHEKKOA5RmGftT0QXABeY,3697
543
543
  reconcile/test/test_utils_jinja2.py,sha256=TpzQlpFnLGzNEZp5WOh0o7AuBiGEktqO4MuwiiJW2YY,3895
544
544
  reconcile/test/test_vault_replication.py,sha256=wlc4jm9f8P641UvvxIFFFc5_unJysNkOVrKJscjhQr0,16867
545
545
  reconcile/test/test_vault_utils.py,sha256=vbJnc89XAuE07qbTuWxHM5o9F6R9SO5aHXA38fwxT7A,1122
@@ -654,7 +654,7 @@ reconcile/utils/oc_connection_parameters.py,sha256=85slrnDigYwYmzhyceVkMElWzFArp
654
654
  reconcile/utils/oc_filters.py,sha256=R2Lf3fo0jQCeE62Ygeo_KN24XbAosq0QbjimYG6qHI4,1402
655
655
  reconcile/utils/oc_map.py,sha256=nT69J5pdPeIDnIYjD9fwY6GkE3BMQCf-AF0rmHJuUNw,9068
656
656
  reconcile/utils/ocm_base_client.py,sha256=X8qkPXfpfJdBKBtFv7zyGD33HNAEBJL8owf-ykrt-Ts,6469
657
- reconcile/utils/openshift_resource.py,sha256=Gxhc3oyYDCfMix7RDVvNAZX9O1bQII0KAjGsC5pu7oA,24831
657
+ reconcile/utils/openshift_resource.py,sha256=l5VLvwZ1LRi3l8InMdJS0oc1w5juhgwpWD2Yg7rXubc,24763
658
658
  reconcile/utils/openssl.py,sha256=QVvhzhpChq_4Daf_5wE1qeZJr4thg3DDjJPn4bOPD4E,365
659
659
  reconcile/utils/output.py,sha256=I_kXYyPcN1mlZmX16ZnLNGkhhwnal640GIdIaGJd4wE,2026
660
660
  reconcile/utils/pagerduty_api.py,sha256=fcSAUez6w51woDvbm0plJW2qSw6_NXQs1Fit_KTNitc,7653
@@ -679,7 +679,7 @@ reconcile/utils/structs.py,sha256=LcbLEg8WxfRqM6nW7NhcWN0YeqF7SQzxOgntmLs1SgY,35
679
679
  reconcile/utils/template.py,sha256=wTvRU4AnAV_o042tD4Mwls2dwWMuk7MKnde3MaCjaYg,331
680
680
  reconcile/utils/terraform_client.py,sha256=mZEKpu6nbfiQd60wRkc8-5sljBTUTOgaAKnF89itMzU,32085
681
681
  reconcile/utils/terrascript_aws_client.py,sha256=VlvIHgrZRiMFVgx6a8ZHxoiJoDwqbtOmsZFnwwNrdL0,273199
682
- reconcile/utils/three_way_diff_strategy.py,sha256=nyqeQsLCoPI6e16k2CF3b9KNgQLU-rPf5RtfdUfVMwE,4468
682
+ reconcile/utils/three_way_diff_strategy.py,sha256=nnTk4VDex1GIEqryFVfATU1AeRwzXyoPl_FX6zzmRFI,4643
683
683
  reconcile/utils/throughput.py,sha256=iP4UWAe2LVhDo69mPPmgo9nQ7RxHD6_GS8MZe-aSiuM,344
684
684
  reconcile/utils/vault.py,sha256=AYGG5aDJ7CSVhTFdZowfEg3iSQWenoAt676aGjHQMX8,14978
685
685
  reconcile/utils/vaultsecretref.py,sha256=3Ed2uBy36TzSvL0B-l4FoWQqB2SbBKDKEuUPIO608Bo,931
@@ -811,8 +811,8 @@ tools/test/test_app_interface_metrics_exporter.py,sha256=SX7qL3D1SIRKFo95FoQztvf
811
811
  tools/test/test_qontract_cli.py,sha256=_D61RFGAN5x44CY1tYbouhlGXXABwYfxKSWSQx3Jrss,4941
812
812
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
813
813
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
814
- qontract_reconcile-0.10.1rc823.dist-info/METADATA,sha256=BZQWX3LX2zeeorNJTNU98S3I_tQ-5Uj3YTxrECoi25g,2314
815
- qontract_reconcile-0.10.1rc823.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
816
- qontract_reconcile-0.10.1rc823.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
817
- qontract_reconcile-0.10.1rc823.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
818
- qontract_reconcile-0.10.1rc823.dist-info/RECORD,,
814
+ qontract_reconcile-0.10.1rc825.dist-info/METADATA,sha256=nGrMqUI3wHpzTSQEQryBhjGLr_ABZ4pd5zx0TOp4F_8,2314
815
+ qontract_reconcile-0.10.1rc825.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
816
+ qontract_reconcile-0.10.1rc825.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
817
+ qontract_reconcile-0.10.1rc825.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
818
+ qontract_reconcile-0.10.1rc825.dist-info/RECORD,,
@@ -56,9 +56,9 @@ class AtlassianRawMaintenance(BaseModel):
56
56
  scheduled_until: str
57
57
  incident_updates: list[AtlassianRawMaintenanceUpdate]
58
58
  components: list[AtlassianRawComponent]
59
- auto_transition_deliver_notifications_at_end: bool
60
- auto_transition_deliver_notifications_at_start: bool
61
- scheduled_remind_prior: bool
59
+ auto_transition_deliver_notifications_at_end: Optional[bool]
60
+ auto_transition_deliver_notifications_at_start: Optional[bool]
61
+ scheduled_remind_prior: Optional[bool]
62
62
 
63
63
 
64
64
  class AtlassianAPI:
@@ -301,8 +301,15 @@ class AtlassianStatusPageProvider:
301
301
 
302
302
  # component status
303
303
  desired_component_status = desired.desired_component_status()
304
- status_update_required = desired_component_status is not None and (
305
- not current or desired_component_status != current.status
304
+ active_maintenance_affecting_component = [
305
+ m
306
+ for m in self.active_maintenances
307
+ if desired.display_name in [c.name for c in m.components]
308
+ ]
309
+ status_update_required = (
310
+ desired_component_status is not None
311
+ and (not current or desired_component_status != current.status)
312
+ and not active_maintenance_affecting_component
306
313
  )
307
314
 
308
315
  # shortcut execution if there is nothing to do
@@ -326,7 +333,7 @@ class AtlassianStatusPageProvider:
326
333
  component_id=current_component.id,
327
334
  )
328
335
 
329
- # validte the component and check if the current state needs to be updated
336
+ # validate the component and check if the current state needs to be updated
330
337
  needs_update = self.should_apply(desired, current_component)
331
338
  if not needs_update:
332
339
  return
@@ -456,12 +463,26 @@ class AtlassianStatusPageProvider:
456
463
  ]
457
464
 
458
465
  def create_maintenance(self, maintenance: StatusMaintenance) -> None:
466
+ component_ids: list[str] = []
467
+ for sc in maintenance.components:
468
+ current_component, _ = self.lookup_component(sc)
469
+ if current_component:
470
+ component_ids.append(current_component.id)
459
471
  data = {
460
472
  "name": maintenance.name,
461
473
  "status": "scheduled",
462
474
  "scheduled_for": maintenance.schedule_start,
463
475
  "scheduled_until": maintenance.schedule_end,
464
476
  "body": maintenance.message,
477
+ "scheduled_remind_prior": maintenance.announcements.remind_subscribers,
478
+ "scheduled_auto_transition": True,
479
+ "scheduled_auto_in_progress": True,
480
+ "scheduled_auto_completed": True,
481
+ "component_ids": component_ids,
482
+ "auto_transition_to_maintenance_state": True,
483
+ "auto_transition_to_operational_state": True,
484
+ "auto_transition_deliver_notifications_at_start": maintenance.announcements.notify_subscribers_on_start,
485
+ "auto_transition_deliver_notifications_at_end": maintenance.announcements.notify_subscribers_on_completion,
465
486
  }
466
487
  incident_id = self._api.create_incident(data)
467
488
  self._bind_component(
@@ -109,3 +109,13 @@ def test_3wpd_change_empty_env_value_should_not_apply(deployment):
109
109
  ]
110
110
 
111
111
  assert three_way_diff_using_hash(c_item, d_item) is True
112
+
113
+
114
+ def test_3wpd_diff_detects_missing_annotation(deployment):
115
+ d_item = OR(deployment, "", "")
116
+ d_item.body["metadata"]["annotations"]["new-annotation"] = "test-value"
117
+ c_item = d_item.annotate(canonicalize=False)
118
+
119
+ del c_item.body["metadata"]["annotations"]["new-annotation"]
120
+
121
+ assert three_way_diff_using_hash(c_item, d_item) is False
@@ -17,7 +17,6 @@ from pydantic import BaseModel
17
17
  from reconcile.utils.metrics import GaugeMetric
18
18
 
19
19
  SECRET_MAX_KEY_LENGTH = 253
20
- LAC_ANNOTATION = "kubectl.kubernetes.io/last-applied-configuration"
21
20
 
22
21
 
23
22
  class ResourceKeyExistsError(Exception):
@@ -20,6 +20,8 @@ NORMALIZE_COMPARE_EXCLUDED_ATTRS = {
20
20
  "managedFields",
21
21
  "namespace",
22
22
  }
23
+ K8S_ANNOTATION_LAC = "kubectl.kubernetes.io/last-applied-configuration"
24
+ NORMALIZE_IGNORE_ANNOTATIONS = QONTRACT_ANNOTATIONS | {K8S_ANNOTATION_LAC}
23
25
 
24
26
 
25
27
  def _normalize_secret(secret: OR) -> None:
@@ -59,9 +61,9 @@ def normalize_object(item: OR) -> OR:
59
61
  validate_k8s_object=False,
60
62
  )
61
63
 
62
- annotations = n.body.get("annotations", {})
64
+ annotations = n.body.get("metadata", {}).get("annotations", {})
63
65
  metadata["annotations"] = {
64
- k: v for k, v in annotations.items() if k not in QONTRACT_ANNOTATIONS
66
+ k: v for k, v in annotations.items() if k not in NORMALIZE_IGNORE_ANNOTATIONS
65
67
  }
66
68
 
67
69
  # Run normalizers on Kinds with special needs