qontract-reconcile 0.10.1rc591__py3-none-any.whl → 0.10.1rc593__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.1rc591
3
+ Version: 0.10.1rc593
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
@@ -118,8 +118,8 @@ reconcile/terraform_vpc_peerings.py,sha256=rnDH1u93OyzrBM8Hib0HwSnlxZtx4ScRQaZAc
118
118
  reconcile/vault_replication.py,sha256=79GZ_kCimPoQcxkdhkWTQxPOAa46E0mNhf05s_Mk5so,17385
119
119
  reconcile/vpc_peerings_validator.py,sha256=Kv22HJVlTW9l9GB2eXwjPWqdDbr_VuvQBNPttox6s5o,7177
120
120
  reconcile/aus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
- reconcile/aus/advanced_upgrade_service.py,sha256=DQ9FrphzhKsKaXbXeA2v3Qsg1ABXXEtPhD-R-FwUsBA,21007
122
- reconcile/aus/aus_label_source.py,sha256=X6FD4NYcX27llMUSmmBcCh-pG7U5FnBd0zl-0zwCj2U,4118
121
+ reconcile/aus/advanced_upgrade_service.py,sha256=PkVcXBMrveW5euvqjEBO4e5-9KDb_6hszLI2GrWpx2w,21378
122
+ reconcile/aus/aus_label_source.py,sha256=qoP8Fgxuu1tCuhG6ixCWve7Ll-KD6a79E2uLAmC0ifw,4184
123
123
  reconcile/aus/base.py,sha256=Qdktz7W7J9TWVCYJZHwyKoIf4sVI7W9o_WwzsOBxLfQ,44912
124
124
  reconcile/aus/cluster_version_data.py,sha256=j4UyEBi5mQuvPq5Lo7a_L_0blxvH790wJV07uAiikFU,7126
125
125
  reconcile/aus/metrics.py,sha256=fIew-rzi_kYuI5Gxn3-4bQVIr2oNibiKPyGnhB-xKU4,3538
@@ -174,8 +174,8 @@ reconcile/gql_definitions/acs/acs_instances.py,sha256=L91WW9LbhJbBSrECqShQpFtjoB
174
174
  reconcile/gql_definitions/acs/acs_policies.py,sha256=Z6Z7duvS9W4cbciBED4oK40Vg9QyYti3zXvoEXM-fak,4422
175
175
  reconcile/gql_definitions/acs/acs_rbac.py,sha256=cZsIlCWliPQdQHgmBsIMx54fJNOtkdRXLzmOKZmJNHk,3009
176
176
  reconcile/gql_definitions/advanced_upgrade_service/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
- reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py,sha256=2-OnknXDUI2pnZknEmjzMPBXUpWStoE32lpQQStobao,4221
178
- reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py,sha256=0gcgv4CoKJ_5DJoIIj0JuytFOyq8HVn4wJyG_iEMH_Q,3219
177
+ reconcile/gql_definitions/advanced_upgrade_service/aus_clusters.py,sha256=z-duZbkMLU1B7P7PSzjUQYVOr2ccP6rvpQLjgzHCj-4,4244
178
+ reconcile/gql_definitions/advanced_upgrade_service/aus_organization.py,sha256=_H8jhf_kzFj5AWa8auawXIwFmrQw3a1RK6MOi4qQ6zA,3242
179
179
  reconcile/gql_definitions/app_interface_metrics_exporter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
180
180
  reconcile/gql_definitions/app_interface_metrics_exporter/onboarding_status.py,sha256=uVEEqU6YYmKsNTo6EWlFnoVmqha2rvBDx-wiD64VmG0,1679
181
181
  reconcile/gql_definitions/aws_ami_cleanup/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -204,7 +204,7 @@ reconcile/gql_definitions/common/app_interface_repo_settings.py,sha256=rud0rz9NI
204
204
  reconcile/gql_definitions/common/app_interface_state_settings.py,sha256=VXIK0Hmyv6GTShI86IGkjxyHGwufqUBAh617XKUAKaI,2507
205
205
  reconcile/gql_definitions/common/app_interface_vault_settings.py,sha256=w8quvdG0cSq71ZyJokPPp7MyMpoDb6-HLQ3o9JHVGRQ,1771
206
206
  reconcile/gql_definitions/common/aws_vpcs.py,sha256=Dss9dQ3xagnz3Ltg1e9mtG2PAmQGBbUzKCmmzvuN28s,1892
