qontract-reconcile 0.10.2.dev197__py3-none-any.whl → 0.10.2.dev199__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.dev197
3
+ Version: 0.10.2.dev199
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
@@ -204,7 +204,7 @@ reconcile/external_resources/integration_secrets_sync.py,sha256=M2uOFi2JXWhiw3hQ
204
204
  reconcile/external_resources/manager.py,sha256=bnGLeQmg7wzTcApgNTDKBTsojuEgOrCYX1QIIS12-ns,18247
205
205
  reconcile/external_resources/meta.py,sha256=noaytFzmShpzLA_ebGh7wuP45mOfHIOnnoUxivjDa1I,672
206
206
  reconcile/external_resources/metrics.py,sha256=KiBjMUaN_z0cSkF_7Ar_a8RiuiwVqjyMcVdISlxhzXE,3898
207
- reconcile/external_resources/model.py,sha256=DDMdk608rsQYfdaYZr77YZLBKW9qgtSLLyVa_FzL5vw,13964
207
+ reconcile/external_resources/model.py,sha256=dhgOsnjoJobF_BGpdbPED2-Rj2g2-lyKUHTP15sFP1Y,14939
208
208
  reconcile/external_resources/reconciler.py,sha256=wB8cB5pmqDJ1_t5_Aly4mrULGnI3OQaKqUZCB_Z9RWw,9573
209
209
  reconcile/external_resources/secrets_sync.py,sha256=ZDxzGZ6wC4zxLhA7-L39xDRH6rzUM285gytuzmRQdlw,16208
210
210
  reconcile/external_resources/state.py,sha256=Hyc3hszY1NFWg3t9QSXL2F5bRs0vP2FNDWzTGrHJsmE,13387
@@ -226,7 +226,7 @@ reconcile/glitchtip_project_alerts/integration.py,sha256=BgMx-NyV9mTuv7Sotb2OioC
226
226
  reconcile/glitchtip_project_dsn/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
227
227
  reconcile/glitchtip_project_dsn/integration.py,sha256=2iugub-kHYkHNK33n0v9_TeWonuxCPah_VkoTPvaajE,8077
228
228
  reconcile/gql_definitions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
- reconcile/gql_definitions/introspection.json,sha256=f7LtPBJlVNfTTlhQjVpp2D6-AF73BqYGoJ3afW8YtJ4,2322856
229
+ reconcile/gql_definitions/introspection.json,sha256=JiCvliRsiUfBN70aVfZ4JcW6qKXRtgHGiVmoWd7B_GI,2327754
230
230
  reconcile/gql_definitions/acs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
231
231
  reconcile/gql_definitions/acs/acs_instances.py,sha256=L91WW9LbhJbBSrECqShQpFtjoBOsmNIYLRpMbx1io5o,2181
232
232
  reconcile/gql_definitions/acs/acs_policies.py,sha256=Ygpfl2-VkYLSlJvHgp_dJBfb66K_Rwfdfpsa18w1v1s,4338
@@ -320,11 +320,11 @@ reconcile/gql_definitions/endpoints_discovery/__init__.py,sha256=47DEQpj8HBSa-_T
320
320
  reconcile/gql_definitions/endpoints_discovery/apps.py,sha256=aBWRAwDUJQ32ghJS4cPQcR9SNl20Fcwd3pxHDB3YJQY,3172
321
321
  reconcile/gql_definitions/external_resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
322
322
  reconcile/gql_definitions/external_resources/aws_accounts.py,sha256=XR69j9dpTQ0gv8y-AZN7AJ0dPvO-wbHscyCDgrax6Bk,2046
