qontract-reconcile 0.10.1rc869__py3-none-any.whl → 0.10.1rc871__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.1rc869
3
+ Version: 0.10.1rc871
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
@@ -39,11 +39,11 @@ reconcile/gitlab_permissions.py,sha256=1tFZws0-prcJ7vhFF3N7BxKocc16SjJuoqCkzRFES
39
39
  reconcile/gitlab_projects.py,sha256=K3tFf_aD1W4Ijp5q-9Qek3kwFGEWPcZ1kd7tzFJ4GyQ,1781
40
40
  reconcile/integrations_manager.py,sha256=J_VV-HINI7YNav2NPIolePZkll-7VBuBXWAyMNhsM_Q,9535
41
41
  reconcile/jenkins_base.py,sha256=0Gocu3fU2YTltaxBlbDQOUvP-7CP2OSQV1ZRwtWeVXw,875
42
- reconcile/jenkins_job_builder.py,sha256=8mcvvkPvcgw0hZnYTcuh9P-ltSHwqg8zihXh7oxGuzI,3957
42
+ reconcile/jenkins_job_builder.py,sha256=XNwEkC688eAUQg8Yd69hZSByvSTmUaIXnZ-1R8LEF94,3521
43
43
  reconcile/jenkins_job_builds_cleaner.py,sha256=ksO5TXHxIMV_SF8kO86Wz7qGnYwbdt10wdhpb4aaEyQ,3851
44
44
  reconcile/jenkins_job_cleaner.py,sha256=dQGInds5RV-s9caec0212GveZ32xlCi2HiPyrIkVyFM,1761
45
45
  reconcile/jenkins_roles.py,sha256=f8ELpZY36UjoaCpR_9LijQuIMuB6a7sVLFf_H1ct9Hc,4460
46
- reconcile/jenkins_webhooks.py,sha256=j8vhJMWcRhOdc9XzRSm0CPj84jsF3e4Syjm7r1BIsDE,1978
46
+ reconcile/jenkins_webhooks.py,sha256=K5h0OlCghoHlpot40IRq4BuezfKB1rj4Xk0dCUvqp3o,1952
47
47
  reconcile/jenkins_webhooks_cleaner.py,sha256=JsN_NVPfZJwv1JtSzZXDIHUqGiefL-DRffFnDGau9aY,1539
48
48
  reconcile/jenkins_worker_fleets.py,sha256=PMNGOX0krubFjInPiFT0za0KCiWBLEcVDuXdKRd1BrE,5378
49
49
  reconcile/jira_permissions_validator.py,sha256=iDsFdGqB8Zv9cjIVgYFq_N3xtRCrcR5uAZmcc51D-2o,13240
@@ -94,7 +94,7 @@ reconcile/quay_mirror.py,sha256=9NzbNoxl-NdD8CwImcXNG5xTdHmUJxBfeVk5XHH41J8,1488
94
94
  reconcile/quay_mirror_org.py,sha256=Oq-t3kSkgfeSAOUDjLCDRBeEvOIEBacfX38qrX_s0oc,10801
95
95
  reconcile/quay_permissions.py,sha256=9KOutS1w4RFQqkvMSy54VtsKNx56-phzP6yI_rEW-B8,4244
96
96
  reconcile/quay_repos.py,sha256=cuEYG0HUe0ut5yvLdEwOF5-CmccpXQHRb_wDazvDrvQ,6895
97
- reconcile/queries.py,sha256=dzg1HlbYYbV-UIpEuHVRpgm65q4B5zkF2EK4qhHWqrI,50839
97
+ reconcile/queries.py,sha256=CAHgFEUMSLOX_fZcHja10D53VKHZdWSUL9sUgNsFmYo,51272
98
98
  reconcile/query_validator.py,sha256=BAjGrU8_VhzTOv5k0-uz0hY9ziZyconv8VAhgre1Auc,1497
99
99
  reconcile/requests_sender.py,sha256=914iluuF4UVgG3VyxxtnHOu4yf6YKS2fIy6PViSsFTQ,3875
100
100
  reconcile/resource_scraper.py,sha256=vo1N9vLJCYWvXlTwFRIpEuWjx_39ZV9zxJlpoPq4g3U,2330
@@ -240,7 +240,7 @@ reconcile/gql_definitions/common/app_interface_dms_settings.py,sha256=h-N7-XGpmH
240
240
  reconcile/gql_definitions/common/app_interface_repo_settings.py,sha256=rud0rz9NIFF-h1fFdk3MnwGmx73rhwrn1taN_HefvyU,1754
241
241
  reconcile/gql_definitions/common/app_interface_state_settings.py,sha256=VXIK0Hmyv6GTShI86IGkjxyHGwufqUBAh617XKUAKaI,2507