207
- reconcile/gql_definitions/common/clusters.py,sha256=p2OCl7LDBilR8hWOwHLxj8qhjA9RU54NDXZBdFJ-Kk0,22764
207
+ reconcile/gql_definitions/common/clusters.py,sha256=b9RLeV4H-y1aAPotySaid6IMT6-jPNE1smu70eSDYH4,23201
208
208
  reconcile/gql_definitions/common/clusters_minimal.py,sha256=yZpjS9qWyusCEiWtD8wzf0tak298uQyxiN4lC6KNo4s,4475
209
209
  reconcile/gql_definitions/common/clusters_with_peering.py,sha256=7ORLr469qEmsqescriARsZrJyQaB0JOFP6UVVlFWfk0,11548
210
210
  reconcile/gql_definitions/common/github_orgs.py,sha256=rZ0pDAA2_9hF9N-ykRZIxPtEmczTSjuA_k3nkp0k1W0,2039
@@ -243,7 +243,7 @@ reconcile/gql_definitions/fragments/resource_requests_requirements.py,sha256=TFK
243
243
  reconcile/gql_definitions/fragments/resource_values.py,sha256=-N2lNRhWp8PgocmIeX3U9f3l90Q97N2lXoq1pXdb_LE,742
244
244
  reconcile/gql_definitions/fragments/saas_target_namespace.py,sha256=y4hA73Vchi3I1UW94r7CmecZe6KoHkCMEVuoiAF2xnc,3660
245
245
  reconcile/gql_definitions/fragments/terraform_state.py,sha256=S5QuTR9YlvUObiU7hevS9ybxZEssWoRGqCR9YtGwePs,1024
246
- reconcile/gql_definitions/fragments/upgrade_policy.py,sha256=QrHCYqeBX8I9FrRK78KIlTAIYo9ijJZtdQn4ODiuWW4,1155
246
+ reconcile/gql_definitions/fragments/upgrade_policy.py,sha256=cVza8zfra1E3yBsHiS-hKbys17fvv572GFnKshJjluE,1246
247
247
  reconcile/gql_definitions/fragments/user.py,sha256=84RGYYSYnZmyrwHlCX89-EgAu7UaLFOTMQXobmHCfz8,939
248
248
  reconcile/gql_definitions/fragments/vault_secret.py,sha256=8xoQJNx1jKw_1yradq1iLEYWzuOHra1bEHHU7WHKxqo,833
249
249
  reconcile/gql_definitions/gitlab_members/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -437,7 +437,7 @@ reconcile/test/test_openshift_resources_base.py,sha256=LtlR9x3o7KkSEw0JN0fZhinFe
437
437
  reconcile/test/test_openshift_saas_deploy.py,sha256=YLJGkc--u5aP0UkQ-b9ZGEFGS2gw25jjcSgknQdI3Ic,5892
438
438
  reconcile/test/test_openshift_saas_deploy_change_tester.py,sha256=1yVe54Hx9YdVjn6qdnKge5Sa_s732c-8uZqCnuT1gGI,12871
439
439
  reconcile/test/test_openshift_tekton_resources.py,sha256=RtRWsdm51S13OSkENC9nY_rOH0QELSCaO5tjF0XqIDI,11222
440
- reconcile/test/test_openshift_upgrade_watcher.py,sha256=na5Q5l88c0ZHMh82gvNpYheoMOAzEZRG0ZvzzDhafYE,7100
440
+ reconcile/test/test_openshift_upgrade_watcher.py,sha256=0GDQ_YFHIX8DbkbDYSuLv9uZeeg4NwP1vlOqvSaZvN4,7183
441
441
  reconcile/test/test_prometheus_rules_tester.py,sha256=Qc9J4k0lSVie361lGr_cOy0EaBTD5LDqGZf7CYVFKr8,5677
442
442
  reconcile/test/test_quay_membership.py,sha256=e29Giz5S9ckFgjpTO8PBo8qVPocIQmy4WqsRhgTFd9A,2643
443
443
  reconcile/test/test_quay_mirror.py,sha256=UBLQDtet5WkWnh98ev5cI3yAflQl07awg2dXTefqoUk,6311
@@ -534,7 +534,7 @@ reconcile/typed_queries/terraform_tgw_attachments/aws_accounts.py,sha256=T5HSeyB
534
534
  reconcile/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
535
535
  reconcile/utils/aggregated_list.py,sha256=pkYoBj7WwmaNgEefETqEOFTnQMcUzHE3mdsVdzGYj60,3372
536
536
  reconcile/utils/amtool.py,sha256=JV5-to_e_FaIcvJWTKYA9d6L3LwzwijM0MjUWn83eD4,2204