323
- reconcile/gql_definitions/external_resources/external_resources_modules.py,sha256=JViHtDWEBwjStBUo_bUdm_sxdpjCHcoATeFvwFRLQpU,3009
324
- reconcile/gql_definitions/external_resources/external_resources_namespaces.py,sha256=vYxUBSx3r9EZI7TCfSTlxKEFKYEUuKxbqTOAlizxApY,45138
325
- reconcile/gql_definitions/external_resources/external_resources_settings.py,sha256=WBkJqnoyYCe1Vimwbp_Pa0RdyTdmWNf6oEWyA749QzA,3589
323
+ reconcile/gql_definitions/external_resources/external_resources_modules.py,sha256=7q-g54eRZI1R9dqsmZFSV7HHvol0CuUJgtYm15iGW5c,3319
324
+ reconcile/gql_definitions/external_resources/external_resources_namespaces.py,sha256=WVr4pyvZYFrN_9QU59Is6xuul_Re155xWoc-t1JXKsI,45449
325
+ reconcile/gql_definitions/external_resources/external_resources_settings.py,sha256=4wK6PBAShQiACVzwUPFVjf9_0_KYUejxoTANS5aSPzo,3588
326
326
  reconcile/gql_definitions/external_resources/fragments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
327
- reconcile/gql_definitions/external_resources/fragments/external_resources_module_overrides.py,sha256=T_qWCRtzU8F9frebBXG9TkeQdrKGt3R9YinSngPoFqM,1262
327
+ reconcile/gql_definitions/external_resources/fragments/external_resources_module_overrides.py,sha256=2uUhr5-6yMczFTJE8t9mXFVADMpNx8QdwkUWTm2Xr3U,1318
328
328
  reconcile/gql_definitions/fleet_labeler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
329
329
  reconcile/gql_definitions/fleet_labeler/fleet_labels.py,sha256=XPk1YFmiCtGlwrldxdABwYaT-wgZdTjpDFHmUnq6xcM,4349
330
330
  reconcile/gql_definitions/fragments/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -337,7 +337,7 @@ reconcile/gql_definitions/fragments/aws_vpc.py,sha256=T2egTwi2Rb0IRBBmsyag8xKpu_
337
337
  reconcile/gql_definitions/fragments/aws_vpc_request.py,sha256=o0qUsPrFXs8GAbtgMXQmIJxc1mw5skSIzCcidE857g8,2460
338
338
  reconcile/gql_definitions/fragments/aws_vpc_request_subnet.py,sha256=qaTFT8cGzEslw51nUeb45Nfnv6kFxUm4CWrRR3xfBvA,760
339
339
  reconcile/gql_definitions/fragments/container_image_mirror.py,sha256=qyfQlnKUCzFEPgUJ9VGmDYFmiGHR7VZ_YJNd4KeoolM,968
340
- reconcile/gql_definitions/fragments/deplopy_resources.py,sha256=0u3xYqL5NpMf149BJLfPhHqAOWu06aLULdNk_2Mulxg,1089
340
+ reconcile/gql_definitions/fragments/deploy_resources.py,sha256=0u3xYqL5NpMf149BJLfPhHqAOWu06aLULdNk_2Mulxg,1089
341
341
  reconcile/gql_definitions/fragments/disable.py,sha256=Ojw98OSxcovrtmw_aAyhaVHhIa1MSUbBfKX4i2IpI74,715
342
342
  reconcile/gql_definitions/fragments/email_service.py,sha256=0wKpICsg4pcMfr2lszvnqbuPX7wVYoJ5cYFU2uQkHbY,803
343
343
  reconcile/gql_definitions/fragments/email_user.py,sha256=UOKbXXNH2Z_7ckgCeCMiBvbfs4qMMYs4PVqxSKNNmBQ,690
@@ -370,7 +370,7 @@ reconcile/gql_definitions/glitchtip/glitchtip_project.py,sha256=3hS6ZbWr-KMWeVHY
370
370
  reconcile/gql_definitions/glitchtip_project_alerts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
371
  reconcile/gql_definitions/glitchtip_project_alerts/glitchtip_project.py,sha256=Pv6RcuIzpNmGc43eEq64nnKG0Dr7H0wjy5Xg1_oRltM,5197
372
372
  reconcile/gql_definitions/integrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
- reconcile/gql_definitions/integrations/integrations.py,sha256=HosEgRUlAkxLNoj2cnq3mrTdWDn9UvbNmtz6OcweIYk,11668
373
+ reconcile/gql_definitions/integrations/integrations.py,sha256=IIKNzpgUCe5-lvdhoA4VFiqvtjtjzTndiR5-jKSzgrQ,11667
374
374
  reconcile/gql_definitions/jenkins_configs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
