qontract-reconcile 0.10.1rc1201__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 (140) hide show
  1. qontract_reconcile-0.10.2.dev1.dist-info/METADATA +500 -0
  2. {qontract_reconcile-0.10.1rc1201.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/RECORD +14 -132
  3. {qontract_reconcile-0.10.1rc1201.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/WHEEL +1 -2
  4. {qontract_reconcile-0.10.1rc1201.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/external_resources/manager.py +12 -1
  8. reconcile/external_resources/model.py +11 -0
  9. reconcile/glitchtip/README.md +150 -0
  10. reconcile/gql_definitions/introspection.json +51176 -0
  11. reconcile/run_integration.py +293 -0
  12. reconcile/utils/binary.py +2 -2
  13. reconcile/utils/mr/README.md +198 -0
  14. reconcile/utils/oc_map.py +2 -2
  15. tools/qontract_cli.py +0 -0
  16. qontract_reconcile-0.10.1rc1201.dist-info/METADATA +0 -64
  17. qontract_reconcile-0.10.1rc1201.dist-info/top_level.txt +0 -3
  18. reconcile/test/__init__.py +0 -0
  19. reconcile/test/conftest.py +0 -157
  20. reconcile/test/fixtures.py +0 -24
  21. reconcile/test/saas_auto_promotions_manager/__init__.py +0 -0
  22. reconcile/test/saas_auto_promotions_manager/conftest.py +0 -170
  23. reconcile/test/saas_auto_promotions_manager/merge_request_manager/__init__.py +0 -0
  24. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/__init__.py +0 -0
  25. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -115
  26. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py +0 -19
  27. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py +0 -66
  28. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py +0 -86
  29. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_mr_parser.py +0 -352
  30. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_reconciler.py +0 -494
  31. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/__init__.py +0 -0
  32. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -25
  33. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +0 -37
  34. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +0 -81
  35. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +0 -61
  36. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py +0 -74
  37. reconcile/test/saas_auto_promotions_manager/test_integration_test.py +0 -52
  38. reconcile/test/saas_auto_promotions_manager/utils/__init__.py +0 -0
  39. reconcile/test/test_acs_notifiers.py +0 -393
  40. reconcile/test/test_acs_policies.py +0 -497
  41. reconcile/test/test_acs_rbac.py +0 -865
  42. reconcile/test/test_aggregated_list.py +0 -237
  43. reconcile/test/test_amtool.py +0 -37
  44. reconcile/test/test_aws_ami_cleanup.py +0 -230
  45. reconcile/test/test_aws_ami_share.py +0 -68
  46. reconcile/test/test_aws_cloudwatch_log_retention.py +0 -434
  47. reconcile/test/test_aws_iam_keys.py +0 -70
  48. reconcile/test/test_aws_iam_password_reset.py +0 -35
  49. reconcile/test/test_aws_support_cases_sos.py +0 -23
  50. reconcile/test/test_checkpoint.py +0 -178
  51. reconcile/test/test_cli.py +0 -41
  52. reconcile/test/test_closedbox_endpoint_monitoring.py +0 -207
  53. reconcile/test/test_dashdotdb_dora.py +0 -245
  54. reconcile/test/test_database_access_manager.py +0 -660
  55. reconcile/test/test_deadmanssnitch.py +0 -290
  56. reconcile/test/test_gabi_authorized_users.py +0 -72
  57. reconcile/test/test_gcr_mirror.py +0 -14
  58. reconcile/test/test_github_org.py +0 -156
  59. reconcile/test/test_github_repo_invites.py +0 -119
  60. reconcile/test/test_gitlab_housekeeping.py +0 -333
  61. reconcile/test/test_gitlab_labeler.py +0 -126
  62. reconcile/test/test_gitlab_members.py +0 -219
  63. reconcile/test/test_gitlab_permissions.py +0 -164
  64. reconcile/test/test_instrumented_wrappers.py +0 -18
  65. reconcile/test/test_integrations_manager.py +0 -1252
  66. reconcile/test/test_jenkins_worker_fleets.py +0 -57
  67. reconcile/test/test_jira_permissions_validator.py +0 -519
  68. reconcile/test/test_jump_host.py +0 -114
  69. reconcile/test/test_ldap_users.py +0 -125
  70. reconcile/test/test_make.py +0 -28
  71. reconcile/test/test_ocm_additional_routers.py +0 -133
  72. reconcile/test/test_ocm_clusters.py +0 -798
  73. reconcile/test/test_ocm_clusters_manifest_updates.py +0 -87
  74. reconcile/test/test_ocm_machine_pools.py +0 -1103
  75. reconcile/test/test_ocm_update_recommended_version.py +0 -145
  76. reconcile/test/test_ocm_upgrade_scheduler_org_updater.py +0 -125
  77. reconcile/test/test_openshift_base.py +0 -1269
  78. reconcile/test/test_openshift_cluster_bots.py +0 -240
  79. reconcile/test/test_openshift_namespace_labels.py +0 -344
  80. reconcile/test/test_openshift_namespaces.py +0 -256
  81. reconcile/test/test_openshift_resource.py +0 -443
  82. reconcile/test/test_openshift_resources_base.py +0 -478
  83. reconcile/test/test_openshift_saas_deploy.py +0 -188
  84. reconcile/test/test_openshift_saas_deploy_change_tester.py +0 -308
  85. reconcile/test/test_openshift_saas_deploy_trigger_cleaner.py +0 -65
  86. reconcile/test/test_openshift_serviceaccount_tokens.py +0 -282
  87. reconcile/test/test_openshift_tekton_resources.py +0 -265
  88. reconcile/test/test_openshift_upgrade_watcher.py +0 -223
  89. reconcile/test/test_prometheus_rules_tester.py +0 -151
  90. reconcile/test/test_quay_membership.py +0 -86
  91. reconcile/test/test_quay_mirror.py +0 -172
  92. reconcile/test/test_quay_mirror_org.py +0 -82
  93. reconcile/test/test_quay_repos.py +0 -59
  94. reconcile/test/test_queries.py +0 -53
  95. reconcile/test/test_repo_owners.py +0 -47
  96. reconcile/test/test_requests_sender.py +0 -139
  97. reconcile/test/test_saasherder.py +0 -1611
  98. reconcile/test/test_saasherder_allowed_secret_paths.py +0 -125
  99. reconcile/test/test_secret_reader.py +0 -153
  100. reconcile/test/test_slack_base.py +0 -183
  101. reconcile/test/test_slack_usergroups.py +0 -785
  102. reconcile/test/test_sql_query.py +0 -316
  103. reconcile/test/test_status_board.py +0 -258
  104. reconcile/test/test_terraform_aws_route53.py +0 -29
  105. reconcile/test/test_terraform_cloudflare_dns.py +0 -117
  106. reconcile/test/test_terraform_cloudflare_resources.py +0 -408
  107. reconcile/test/test_terraform_cloudflare_users.py +0 -747
  108. reconcile/test/test_terraform_repo.py +0 -440
  109. reconcile/test/test_terraform_resources.py +0 -519
  110. reconcile/test/test_terraform_tgw_attachments.py +0 -1295
  111. reconcile/test/test_terraform_users.py +0 -152
  112. reconcile/test/test_terraform_vpc_peerings.py +0 -576
  113. reconcile/test/test_terraform_vpc_peerings_build_desired_state.py +0 -1434
  114. reconcile/test/test_three_way_diff_strategy.py +0 -131
  115. reconcile/test/test_utils_jinja2.py +0 -130
  116. reconcile/test/test_vault_replication.py +0 -534
  117. reconcile/test/test_vault_utils.py +0 -47
  118. reconcile/test/test_version_bump.py +0 -18
  119. reconcile/test/test_vpc_peerings_validator.py +0 -194
  120. reconcile/test/test_wrong_region.py +0 -78
  121. release/__init__.py +0 -0
  122. release/test_version.py +0 -50
  123. release/version.py +0 -104
  124. tools/cli_commands/test/__init__.py +0 -0
  125. tools/cli_commands/test/conftest.py +0 -332
  126. tools/cli_commands/test/test_aws_cost_report.py +0 -258
  127. tools/cli_commands/test/test_cost_management_api.py +0 -326
  128. tools/cli_commands/test/test_gpg_encrypt.py +0 -235
  129. tools/cli_commands/test/test_openshift_cost_optimization_report.py +0 -255
  130. tools/cli_commands/test/test_openshift_cost_report.py +0 -295
  131. tools/cli_commands/test/test_util.py +0 -70
  132. tools/test/__init__.py +0 -0
  133. tools/test/conftest.py +0 -77
  134. tools/test/test_app_interface_metrics_exporter.py +0 -48
  135. tools/test/test_erv2.py +0 -80
  136. tools/test/test_get_container_images.py +0 -230
  137. tools/test/test_qontract_cli.py +0 -197
  138. tools/test/test_saas_promotion_state.py +0 -187
  139. tools/test/test_sd_app_sre_alert_report.py +0 -74
  140. tools/test/test_sre_checkpoints.py +0 -79
@@ -1,478 +0,0 @@
1
- import copy
2
- from typing import Any
3
- from unittest.mock import (
4
- Mock,
5
- patch,
6
- )
7
-
8
- import pytest
9
- from kubernetes.dynamic import Resource
10
-
11
- from reconcile import openshift_resources_base as orb
12
- from reconcile.openshift_base import CurrentStateSpec
13
- from reconcile.openshift_resources_base import (
14
- CheckClusterScopedResourceDuplicates,
15
- canonicalize_namespaces,
16
- ob,
17
- )
18
- from reconcile.test.fixtures import Fixtures
19
- from reconcile.utils import oc
20
- from reconcile.utils.openshift_resource import ResourceInventory
21
-
22
- fxt = Fixtures("namespaces")
23
-
24
-
25
- @pytest.fixture
26
- def namespaces() -> list[dict[str, Any]]:
27
- return [fxt.get_anymarkup("openshift-resources-only.yml")]
28
-
29
-
30
- @pytest.fixture
31
- @patch("reconcile.utils.oc.OCNative")
32
- def oc_cs1(self) -> oc.OCClient:
33
- client = oc.OCNative(cluster_name="cs1", server="s", token="t", local=True)
34
- client.init_api_resources = True
35
- client.api_resources = {
36
- "Template": ["template.openshift.io/v1"],
37
- "Subscription": ["apps.open-cluster-management.io/v1", "operators.coreos.com"],
38
- }
39
- client.get_items = lambda kind, **kwargs: []
40
- return client
41
-
42
-
43
- @pytest.fixture
44
- def tmpl1() -> dict[str, Any]:
45
- return {
46
- "kind": "Template",
47
- "apiVersion": "template.openshift.io/v1",
48
- "metadata": {"name": "tmpl1"},
49
- }
50
-
51
-
52
- @pytest.fixture
53
- def current_state_spec(oc_cs1: oc.OCNative) -> CurrentStateSpec:
54
- return CurrentStateSpec(
55
- oc=oc_cs1, cluster="cs1", namespace="ns1", kind="Template", resource_names=None
56
- )
57
-
58
-
59
- def test_secret(namespaces: list[dict[str, Any]], mocker):
60
- mocker.patch.object(ob, "aggregate_shared_resources", autospec=True)
61
- expected = (
62
- [
63
- {
64
- "name": "ns1",
65
- "cluster": {"name": "cs1"},
66
- "managedResourceTypes": ["Template"],
67
- "openshiftResources": [
68
- {
69
- "provider": "vault-secret",
70
- "path": "/secret/place.yml",
71
- }
72
- ],
73
- }
74
- ],
75
- ["Secret"],
76
- )
77
-
78
- ns, override = canonicalize_namespaces(namespaces, ["vault-secret"])
79
- assert (ns, override) == expected
80
-
81
-
82
- def test_route(namespaces: list[dict[str, Any]], mocker):
83
- mocker.patch.object(ob, "aggregate_shared_resources", autospec=True)
84
- expected = (
85
- [
86
- {
87
- "name": "ns1",
88
- "cluster": {"name": "cs1"},
89
- "managedResourceTypes": ["Template"],
90
- "openshiftResources": [
91
- {"provider": "route", "path": "/route/network.yml"}
92
- ],
93
- }
94
- ],
95
- ["Route"],
96
- )
97
- ns, override = canonicalize_namespaces(namespaces, ["route"])
98
- assert (ns, override) == expected
99
-
100
-
101
- def test_no_overrides(namespaces: list[dict[str, Any]], mocker):
102
- mocker.patch.object(ob, "aggregate_shared_resources", autospec=True)
103
- expected = (
104
- [
105
- {
106
- "name": "ns1",
107
- "cluster": {"name": "cs1"},
108
- "managedResourceTypes": ["Template"],
109
- "openshiftResources": [
110
- {"provider": "resource", "path": "/some/path.yml"}
111
- ],
112
- }
113
- ],
114
- None,
115
- )
116
-
117
- ns, override = canonicalize_namespaces(namespaces, ["resource"])
118
- assert (ns, override) == expected
119
-
120
-
121
- @pytest.fixture
122
- @patch("reconcile.utils.oc.OCNative")
123
- def test_fetch_current_state_ri_not_initialized(
124
- oc_cs1: oc.OCClient, tmpl1: dict[str, Any]
125
- ):
126
- ri = ResourceInventory()
127
- oc_cs1.get_items = lambda kind, **kwargs: [tmpl1] # type: ignore[method-assign]
128
- ri.initialize_resource_type("cs1", "wrong_namespace", "Template")
129
- ri.initialize_resource_type("wrong_cluster", "ns1", "Template")
130
- ri.initialize_resource_type("cs1", "ns1", "wrong_kind")
131
- with pytest.raises(KeyError):
132
- orb.fetch_current_state(
133
- oc=oc_cs1,
134
- ri=ri,
135
- cluster="cs1",
136
- namespace="ns1",
137
- kind="Template",
138
- resource_names=[],
139
- )
140
-
141
- for _, _, _, resource in ri:
142
- assert len(resource["current"]) == 0
143
-
144
-
145
- def test_fetch_current_state_ri_initialized(oc_cs1: oc.OCClient, tmpl1: dict[str, Any]):
146
- ri = ResourceInventory()
147
- ri.initialize_resource_type("cs1", "ns1", "Template")
148
- oc_cs1.get_items = lambda kind, **kwargs: [tmpl1] # type: ignore[method-assign]
149
- orb.fetch_current_state(
150
- oc=oc_cs1,
151
- ri=ri,
152
- cluster="cs1",
153
- namespace="ns1",
154
- kind="Template",
155
- resource_names=[],
156
- )
157
-
158
- _, _, _, resource = next(iter(ri))
159
- assert len(resource["current"]) == 1
160
- assert "tmpl1" in resource["current"]
161
- assert resource["current"]["tmpl1"].kind == "Template"
162
-
163
-
164
- @pytest.fixture
165
- @patch("reconcile.utils.oc.OCNative")
166
- def test_fetch_current_state_kind_not_supported(
167
- oc_cs1: oc.OCNative, tmpl1: dict[str, Any]
168
- ):
169
- ri = ResourceInventory()
170
- ri.initialize_resource_type("cs1", "ns1", "AnUnsupportedKind")
171
- oc_cs1.get_items = lambda kind, **kwargs: [tmpl1]
172
- orb.fetch_current_state(
173
- oc=oc_cs1,
174
- ri=ri,
175
- cluster="cs1",
176
- namespace="ns1",
177
- kind="AnUnsupportedKind",
178
- resource_names=[],
179
- )
180
-
181
- _, _, _, resource = next(iter(ri))
182
- assert len(resource["current"]) == 0
183
-
184
-
185
- def test_fetch_current_state_long_kind(oc_cs1: oc.OCClient, tmpl1: dict[str, Any]):
186
- ri = ResourceInventory()
187
- ri.initialize_resource_type("cs1", "ns1", "Template.template.openshift.io")
188
- oc_cs1.get_items = lambda kind, **kwargs: [tmpl1] # type: ignore
189
- orb.fetch_current_state(
190
- oc=oc_cs1,
191
- ri=ri,
192
- cluster="cs1",
193
- namespace="ns1",
194
- kind="Template.template.openshift.io",
195
- resource_names=[],
196
- )
197
-
198
- _, _, _, resource = next(iter(ri))
199
- assert len(resource["current"]) == 1
200
- assert "tmpl1" in resource["current"]
201
- assert resource["current"]["tmpl1"].kind == "Template"
202
-
203
-
204
- @pytest.fixture
205
- @patch("reconcile.utils.oc.OCNative")
206
- def test_fetch_current_state_long_kind_not_supported(
207
- oc_cs1: oc.OCNative, tmpl1: dict[str, Any]
208
- ):
209
- ri = ResourceInventory()
210
- ri.initialize_resource_type("cs1", "ns1", "UnknownKind.mysterious.io")
211
- oc_cs1.get_items = lambda kind, **kwargs: [tmpl1]
212
- orb.fetch_current_state(
213
- oc=oc_cs1,
214
- ri=ri,
215
- cluster="cs1",
216
- namespace="ns1",
217
- kind="UnknownKind.mysterious.io",
218
- resource_names=[],
219
- )
220
-
221
- _, _, _, resource = next(iter(ri))
222
- assert len(resource["current"]) == 0
223
-
224
-
225
- def test_fetch_states(current_state_spec: CurrentStateSpec, tmpl1: dict[str, Any]):
226
- ri = ResourceInventory()
227
- ri.initialize_resource_type("cs1", "ns1", "Template")
228
- current_state_spec.oc.get_items = lambda kind, **kwargs: [tmpl1] # type: ignore[method-assign]
229
- orb.fetch_states(ri=ri, spec=current_state_spec)
230
- _, _, _, resource = next(iter(ri))
231
- assert len(resource["current"]) == 1
232
- assert "tmpl1" in resource["current"]
233
- assert resource["current"]["tmpl1"].kind == "Template"
234
-
235
-
236
- def test_fetch_states_unknown_kind(current_state_spec: CurrentStateSpec):
237
- current_state_spec.kind = "UnknownKind"
238
- ri = ResourceInventory()
239
- ri.initialize_resource_type("cs1", "ns1", "UnknownKind")
240
- orb.fetch_states(ri=ri, spec=current_state_spec)
241
- _, _, _, resource = next(iter(ri))
242
- assert len(resource["current"]) == 0
243
-
244
-
245
- def test_fetch_states_oc_error(current_state_spec: CurrentStateSpec):
246
- current_state_spec.oc.get_items = Mock( # type: ignore[method-assign]
247
- side_effect=oc.StatusCodeError("something wrong with openshift")
248
- )
249
- ri = ResourceInventory()
250
- ri.initialize_resource_type("cs1", "ns1", "Template")
251
- orb.fetch_states(ri=ri, spec=current_state_spec)
252
- assert ri.has_error_registered("cs1")
253
- _, _, _, resource = next(iter(ri))
254
- assert len(resource["current"]) == 0
255
-
256
-
257
- @pytest.fixture
258
- def nss_csr_overrides() -> list[dict[str, Any]]:
259
- return [fxt.get_anymarkup("ns-overrides-cluster-resources.yml")]
260
-
261
-
262
- @pytest.fixture
263
- def api_resources():
264
- p1 = Resource(
265
- prefix="",
266
- kind="Project",
267
- group="project.openshift.io",
268
- api_version="v1",
269
- namespaced=False,
270
- )
271
- p2 = Resource(
272
- prefix="",
273
- kind="Project",
274
- group="config.openshift.io",
275
- api_version="v1",
276
- namespaced=False,
277
- )
278
- cr = Resource(
279
- prefix="",
280
- kind="ClusterRole",
281
- group="rbac.authorization.k8s.io",
282
- api_version="v1",
283
- namespaced=False,
284
- )
285
- d1 = Resource(
286
- prefix="",
287
- kind="Deployment",
288
- group="apps",
289
- api_version="v1",
290
- namespaced=True,
291
- )
292
- return {"Project": [p1, p2], "ClusterRole": [cr], "Deployment": [d1]}
293
-
294
-
295
- @pytest.fixture
296
- def oc_api_resources(mocker, api_resources):
297
- mock = mocker.patch("reconcile.utils.oc.OCNative", autospec=True).return_value
298
- mock.get_api_resources.return_value = api_resources
299
- mock.is_kind_namespaced.side_effect = lambda k: k == "Deployment"
300
- return oc.OCNative("cluster", "server", "token", local=True)
301
-
302
-
303
- @pytest.fixture
304
- def oc_map_api_resources(mocker, oc_api_resources):
305
- ocmap = mocker.patch("reconcile.utils.oc.OC_Map", autospec=True).return_value
306
- ocmap.get_cluster.return_value = oc_api_resources
307
- ocmap.clusters.side_effect = (
308
- lambda include_errors=False, privileged=False: ["cs1"] if not privileged else []
309
- )
310
- return oc.OC_Map(clusters=["cs1"])
311
-
312
-
313
- def test_get_namespace_cluster_scoped_resources(
314
- oc_map_api_resources, nss_csr_overrides
315
- ):
316
- expected = (
317
- "cs1",
318
- "ns1",
319
- {
320
- "ClusterRole": ["cr1"],
321
- "Project.config.openshift.io": ["pr1", "pr2"],
322
- },
323
- )
324
-
325
- result = orb._get_namespace_cluster_scoped_resources(
326
- nss_csr_overrides[0],
327
- oc_map_api_resources,
328
- )
329
- assert result == expected
330
-
331
-
332
- def test_get_cluster_scoped_resources(oc_map_api_resources, nss_csr_overrides):
333
- expected = {
334
- "cs1": {
335
- "ns1": {
336
- "ClusterRole": ["cr1"],
337
- "Project.config.openshift.io": ["pr1", "pr2"],
338
- }
339
- }
340
- }
341
- result = orb.get_cluster_scoped_resources(
342
- oc_map_api_resources, clusters=["cs1"], namespaces=nss_csr_overrides
343
- )
344
- assert result == expected
345
-
346
-
347
- def test_find_resource_duplicates(oc_map_api_resources):
348
- input = {
349
- "cs1": {
350
- "ns1": {
351
- "ClusterRole": ["cr1"],
352
- "Project.config.openshift.io": ["pr1", "pr2"],
353
- },
354
- "ns2": {
355
- "ClusterRole": ["cr1"],
356
- },
357
- },
358
- "cs2": {
359
- "ns3": {
360
- "ClusterRole": ["cr1"],
361
- "ClusterRoleBinding": ["crb1"],
362
- },
363
- "ns4": {
364
- "ClusterRoleBinding": ["crb1"],
365
- },
366
- },
367
- }
368
- expected = [
369
- ("cs1", "ClusterRole", "cr1", ["ns1", "ns2"]),
370
- ("cs2", "ClusterRoleBinding", "crb1", ["ns3", "ns4"]),
371
- ]
372
- c = CheckClusterScopedResourceDuplicates(oc_map_api_resources)
373
- result = c._find_resource_duplicates(input)
374
- assert result == expected
375
-
376
-
377
- @pytest.fixture
378
- def resource_inventory_csr_tests():
379
- ri = ResourceInventory()
380
- ri.initialize_resource_type("cs1", "ns1", "ClusterRole")
381
- ri.initialize_resource_type("cs1", "ns1", "Project.config.openshift.io")
382
- ri.add_desired("cs1", "ns1", "ClusterRole", "cr1", "dummy_values", True)
383
- ri.add_desired(
384
- "cs1", "ns1", "Project.config.openshift.io", "pr1", "dummy_values", True
385
- )
386
- ri.add_desired(
387
- "cs1", "ns1", "Project.config.openshift.io", "pr2", "dummy_values", True
388
- )
389
- return ri
390
-
391
-
392
- def test_check_cluster_scoped_resources_ok(
393
- oc_map_api_resources, resource_inventory_csr_tests, nss_csr_overrides
394
- ):
395
- error = orb.check_cluster_scoped_resources(
396
- oc_map_api_resources,
397
- resource_inventory_csr_tests,
398
- nss_csr_overrides,
399
- nss_csr_overrides,
400
- )
401
-
402
- assert error is False
403
-
404
-
405
- def test_check_cluster_scoper_resources_non_declared(
406
- oc_map_api_resources, resource_inventory_csr_tests, nss_csr_overrides
407
- ):
408
- resource_inventory_csr_tests.add_desired(
409
- "cs1", "ns1", "ClusterRole", "cr3", "dummy_value", True
410
- )
411
- error = orb.check_cluster_scoped_resources(
412
- oc_map_api_resources,
413
- resource_inventory_csr_tests,
414
- nss_csr_overrides,
415
- nss_csr_overrides,
416
- )
417
-
418
- assert error is True
419
-
420
-
421
- def test_check_cluster_scoped_resources_duplicated(
422
- oc_map_api_resources, resource_inventory_csr_tests, nss_csr_overrides
423
- ):
424
- ns2 = copy.deepcopy(nss_csr_overrides[0])
425
- ns2["name"] = "ns3"
426
-
427
- all_namespaces = [nss_csr_overrides[0], ns2]
428
- error = orb.check_cluster_scoped_resources(
429
- oc_map_api_resources,
430
- resource_inventory_csr_tests,
431
- nss_csr_overrides,
432
- all_namespaces,
433
- )
434
-
435
- assert error is True
436
-
437
-
438
- def test_check_error():
439
- e = orb.CheckError("message")
440
- print(e)
441
-
442
-
443
- def test_cluster_params():
444
- with pytest.raises(RuntimeError):
445
- orb.run(dry_run=False, exclude_cluster=["test-cluster"])
446
-
447
- with pytest.raises(RuntimeError):
448
- orb.run(
449
- dry_run=False, cluster_name=["cluster-1"], exclude_cluster=["cluster-2"]
450
- )
451
-
452
- with pytest.raises(RuntimeError):
453
- orb.run(dry_run=False, cluster_name=["cluster-1", "cluster-2"])
454
-
455
-
456
- @pytest.mark.parametrize(
457
- "test_parameters, exception_expected",
458
- [
459
- ({" leading_space": "test"}, orb.SecretKeyFormatError),
460
- ({" space_padding ": "test"}, orb.SecretKeyFormatError),
461
- ({"trailing_space ": "test"}, orb.SecretKeyFormatError),
462
- ({"&invalidkey": "test"}, orb.SecretKeyFormatError),
463
- ({"!invalidkey": "test"}, orb.SecretKeyFormatError),
464
- ({"space issues": "test"}, orb.SecretKeyFormatError),
465
- ({"/etc/passwd": "test"}, orb.SecretKeyFormatError),
466
- ({"": "test"}, orb.SecretKeyFormatError),
467
- ({".": "test"}, None),
468
- ({"0validkey": "test"}, None),
469
- ({"no_spacing": "test"}, None),
470
- ({"-": "test"}, None),
471
- ],
472
- )
473
- def test_secret_keys(test_parameters, exception_expected):
474
- if exception_expected is not None:
475
- with pytest.raises(exception_expected):
476
- orb.assert_valid_secret_keys(test_parameters)
477
- else:
478
- orb.assert_valid_secret_keys(test_parameters)
@@ -1,188 +0,0 @@
1
- from collections.abc import Callable
2
- from unittest.mock import create_autospec
3
-
4
- import pytest
5
-
6
- from reconcile.openshift_saas_deploy import (
7
- compose_console_url,
8
- slack_notify,
9
- )
10
- from reconcile.openshift_tekton_resources import (
11
- OpenshiftTektonResourcesNameTooLongError,
12
- )
13
- from reconcile.typed_queries.saas_files import SaasFile
14
- from reconcile.utils import (
15
- openshift_resource,
16
- slack_api,
17
- )
18
- from reconcile.utils.saasherder.saasherder import UNIQUE_SAAS_FILE_ENV_COMBO_LEN
19
-
20
-
21
- @pytest.fixture
22
- def saas_file_builder(
23
- gql_class_factory: Callable[..., SaasFile],
24
- ) -> Callable[..., SaasFile]:
25
- def builder(saas_name: str) -> SaasFile:
26
- return gql_class_factory(
27
- SaasFile,
28
- {
29
- "name": saas_name,
30
- "app": {"name": "app_name"},
31
- "pipelinesProvider": {
32
- "namespace": {
33
- "name": "namespace_name",
34
- "cluster": {"consoleUrl": "https://console.url"},
35
- },
36
- "defaults": {
37
- "pipelineTemplates": {
38
- "openshiftSaasDeploy": {"name": "saas-deploy"}
39
- },
40
- },
41
- },
42
- "managedResourceTypes": [],
43
- "managedResourceNames": None,
44
- "imagePatterns": [],
45
- "resourceTemplates": [],
46
- },
47
- )
48
-
49
- return builder
50
-
51
-
52
- def test_compose_console_url(
53
- saas_file_builder: Callable[..., SaasFile],
54
- ) -> None:
55
- saas_file = saas_file_builder("saas_name")
56
- env_name = "production"
57
-
58
- url = compose_console_url(saas_file, env_name)
59
-
60
- assert (
61
- url
62
- == "https://console.url/k8s/ns/namespace_name/tekton.dev~v1~Pipeline/o-saas-deploy-saas_name/"
63
- "Runs?name=saas_name-production"
64
- )
65
-
66
-
67
- def test_compose_console_url_with_medium_saas_name(
68
- saas_file_builder: Callable[..., SaasFile],
69
- ) -> None:
70
- saas_name = "saas-openshift-cert-manager-routes"
71
- saas_file = saas_file_builder(saas_name)
72
- env_name = "app-sre-production"
73
-
74
- url = compose_console_url(saas_file, env_name)
75
-
76
- expected_run_name = f"{saas_name}-{env_name}"[:UNIQUE_SAAS_FILE_ENV_COMBO_LEN]
77
- assert (
78
- url == "https://console.url/k8s/ns/namespace_name/tekton.dev~v1~Pipeline/"
79
- "o-saas-deploy-saas-openshift-cert-manager-routes/"
80
- f"Runs?name={expected_run_name}"
81
- )
82
-
83
-
84
- def test_compose_console_url_with_long_saas_name(
85
- saas_file_builder: Callable[..., SaasFile],
86
- ) -> None:
87
- saas_name = "this-is-a-very-looooooooooooooooooooooong-saas-name"
88
- saas_file = saas_file_builder(saas_name)
89
- env_name = "app-sre-production"
90
-
91
- with pytest.raises(OpenshiftTektonResourcesNameTooLongError) as e:
92
- compose_console_url(saas_file, env_name)
93
-
94
- assert (
95
- f"Pipeline name o-saas-deploy-{saas_name} is longer than 56 characters"
96
- == str(e.value)
97
- )
98
-
99
-
100
- def test_slack_notify_skipped_success():
101
- api = create_autospec(slack_api.SlackApi)
102
- slack_notify(
103
- saas_file_name="test-slack_notify--skipped-success.yaml",
104
- env_name="test",
105
- slack=api,
106
- ri=openshift_resource.ResourceInventory(),
107
- console_url="https://test.local/console",
108
- in_progress=False,
109
- skip_successful_notifications=True,
110
- )
111
- api.chat_post_message.assert_not_called()
112
-
113
-
114
- def test_slack_notify_unskipped_success():
115
- api = create_autospec(slack_api.SlackApi)
116
- slack_notify(
117
- saas_file_name="test-slack_notify--unskipped-success.yaml",
118
- env_name="test",
119
- slack=api,
120
- ri=openshift_resource.ResourceInventory(),
121
- console_url="https://test.local/console",
122
- in_progress=False,
123
- skip_successful_notifications=False,
124
- )
125
- api.chat_post_message.assert_called_once_with(
126
- ":green_jenkins_circle: SaaS file *test-slack_notify--unskipped-success.yaml* "
127
- "deployment to environment *test*: Success "
128
- "(<https://test.local/console|Open>)"
129
- )
130
-
131
-
132
- def test_slack_notify_unskipped_failure():
133
- api = create_autospec(slack_api.SlackApi)
134
- ri = openshift_resource.ResourceInventory()
135
- ri.register_error()
136
- slack_notify(
137
- saas_file_name="test-saas-file-name.yaml",
138
- env_name="test",
139
- slack=api,
140
- ri=ri,
141
- console_url="https://test.local/console",
142
- in_progress=False,
143
- skip_successful_notifications=False,
144
- )
145
- api.chat_post_message.assert_called_once_with(
146
- ":red_jenkins_circle: SaaS file *test-saas-file-name.yaml* "
147
- "deployment to environment *test*: Failure "
148
- "(<https://test.local/console|Open>)"
149
- )
150
-
151
-
152
- def test_slack_notify_skipped_failure():
153
- api = create_autospec(slack_api.SlackApi)
154
- ri = openshift_resource.ResourceInventory()
155
- ri.register_error()
156
- slack_notify(
157
- saas_file_name="test-saas-file-name.yaml",
158
- env_name="test",
159
- slack=api,
160
- ri=ri,
161
- console_url="https://test.local/console",
162
- in_progress=False,
163
- skip_successful_notifications=True,
164
- )
165
- api.chat_post_message.assert_called_once_with(
166
- ":red_jenkins_circle: SaaS file *test-saas-file-name.yaml* "
167
- "deployment to environment *test*: Failure "
168
- "(<https://test.local/console|Open>)"
169
- )
170
-
171
-
172
- def test_slack_notify_skipped_in_progress():
173
- api = create_autospec(slack_api.SlackApi)
174
- ri = openshift_resource.ResourceInventory()
175
- slack_notify(
176
- saas_file_name="test-saas-file-name.yaml",
177
- env_name="test",
178
- slack=api,
179
- ri=ri,
180
- console_url="https://test.local/console",
181
- in_progress=True,
182
- skip_successful_notifications=True,
183
- )
184
- api.chat_post_message.assert_called_once_with(
185
- ":yellow_jenkins_circle: SaaS file *test-saas-file-name.yaml* "
186
- "deployment to environment *test*: In Progress "
187
- "(<https://test.local/console|Open>). There will not be a notice for success."
188
- )