242
242
  reconcile/gql_definitions/common/app_interface_vault_settings.py,sha256=w8quvdG0cSq71ZyJokPPp7MyMpoDb6-HLQ3o9JHVGRQ,1771
243
- reconcile/gql_definitions/common/aws_vpc_requests.py,sha256=7i9t4R2hoF9NQaFXUjTmMxXDTcDKrUNDen0mQA0bFgY,2278
243
+ reconcile/gql_definitions/common/aws_vpc_requests.py,sha256=2lpyy-QSfHPSTvV_zbnqzqUoFzVNl-CJDmoqd_zVSX4,2366
244
244
  reconcile/gql_definitions/common/aws_vpcs.py,sha256=Dss9dQ3xagnz3Ltg1e9mtG2PAmQGBbUzKCmmzvuN28s,1892
245
245
  reconcile/gql_definitions/common/clusters.py,sha256=lIBA_wgwOTdcQgkFJ7EU23e9mlln-7WgstB_2psxZA4,21624
246
246
  reconcile/gql_definitions/common/clusters_minimal.py,sha256=JYrJV_aStmryiiGKyiXhj47qpF_8KilCqy-d9CofBCo,4635
@@ -285,7 +285,7 @@ reconcile/gql_definitions/fragments/aws_account_managed.py,sha256=zXbux0Bb7QZ37f
285
285
  reconcile/gql_definitions/fragments/aws_account_sso.py,sha256=ITR3PLz4Iq1SiWAoYGWPDuHJnAmTyZ0QQqs2Zsi8pxA,979
286
286
  reconcile/gql_definitions/fragments/aws_infra_management_account.py,sha256=uAmALVRF2gBM3p_Dmez_ew6KVAtetamwOPkRIPZAlGc,1254
287
287
  reconcile/gql_definitions/fragments/aws_vpc.py,sha256=T2egTwi2Rb0IRBBmsyag8xKpu_m6GbIAy80fhZNZwk8,1434
288
- reconcile/gql_definitions/fragments/aws_vpc_request.py,sha256=HgFg6MGxKg_FwbWT6SV11hY2aMitO2ieLYb-NL2n2_Q,2102
288
+ reconcile/gql_definitions/fragments/aws_vpc_request.py,sha256=o0qUsPrFXs8GAbtgMXQmIJxc1mw5skSIzCcidE857g8,2460
289
289
  reconcile/gql_definitions/fragments/aws_vpc_request_subnet.py,sha256=qaTFT8cGzEslw51nUeb45Nfnv6kFxUm4CWrRR3xfBvA,760
290
290
  reconcile/gql_definitions/fragments/deplopy_resources.py,sha256=0u3xYqL5NpMf149BJLfPhHqAOWu06aLULdNk_2Mulxg,1089
291
291
  reconcile/gql_definitions/fragments/disable.py,sha256=Ojw98OSxcovrtmw_aAyhaVHhIa1MSUbBfKX4i2IpI74,715
@@ -809,7 +809,7 @@ tools/app_interface_metrics_exporter.py,sha256=zkwkxdAUAxjdc-pzx2_oJXG25fo0Fnyd5
809
809
  tools/app_interface_reporter.py,sha256=upA-J-n-HXHKVDINRuMR7vTt-iJvQORKUVi9D3leQto,17738
810
810
  tools/glitchtip_access_reporter.py,sha256=oPBnk_YoDuljU3v0FaChzOwwnk4vap1xEE67QEjzdqs,2948
811
811
  tools/glitchtip_access_revalidation.py,sha256=8kbBJk04mkq28kWoRDDkfCGIF3GRg3pJrFAh1sW0dbk,2821
812
- tools/qontract_cli.py,sha256=y6Okq0KPRKXx8glu4g3GeDavtoosH8iqwy5YZMV8cwc,118517
812
+ tools/qontract_cli.py,sha256=GsODNjSs-1TP7U0JjHxYhF-9XWZe3cCk-rj7osApLr4,120445
813
813
  tools/sd_app_sre_alert_report.py,sha256=e9vAdyenUz2f5c8-z-5WY0wv-SJ9aePKDH2r4IwB6pc,5063
814
814
  tools/template_validation.py,sha256=-U-lTGeLaci8yWPEblCJeev2DOlY1jM9QOOh-O1zts8,3376
815
815
  tools/cli_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -837,8 +837,8 @@ tools/test/test_app_interface_metrics_exporter.py,sha256=SX7qL3D1SIRKFo95FoQztvf
837
837
  tools/test/test_qontract_cli.py,sha256=_D61RFGAN5x44CY1tYbouhlGXXABwYfxKSWSQx3Jrss,4941