375
375
  reconcile/gql_definitions/jenkins_configs/jenkins_configs.py,sha256=kr1RwKcSpmpBkotl8rR0cOZ02Co5FAbE1he80CCFbTc,2961
376
376
  reconcile/gql_definitions/jenkins_configs/jenkins_instances.py,sha256=b3gYVzQavxeLe4jSM5ZxrO77Vvs7kOljVOXEkTO943U,2165
@@ -669,7 +669,7 @@ reconcile/utils/sqs_gateway.py,sha256=XNIf3PY4UCPNufP2Ul0UJj3fKlt5larBba-VTT-41F
669
669
  reconcile/utils/state.py,sha256=az4tBmZ0EdbFcAGiBVUxs3cr2-BVWsuDQiNTvjjQq8s,16378
670
670
  reconcile/utils/structs.py,sha256=LcbLEg8WxfRqM6nW7NhcWN0YeqF7SQzxOgntmLs1SgY,352
671
671
  reconcile/utils/template.py,sha256=wTvRU4AnAV_o042tD4Mwls2dwWMuk7MKnde3MaCjaYg,331
672
- reconcile/utils/terraform_client.py,sha256=IDlrNvGEc2i6ElZIL_fzaJEad1nRC3DkP9_VXhJXmU0,37329
672
+ reconcile/utils/terraform_client.py,sha256=zXqL8TjskV4gB1K7bBoE_E3h6afKH7nw5y5H2N9NaIA,37346
673
673
  reconcile/utils/terrascript_aws_client.py,sha256=RkiYjRietHFNXtfA1-WEZ1lZbJFBA_XCtTOsZUij5VM,292360
674
674
  reconcile/utils/three_way_diff_strategy.py,sha256=oQcHXd9LVhirJfoaOBoHUYuZVGfyL2voKr6KVI34zZE,4833
675
675
  reconcile/utils/throughput.py,sha256=iP4UWAe2LVhDo69mPPmgo9nQ7RxHD6_GS8MZe-aSiuM,344
@@ -809,7 +809,7 @@ tools/saas_promotion_state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
809
809
  tools/saas_promotion_state/saas_promotion_state.py,sha256=UfwwRLS5Ya4_Nh1w5n1dvoYtchQvYE9yj1VANt2IKqI,3925
810
810
  tools/sre_checkpoints/__init__.py,sha256=CDaDaywJnmRCLyl_NCcvxi-Zc0hTi_3OdwKiFOyS39I,145
811
811
  tools/sre_checkpoints/util.py,sha256=zEDbGr18ZeHNQwW8pUsr2JRjuXIPz--WAGJxZo9sv_Y,894
812
- qontract_reconcile-0.10.2.dev197.dist-info/METADATA,sha256=rege7bsatzPbGGlyw26PU4oHYZuVuqVjfy8pKkGr4Sk,24555
813
- qontract_reconcile-0.10.2.dev197.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
814
- qontract_reconcile-0.10.2.dev197.dist-info/entry_points.txt,sha256=5i9l54La3vQrDLAdwDKQWC0iG4sV9RRfOb1BpvzOWLc,698
815
- qontract_reconcile-0.10.2.dev197.dist-info/RECORD,,
812
+ qontract_reconcile-0.10.2.dev199.dist-info/METADATA,sha256=Hj41Ae3IN576kIdZ792tqNvq3tVat6Rn1FswT099EWg,24555
813
+ qontract_reconcile-0.10.2.dev199.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
814
+ qontract_reconcile-0.10.2.dev199.dist-info/entry_points.txt,sha256=5i9l54La3vQrDLAdwDKQWC0iG4sV9RRfOb1BpvzOWLc,698
815
+ qontract_reconcile-0.10.2.dev199.dist-info/RECORD,,
@@ -32,7 +32,7 @@ from reconcile.gql_definitions.external_resources.external_resources_settings im
32
32
  from reconcile.gql_definitions.external_resources.fragments.external_resources_module_overrides import (
33
33
  ExternalResourcesModuleOverrides,
34
34
  )
35
- from reconcile.gql_definitions.fragments.deplopy_resources import DeployResourcesFields
35
+ from reconcile.gql_definitions.fragments.deploy_resources import DeployResourcesFields
36
36
  from reconcile.utils.exceptions import FetchResourceError
