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.
- qontract_reconcile-0.10.2.dev1.dist-info/METADATA +500 -0
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/RECORD +12 -130
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/WHEEL +1 -2
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/entry_points.txt +1 -0
- reconcile/aws_account_manager/README.md +5 -0
- reconcile/change_owners/README.md +34 -0
- reconcile/glitchtip/README.md +150 -0
- reconcile/gql_definitions/introspection.json +51176 -0
- reconcile/run_integration.py +293 -0
- reconcile/utils/binary.py +2 -2
- reconcile/utils/mr/README.md +198 -0
- reconcile/utils/oc_map.py +2 -2
- tools/qontract_cli.py +0 -0
- qontract_reconcile-0.10.1rc1202.dist-info/METADATA +0 -64
- qontract_reconcile-0.10.1rc1202.dist-info/top_level.txt +0 -3
- reconcile/test/__init__.py +0 -0
- reconcile/test/conftest.py +0 -157
- reconcile/test/fixtures.py +0 -24
- reconcile/test/saas_auto_promotions_manager/__init__.py +0 -0
- reconcile/test/saas_auto_promotions_manager/conftest.py +0 -170
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/__init__.py +0 -0
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/__init__.py +0 -0
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -115
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py +0 -19
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py +0 -66
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py +0 -86
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_mr_parser.py +0 -352
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_reconciler.py +0 -494
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/__init__.py +0 -0
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -25
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +0 -37
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +0 -81
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +0 -61
- reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py +0 -74
- reconcile/test/saas_auto_promotions_manager/test_integration_test.py +0 -52
- reconcile/test/saas_auto_promotions_manager/utils/__init__.py +0 -0
- reconcile/test/test_acs_notifiers.py +0 -393
- reconcile/test/test_acs_policies.py +0 -497
- reconcile/test/test_acs_rbac.py +0 -865
- reconcile/test/test_aggregated_list.py +0 -237
- reconcile/test/test_amtool.py +0 -37
- reconcile/test/test_aws_ami_cleanup.py +0 -230
- reconcile/test/test_aws_ami_share.py +0 -68
- reconcile/test/test_aws_cloudwatch_log_retention.py +0 -434
- reconcile/test/test_aws_iam_keys.py +0 -70
- reconcile/test/test_aws_iam_password_reset.py +0 -35
- reconcile/test/test_aws_support_cases_sos.py +0 -23
- reconcile/test/test_checkpoint.py +0 -178
- reconcile/test/test_cli.py +0 -41
- reconcile/test/test_closedbox_endpoint_monitoring.py +0 -207
- reconcile/test/test_dashdotdb_dora.py +0 -245
- reconcile/test/test_database_access_manager.py +0 -660
- reconcile/test/test_deadmanssnitch.py +0 -290
- reconcile/test/test_gabi_authorized_users.py +0 -72
- reconcile/test/test_gcr_mirror.py +0 -14
- reconcile/test/test_github_org.py +0 -156
- reconcile/test/test_github_repo_invites.py +0 -119
- reconcile/test/test_gitlab_housekeeping.py +0 -333
- reconcile/test/test_gitlab_labeler.py +0 -126
- reconcile/test/test_gitlab_members.py +0 -219
- reconcile/test/test_gitlab_permissions.py +0 -164
- reconcile/test/test_instrumented_wrappers.py +0 -18
- reconcile/test/test_integrations_manager.py +0 -1252
- reconcile/test/test_jenkins_worker_fleets.py +0 -57
- reconcile/test/test_jira_permissions_validator.py +0 -519
- reconcile/test/test_jump_host.py +0 -114
- reconcile/test/test_ldap_users.py +0 -125
- reconcile/test/test_make.py +0 -28
- reconcile/test/test_ocm_additional_routers.py +0 -133
- reconcile/test/test_ocm_clusters.py +0 -798
- reconcile/test/test_ocm_clusters_manifest_updates.py +0 -87
- reconcile/test/test_ocm_machine_pools.py +0 -1103
- reconcile/test/test_ocm_update_recommended_version.py +0 -145
- reconcile/test/test_ocm_upgrade_scheduler_org_updater.py +0 -125
- reconcile/test/test_openshift_base.py +0 -1269
- reconcile/test/test_openshift_cluster_bots.py +0 -240
- reconcile/test/test_openshift_namespace_labels.py +0 -344
- reconcile/test/test_openshift_namespaces.py +0 -256
- reconcile/test/test_openshift_resource.py +0 -443
- reconcile/test/test_openshift_resources_base.py +0 -478
- reconcile/test/test_openshift_saas_deploy.py +0 -188
- reconcile/test/test_openshift_saas_deploy_change_tester.py +0 -308
- reconcile/test/test_openshift_saas_deploy_trigger_cleaner.py +0 -65
- reconcile/test/test_openshift_serviceaccount_tokens.py +0 -282
- reconcile/test/test_openshift_tekton_resources.py +0 -265
- reconcile/test/test_openshift_upgrade_watcher.py +0 -223
- reconcile/test/test_prometheus_rules_tester.py +0 -151
- reconcile/test/test_quay_membership.py +0 -86
- reconcile/test/test_quay_mirror.py +0 -172
- reconcile/test/test_quay_mirror_org.py +0 -82
- reconcile/test/test_quay_repos.py +0 -59
- reconcile/test/test_queries.py +0 -53
- reconcile/test/test_repo_owners.py +0 -47
- reconcile/test/test_requests_sender.py +0 -139
- reconcile/test/test_saasherder.py +0 -1611
- reconcile/test/test_saasherder_allowed_secret_paths.py +0 -125
- reconcile/test/test_secret_reader.py +0 -153
- reconcile/test/test_slack_base.py +0 -183
- reconcile/test/test_slack_usergroups.py +0 -785
- reconcile/test/test_sql_query.py +0 -316
- reconcile/test/test_status_board.py +0 -258
- reconcile/test/test_terraform_aws_route53.py +0 -29
- reconcile/test/test_terraform_cloudflare_dns.py +0 -117
- reconcile/test/test_terraform_cloudflare_resources.py +0 -408
- reconcile/test/test_terraform_cloudflare_users.py +0 -747
- reconcile/test/test_terraform_repo.py +0 -440
- reconcile/test/test_terraform_resources.py +0 -519
- reconcile/test/test_terraform_tgw_attachments.py +0 -1295
- reconcile/test/test_terraform_users.py +0 -152
- reconcile/test/test_terraform_vpc_peerings.py +0 -576
- reconcile/test/test_terraform_vpc_peerings_build_desired_state.py +0 -1434
- reconcile/test/test_three_way_diff_strategy.py +0 -131
- reconcile/test/test_utils_jinja2.py +0 -130
- reconcile/test/test_vault_replication.py +0 -534
- reconcile/test/test_vault_utils.py +0 -47
- reconcile/test/test_version_bump.py +0 -18
- reconcile/test/test_vpc_peerings_validator.py +0 -194
- reconcile/test/test_wrong_region.py +0 -78
- release/__init__.py +0 -0
- release/test_version.py +0 -50
- release/version.py +0 -104
- tools/cli_commands/test/__init__.py +0 -0
- tools/cli_commands/test/conftest.py +0 -332
- tools/cli_commands/test/test_aws_cost_report.py +0 -258
- tools/cli_commands/test/test_cost_management_api.py +0 -326
- tools/cli_commands/test/test_gpg_encrypt.py +0 -235
- tools/cli_commands/test/test_openshift_cost_optimization_report.py +0 -255
- tools/cli_commands/test/test_openshift_cost_report.py +0 -295
- tools/cli_commands/test/test_util.py +0 -70
- tools/test/__init__.py +0 -0
- tools/test/conftest.py +0 -77
- tools/test/test_app_interface_metrics_exporter.py +0 -48
- tools/test/test_erv2.py +0 -80
- tools/test/test_get_container_images.py +0 -230
- tools/test/test_qontract_cli.py +0 -197
- tools/test/test_saas_promotion_state.py +0 -187
- tools/test/test_sd_app_sre_alert_report.py +0 -74
- 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)
|
reconcile/test/test_amtool.py
DELETED
@@ -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)
|