537
- reconcile/utils/aws_api.py,sha256=gB0rBj40oDyt7Z1d9EVNIsF1E0CViQpN6vbl9AlzCos,68612
537
+ reconcile/utils/aws_api.py,sha256=Wy040GBQ3HrWmtxe1QAx3zl1I3phVDVjXEx_OITEcOw,69191
538
538
  reconcile/utils/aws_helper.py,sha256=E8NHkStoHRmvLVjRll2f5kGtU3i3f7ekp5V6nrn7B_M,1691
539
539
  reconcile/utils/binary.py,sha256=3IBnwjKakHM367skPPvG6yVSQYjKt5muQlFNdoa63DU,2352
540
540
  reconcile/utils/config.py,sha256=aId5zrPjM_84u_T4yTRE_Psu3zo5-5_JCR6_7Wgv5UQ,990
@@ -682,7 +682,7 @@ tools/app_interface_metrics_exporter.py,sha256=zkwkxdAUAxjdc-pzx2_oJXG25fo0Fnyd5
682
682
  tools/app_interface_reporter.py,sha256=upA-J-n-HXHKVDINRuMR7vTt-iJvQORKUVi9D3leQto,17738
683
683
  tools/glitchtip_access_reporter.py,sha256=oPBnk_YoDuljU3v0FaChzOwwnk4vap1xEE67QEjzdqs,2948
684
684
  tools/glitchtip_access_revalidation.py,sha256=8kbBJk04mkq28kWoRDDkfCGIF3GRg3pJrFAh1sW0dbk,2821
685
- tools/qontract_cli.py,sha256=KWZz7eO-GeO_37bx4_rjJVKiq3VcuSheLBCr5-FwNFI,107516
685
+ tools/qontract_cli.py,sha256=X6F63x-1m7iuPvnrxRqkav3ZUaU-tC4fmaouhVGy1TQ,107850
686
686
  tools/sd_app_sre_alert_report.py,sha256=e9vAdyenUz2f5c8-z-5WY0wv-SJ9aePKDH2r4IwB6pc,5063
687
687
  tools/cli_commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
688
688
  tools/cli_commands/gpg_encrypt.py,sha256=w8hl4jIEWk5wKbEFN6fVEOwUJGmdlvOqYodW3XSN7mU,4978
@@ -693,8 +693,8 @@ tools/test/test_app_interface_metrics_exporter.py,sha256=SX7qL3D1SIRKFo95FoQztvf
693
693
  tools/test/test_qontract_cli.py,sha256=OvalpVRfY4pNmpMaWHHYqBjV68b1eGQjX8SCyTAXb1w,3501
694
694
  tools/test/test_sd_app_sre_alert_report.py,sha256=v363r9zM7__0kR5K6mvJoGFcM9BvE33fWAayrqkpojA,2116
695
695
  tools/test/test_sre_checkpoints.py,sha256=SKqPPTl9ua0RFdSSofnoQX-JZE6dFLO3LRhfQzqtfh8,2607
696
- qontract_reconcile-0.10.1rc591.dist-info/METADATA,sha256=DqTA90B8RVSkuAVNCozScXLowFwyT2wVkm0p8K3hxdY,2349
697
- qontract_reconcile-0.10.1rc591.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
698
- qontract_reconcile-0.10.1rc591.dist-info/entry_points.txt,sha256=rTjAv28I_CHLM8ID3OPqMI_suoQ9s7tFbim4aYjn9kk,376
699
- qontract_reconcile-0.10.1rc591.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
700
- qontract_reconcile-0.10.1rc591.dist-info/RECORD,,
696
+ qontract_reconcile-0.10.1rc593.dist-info/METADATA,sha256=Lfkt4RPQCrWJAcp1p0WBo6W__DgrMYySGwnLQTWNFUw,2349
697
+ qontract_reconcile-0.10.1rc593.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
698
+ qontract_reconcile-0.10.1rc593.dist-info/entry_points.txt,sha256=rTjAv28I_CHLM8ID3OPqMI_suoQ9s7tFbim4aYjn9kk,376
699
+ qontract_reconcile-0.10.1rc593.dist-info/top_level.txt,sha256=l5ISPoXzt0SdR4jVdkfa7RPSKNc8zAHYWAnR-Dw8Ey8,24
700
+ qontract_reconcile-0.10.1rc593.dist-info/RECORD,,
@@ -364,6 +364,9 @@ class ClusterUpgradePolicyLabelSet(BaseModel):
364
364
  mutexes: Optional[CSV] = Field(alias=aus_label_key("mutexes"))
