qontract-reconcile 0.10.2.dev6__py3-none-any.whl → 0.10.2.dev8__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.4
2
2
  Name: qontract-reconcile
3
- Version: 0.10.2.dev6
3
+ Version: 0.10.2.dev8
4
4
  Summary: Collection of tools to reconcile services with their desired state as defined in the app-interface DB.
5
5
  Project-URL: homepage, https://github.com/app-sre/qontract-reconcile
6
6
  Project-URL: repository, https://github.com/app-sre/qontract-reconcile
@@ -35,7 +35,7 @@ reconcile/gitlab_labeler.py,sha256=4xJHmVX155fclrHqkR926sL1GH6RTN5XfZ8PnqNXbRA,4
35
35
  reconcile/gitlab_members.py,sha256=MUIgYDLeJx2-_vMypyq2Pa17cpKdXATYhtVACS2ghpQ,8297
36
36
  reconcile/gitlab_mr_sqs_consumer.py,sha256=O46mdziPgGOndbU-0_UJKJVUaiEoVzJPEgKm4_UvYoI,2571
37
37
  reconcile/gitlab_owners.py,sha256=sn9njaKOtqcvnhi2qtm-faAfAR4zNqflbSuusA9RUuI,13456
38
- reconcile/gitlab_permissions.py,sha256=6ZBPnQci4-1LVJBvaUS-c0QwIJjITNKVflCeH-Y5Lbk,7507
38
+ reconcile/gitlab_permissions.py,sha256=hJ1KNrWGD8dM5ozELxUqKKFvHFP1yfUZKO4e3dZ_NwM,8092
39
39
  reconcile/gitlab_projects.py,sha256=K3tFf_aD1W4Ijp5q-9Qek3kwFGEWPcZ1kd7tzFJ4GyQ,1781
40
40
  reconcile/integrations_manager.py,sha256=gvOhVklJDeMPURxLjV30Q4hnLET3BZ-NeEEtQBoo_E0,9500
41
41
  reconcile/jenkins_base.py,sha256=0Gocu3fU2YTltaxBlbDQOUvP-7CP2OSQV1ZRwtWeVXw,875
@@ -199,9 +199,9 @@ reconcile/external_resources/aws.py,sha256=NSaOeHqFEcMaMxNjJwuQZosolgsJ8XRVvwkEE
199
199
  reconcile/external_resources/factories.py,sha256=TyJMaijDfPIFYks9i6dhKN7nSR1BoCkoBs1iPExKpcE,5493
200
200
  reconcile/external_resources/integration.py,sha256=gBVO5dE8JyZ3xYcYik-MTIp_18oU7_hpYc_oztyfElQ,6753
201
201
  reconcile/external_resources/integration_secrets_sync.py,sha256=dX09O3r6KURziUYYfiki10orNjOGVma-XojhVqd0ww4,1667
202
- reconcile/external_resources/manager.py,sha256=T3z-IEjjr8DpNbnqyzJnnXrdkBksCFcepL6py2U9t-c,15909
202
+ reconcile/external_resources/manager.py,sha256=eVaaGCaKDkc897xt5cA5-B4yYuS9VWR-Z7Uom0uSsG0,15971
203
203
  reconcile/external_resources/meta.py,sha256=noaytFzmShpzLA_ebGh7wuP45mOfHIOnnoUxivjDa1I,672
204
- reconcile/external_resources/metrics.py,sha256=8MZgNtNZzIRSYTX97KEUIUTETZBhitULzWxbShGyMO8,3193
204
+ reconcile/external_resources/metrics.py,sha256=KiBjMUaN_z0cSkF_7Ar_a8RiuiwVqjyMcVdISlxhzXE,3898
205
205
  reconcile/external_resources/model.py,sha256=YJylbAhetN9szpLUFd9jFqxCRMvSWXVxSC9OMQNV-wg,11316
206
206
  reconcile/external_resources/reconciler.py,sha256=K9QvbQCIOCuOHnPIxQE_P_jFtrkF3dGo8d_cCCh08Ys,8973
207
207
  reconcile/external_resources/secrets_sync.py,sha256=H8JfI3JW1XEau1jqv15AhYg49mCZeHwZmqMzMv_6tFc,16344
@@ -766,7 +766,7 @@ tools/saas_promotion_state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
766
766
  tools/saas_promotion_state/saas_promotion_state.py,sha256=5LJ9rygZ304vxfsIuRfuxueoYRb72EZNKKITEcJ4Mtk,3908
767
767
  tools/sre_checkpoints/__init__.py,sha256=CDaDaywJnmRCLyl_NCcvxi-Zc0hTi_3OdwKiFOyS39I,145
768
768
  tools/sre_checkpoints/util.py,sha256=zEDbGr18ZeHNQwW8pUsr2JRjuXIPz--WAGJxZo9sv_Y,894
