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,237 +0,0 @@
1
- import pytest
2
-
3
- from reconcile.utils.aggregated_list import (
4
- AggregatedDiffRunner,
5
- AggregatedList,
6
- )
7
-
8
-
9
- class TestAggregatedList:
10
- @staticmethod
11
- def test_add_item():
12
- alist = AggregatedList()
13
-
14
- params = {"a": 1, "b": 2}
15
- items = ["qwerty"]
16
-
17
- alist.add(params, items)
18
-
19
- assert len(alist.dump()) == 1
20
- assert alist.dump()[0]["items"] == items
21
- assert alist.dump()[0]["params"] == params
22
-
23
- @staticmethod
24
- def test_add_repeated_item():
25
- alist = AggregatedList()
26
-
27
- params = {"a": 1, "b": 2}
28
- item = "qwerty"
29
- items = [item, item]
30
-
31
- alist.add(params, items)
32
-
33
- assert len(alist.dump()) == 1
34
- assert alist.dump()[0]["items"] == [item]
35
- assert alist.dump()[0]["params"] == params
36
-
37
- @staticmethod
38
- def test_add_different_params():
39
- alist = AggregatedList()
40
-
41
- params1 = {"b": 1, "a": 2}
42
- items1 = ["qwerty1"]
43
-
44
- params2 = {"a": 1, "b": 3}
45
- items2 = ["qwerty2"]
46
-
47
- alist.add(params1, items1)
48
- alist.add(params2, items2)
49
-
50
- assert len(alist.dump()) == 2
51
-
52
- hp1 = AggregatedList.hash_params(params1)
53
- hp2 = AggregatedList.hash_params(params2)
54
-
55
- assert alist.get_by_params_hash(hp1)["items"] == items1
56
- assert alist.get_by_params_hash(hp2)["items"] == items2
57
-
58
- @staticmethod
59
- def test_get_py_params_hash():
60
- alist = AggregatedList()
61
-
62
- params1 = {"a": 1, "b": 2, "c": 3}
63
- params2 = {"b": 2, "c": 3, "a": 1}
64
- params3 = {"c": 3, "a": 1, "b": 2}
65
- params4 = {"a": 1, "c": 3, "b": 2}
66
- params5 = {"a": 1}
67
-
68
- items1 = ["qwerty1"]
69
- items2 = ["qwerty2"]
70
-
71
- alist.add(params1, items1)
72
- alist.add(params2, items1)
73
- alist.add(params3, items1)
74
- alist.add(params4, items1)
75
- alist.add(params5, items2)
76
-
77
- hp1 = AggregatedList.hash_params(params1)
78
- hp2 = AggregatedList.hash_params(params2)
79
- hp3 = AggregatedList.hash_params(params3)
80
- hp4 = AggregatedList.hash_params(params4)
81
- hp5 = AggregatedList.hash_params(params5)
82
-
83
- assert hp1 == hp2
84
- assert hp1 == hp2
85
- assert hp1 == hp3
86
- assert hp1 == hp4
87
- assert hp1 != hp5
88
-
89
- assert alist.get_by_params_hash(hp1)["items"] == items1
90
- assert alist.get_by_params_hash(hp5)["items"] == items2
91
-
92
- @staticmethod
93
- def test_diff_insert():
94
- left = AggregatedList()
95
- right = AggregatedList()
96
-
97
- right.add({"a": 1}, ["qwerty"])
98
-
99
- diff = left.diff(right)
100
-
101
- assert not diff["delete"]
102
- assert not diff["update-insert"]
103
- assert not diff["update-delete"]
104
-
105
- assert diff["insert"] == [{"params": {"a": 1}, "items": ["qwerty"]}]
106
-
107
- @staticmethod
108
- def test_diff_delete():
109
- left = AggregatedList()
110
- right = AggregatedList()
111
-
112
- left.add({"a": 1}, ["qwerty"])
113
-
114
- diff = left.diff(right)
115
-
116
- assert not diff["insert"]
117
- assert not diff["update-insert"]
118
- assert not diff["update-delete"]
119
-
120
- assert diff["delete"] == [{"params": {"a": 1}, "items": ["qwerty"]}]
121
-
122
- @staticmethod
123
- def test_diff_update_insert():
124
- left = AggregatedList()
125
- right = AggregatedList()
126
-
127
- left.add({"a": 1}, ["qwerty1"])
128
- right.add({"a": 1}, ["qwerty1", "qwerty2"])
129
-
130
- diff = left.diff(right)
131
-
132
- assert not diff["insert"]
133
- assert not diff["delete"]
134
- assert not diff["update-delete"]
135
-
136
- assert diff["update-insert"] == [{"items": ["qwerty2"], "params": {"a": 1}}]
137
-
138
- @staticmethod
139
- def test_diff_update_delete():
140
- left = AggregatedList()
141
- right = AggregatedList()
142
-
143
- left.add({"a": 1}, ["qwerty1", "qwerty2"])
144
- right.add({"a": 1}, ["qwerty1"])
145
-
146
- diff = left.diff(right)
147
-
148
- assert diff["insert"] == []
149
- assert diff["delete"] == []
150
- assert not diff["update-insert"]
151
-
152
- assert diff["update-delete"] == [{"items": ["qwerty2"], "params": {"a": 1}}]
153
-
154
-
155
- class TestAggregatedDiffRunner:
156
- @staticmethod
157
- def test_run():
158
- left = AggregatedList()
159
- right = AggregatedList()
160
-
161
- # test insert
162
- right.add({"on": "insert"}, ["i"])
163
-
164
- # test delete
165
- left.add({"on": "delete"}, ["d"])
166
-
167
- # test update-insert
168
- left.add({"on": "update-insert"}, ["ui1"])
169
- right.add({"on": "update-insert"}, ["ui1", "ui2"])
170
-
171
- # test update-delete
172
- left.add({"on": "update-delete"}, ["ud1", "ud2"])
173
- right.add({"on": "update-delete"}, ["ud1"])
174
-
175
- on_insert = []
176
- on_delete = []
177
- on_update_insert = []
178
- on_update_delete = []
179
-
180
- def recorder(ls):
181
- return lambda p, i: ls.append([p, i])
182
-
183
- runner = AggregatedDiffRunner(left.diff(right))
184
-
185
- runner.register("insert", recorder(on_insert))
186
- runner.register("delete", recorder(on_delete))
187
- runner.register("update-insert", recorder(on_update_insert))
188
- runner.register("update-delete", recorder(on_update_delete))
189
-
190
- runner.run()
191
-
192
- assert on_insert == [[{"on": "insert"}, ["i"]]]
193
- assert on_delete == [[{"on": "delete"}, ["d"]]]
194
- assert on_update_insert == [[{"on": "update-insert"}, ["ui2"]]]
195
- assert on_update_delete == [[{"on": "update-delete"}, ["ud2"]]]
196
-
197
- @staticmethod
198
- def test_run_cond_true():
199
- left = AggregatedList()
200
- right = AggregatedList()
201
-
202
- right.add({"on": "insert"}, ["qwerty"])
203
-
204
- runner = AggregatedDiffRunner(left.diff(right))
205
-
206
- recorder = []
207
- runner.register("insert", lambda p, i: recorder.append("True"), lambda p: True)
208
-
209
- runner.run()
210
-
211
- assert recorder == ["True"]
212
-
213
- @staticmethod
214
- def test_run_cond_false():
215
- left = AggregatedList()
216
- right = AggregatedList()
217
-
218
- right.add({"on": "insert"}, ["qwerty"])
219
-
220
- runner = AggregatedDiffRunner(left.diff(right))
221
-
222
- recorder = []
223
- runner.register("insert", lambda p, i: recorder.append("True"), lambda p: False)
224
-
225
- runner.run()
226
-
227
- assert not recorder
228
-
229
- @staticmethod
230
- def test_unknown_diff_on():
231
- left = AggregatedList()
232
- right = AggregatedList()
233
-
234
- runner = AggregatedDiffRunner(left.diff(right))
235
-
236
- with pytest.raises(Exception):
237
- runner.register("qwerty", lambda p, i: True, lambda p: True)
@@ -1,37 +0,0 @@
1
- import pytest
2
- import semver
3
-
4
- from reconcile.test.fixtures import Fixtures
5
- from reconcile.utils import amtool
6
-
7
-
8
- def test_minimal_version() -> None:
9
- if result := amtool.version():
10
- assert semver.VersionInfo.parse(str(result)).compare("0.24.0") >= 0
11
- else:
12
- pytest.fail(f"Error getting amtool version {result}")
13
-
14
-
15
- def test_check_good_config() -> None:
16
- am_config = Fixtures("amtool").get("alertmanager.yaml")
17
- result = amtool.check_config(am_config)
18
- assert result
19
-
20
-
21
- def test_check_bad_config() -> None:
22
- am_config = "bad: config"
23
- result = amtool.check_config(am_config)
24
- assert not result
25
-
26
-
27
- def test_config_routes_test() -> None:
28
- am_config = Fixtures("amtool").get("alertmanager.yaml")
29
- labels = {"service": "foo1"}
30
- result = amtool.config_routes_test(am_config, labels)
31
- assert result
32
- assert str(result) == "team-X-mails"
33
-
34
- labels["severity"] = "critical"
35
- result = amtool.config_routes_test(am_config, labels)
36
- assert result
37
- assert str(result) == "team-X-pager"
@@ -1,230 +0,0 @@
1
- # pylint does not consider frozen BaseModels as hashable and then complains that they cannot
2
- # be members of a set.
3
- # pylint: disable=unhashable-member
4
-
5
- from collections.abc import Generator
6
- from datetime import (
7
- datetime,
8
- timedelta,
9
- )
10
- from typing import (
11
- TYPE_CHECKING,
12
- Any,
13
- )
14
-
15
- import boto3
16
- import pytest
17
- from moto import mock_ec2
18
-
19
- from reconcile.aws_ami_cleanup.integration import (
20
- get_aws_amis,
21
- get_aws_amis_from_launch_templates,
22
- )
23
-
24
- if TYPE_CHECKING:
25
- from mypy_boto3_ec2 import EC2Client
26
- from mypy_boto3_ec2.type_defs import (
27
- CreateImageResultTypeDef,
28
- LaunchTemplateVersionTypeDef,
29
- )
30
- else:
31
- EC2Client = object
32
- CreateImageResultTypeDef = dict
33
- LaunchTemplateVersionTypeDef = dict
34
-
35
- MOTO_DEFAULT_ACCOUNT = "123456789012"
36
-
37
-
38
- @pytest.fixture
39
- def accounts() -> list[dict[str, Any]]:
40
- return [
41
- {
42
- "name": "some-account",
43
- "automationToken": {
44
- "path": "path",
45
- },
46
- "resourcesDefaultRegion": "default-region",
47
- }
48
- ]
49
-
50
-
51
- @pytest.fixture
52
- def ec2_client() -> Generator[EC2Client, None, None]:
53
- with mock_ec2():
54
- yield boto3.client("ec2", region_name="us-east-1")
55
-
56
-
57
- @pytest.fixture
58
- def rhel_image(ec2_client: EC2Client) -> CreateImageResultTypeDef:
59
- # RHEL7 ami from moto/ec2/resources/amis.json
60
- reservation = ec2_client.run_instances(
61
- ImageId="ami-bb9a6bc2", MinCount=1, MaxCount=1
62
- )
63
- instance_id = reservation["Instances"][0]["InstanceId"]
64
-
65
- return ec2_client.create_image(
66
- InstanceId=instance_id,
67
- Name="ci-int-jenkins-worker-rhel7-sha-123456",
68
- TagSpecifications=[
69
- {
70
- "ResourceType": "image",
71
- "Tags": [
72
- {"Key": "infra_commit", "Value": "sha-123456"},
73
- {"Key": "type", "Value": "ci-int-jenkins-worker-rhel7"},
74
- ],
75
- },
76
- ],
77
- )
78
-
79
-
80
- @pytest.fixture
81
- def suse_image(ec2_client: EC2Client) -> CreateImageResultTypeDef:
82
- # SUSE AMI from moto/ec2/resources/amis.json
83
- reservation = ec2_client.run_instances(
84
- ImageId="ami-35e92e4c", MinCount=1, MaxCount=1
85
- )
86
- instance_id = reservation["Instances"][0]["InstanceId"]
87
-
88
- return ec2_client.create_image(
89
- InstanceId=instance_id,
90
- Name="ci-int-jenkins-worker-suse12-sha-789012",
91
- TagSpecifications=[
92
- {
93
- "ResourceType": "image",
94
- "Tags": [
95
- {"Key": "infra_commit", "Value": "sha-789012"},
96
- {"Key": "arch", "Value": "ci-int-jenkins-worker-suse12"},
97
- ],
98
- },
99
- ],
100
- )
101
-
102
-
103
- @pytest.fixture
104
- def ubuntu_launch_template(ec2_client: EC2Client) -> LaunchTemplateVersionTypeDef:
105
- # Ubuntu AMI from moto/ec2/resources/amis.json
106
- response = ec2_client.create_launch_template(
107
- LaunchTemplateName="Ubuntu",
108
- LaunchTemplateData={
109
- "ImageId": "ami-1e749f67", # Canonical, Ubuntu, 14.04 LTS
110
- "InstanceType": "t3.micro",
111
- "SecurityGroupIds": ["sg-12345678"],
112
- },
113
- )
114
-
115
- return ec2_client.describe_launch_template_versions(
116
- LaunchTemplateId=response["LaunchTemplate"]["LaunchTemplateId"],
117
- Versions=["1"],
118
- )["LaunchTemplateVersions"][0]
119
-
120
-
121
- @pytest.fixture
122
- def suse_launch_template(ec2_client: EC2Client) -> LaunchTemplateVersionTypeDef:
123
- # SUSE AMI from moto/ec2/resources/amis.json
124
- response = ec2_client.create_launch_template(
125
- LaunchTemplateName="SUSE",
126
- LaunchTemplateData={
127
- "ImageId": "ami-35e92e4c", # SUSE Linux Enterprise Server 12 SP3
128
- "InstanceType": "t3.micro",
129
- "SecurityGroupIds": ["sg-12345678"],
130
- },
131
- )
132
-
133
- return ec2_client.describe_launch_template_versions(
134
- LaunchTemplateId=response["LaunchTemplate"]["LaunchTemplateId"],
135
- Versions=["1"],
136
- )["LaunchTemplateVersions"][0]
137
-
138
-
139
- def test_get_aws_amis_success(
140
- ec2_client: EC2Client,
141
- rhel_image: CreateImageResultTypeDef,
142
- suse_image: CreateImageResultTypeDef,
143
- ) -> None:
144
- utc_now = datetime.utcnow() + timedelta(seconds=60)
145
- amis = get_aws_amis(
146
- ec2_client=ec2_client,
147
- owner=MOTO_DEFAULT_ACCOUNT,
148
- regex="ci-int-jenkins-worker-rhel7.*",
149
- age_in_seconds=30,
150
- utc_now=utc_now,
151
- )
152
-
153
- assert len(amis) == 1
154
- assert amis[0].image_id == rhel_image["ImageId"]
155
-
156
-
157
- def test_get_aws_amis_unmatched_regex(
158
- ec2_client: EC2Client,
159
- rhel_image: CreateImageResultTypeDef,
160
- suse_image: CreateImageResultTypeDef,
161
- ) -> None:
162
- utc_now = datetime.utcnow() + timedelta(seconds=60)
163
- amis = get_aws_amis(
164
- ec2_client=ec2_client,
165
- owner=MOTO_DEFAULT_ACCOUNT,
166
- regex="ci-int-jenkins-worker-centos7.*",
167
- age_in_seconds=30,
168
- utc_now=utc_now,
169
- )
170
-
171
- assert len(amis) == 0
172
-
173
-
174
- def test_get_aws_amis_different_account(
175
- ec2_client: EC2Client,
176
- rhel_image: CreateImageResultTypeDef,
177
- suse_image: CreateImageResultTypeDef,
178
- ) -> None:
179
- utc_now = datetime.utcnow() + timedelta(seconds=60)
180
- amis = get_aws_amis(
181
- ec2_client=ec2_client,
182
- owner="789123456789",
183
- regex="ci-int-jenkins-worker-rhel7.*",
184
- age_in_seconds=30,
185
- utc_now=utc_now,
186
- )
187
-
188
- assert len(amis) == 0
189
-
190
-
191
- def test_get_aws_amis_too_young(
192
- ec2_client: EC2Client,
193
- rhel_image: CreateImageResultTypeDef,
194
- suse_image: CreateImageResultTypeDef,
195
- ) -> None:
196
- utc_now = datetime.utcnow() + timedelta(seconds=60)
197
- amis = get_aws_amis(
198
- ec2_client=ec2_client,
199
- owner=MOTO_DEFAULT_ACCOUNT,
200
- regex="ci-int-jenkins-worker-rhel7.*",
201
- age_in_seconds=90,
202
- utc_now=utc_now,
203
- )
204
-
205
- assert len(amis) == 0
206
-
207
-
208
- def test_get_aws_amis_from_launch_templates(
209
- ec2_client: EC2Client,
210
- ubuntu_launch_template: LaunchTemplateVersionTypeDef,
211
- suse_launch_template: LaunchTemplateVersionTypeDef,
212
- ) -> None:
213
- amis = get_aws_amis_from_launch_templates(ec2_client)
214
- assert amis == {
215
- ubuntu_launch_template["LaunchTemplateData"]["ImageId"],
216
- suse_launch_template["LaunchTemplateData"]["ImageId"],
217
- }
218
-
219
- # create a new ubuntu version
220
- new_ami_id = "ami-785db401" # "Canonical, Ubuntu, 16.04 LTS
221
- ec2_client.create_launch_template_version(
222
- LaunchTemplateId=ubuntu_launch_template["LaunchTemplateId"],
223
- LaunchTemplateData={"ImageId": new_ami_id},
224
- )
225
-
226
- amis = get_aws_amis_from_launch_templates(ec2_client)
227
- assert amis == {
228
- new_ami_id,
229
- suse_launch_template["LaunchTemplateData"]["ImageId"],
230
- }
@@ -1,68 +0,0 @@
1
- import pytest
2
-
3
- import reconcile.aws_ami_share as integ
4
-
5
-
6
- @pytest.fixture
7
- def accounts():
8
- return [
9
- {
10
- "name": "some-account",
11
- "automationToken": {
12
- "path": "path",
13
- },
14
- "resourcesDefaultRegion": "default-region",
15
- "sharing": [
16
- {
17
- "provider": "ami",
18
- "account": {
19
- "name": "shared-account",
20
- "uid": 123,
21
- },
22
- }
23
- ],
24
- },
25
- {
26
- "name": "some-account-too",
27
- "automationToken": {
28
- "path": "path",
29
- },
30
- "resourcesDefaultRegion": "default-region",
31
- },
32
- {
33
- "name": "shared-account",
34
- "automationToken": {
35
- "path": "path",
36
- },
37
- "resourcesDefaultRegion": "default-region",
38
- },
39
- ]
40
-
41
-
42
- def test_filter_accounts(accounts):
43
- filtered = [a["name"] for a in integ.filter_accounts(accounts)]
44
- assert filtered == ["some-account", "shared-account"]
45
-
46
-
47
- def test_get_region_share_valid():
48
- share = {"region": "valid"}
49
- src_account = {"resourcesDefaultRegion": "doesnt-matter"}
50
- dst_account = {"supportedDeploymentRegions": ["valid"]}
51
- result = integ.get_region(share, src_account, dst_account)
52
- assert result == "valid"
53
-
54
-
55
- def test_get_region_default_no_share():
56
- share = {"region": None}
57
- src_account = {"resourcesDefaultRegion": "valid"}
58
- dst_account = {"supportedDeploymentRegions": ["valid"]}
59
- result = integ.get_region(share, src_account, dst_account)
60
- assert result == "valid"
61
-
62
-
63
- def test_get_region_share_invalid():
64
- share = {"region": "invalid"}
65
- src_account = {"resourcesDefaultRegion": "doesnt-matter"}
66
- dst_account = {"name": "really", "supportedDeploymentRegions": ["valid"]}
67
- with pytest.raises(ValueError):
68
- integ.get_region(share, src_account, dst_account)