37
37
  from reconcile.utils.external_resource_spec import (
38
38
  ExternalResourceSpec,
@@ -61,6 +61,10 @@ class ExternalResourceOutputResourceNameDuplications(Exception):
61
61
  super().__init__("".join(msg))
62
62
 
63
63
 
64
+ class ExternalResourceModuleConfigurationError(Exception):
65
+ pass
66
+
67
+
64
68
  class ExternalResourceValidationError(Exception):
65
69
  errors: list[str] = []
66
70
 
@@ -281,6 +285,13 @@ class ExternalResourceModuleConfiguration(BaseModel, frozen=True):
281
285
  spec: ExternalResourceSpec,
282
286
  settings: ExternalResourcesSettingsV1,
283
287
  ) -> "ExternalResourceModuleConfiguration":
288
+ """Resolve the module configuration for a given ExternalResourceSpec.
289
+ Priority:
290
+ 1.- Module_overrides from the spec
291
+ 2.- Provisioner (AWS account) channel
292
+ 3.- Module default channel
293
+ """
294
+
284
295
  module_overrides = spec.metadata.get("module_overrides")
285
296
  overridden = module_overrides is not None
286
297
 
@@ -289,15 +300,35 @@ class ExternalResourceModuleConfiguration(BaseModel, frozen=True):
289
300
  module_type=None,
290
301
  image=None,
291
302
  version=None,
303
+ channel=None,
292
304
  reconcile_timeout_minutes=None,
293
305
  outputs_secret_image=None,
294
306
  outputs_secret_version=None,
295
307
  resources=None,
296
308
  )
297
309
 