838
838
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
839
839
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
840
- qontract_reconcile-0.10.1rc869.dist-info/METADATA,sha256=geTr8-qfS2A6C1-lBsxjSlUZLA5SGrxsm8RgJkSCnsY,2273
841
- qontract_reconcile-0.10.1rc869.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
842
- qontract_reconcile-0.10.1rc869.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
843
- qontract_reconcile-0.10.1rc869.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
844
- qontract_reconcile-0.10.1rc869.dist-info/RECORD,,
840
+ qontract_reconcile-0.10.1rc871.dist-info/METADATA,sha256=-LgSP8TnH7lS6H7ovYlSq3-sogHwbHk9t9qNKgjJxEY,2273
841
+ qontract_reconcile-0.10.1rc871.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
842
+ qontract_reconcile-0.10.1rc871.dist-info/entry_points.txt,sha256=GKQqCl2j2X1BJQ69een6rHcR26PmnxnONLNOQB-nRjY,491
843
+ qontract_reconcile-0.10.1rc871.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
844
+ qontract_reconcile-0.10.1rc871.dist-info/RECORD,,
@@ -47,6 +47,12 @@ fragment VPCRequest on VPCRequest_v1 {
47
47
  terraformState {
48
48
  ...TerraformState
49
49
  }
50
+ enableDeletion
51
+ deletionApprovals {
52
+ type
53
+ name
54
+ expiration
55
+ }
50
56
  }
51
57
  region