365
365
  sector: Optional[str] = Field(alias=aus_label_key("sector"))
366
366
  blocked_versions: Optional[CSV] = Field(alias=aus_label_key("blocked-versions"))
367
+ version_gate_approvals: Optional[CSV] = Field(
368
+ alias=aus_label_key("version-gate-approvals")
369
+ )
367
370
  _schedule_validator = validator("schedule", allow_reuse=True)(cron_validator)
368
371
 
369
372
  def build_labels_dict(self) -> dict[str, str]:
@@ -388,6 +391,7 @@ def build_cluster_upgrade_policy_label_set(
388
391
  mutexes: Optional[list[str]] = None,
389
392
  sector: Optional[str] = None,
390
393
  blocked_versions: Optional[list[str]] = None,
394
+ version_gate_approvals: Optional[list[str]] = None,
391
395
  ) -> ClusterUpgradePolicyLabelSet:
392
396
  return ClusterUpgradePolicyLabelSet(**{
393
397
  aus_label_key("workloads"): ",".join(workloads),
@@ -398,6 +402,9 @@ def build_cluster_upgrade_policy_label_set(
398
402
  aus_label_key("blocked-versions"): ",".join(blocked_versions)
399
403
  if blocked_versions
400
404
  else None,
405
+ aus_label_key("version-gate-approvals"): ",".join(version_gate_approvals)
406
+ if version_gate_approvals
407
+ else None,
401
408
  })
402
409
 
403
410
 
@@ -410,6 +417,7 @@ def _build_policy_from_labels(labels: LabelContainer) -> ClusterUpgradePolicyV1:
410
417
  policy_labelset = build_labelset(labels, ClusterUpgradePolicyLabelSet)
411
418
  return ClusterUpgradePolicyV1(
412
419
  workloads=policy_labelset.workloads,
420
+ versionGateApprovals=policy_labelset.version_gate_approvals,
413
421
  schedule=policy_labelset.schedule,
414
422
  conditions=ClusterUpgradePolicyConditionsV1(
415
423
  soakDays=policy_labelset.soak_days,
@@ -52,6 +52,7 @@ class AUSClusterUpgradePolicyLabelSource(LabelSource):
52
52
  mutexes=policy.conditions.mutexes,
53
53
  sector=policy.conditions.sector,
54
54
  blocked_versions=policy.conditions.blocked_versions,
55
+ version_gate_approvals=policy.version_gate_approvals,
55
56
  ).build_labels_dict()
56
57
 
57
58
 
@@ -84,6 +84,7 @@ fragment AUSOCMOrganization on OpenShiftClusterManager_v1 {
84
84
  fragment ClusterUpgradePolicyV1 on ClusterUpgradePolicy_v1 {
85
85
  workloads
86
86
  schedule
87
+ versionGateApprovals
87
88
  conditions {
88
89
  mutexes
89
90
  soakDays
@@ -83,6 +83,7 @@ fragment AUSOCMOrganization on OpenShiftClusterManager_v1 {
83
83
  fragment ClusterUpgradePolicyV1 on ClusterUpgradePolicy_v1 {
84
84
  workloads
85
85
  schedule
86
+ versionGateApprovals
86
87
  conditions {
87
88
  mutexes
88
89
  soakDays
@@ -62,6 +62,7 @@ fragment AWSVPC on AWSVPC_v1 {
62
62
  fragment ClusterUpgradePolicyV1 on ClusterUpgradePolicy_v1 {
63
63
  workloads
64
64
  schedule
65
+ versionGateApprovals
65
66
  conditions {
66
67
  mutexes
67
68
  soakDays
@@ -186,7 +187,13 @@ query Clusters($name: String) {
186
187
  availability_zones
187
188
  oidc_endpoint_url
188
189
  account {
190
+ name
189
191
  uid
192
+ terraformUsername
193
+ automationToken {
194
+ ... VaultSecret
195
+ }
196
+ resourcesDefaultRegion
190
197
  rosa {
191
198
  ocm_environments {
192
199
  ocm {
@@ -473,7 +480,11 @@ class RosaOcmSpecV1(ConfiguredBaseModel):
473
480
 
474
481
 
475
482
  class ClusterSpecROSAV1_AWSAccountV1(ConfiguredBaseModel):
483
+ name: str = Field(..., alias="name")
476
484
  uid: str = Field(..., alias="uid")
485
+ terraform_username: Optional[str] = Field(..., alias="terraformUsername")
486
+ automation_token: VaultSecret = Field(..., alias="automationToken")
487
+ resources_default_region: str = Field(..., alias="resourcesDefaultRegion")
477
488
  rosa: Optional[RosaOcmSpecV1] = Field(..., alias="rosa")
478
489
 
479
490
 
@@ -34,4 +34,5 @@ class ClusterUpgradePolicyConditionsV1(ConfiguredBaseModel):
34
34
  class ClusterUpgradePolicyV1(ConfiguredBaseModel):
35
35
  workloads: list[str] = Field(..., alias="workloads")
36
36
  schedule: str = Field(..., alias="schedule")
37
+ version_gate_approvals: Optional[list[str]] = Field(..., alias="versionGateApprovals")
37
38
  conditions: ClusterUpgradePolicyConditionsV1 = Field(..., alias="conditions")
@@ -8,13 +8,14 @@ import pytest
8
8
  from reconcile import openshift_upgrade_watcher as ouw
9
9
  from reconcile.gql_definitions.common.clusters import ClusterV1
10
10
  from reconcile.test.fixtures import Fixtures
11
+ from reconcile.utils.models import data_default_none
11
12
 
12
13
  fxt = Fixtures("openshift_upgrade_watcher")
13
14
 
14
15
 
15
16
  def load_cluster(path: str) -> ClusterV1:
16
17
  content = fxt.get_anymarkup(path)
17
- return ClusterV1(**content)
18
+ return ClusterV1(**data_default_none(ClusterV1, content))
18
19
 
19
20
 
20
21
  @pytest.fixture
@@ -50,6 +50,7 @@ if TYPE_CHECKING:
50
50
  )
51
51
  from mypy_boto3_iam import IAMClient
52
52
  from mypy_boto3_iam.type_defs import AccessKeyMetadataTypeDef
53
+ from mypy_boto3_organizations import OrganizationsClient
53
54
  from mypy_boto3_rds import RDSClient
54
55
  from mypy_boto3_rds.type_defs import (
55
56
  DBInstanceMessageTypeDef,
@@ -70,7 +71,9 @@ else:
70
71
  FilterTypeDef
71
72
  ) = Route53Client = ResourceRecordSetTypeDef = ResourceRecordTypeDef = (
72
73
  HostedZoneTypeDef
73
- ) = RDSClient = DBInstanceMessageTypeDef = UpgradeTargetTypeDef = object
74
+ ) = RDSClient = DBInstanceMessageTypeDef = UpgradeTargetTypeDef = (
75
+ OrganizationsClient
76
+ ) = object
74
77
 
75
78
 
76
79
  class InvalidResourceTypeError(Exception):
@@ -350,6 +353,12 @@ class AWSApi: # pylint: disable=too-many-public-methods
350
353
  session = self.get_session(account_name)
351
354
  return self.get_session_client(session, "logs", region_name)
352
355
 
356
+ def _account_organizations_client(
357
+ self, account_name: str, region_name: Optional[str] = None
358
+ ) -> OrganizationsClient:
359
+ session = self.get_session(account_name)
360
+ return self.get_session_client(session, "organizations", region_name)
361
+
353
362
  def init_users(self):
354
363
  self.users = {}
355
364
  for account, s in self.sessions.items():
@@ -1729,6 +1738,10 @@ class AWSApi: # pylint: disable=too-many-public-methods
1729
1738
  return versions[0]["ValidUpgradeTarget"]
1730
1739
  return []
1731
1740
 
1741
+ def get_organization_billing_account(self, account_name: str) -> str:
1742
+ org = self._account_organizations_client(account_name)
1743
+ return org.describe_organization()["Organization"]["MasterAccountId"]
1744
+
1732
1745
 
1733
1746
  def aws_config_file_path() -> Optional[str]:
1734
1747
  config_file_path = os.path.expanduser(
tools/qontract_cli.py CHANGED
@@ -1309,9 +1309,17 @@ def rosa_create_cluster_command(ctx, cluster_name):
1309
1309
  print("must be a rosa cluster.")
1310
1310
  sys.exit(1)
1311
1311
 
1312
+ settings = queries.get_app_interface_settings()
1313
+ account = cluster.spec.account
1314
+ with AWSApi(
1315
+ 1, [account.dict(by_alias=True)], settings=settings, init_users=False
1316
+ ) as aws_api:
1317
+ billing_account = aws_api.get_organization_billing_account(account.name)
1318
+
1312
1319
  print(
1313
1320
  " ".join([
1314
1321
  "rosa create cluster",
1322
+ f"--billing-account {billing_account}",
1315
1323
  f"--cluster-name {cluster.name}",
1316
1324
  "--sts",
1317
1325
  ("--private" if cluster.spec.private else ""),