qontract-reconcile 0.10.1rc1202__py3-none-any.whl → 0.10.2.dev1__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.
Files changed (138) hide show
  1. qontract_reconcile-0.10.2.dev1.dist-info/METADATA +500 -0
  2. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/RECORD +12 -130
  3. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/WHEEL +1 -2
  4. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/entry_points.txt +1 -0
  5. reconcile/aws_account_manager/README.md +5 -0
  6. reconcile/change_owners/README.md +34 -0
  7. reconcile/glitchtip/README.md +150 -0
  8. reconcile/gql_definitions/introspection.json +51176 -0
  9. reconcile/run_integration.py +293 -0
  10. reconcile/utils/binary.py +2 -2
  11. reconcile/utils/mr/README.md +198 -0
  12. reconcile/utils/oc_map.py +2 -2
  13. tools/qontract_cli.py +0 -0
  14. qontract_reconcile-0.10.1rc1202.dist-info/METADATA +0 -64
  15. qontract_reconcile-0.10.1rc1202.dist-info/top_level.txt +0 -3
  16. reconcile/test/__init__.py +0 -0
  17. reconcile/test/conftest.py +0 -157
  18. reconcile/test/fixtures.py +0 -24
  19. reconcile/test/saas_auto_promotions_manager/__init__.py +0 -0
  20. reconcile/test/saas_auto_promotions_manager/conftest.py +0 -170
  21. reconcile/test/saas_auto_promotions_manager/merge_request_manager/__init__.py +0 -0
  22. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/__init__.py +0 -0
  23. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -115
  24. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py +0 -19
  25. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py +0 -66
  26. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py +0 -86
  27. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_mr_parser.py +0 -352
  28. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_reconciler.py +0 -494
  29. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/__init__.py +0 -0
  30. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -25
  31. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +0 -37
  32. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +0 -81
  33. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +0 -61
  34. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py +0 -74
  35. reconcile/test/saas_auto_promotions_manager/test_integration_test.py +0 -52
  36. reconcile/test/saas_auto_promotions_manager/utils/__init__.py +0 -0
  37. reconcile/test/test_acs_notifiers.py +0 -393
  38. reconcile/test/test_acs_policies.py +0 -497
  39. reconcile/test/test_acs_rbac.py +0 -865
  40. reconcile/test/test_aggregated_list.py +0 -237
  41. reconcile/test/test_amtool.py +0 -37
  42. reconcile/test/test_aws_ami_cleanup.py +0 -230
  43. reconcile/test/test_aws_ami_share.py +0 -68
  44. reconcile/test/test_aws_cloudwatch_log_retention.py +0 -434
  45. reconcile/test/test_aws_iam_keys.py +0 -70
  46. reconcile/test/test_aws_iam_password_reset.py +0 -35
  47. reconcile/test/test_aws_support_cases_sos.py +0 -23
  48. reconcile/test/test_checkpoint.py +0 -178
  49. reconcile/test/test_cli.py +0 -41
  50. reconcile/test/test_closedbox_endpoint_monitoring.py +0 -207
  51. reconcile/test/test_dashdotdb_dora.py +0 -245
  52. reconcile/test/test_database_access_manager.py +0 -660
  53. reconcile/test/test_deadmanssnitch.py +0 -290
  54. reconcile/test/test_gabi_authorized_users.py +0 -72
  55. reconcile/test/test_gcr_mirror.py +0 -14
  56. reconcile/test/test_github_org.py +0 -156
  57. reconcile/test/test_github_repo_invites.py +0 -119
  58. reconcile/test/test_gitlab_housekeeping.py +0 -333
  59. reconcile/test/test_gitlab_labeler.py +0 -126
  60. reconcile/test/test_gitlab_members.py +0 -219
  61. reconcile/test/test_gitlab_permissions.py +0 -164
  62. reconcile/test/test_instrumented_wrappers.py +0 -18
  63. reconcile/test/test_integrations_manager.py +0 -1252
  64. reconcile/test/test_jenkins_worker_fleets.py +0 -57
  65. reconcile/test/test_jira_permissions_validator.py +0 -519
  66. reconcile/test/test_jump_host.py +0 -114
  67. reconcile/test/test_ldap_users.py +0 -125
  68. reconcile/test/test_make.py +0 -28
  69. reconcile/test/test_ocm_additional_routers.py +0 -133
  70. reconcile/test/test_ocm_clusters.py +0 -798
  71. reconcile/test/test_ocm_clusters_manifest_updates.py +0 -87
  72. reconcile/test/test_ocm_machine_pools.py +0 -1103
  73. reconcile/test/test_ocm_update_recommended_version.py +0 -145
  74. reconcile/test/test_ocm_upgrade_scheduler_org_updater.py +0 -125
  75. reconcile/test/test_openshift_base.py +0 -1269
  76. reconcile/test/test_openshift_cluster_bots.py +0 -240
  77. reconcile/test/test_openshift_namespace_labels.py +0 -344
  78. reconcile/test/test_openshift_namespaces.py +0 -256
  79. reconcile/test/test_openshift_resource.py +0 -443
  80. reconcile/test/test_openshift_resources_base.py +0 -478
  81. reconcile/test/test_openshift_saas_deploy.py +0 -188
  82. reconcile/test/test_openshift_saas_deploy_change_tester.py +0 -308
  83. reconcile/test/test_openshift_saas_deploy_trigger_cleaner.py +0 -65
  84. reconcile/test/test_openshift_serviceaccount_tokens.py +0 -282
  85. reconcile/test/test_openshift_tekton_resources.py +0 -265
  86. reconcile/test/test_openshift_upgrade_watcher.py +0 -223
  87. reconcile/test/test_prometheus_rules_tester.py +0 -151
  88. reconcile/test/test_quay_membership.py +0 -86
  89. reconcile/test/test_quay_mirror.py +0 -172
  90. reconcile/test/test_quay_mirror_org.py +0 -82
  91. reconcile/test/test_quay_repos.py +0 -59
  92. reconcile/test/test_queries.py +0 -53
  93. reconcile/test/test_repo_owners.py +0 -47
  94. reconcile/test/test_requests_sender.py +0 -139
  95. reconcile/test/test_saasherder.py +0 -1611
  96. reconcile/test/test_saasherder_allowed_secret_paths.py +0 -125
  97. reconcile/test/test_secret_reader.py +0 -153
  98. reconcile/test/test_slack_base.py +0 -183
  99. reconcile/test/test_slack_usergroups.py +0 -785
  100. reconcile/test/test_sql_query.py +0 -316
  101. reconcile/test/test_status_board.py +0 -258
  102. reconcile/test/test_terraform_aws_route53.py +0 -29
  103. reconcile/test/test_terraform_cloudflare_dns.py +0 -117
  104. reconcile/test/test_terraform_cloudflare_resources.py +0 -408
  105. reconcile/test/test_terraform_cloudflare_users.py +0 -747
  106. reconcile/test/test_terraform_repo.py +0 -440
  107. reconcile/test/test_terraform_resources.py +0 -519
  108. reconcile/test/test_terraform_tgw_attachments.py +0 -1295
  109. reconcile/test/test_terraform_users.py +0 -152
  110. reconcile/test/test_terraform_vpc_peerings.py +0 -576
  111. reconcile/test/test_terraform_vpc_peerings_build_desired_state.py +0 -1434
  112. reconcile/test/test_three_way_diff_strategy.py +0 -131
  113. reconcile/test/test_utils_jinja2.py +0 -130
  114. reconcile/test/test_vault_replication.py +0 -534
  115. reconcile/test/test_vault_utils.py +0 -47
  116. reconcile/test/test_version_bump.py +0 -18
  117. reconcile/test/test_vpc_peerings_validator.py +0 -194
  118. reconcile/test/test_wrong_region.py +0 -78
  119. release/__init__.py +0 -0
  120. release/test_version.py +0 -50
  121. release/version.py +0 -104
  122. tools/cli_commands/test/__init__.py +0 -0
  123. tools/cli_commands/test/conftest.py +0 -332
  124. tools/cli_commands/test/test_aws_cost_report.py +0 -258
  125. tools/cli_commands/test/test_cost_management_api.py +0 -326
  126. tools/cli_commands/test/test_gpg_encrypt.py +0 -235
  127. tools/cli_commands/test/test_openshift_cost_optimization_report.py +0 -255
  128. tools/cli_commands/test/test_openshift_cost_report.py +0 -295
  129. tools/cli_commands/test/test_util.py +0 -70
  130. tools/test/__init__.py +0 -0
  131. tools/test/conftest.py +0 -77
  132. tools/test/test_app_interface_metrics_exporter.py +0 -48
  133. tools/test/test_erv2.py +0 -80
  134. tools/test/test_get_container_images.py +0 -230
  135. tools/test/test_qontract_cli.py +0 -197
  136. tools/test/test_saas_promotion_state.py +0 -187
  137. tools/test/test_sd_app_sre_alert_report.py +0 -74
  138. tools/test/test_sre_checkpoints.py +0 -79