769
- qontract_reconcile-0.10.2.dev6.dist-info/METADATA,sha256=XH6LW3B3BM4fyIy9urLw7UrTe-exQ-INWXszkQNnXhk,24664
770
- qontract_reconcile-0.10.2.dev6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
771
- qontract_reconcile-0.10.2.dev6.dist-info/entry_points.txt,sha256=JniHZPadNOILPyfSl0LF2YSp3Db7K2_W2CN7i9f3Gos,540
772
- qontract_reconcile-0.10.2.dev6.dist-info/RECORD,,
769
+ qontract_reconcile-0.10.2.dev8.dist-info/METADATA,sha256=Q7bA9-IZt-P1nmshnv22D4iHqrAq7N03KD5__iEgMyA,24664
770
+ qontract_reconcile-0.10.2.dev8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
771
+ qontract_reconcile-0.10.2.dev8.dist-info/entry_points.txt,sha256=JniHZPadNOILPyfSl0LF2YSp3Db7K2_W2CN7i9f3Gos,540
772
+ qontract_reconcile-0.10.2.dev8.dist-info/RECORD,,
@@ -357,12 +357,14 @@ class ExternalResourcesManager:
357
357
  if reconciliation_status.resource_status.needs_secret_sync:
358
358
  to_sync_keys.add(r.key)
359
359
 
360
- if self._resource_needs_reconciliation(reconciliation=r, state=state):
360
+ if is_reconciled := self._resource_needs_reconciliation(
361
+ reconciliation=r, state=state
362
+ ):
361
363
  self.reconciler.reconcile_resource(reconciliation=r)
362
364
  self._set_resource_reconciliation_in_progress(r, state)
363
365
 
364
366
  if spec := self.er_inventory.get(r.key):
365
- publish_metrics(r, spec, reconciliation_status)
367
+ publish_metrics(r, spec, reconciliation_status, is_reconciled)
366
368
 
367
369
  pending_sync_keys = self.state_mgr.get_keys_by_status(
368
370
  ResourceStatus.PENDING_SECRET_SYNC
@@ -23,6 +23,14 @@ class ExternalResourcesBaseMetric(BaseModel):
23
23
  job_name: str
24
24
 
25
25
 
26
+ class ExternalResourcesReconciliationsCounter(
27
+ ExternalResourcesBaseMetric, CounterMetric
28
+ ):
29
+ @classmethod
30
+ def name(cls) -> str:
31
+ return "external_resources_reconciliations"
32
+
33
+
26
34
  class ExternalResourcesReconcileErrorsCounter(
27
35
  ExternalResourcesBaseMetric, CounterMetric
28
36
  ):
@@ -49,6 +57,7 @@ def publish_metrics(
49
57
  r: Reconciliation,
50
58
  spec: ExternalResourceSpec,
51
59
  reconciliation_status: ReconciliationStatus,
60
+ is_reconciled: bool,
52
61
  ) -> None:
53
62
  job_name = ReconciliationK8sJob(reconciliation=r).name()
54
63
 
@@ -93,3 +102,16 @@ def publish_metrics(
93
102
  job_name=job_name,
94
103
  )
95
104
  )
105
+
106
+ if is_reconciled:
107
+ metrics.inc_counter(
108
+ ExternalResourcesReconciliationsCounter(
109
+ app=spec.namespace["app"]["name"],
110
+ environment=spec.namespace["environment"]["name"],
111
+ provision_provider=r.key.provision_provider,
112
+ provisioner_name=r.key.provisioner_name,
113
+ provider=r.key.provider,
114
+ identifier=r.key.identifier,
115
+ job_name=job_name,
116
+ )
117
+ )
@@ -90,6 +90,13 @@ class GroupPermissionHandler:
90
90
  desired_state: dict[str, GroupSpec],
91
91
  current_state: dict[str, GroupSpec],
92
92
  ) -> None:
93
+ # gather list of app-interface managed repos
94
+ managed_repos: set[str] = set()
95
+ instance = queries.get_gitlab_instance()
96
+ for project_request in instance.get("projectRequests", []):
97
+ for r in project_request.get("projects", []):
98
+ managed_repos.add(f"{instance['url']}/{project_request['group']}/{r}")
99
+
93
100
  # get the diff data
94
101
  diff_data = diff_mappings(
95
102
  current=current_state,
@@ -100,6 +107,11 @@ class GroupPermissionHandler:
100
107
  errors: list[Exception] = []
101
108
  for repo in diff_data.add:
102
109
  project = self.gl.get_project(repo)
110
+ if not project and repo in managed_repos:
111
+ logging.info(
112
+ f"New app-interface managed repository {repo} hasn't been created yet - skipping"
113
+ )
114
+ continue
103
115
  if not self.can_share_project(project):
104
116
  errors.append(
105
117
  GroupAccessLevelError(