52
58
  cidr_block {
@@ -27,6 +27,12 @@ class ConfiguredBaseModel(BaseModel):
27
27
  extra=Extra.forbid
28
28
 
29
29
 
30
+ class DeletionApprovalV1(ConfiguredBaseModel):
31
+ q_type: str = Field(..., alias="type")
32
+ name: str = Field(..., alias="name")
33
+ expiration: str = Field(..., alias="expiration")
34
+
35
+
30
36
  class AWSAccountV1(ConfiguredBaseModel):
31
37
  name: str = Field(..., alias="name")
32
38
  uid: str = Field(..., alias="uid")
@@ -36,6 +42,8 @@ class AWSAccountV1(ConfiguredBaseModel):
36
42
  resources_default_region: str = Field(..., alias="resourcesDefaultRegion")
37
43
  provider_version: str = Field(..., alias="providerVersion")
38
44
  terraform_state: Optional[TerraformState] = Field(..., alias="terraformState")
45
+ enable_deletion: Optional[bool] = Field(..., alias="enableDeletion")
46
+ deletion_approvals: Optional[list[DeletionApprovalV1]] = Field(..., alias="deletionApprovals")
39
47
 
40
48
 
41
49
  class NetworkV1(ConfiguredBaseModel):
@@ -7,7 +7,6 @@ from typing import (
7
7
  )
8
8
 
9
9
  from reconcile import queries
10
- from reconcile.utils import gql
11
10
  from reconcile.utils.defer import defer
12
11
  from reconcile.utils.jjb_client import JJB
13
12
  from reconcile.utils.secret_reader import (
@@ -16,46 +15,14 @@ from reconcile.utils.secret_reader import (
16
15
  )
17
16
  from reconcile.utils.state import init_state
18
17
 
19
- QUERY = """
20
- {
21
- jenkins_configs: jenkins_configs_v1 {
22
- name
23
- app {
24
- name
25
- }
26
- instance {
27
- name
28
- serverUrl
29
- token {
30
- path
31
- field
32
- version
33
- format
34
- }
35
- deleteMethod
36
- }
37
- type
38
- config
39
- config_path {
40
- content
41
- }
42
- }
43
- }
44
- """
45
-
46
18
  QONTRACT_INTEGRATION = "jenkins-job-builder"
47
19
  GENERATE_TYPE = ["jobs", "views"]
48
20
 
49
21
 
50
- def get_jenkins_configs():
51
- gqlapi = gql.get_api()
52
- return gqlapi.query(QUERY)["jenkins_configs"]
53
-
54
-
55
22
  def collect_configs(
56
23
  instance_name: Optional[str], config_name: Optional[str]
57
24
  ) -> list[dict[str, Any]]:
58
- configs = get_jenkins_configs()
25
+ configs = queries.get_jenkins_configs()
59
26
  if instance_name is not None:
60
27
  configs = [n for n in configs if n["instance"]["name"] == instance_name]
61
28
  if not configs:
@@ -3,10 +3,7 @@ import logging
3
3
  from typing import Any
4
4
 
5
5
  from reconcile import queries
6
- from reconcile.jenkins_job_builder import (
7
- get_jenkins_configs,
8
- init_jjb,
9
- )
6
+ from reconcile.jenkins_job_builder import init_jjb
10
7
  from reconcile.utils.defer import defer
11
8
  from reconcile.utils.gitlab_api import GitLabApi
12
9
  from reconcile.utils.jjb_client import JJB
@@ -62,5 +59,5 @@ def run(dry_run, defer=None):
62
59
 
63
60
  def early_exit_desired_state(*args, **kwargs) -> dict[str, Any]:
64
61
  return {
65
- "jenkins_configs": get_jenkins_configs(),
62
+ "jenkins_configs": queries.get_jenkins_configs(),
66
63
  }
reconcile/queries.py CHANGED
@@ -2793,3 +2793,36 @@ BLACKBOX_EXPORTER_MONITORING_PROVIDER = """
2793
2793
  def get_blackbox_exporter_monitoring_provider() -> dict:
2794
2794
  gqlapi = gql.get_api()
2795
2795
  return gqlapi.query(BLACKBOX_EXPORTER_MONITORING_PROVIDER)["providers"]
2796
+
2797
+
2798
+ JENKINS_CONFIGS = """
2799
+ {
2800
+ jenkins_configs: jenkins_configs_v1 {
2801
+ name
2802
+ app {
2803
+ name
2804
+ }
2805
+ instance {
2806
+ name
2807
+ serverUrl
2808
+ token {
2809
+ path
2810
+ field
2811
+ version
2812
+ format
2813
+ }
2814
+ deleteMethod
2815
+ }
2816
+ type
2817
+ config
2818
+ config_path {
2819
+ content
2820
+ }
2821
+ }
2822
+ }
2823
+ """
2824
+
2825
+
2826
+ def get_jenkins_configs():
2827
+ gqlapi = gql.get_api()
2828
+ return gqlapi.query(JENKINS_CONFIGS)["jenkins_configs"]
tools/qontract_cli.py CHANGED
@@ -2712,6 +2712,76 @@ def systems_and_tools(ctx):
2712
2712
  print_output(ctx.obj["options"], inventory.data, inventory.columns)
2713
2713
 
2714
2714
 
2715
+ @get.command
2716
+ @click.pass_context
2717
+ def jenkins_jobs(ctx):
2718
+ jenkins_configs = queries.get_jenkins_configs()
2719
+
2720
+ # stats dicts
2721
+ apps = {}
2722
+ totals = {"rhel8": 0, "other": 0}
2723
+
2724
+ for jc in jenkins_configs:
2725
+ app_name = jc["app"]["name"]
2726
+
2727
+ if app_name not in apps:
2728
+ apps[app_name] = {"rhel8": 0, "other": 0}
2729
+
2730
+ config = json.loads(jc["config"]) if jc["config"] else []
2731
+ for c in config:
2732
+ if "project" not in c:
2733
+ continue
2734
+
2735
+ project = c["project"]
2736
+ root_node = project.get("node") or ""
2737
+ if "jobs" not in project:
2738
+ continue
2739
+
2740
+ for pj in project["jobs"]:
2741
+ for job in pj.values():
2742
+ node = job["node"] if "node" in job else root_node
2743
+ if node == "rhel8":
2744
+ apps[app_name]["rhel8"] += 1
2745
+ totals["rhel8"] += 1
2746
+ else:
2747
+ apps[app_name]["other"] += 1
2748
+ totals["other"] += 1
2749
+
2750
+ results = [
2751
+ {"app": app} | stats
2752
+ for app, stats in sorted(apps.items(), key=lambda i: i[0].lower())
2753
+ if not (stats["other"] == 0 and stats["rhel8"] == 0)
2754
+ ]
2755
+ results.append({"app": "TOTALS"} | totals)
2756
+
2757
+ if ctx.obj["options"]["output"] == "md":
2758
+ json_table = {
2759
+ "filter": True,
2760
+ "fields": [
2761
+ {"key": "app"},
2762
+ {"key": "other"},
2763
+ {"key": "rhel8"},
2764
+ ],
2765
+ "items": results,
2766
+ }
2767
+
2768
+ print(
2769
+ f"""
2770
+ You can view the source of this Markdown to extract the JSON data.
2771
+
2772
+ {len(results)} apps with Jenkins jobs
2773
+
2774
+ ```json:table
2775
+ {json.dumps(json_table)}
2776
+ ```
2777
+ """
2778
+ )
2779
+ else:
2780
+ columns = ["app", "other", "rhel8"]
2781
+ ctx.obj["options"]["sort"] = False
2782
+ print_output(ctx.obj["options"], results, columns)
2783
+
2784
+
2715
2785
  @root.group(name="set")
2716
2786
  @output
2717
2787
  @click.pass_context