@@ -1,576 +0,0 @@
1
- import sys
2
- from typing import Any, Self
3
-
4
- import pytest
5
- import testslide
6
- from pytest_mock import MockerFixture
7
-
8
- import reconcile.terraform_vpc_peerings as integ
9
- import reconcile.utils.terraform_client as terraform
10
- import reconcile.utils.terrascript_aws_client as terrascript
11
- from reconcile import queries
12
- from reconcile.terraform_vpc_peerings import BadTerraformPeeringState
13
- from reconcile.utils import (
14
- aws_api,
15
- ocm,
16
- )
17
-
18
-
19
- class MockOCM:
20
- def __init__(self) -> None:
21
- self.assumes: dict[str, str] = {}
22
-
23
- def register(
24
- self, cluster: str, tf_account_id: str, tf_user: str, assume_role: str | None
25
- ) -> Self:
26
- if not assume_role:
27
- assume_role = f"arn::::{cluster}"
28
- if not assume_role.startswith("arn:"):
29
- assume_role = f"arn::::{assume_role}"
30
- self.assumes[f"{cluster}/{tf_account_id}/{tf_user}"] = assume_role
31
- return self
32
-
33
- def get_aws_infrastructure_access_terraform_assume_role(
34
- self, cluster: str, tf_account_id: str, tf_user: str
35
- ) -> str | None:
36
- return self.assumes.get(f"{cluster}/{tf_account_id}/{tf_user}")
37
-
38
- def auto_speced_mock(self, mocker: MockerFixture) -> ocm.OCM:
39
- ocm_mock = mocker.patch("reconcile.utils.ocm.OCM", autospec=True).return_value
40
- ocm_mock.get_aws_infrastructure_access_terraform_assume_role.mock_add_spec(
41
- ocm.OCM.get_aws_infrastructure_access_terraform_assume_role
42
- )
43
- ocm_mock.get_aws_infrastructure_access_terraform_assume_role.side_effect = (
44
- self.get_aws_infrastructure_access_terraform_assume_role
45
- )
46
- return ocm_mock
47
-
48
-
49
- class MockAWSAPI:
50
- def __init__(self) -> None:
51
- self.vpc_details: dict[str, tuple[str, list[str], str | None]] = {}
52
-
53
- def register(
54
- self,
55
- vpc: str,
56
- vpc_id: str,
57
- route_tables: list[str],
58
- vpce_sg: str | None = None,
59
- ) -> Self:
60
- self.vpc_details[vpc] = (
61
- vpc_id,
62
- route_tables,
63
- vpce_sg,
64
- )
65
- return self
66
-
67
- def get_cluster_vpc_details(
68
- self,
69
- account: dict[str, Any],
70
- route_tables: bool = False,
71
- subnets: bool = False,
72
- hcp_vpc_endpoint_sg: bool = False,
73
- ) -> tuple:
74
- if account["assume_cidr"] in self.vpc_details:
75
- vpc_id, rt, sg_id = self.vpc_details[account["assume_cidr"]]
76
- if not route_tables:
77
- return vpc_id, None, None, sg_id if hcp_vpc_endpoint_sg else None
78
- return vpc_id, rt, None, sg_id if hcp_vpc_endpoint_sg else None
79
- return None, None, None, None
80
-
81
- def auto_speced_mock(self, mocker: MockerFixture) -> aws_api.AWSApi:
82
- aws_api_mock = mocker.patch(
83
- "reconcile.utils.aws_api.AWSApi", autospec=True
84
- ).return_value
85
- aws_api_mock.get_cluster_vpc_details.mock_add_spec(
86
- aws_api.AWSApi.get_cluster_vpc_details
87
- )
88
- aws_api_mock.get_cluster_vpc_details.side_effect = self.get_cluster_vpc_details
89
- return aws_api_mock
90
-
91
-
92
- def build_cluster(
93
- name: str,
94
- vpc: str | None = None,
95
- read_only_accounts: list[str] | None = None,
96
- network_mgmt_accounts: list[str] | None = None,
97
- peering_connections: list[dict[str, Any]] | None = None,
98
- hcp: bool = False,
99
- private: bool = False,
100
- sg: str | None = None,
101
- ) -> dict[str, Any]:
102
- if not vpc:
103
- vpc = name
104
- cluster = {
105
- "name": name,
106
- "spec": {
107
- "region": "region",
108
- "private": private,
109
- "hypershift": hcp,
110
- },
111
- "network": {"vpc": vpc},
112
- "peering": {"connections": peering_connections or []},
113
- "awsInfrastructureManagementAccounts": None,
114
- }
115
-
116
- if read_only_accounts or network_mgmt_accounts:
117
- cluster["awsInfrastructureManagementAccounts"] = []
118
- if read_only_accounts:
119
- for acc in read_only_accounts:
120
- cluster["awsInfrastructureManagementAccounts"].append( # type: ignore
121
- {
122
- "account": {
123
- "name": acc,
124
- "uid": acc,
125
- "terraformUsername": "terraform",
126
- "automationToken": {},
127
- },
128
- "accessLevel": "read-only",
129
- "default": None,
130
- }
131
- )
132
- if network_mgmt_accounts:
133
- for idx, acc in enumerate(network_mgmt_accounts):
134
- cluster["awsInfrastructureManagementAccounts"].append( # type: ignore
135
- {
136
- "account": {
137
- "name": acc,
138
- "uid": acc,
139
- "terraformUsername": "terraform",
140
- "automationToken": {},
141
- },
142
- "accessLevel": "network-mgmt",
143
- "default": True if idx == 0 else None,
144
- }
145
- )
146
- return cluster
147
-
148
-
149
- def build_requester_connection(
150
- name: str, peer_cluster: dict[str, Any], manage_routes: bool = True
151
- ) -> dict[str, Any]:
152
- return {
153
- "name": name,
154
- "provider": "cluster-vpc-requester",
155
- "manageRoutes": manage_routes,
156
- "cluster": peer_cluster,
157
- }
158
-
159
-
160
- def build_accepter_connection(
161
- name: str,
162
- cluster: str,
163
- aws_infra_acc: str | None = None,
164
- manage_routes: bool = True,
165
- ) -> dict[str, Any]:
166
- connection = {
167
- "name": name,
168
- "provider": "cluster-vpc-accepter",
169
- "manageRoutes": manage_routes,
170
- "cluster": {"name": cluster},
171
- "awsInfrastructureManagementAccount": None,
172
- }
173
- if aws_infra_acc:
174
- connection["awsInfrastructureManagementAccount"] = {
175
- "name": aws_infra_acc,
176
- "uid": aws_infra_acc,
177
- "terraformUsername": "terraform",
178
- "automationToken": {},
179
- }
180
- return connection
181
-
182
-
183
- def test_c2c_vpc_peering_assume_role_accepter_connection_acc_overwrite() -> None:
184
- """
185
- makes sure the peer connection account overwrite on the accepter is used
186
- when available. in this test, the overwrite is also allowed
187
- """
188
- requester_cluster = build_cluster(name="r_c")
189
- requester_connection = build_accepter_connection(
190
- name="r_c", cluster="r_c", aws_infra_acc="req_overwrite"
191
- )
192
- accepter_cluster = build_cluster(
193
- name="a_c", network_mgmt_accounts=["acc", "acc_overwrite"]
194
- )
195
- accepter_connection = build_accepter_connection(
196
- name="a_c", cluster="a_c", aws_infra_acc="acc_overwrite"
197
- )
198
-
199
- ocm = (
200
- MockOCM()
201
- .register("r_c", "acc_overwrite", "terraform", "arn:r_acc_overwrite")
202
- .register("r_c", "acc", "terraform", "arn:r_acc")
203
- .register("a_c", "acc_overwrite", "terraform", "arn:a_acc_overwrite")
204
- .register("a_c", "acc", "terraform", "arn:a_acc")
205
- )
206
- infra_acc_name, req_aws, acc_aws = integ.aws_assume_roles_for_cluster_vpc_peering(
207
- requester_connection,
208
- requester_cluster,
209
- accepter_connection,
210
- accepter_cluster,
211
- ocm, # type: ignore
212
- )
213
-
214
- assert infra_acc_name == "acc_overwrite"
215
-
216
- expected_req_aws = {
217
- "name": "acc_overwrite",
218
- "uid": "acc_overwrite",
219
- "terraformUsername": "terraform",
220
- "automationToken": {},
221
- "assume_role": "arn:r_acc_overwrite",
222
- "assume_region": "region",
223
- "assume_cidr": "r_c",
224
- }
225
- assert req_aws == expected_req_aws
226
-
227
- expected_acc_aws = {
228
- "name": "acc_overwrite",
229
- "uid": "acc_overwrite",
230
- "terraformUsername": "terraform",
231
- "automationToken": {},
232
- "assume_role": "arn:a_acc_overwrite",
233
- "assume_region": "region",
234
- "assume_cidr": "a_c",
235
- }
236
- assert acc_aws == expected_acc_aws
237
-
238
-
239
- def test_c2c_vpc_peering_assume_role_acc_overwrite_fail() -> None:
240
- """
241
- try overwrite the account to be used on the accepter connection with an
242
- account not listed on the accepter cluster
243
- """
244
- requester_cluster = build_cluster(name="r_c")
245
- requester_connection = build_accepter_connection(
246
- name="r_c", cluster="r_c", aws_infra_acc="req_overwrite"
247
- )
248
- accepter_cluster = build_cluster(name="a_c", network_mgmt_accounts=["acc"])
249
- accepter_connection = build_accepter_connection(
250
- name="a_c", cluster="a_c", aws_infra_acc="acc_overwrite"
251
- )
252
-
253
- ocm = (
254
- MockOCM()
255
- .register("r_c", "acc", "terraform", "arn:r_acc")
256
- .register("a_c", "acc", "terraform", "arn:a_acc")
257
- )
258
- with pytest.raises(BadTerraformPeeringState) as ex:
259
- integ.aws_assume_roles_for_cluster_vpc_peering(
260
- requester_connection,
261
- requester_cluster,
262
- accepter_connection,
263
- accepter_cluster,
264
- ocm, # type: ignore
265
- )
266
- assert str(ex.value).startswith("[account_not_allowed]")
267
-
268
-
269
- def test_c2c_vpc_peering_assume_role_accepter_cluster_account() -> None:
270
- """
271
- makes sure the clusters default infra account is used when no peer
272
- connection overwrite exists
273
- """
274
- requester_cluster = build_cluster(name="r_c")
275
- requester_connection = build_accepter_connection(name="r_c", cluster="r_c")
276
- accepter_cluster = build_cluster(
277
- name="a_c", network_mgmt_accounts=["default_acc", "other_acc"]
278
- )
279
- accepter_connection = build_accepter_connection(name="a_c", cluster="a_c")
280
-
281
- ocm = (
282
- MockOCM()
283
- .register("r_c", "default_acc", "terraform", "arn:r_default_acc")
284
- .register("r_c", "other_acc", "terraform", "arn:r_other_acc")
285
- .register("a_c", "default_acc", "terraform", "arn:a_default_acc")
286
- .register("a_c", "other_acc", "terraform", "arn:a_other_acc")
287
- )
288
- infra_acc_name, req_aws, acc_aws = integ.aws_assume_roles_for_cluster_vpc_peering(
289
- requester_connection,
290
- requester_cluster,
291
- accepter_connection,
292
- accepter_cluster,
293
- ocm, # type: ignore
294
- )
295
-
296
- assert infra_acc_name == "default_acc"
297
-
298
- expected_req_aws = {
299
- "name": "default_acc",
300
- "uid": "default_acc",
301
- "terraformUsername": "terraform",
302
- "automationToken": {},
303
- "assume_role": "arn:r_default_acc",
304
- "assume_region": "region",
305
- "assume_cidr": "r_c",
306
- }
307
- assert req_aws == expected_req_aws
308
-
309
- expected_acc_aws = {
310
- "name": "default_acc",
311
- "uid": "default_acc",
312
- "terraformUsername": "terraform",
313
- "automationToken": {},
314
- "assume_role": "arn:a_default_acc",
315
- "assume_region": "region",
316
- "assume_cidr": "a_c",
317
- }
318
- assert acc_aws == expected_acc_aws
319
-
320
-
321
- def test_c2c_vpc_peering_missing_ocm_assume_role() -> None:
322
- """
323
- makes sure the clusters infra account is used when no peer connection
324
- overwrite exists
325
- """
326
- requester_cluster = build_cluster(name="r_c")
327
- requester_connection = build_accepter_connection(name="r_c", cluster="r_c")
328
- accepter_cluster = build_cluster(name="a_c", network_mgmt_accounts=["acc"])
329
- accepter_connection = build_accepter_connection(name="a_c", cluster="a_c")
330
-
331
- ocm = MockOCM()
332
-
333
- with pytest.raises(BadTerraformPeeringState) as ex:
334
- integ.aws_assume_roles_for_cluster_vpc_peering(
335
- requester_connection,
336
- requester_cluster,
337
- accepter_connection,
338
- accepter_cluster,
339
- ocm, # type: ignore
340
- )
341
- assert str(ex.value).startswith("[assume_role_not_found]")
342
-
343
-
344
- def test_c2c_vpc_peering_missing_account() -> None:
345
- """
346
- test the fallback logic, looking for network-mgmt groups accounts
347
- """
348
- requester_cluster = build_cluster(name="r_c")
349
- requester_connection = build_accepter_connection(name="r_c", cluster="r_c")
350
- accepter_cluster = build_cluster(name="a_c")
351
- accepter_connection = build_accepter_connection(name="a_c", cluster="a_c")
352
-
353
- ocm = MockOCM()
354
-
355
- with pytest.raises(BadTerraformPeeringState) as ex:
356
- integ.aws_assume_roles_for_cluster_vpc_peering(
357
- requester_connection,
358
- requester_cluster,
359
- accepter_connection,
360
- accepter_cluster,
361
- ocm, # type: ignore
362
- )
363
- assert str(ex.value).startswith("[no_account_available]")
364
-
365
-
366
- def test_empty_run(mocker: MockerFixture) -> None:
367
- mocked_queries = mocker.patch("reconcile.terraform_vpc_peerings.queries")
368
- mocked_queries.get_secret_reader_settings.return_value = {}
369
- mocked_queries.get_clusters_with_peering_settings.return_value = []
370
- mocked_queries.get_aws_accounts.return_value = [{"name": "some_account"}]
371
- mocker.patch("reconcile.terraform_vpc_peerings.aws_api.AWSApi", autospec=True)
372
- mocker.patch(
373
- "reconcile.terraform_vpc_peerings.build_desired_state_vpc"
374
- ).return_value = ([], False)
375
- mocker.patch(
376
- "reconcile.terraform_vpc_peerings.build_desired_state_vpc_mesh"
377
- ).return_value = ([], False)
378
- mocker.patch(
379
- "reconcile.terraform_vpc_peerings.build_desired_state_all_clusters"
380
- ).return_value = ([], False)
381
- mocked_logging = mocker.patch("reconcile.terraform_vpc_peerings.logging")
382
-
383
- integ.run(True)
384
-
385
- mocked_logging.warning.assert_called_once_with(
386
- "No participating AWS accounts found, consider disabling this integration, account name: None"
387
- )
388
-
389
-
390
- class TestRun(testslide.TestCase):
391
- def setUp(self) -> None:
392
- super().setUp()
393
-
394
- self.awsapi = testslide.StrictMock(aws_api.AWSApi)
395
- self.mock_constructor(aws_api, "AWSApi").to_return_value(self.awsapi)
396
-
397
- self.build_desired_state_vpc = self.mock_callable(
398
- integ, "build_desired_state_vpc"
399
- )
400
- self.build_desired_state_all_clusters = self.mock_callable(
401
- integ, "build_desired_state_all_clusters"
402
- )
403
- self.build_desired_state_vpc_mesh = self.mock_callable(
404
- integ, "build_desired_state_vpc_mesh"
405
- )
406
- self.terraform = testslide.StrictMock(terraform.TerraformClient)
407
- self.terrascript = testslide.StrictMock(
408
- terrascript.TerrascriptClient, default_context_manager=True
409
- )
410
- self.mock_constructor(terraform, "TerraformClient").to_return_value(
411
- self.terraform
412
- )
413
- self.terraform.apply_count = 1
414
- self.mock_constructor(terrascript, "TerrascriptClient").to_return_value(
415
- self.terrascript
416
- )
417
- self.ocmmap = testslide.StrictMock(ocm.OCMMap)
418
- self.mock_constructor(ocm, "OCMMap").to_return_value(self.ocmmap)
419
- self.mock_callable(queries, "get_aws_accounts").to_return_value([
420
- {"name": "desired_account"}
421
- ])
422
- self.clusters = (
423
- self.mock_callable(queries, "get_clusters_with_peering_settings")
424
- .to_return_value([
425
- {"name": "aname", "ocm": "aocm", "peering": {"apeering"}}
426
- ])
427
- .and_assert_called_once()
428
- )
429
- self.settings = (
430
- self.mock_callable(queries, "get_secret_reader_settings")
431
- .to_return_value({})
432
- .and_assert_called_once()
433
- )
434
-
435
- self.mock_callable(self.terrascript, "populate_vpc_peerings").to_return_value(
436
- None
437
- ).and_assert_called_once()
438
- self.mock_callable(self.terrascript, "populate_configs").to_return_value(
439
- None
440
- ).and_assert_called_once()
441
- self.mock_callable(self.terrascript, "dump").to_return_value({
442
- "some_account": "/some/dir"
443
- }).and_assert_called_once()
444
- self.mock_callable(
445
- self.terrascript, "terraform_configurations"
446
- ).to_return_value({"foo": "bar"}).and_assert_called_once()
447
- # Sigh...
448
- self.exit = self.mock_callable(sys, "exit").to_raise(OSError("Exit called!"))
449
- self.addCleanup(testslide.mock_callable.unpatch_all_callable_mocks)
450
-
451
- def initialize_desired_states(self, error_code: bool) -> None:
452
- self.build_desired_state_vpc.to_return_value((
453
- [
454
- {
455
- "connection_name": "desired_vpc_conn",
456
- "infra_account_name": "desired_account",
457
- "requester": {"account": {"name": "desired_account"}},
458
- "accepter": {"account": {"name": "desired_account"}},
459
- },
460
- ],
461
- error_code,
462
- ))
463
- self.build_desired_state_all_clusters.to_return_value((
464
- [
465
- {
466
- "connection_name": "all_clusters_vpc_conn",
467
- "infra_account_name": "desired_account",
468
- "requester": {"account": {"name": "all_clusters_account"}},
469
- "accepter": {
470
- "account": {
471
- "name": "all_clusters_account",
472
- }
473
- },
474
- }
475
- ],
476
- error_code,
477
- ))
478
- self.build_desired_state_vpc_mesh.to_return_value((
479
- [
480
- {
481
- "connection_name": "mesh_vpc_conn",
482
- "infra_account_name": "desired_account",
483
- "requester": {
484
- "account": {"name": "mesh_account"},
485
- },
486
- "accepter": {
487
- "account": {"name": "mesh_account"},
488
- },
489
- }
490
- ],
491
- error_code,
492
- ))
493
-
494
- self.mock_callable(self.terrascript, "populate_additional_providers").for_call(
495
- "desired_account",
496
- [
497
- {"name": "mesh_account"},
498
- {"name": "all_clusters_account"},
499
- {"name": "mesh_account"},
500
- {"name": "all_clusters_account"},
501
- ],
502
- ).to_return_value(None).and_assert_called_once()
503
-
504
- def test_all_fine(self) -> None:
505
- self.initialize_desired_states(False)
506
- self.mock_callable(self.terraform, "plan").to_return_value((
507
- False,
508
- False,
509
- )).and_assert_called_once()
510
- self.mock_callable(self.terraform, "cleanup").to_return_value(
511
- None
512
- ).and_assert_called_once()
513
- self.mock_callable(self.terraform, "apply").to_return_value(
514
- None
515
- ).and_assert_called_once()
516
- integ.run(False, print_to_file=None, enable_deletion=False)
517
-
518
- def test_fail_state(self) -> None:
519
- """Ensure we don't change the world if there are failures"""
520
- self.initialize_desired_states(True)
521
- self.mock_callable(self.terraform, "plan").to_return_value((
522
- False,
523
- False,
524
- )).and_assert_not_called()
525
- self.mock_callable(self.terraform, "cleanup").to_return_value(
526
- None
527
- ).and_assert_not_called()
528
- self.mock_callable(self.terraform, "apply").to_return_value(
529
- None
530
- ).and_assert_not_called()
531
- self.exit.for_call(1).and_assert_called_once()
532
- with self.assertRaises(OSError):
533
- integ.run(False, print_to_file=None, enable_deletion=True)
534
-
535
- def test_dry_run(self) -> None:
536
- self.initialize_desired_states(False)
537
-
538
- self.mock_callable(self.terraform, "plan").to_return_value((
539
- False,
540
- False,
541
- )).and_assert_called_once()
542
- self.mock_callable(self.terraform, "cleanup").to_return_value(
543
- None
544
- ).and_assert_called_once()
545
- self.mock_callable(self.terraform, "apply").to_return_value(
546
- None
547
- ).and_assert_not_called()
548
- integ.run(True, print_to_file=None, enable_deletion=False)
549
-
550
- def test_dry_run_with_failures(self) -> None:
551
- """This is what we do during PR checks and new clusters!"""
552
- self.initialize_desired_states(True)
553
- self.mock_callable(self.terraform, "plan").to_return_value((
554
- False,
555
- False,
556
- )).and_assert_not_called()
557
- self.mock_callable(self.terraform, "apply").to_return_value(
558
- None
559
- ).and_assert_not_called()
560
- self.exit.for_call(1).and_assert_called_once()
561
- with self.assertRaises(OSError):
562
- integ.run(True, print_to_file=None, enable_deletion=False)
563
-
564
- def test_dry_run_print_only_with_failures(self) -> None:
565
- """This is what we do during PR checks and new clusters!"""
566
- self.initialize_desired_states(True)
567
- self.mock_callable(self.terraform, "plan").to_return_value((
568
- False,
569
- False,
570
- )).and_assert_not_called()
571
- self.mock_callable(self.terraform, "apply").to_return_value(
572
- None
573
- ).and_assert_not_called()
574
- self.exit.for_call(0).and_assert_called_once()
575
- with self.assertRaises(OSError):
576
- integ.run(True, print_to_file="some/dir", enable_deletion=False)