310
+ provisioner_channel = (spec.provisioner.get("external_resources") or {}).get(
311
+ "channel"
312
+ ) or None
313
+
314
+ channel_name = (
315
+ module_overrides.channel or provisioner_channel or module.default_channel
316
+ )
317
+
318
+ channel = next(
319
+ (c for c in module.channels if c.name == channel_name),
320
+ None,
321
+ )
322
+
323
+ if channel is None:
324
+ raise ExternalResourceModuleConfigurationError(
325
+ f"Module {module.provision_provider}/{module.provider} does not have the channel {channel_name}. "
326
+ f"Resource spec: {spec.id_object()}"
327
+ )
328
+
298
329
  return ExternalResourceModuleConfiguration(
299
- image=module_overrides.image or module.image,
300
- version=module_overrides.version or module.version,
330
+ image=module_overrides.image or channel.image,
331
+ version=module_overrides.version or channel.version,
301
332
  reconcile_drift_interval_minutes=module.reconcile_drift_interval_minutes,
302
333
  reconcile_timeout_minutes=module_overrides.reconcile_timeout_minutes
303
334
  or module.reconcile_timeout_minutes,
@@ -17,7 +17,7 @@ from pydantic import ( # noqa: F401 # pylint: disable=W0611
17
17
  Json,
18
18
  )
19
19
 
20
- from reconcile.gql_definitions.fragments.deplopy_resources import DeployResourcesFields
20
+ from reconcile.gql_definitions.fragments.deploy_resources import DeployResourcesFields
21
21
 
22
22
 
23
23
  DEFINITION = """
@@ -37,8 +37,6 @@ query ExternalResourcesModules {
37
37
  provision_provider
38
38
  provider
39
39
  module_type
40
- image
41
- version
42
40
  reconcile_drift_interval_minutes
43
41
  reconcile_timeout_minutes
44
42
  outputs_secret_sync
@@ -47,6 +45,12 @@ query ExternalResourcesModules {
47
45
  resources {
48
46
  ... DeployResourcesFields
49
47
  }
48
+ default_channel
49
+ channels {
50
+ name
51
+ image
52
+ version
53
+ }
50
54
  }
51
55
  }
52
56
  """
@@ -58,18 +62,24 @@ class ConfiguredBaseModel(BaseModel):
58
62
  extra=Extra.forbid
59
63
 
60
64
 
65
+ class ExternalResourcesChannelV1(ConfiguredBaseModel):
66
+ name: str = Field(..., alias="name")
67
+ image: str = Field(..., alias="image")
68
+ version: str = Field(..., alias="version")
69
+
70
+
61
71
  class ExternalResourcesModuleV1(ConfiguredBaseModel):
62
72
  provision_provider: str = Field(..., alias="provision_provider")
63
73
  provider: str = Field(..., alias="provider")
64
74
  module_type: str = Field(..., alias="module_type")
65
- image: str = Field(..., alias="image")
66
- version: str = Field(..., alias="version")
67
75
  reconcile_drift_interval_minutes: int = Field(..., alias="reconcile_drift_interval_minutes")
68
76
  reconcile_timeout_minutes: int = Field(..., alias="reconcile_timeout_minutes")
69
77
  outputs_secret_sync: bool = Field(..., alias="outputs_secret_sync")
70
78
  outputs_secret_image: Optional[str] = Field(..., alias="outputs_secret_image")
71
79
  outputs_secret_version: Optional[str] = Field(..., alias="outputs_secret_version")
72
80
  resources: Optional[DeployResourcesFields] = Field(..., alias="resources")
81
+ default_channel: str = Field(..., alias="default_channel")
82
+ channels: list[ExternalResourcesChannelV1] = Field(..., alias="channels")
73
83
 
74
84
 
75
85
  class ExternalResourcesModulesQueryData(ConfiguredBaseModel):
@@ -67,6 +67,7 @@ fragment DeployResourcesFields on DeployResources_v1 {
67
67
 
68
68
  fragment ExternalResourcesModuleOverrides on ExternalResourcesModuleOverrides_v1 {
69
69
  module_type
70
+ channel
70
71
  image
71
72
  version
72
73
  reconcile_timeout_minutes
@@ -98,6 +99,9 @@ query ExternalResourcesNamespaces {
98
99
  name
99
100
  resourcesDefaultRegion
100
101
  supportedDeploymentRegions
102
+ externalResources {
103
+ channel
104
+ }
101
105
  }
102
106
  resources {
103
107
  output_format {
@@ -572,10 +576,15 @@ class NamespaceExternalResourceV1(ConfiguredBaseModel):
572
576
  provider: str = Field(..., alias="provider")
573
577
 
574
578
 
579
+ class ExternalResourcesAccountSettingsV1(ConfiguredBaseModel):
580
+ channel: Optional[str] = Field(..., alias="channel")
581
+
582
+
575
583
  class AWSAccountV1(ConfiguredBaseModel):
576
584
  name: str = Field(..., alias="name")
577
585
  resources_default_region: str = Field(..., alias="resourcesDefaultRegion")
578
586
  supported_deployment_regions: Optional[list[str]] = Field(..., alias="supportedDeploymentRegions")
587
+ external_resources: Optional[ExternalResourcesAccountSettingsV1] = Field(..., alias="externalResources")
579
588
 
580
589
 
581
590
  class NamespaceTerraformResourceOutputFormatV1(ConfiguredBaseModel):
@@ -17,7 +17,7 @@ from pydantic import ( # noqa: F401 # pylint: disable=W0611
17
17
  Json,
18
18
  )
19
19
 
20
- from reconcile.gql_definitions.fragments.deplopy_resources import DeployResourcesFields
20
+ from reconcile.gql_definitions.fragments.deploy_resources import DeployResourcesFields
21
21
 
22
22
 
23
23
  DEFINITION = """
@@ -17,7 +17,7 @@ from pydantic import ( # noqa: F401 # pylint: disable=W0611
17
17
  Json,
18
18
  )
19
19
 
20
- from reconcile.gql_definitions.fragments.deplopy_resources import DeployResourcesFields
20
+ from reconcile.gql_definitions.fragments.deploy_resources import DeployResourcesFields
21
21
 
22
22
 
23
23
  class ConfiguredBaseModel(BaseModel):
@@ -28,6 +28,7 @@ class ConfiguredBaseModel(BaseModel):
28
28
 
29
29
  class ExternalResourcesModuleOverrides(ConfiguredBaseModel):
30
30
  module_type: Optional[str] = Field(..., alias="module_type")
31
+ channel: Optional[str] = Field(..., alias="channel")
31
32
  image: Optional[str] = Field(..., alias="image")
32
33
  version: Optional[str] = Field(..., alias="version")
33
34
  reconcile_timeout_minutes: Optional[int] = Field(..., alias="reconcile_timeout_minutes")
@@ -18,7 +18,7 @@ from pydantic import ( # noqa: F401 # pylint: disable=W0611
18
18
  )
19
19
 
20
20
  from reconcile.gql_definitions.fragments.jumphost_common_fields import CommonJumphostFields
21
- from reconcile.gql_definitions.fragments.deplopy_resources import DeployResourcesFields
21
+ from reconcile.gql_definitions.fragments.deploy_resources import DeployResourcesFields
22
22
  from reconcile.gql_definitions.fragments.minimal_ocm_organization import MinimalOCMOrganization
23
23
  from reconcile.gql_definitions.fragments.vault_secret import VaultSecret
24
24
 
@@ -10447,6 +10447,18 @@
10447
10447
  "isDeprecated": false,
10448
10448
  "deprecationReason": null
10449
10449
  },
10450
+ {
10451
+ "name": "externalResources",
10452
+ "description": null,
10453
+ "args": [],
10454
+ "type": {
10455
+ "kind": "OBJECT",
10456
+ "name": "ExternalResourcesAccountSettings_v1",
10457
+ "ofType": null
10458
+ },
10459
+ "isDeprecated": false,
10460
+ "deprecationReason": null
10461
+ },
10450
10462
  {
10451
10463
  "name": "account_requests",
10452
10464
  "description": null,
@@ -15412,6 +15424,29 @@
15412
15424
  "enumValues": null,
15413
15425
  "possibleTypes": null
15414
15426
  },
15427
+ {
15428
+ "kind": "OBJECT",
15429
+ "name": "ExternalResourcesAccountSettings_v1",
15430
+ "description": null,
15431
+ "fields": [
15432
+ {
15433
+ "name": "channel",
15434
+ "description": null,
15435
+ "args": [],
15436
+ "type": {
15437
+ "kind": "SCALAR",
15438
+ "name": "String",
15439
+ "ofType": null
15440
+ },
15441
+ "isDeprecated": false,
15442
+ "deprecationReason": null
15443
+ }
15444
+ ],
15445
+ "inputFields": null,
15446
+ "interfaces": [],
15447
+ "enumValues": null,
15448
+ "possibleTypes": null
15449
+ },
15415
15450
  {
15416
15451
  "kind": "OBJECT",
15417
15452
  "name": "AWSAccountRequest_v1",
@@ -34816,38 +34851,6 @@
34816
34851
  "isDeprecated": false,
34817
34852
  "deprecationReason": null
34818
34853
  },
34819
- {
34820
- "name": "image",
34821
- "description": null,
34822
- "args": [],
34823
- "type": {
34824
- "kind": "NON_NULL",
34825
- "name": null,
34826
- "ofType": {
34827
- "kind": "SCALAR",
34828
- "name": "String",
34829
- "ofType": null
34830
- }
34831
- },
34832
- "isDeprecated": false,
34833
- "deprecationReason": null
34834
- },
34835
- {
34836
- "name": "version",
34837
- "description": null,
34838
- "args": [],
34839
- "type": {
34840
- "kind": "NON_NULL",
34841
- "name": null,
34842
- "ofType": {
34843
- "kind": "SCALAR",
34844
- "name": "String",
34845
- "ofType": null
34846
- }
34847
- },
34848
- "isDeprecated": false,
34849
- "deprecationReason": null
34850
- },
34851
34854
  {
34852
34855
  "name": "reconcile_drift_interval_minutes",
34853
34856
  "description": null,
@@ -34931,6 +34934,46 @@
34931
34934
  },
34932
34935
  "isDeprecated": false,
34933
34936
  "deprecationReason": null
34937
+ },
34938
+ {
34939
+ "name": "default_channel",
34940
+ "description": null,
34941
+ "args": [],
34942
+ "type": {
34943
+ "kind": "NON_NULL",
34944
+ "name": null,
34945
+ "ofType": {
34946
+ "kind": "SCALAR",
34947
+ "name": "String",
34948
+ "ofType": null
34949
+ }
34950
+ },
34951
+ "isDeprecated": false,
34952
+ "deprecationReason": null
34953
+ },
34954
+ {
34955
+ "name": "channels",
34956
+ "description": null,
34957
+ "args": [],
34958
+ "type": {
34959
+ "kind": "NON_NULL",
34960
+ "name": null,
34961
+ "ofType": {
34962
+ "kind": "LIST",
34963
+ "name": null,
34964
+ "ofType": {
34965
+ "kind": "NON_NULL",
34966
+ "name": null,
34967
+ "ofType": {
34968
+ "kind": "OBJECT",
34969
+ "name": "ExternalResourcesChannel_v1",
34970
+ "ofType": null
34971
+ }
34972
+ }
34973
+ }
34974
+ },
34975
+ "isDeprecated": false,
34976
+ "deprecationReason": null
34934
34977
  }
34935
34978
  ],
34936
34979
  "inputFields": null,
@@ -34944,6 +34987,65 @@
34944
34987
  "enumValues": null,
34945
34988
  "possibleTypes": null
34946
34989
  },
34990
+ {
34991
+ "kind": "OBJECT",
34992
+ "name": "ExternalResourcesChannel_v1",
34993
+ "description": null,
34994
+ "fields": [
34995
+ {
34996
+ "name": "name",
34997
+ "description": null,
34998
+ "args": [],
34999
+ "type": {
35000
+ "kind": "NON_NULL",
35001
+ "name": null,
35002
+ "ofType": {
35003
+ "kind": "SCALAR",
35004
+ "name": "String",
35005
+ "ofType": null
35006
+ }
35007
+ },
35008
+ "isDeprecated": false,
35009
+ "deprecationReason": null
35010
+ },
35011
+ {
35012
+ "name": "image",
35013
+ "description": null,
35014
+ "args": [],
35015
+ "type": {
35016
+ "kind": "NON_NULL",
35017
+ "name": null,
35018
+ "ofType": {
35019
+ "kind": "SCALAR",
35020
+ "name": "String",
35021
+ "ofType": null
35022
+ }
35023
+ },
35024
+ "isDeprecated": false,
35025
+ "deprecationReason": null
35026
+ },
35027
+ {
35028
+ "name": "version",
35029
+ "description": null,
35030
+ "args": [],
35031
+ "type": {
35032
+ "kind": "NON_NULL",
35033
+ "name": null,
35034
+ "ofType": {
35035
+ "kind": "SCALAR",
35036
+ "name": "String",
35037
+ "ofType": null
35038
+ }
35039
+ },
35040
+ "isDeprecated": false,
35041
+ "deprecationReason": null
35042
+ }
35043
+ ],
35044
+ "inputFields": null,
35045
+ "interfaces": [],
35046
+ "enumValues": null,
35047
+ "possibleTypes": null
35048
+ },
34947
35049
  {
34948
35050
  "kind": "OBJECT",
34949
35051
  "name": "AppChangelog_v1",
@@ -44161,6 +44263,18 @@
44161
44263
  "isDeprecated": false,
44162
44264
  "deprecationReason": null
44163
44265
  },
44266
+ {
44267
+ "name": "channel",
44268
+ "description": null,
44269
+ "args": [],
44270
+ "type": {
44271
+ "kind": "SCALAR",
44272
+ "name": "String",
44273
+ "ofType": null
44274
+ },
44275
+ "isDeprecated": false,
44276
+ "deprecationReason": null
44277
+ },
44164
44278
  {
44165
44279
  "name": "image",
44166
44280
  "description": null,
@@ -222,7 +222,7 @@ class TerraformClient: # pylint: disable=too-many-public-methods
222
222
  if disable_deletions_detected:
223
223
  raise RuntimeError("Terraform plan has disabled deletions detected")
224
224
 
225
- @retry(no_retry_exceptions=RdsUpgradeValidationError)
225
+ @retry(max_attempts=10, no_retry_exceptions=RdsUpgradeValidationError)
226
226
  def terraform_plan(
227
227
  self, spec: TerraformSpec, enable_deletion: bool
228
228
  ) -> tuple[bool, list[AccountUser], bool]: