qontract-reconcile 0.10.1rc1202__py3-none-any.whl → 0.10.2.dev2__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.dev2.dist-info/METADATA +500 -0
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.dist-info}/RECORD +12 -130
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.dist-info}/WHEEL +1 -2
- {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.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,1103 +0,0 @@
|
|
1
|
-
from collections.abc import (
|
2
|
-
Callable,
|
3
|
-
Iterable,
|
4
|
-
Mapping,
|
5
|
-
)
|
6
|
-
from unittest.mock import create_autospec
|
7
|
-
|
8
|
-
import pytest
|
9
|
-
from pytest_mock import MockerFixture
|
10
|
-
|
11
|
-
from reconcile.gql_definitions.common.clusters import (
|
12
|
-
ClusterMachinePoolV1,
|
13
|
-
ClusterSpecAutoScaleV1,
|
14
|
-
ClusterV1,
|
15
|
-
)
|
16
|
-
from reconcile.ocm_machine_pools import (
|
17
|
-
AbstractPool,
|
18
|
-
AWSNodePool,
|
19
|
-
ClusterType,
|
20
|
-
DesiredMachinePool,
|
21
|
-
InvalidUpdateError,
|
22
|
-
MachinePool,
|
23
|
-
MachinePoolAutoscaling,
|
24
|
-
NodePool,
|
25
|
-
PoolHandler,
|
26
|
-
calculate_diff,
|
27
|
-
run,
|
28
|
-
)
|
29
|
-
from reconcile.utils.ocm import OCM
|
30
|
-
|
31
|
-
|
32
|
-
class PoolStub(AbstractPool):
|
33
|
-
created = False
|
34
|
-
deleted = False
|
35
|
-
updated = False
|
36
|
-
|
37
|
-
def create(self, ocm: OCM) -> None:
|
38
|
-
self.created = True
|
39
|
-
|
40
|
-
def delete(self, ocm: OCM) -> None:
|
41
|
-
self.deleted = True
|
42
|
-
|
43
|
-
def update(self, ocm: OCM) -> None:
|
44
|
-
self.updated = True
|
45
|
-
|
46
|
-
def has_diff(self, pool: ClusterMachinePoolV1) -> bool:
|
47
|
-
return True
|
48
|
-
|
49
|
-
def invalid_diff(self, pool: ClusterMachinePoolV1) -> str | None:
|
50
|
-
return None
|
51
|
-
|
52
|
-
def deletable(self) -> bool:
|
53
|
-
return True
|
54
|
-
|
55
|
-
|
56
|
-
@pytest.fixture
|
57
|
-
def test_pool() -> PoolStub:
|
58
|
-
return PoolStub(
|
59
|
-
id="pool1",
|
60
|
-
replicas=2,
|
61
|
-
labels=None,
|
62
|
-
taints=None,
|
63
|
-
cluster="cluster1",
|
64
|
-
cluster_type=ClusterType.OSD,
|
65
|
-
)
|
66
|
-
|
67
|
-
|
68
|
-
@pytest.fixture
|
69
|
-
def current_with_pool() -> Mapping[str, list[AbstractPool]]:
|
70
|
-
return {
|
71
|
-
"cluster1": [
|
72
|
-
MachinePool(
|
73
|
-
id="pool1",
|
74
|
-
instance_type="m5.xlarge",
|
75
|
-
replicas=2,
|
76
|
-
labels=None,
|
77
|
-
taints=None,
|
78
|
-
cluster="cluster1",
|
79
|
-
cluster_type=ClusterType.OSD,
|
80
|
-
)
|
81
|
-
]
|
82
|
-
}
|
83
|
-
|
84
|
-
|
85
|
-
@pytest.fixture
|
86
|
-
def node_pool() -> NodePool:
|
87
|
-
return NodePool(
|
88
|
-
id="pool1",
|
89
|
-
replicas=2,
|
90
|
-
labels=None,
|
91
|
-
taints=None,
|
92
|
-
cluster="cluster1",
|
93
|
-
cluster_type=ClusterType.ROSA_HCP,
|
94
|
-
subnet="subnet1",
|
95
|
-
aws_node_pool=AWSNodePool(
|
96
|
-
instance_type="m5.xlarge",
|
97
|
-
),
|
98
|
-
)
|
99
|
-
|
100
|
-
|
101
|
-
@pytest.fixture
|
102
|
-
def machine_pool() -> MachinePool:
|
103
|
-
return MachinePool(
|
104
|
-
id="pool1",
|
105
|
-
replicas=2,
|
106
|
-
labels=None,
|
107
|
-
taints=None,
|
108
|
-
cluster="cluster1",
|
109
|
-
cluster_type=ClusterType.OSD,
|
110
|
-
instance_type="m5.xlarge",
|
111
|
-
)
|
112
|
-
|
113
|
-
|
114
|
-
@pytest.fixture
|
115
|
-
def cluster_machine_pool() -> ClusterMachinePoolV1:
|
116
|
-
return ClusterMachinePoolV1(
|
117
|
-
id="pool1",
|
118
|
-
instance_type="m5.xlarge",
|
119
|
-
replicas=1,
|
120
|
-
autoscale=None,
|
121
|
-
labels=None,
|
122
|
-
taints=None,
|
123
|
-
subnet="subnet1",
|
124
|
-
)
|
125
|
-
|
126
|
-
|
127
|
-
@pytest.fixture
|
128
|
-
def ocm_mock():
|
129
|
-
return create_autospec(OCM)
|
130
|
-
|
131
|
-
|
132
|
-
def test_diff__has_diff_autoscale(cluster_machine_pool: ClusterMachinePoolV1):
|
133
|
-
pool = PoolStub(id="pool1", cluster="cluster1", cluster_type=ClusterType.OSD)
|
134
|
-
|
135
|
-
assert cluster_machine_pool.autoscale is None
|
136
|
-
assert not pool._has_diff_autoscale(cluster_machine_pool)
|
137
|
-
|
138
|
-
cluster_machine_pool.autoscale = ClusterSpecAutoScaleV1(
|
139
|
-
min_replicas=1, max_replicas=2
|
140
|
-
)
|
141
|
-
assert pool._has_diff_autoscale(cluster_machine_pool)
|
142
|
-
|
143
|
-
cluster_machine_pool.autoscale = None
|
144
|
-
pool.autoscaling = MachinePoolAutoscaling(min_replicas=1, max_replicas=2)
|
145
|
-
assert pool._has_diff_autoscale(cluster_machine_pool)
|
146
|
-
|
147
|
-
cluster_machine_pool.autoscale = ClusterSpecAutoScaleV1(
|
148
|
-
min_replicas=1, max_replicas=2
|
149
|
-
)
|
150
|
-
assert not pool._has_diff_autoscale(cluster_machine_pool)
|
151
|
-
|
152
|
-
pool.autoscaling.max_replicas = 3
|
153
|
-
assert pool._has_diff_autoscale(cluster_machine_pool)
|
154
|
-
|
155
|
-
pool.autoscaling.max_replicas = 2
|
156
|
-
assert not pool._has_diff_autoscale(cluster_machine_pool)
|
157
|
-
|
158
|
-
pool.autoscaling.min_replicas = 0
|
159
|
-
assert pool._has_diff_autoscale(cluster_machine_pool)
|
160
|
-
|
161
|
-
|
162
|
-
def test_calculate_diff_create():
|
163
|
-
current: Mapping[str, list[AbstractPool]] = {
|
164
|
-
"cluster1": [],
|
165
|
-
}
|
166
|
-
desired = {
|
167
|
-
"cluster1": DesiredMachinePool(
|
168
|
-
cluster_name="cluster1",
|
169
|
-
cluster_type=ClusterType.OSD,
|
170
|
-
pools=[
|
171
|
-
ClusterMachinePoolV1(
|
172
|
-
id="pool1",
|
173
|
-
instance_type="m5.xlarge",
|
174
|
-
autoscale=None,
|
175
|
-
replicas=1,
|
176
|
-
labels=None,
|
177
|
-
taints=None,
|
178
|
-
subnet="subnet1",
|
179
|
-
)
|
180
|
-
],
|
181
|
-
)
|
182
|
-
}
|
183
|
-
|
184
|
-
diff, error = calculate_diff(current, desired)
|
185
|
-
assert len(diff) == 1
|
186
|
-
assert diff[0].action == "create"
|
187
|
-
assert not error
|
188
|
-
|
189
|
-
|
190
|
-
def test_calculate_diff_noop(current_with_pool):
|
191
|
-
desired = {
|
192
|
-
"cluster1": DesiredMachinePool(
|
193
|
-
cluster_name="cluster1",
|
194
|
-
cluster_type=ClusterType.OSD,
|
195
|
-
pools=[
|
196
|
-
ClusterMachinePoolV1(
|
197
|
-
id="pool1",
|
198
|
-
instance_type="m5.xlarge",
|
199
|
-
replicas=2,
|
200
|
-
autoscale=None,
|
201
|
-
labels=None,
|
202
|
-
taints=None,
|
203
|
-
subnet="subnet1",
|
204
|
-
)
|
205
|
-
],
|
206
|
-
),
|
207
|
-
}
|
208
|
-
diff, error = calculate_diff(current_with_pool, desired)
|
209
|
-
assert len(diff) == 0
|
210
|
-
assert not error
|
211
|
-
|
212
|
-
|
213
|
-
def test_calculate_diff_update(current_with_pool):
|
214
|
-
desired = {
|
215
|
-
"cluster1": DesiredMachinePool(
|
216
|
-
cluster_name="cluster1",
|
217
|
-
cluster_type=ClusterType.OSD,
|
218
|
-
pools=[
|
219
|
-
ClusterMachinePoolV1(
|
220
|
-
id="pool1",
|
221
|
-
instance_type="m5.xlarge",
|
222
|
-
replicas=1,
|
223
|
-
autoscale=None,
|
224
|
-
labels=None,
|
225
|
-
taints=None,
|
226
|
-
subnet="subnet1",
|
227
|
-
)
|
228
|
-
],
|
229
|
-
),
|
230
|
-
}
|
231
|
-
|
232
|
-
diff, error = calculate_diff(current_with_pool, desired)
|
233
|
-
assert len(diff) == 1
|
234
|
-
assert diff[0].action == "update"
|
235
|
-
assert not error
|
236
|
-
|
237
|
-
|
238
|
-
@pytest.fixture
|
239
|
-
def current_with_2_pools() -> Mapping[str, list[AbstractPool]]:
|
240
|
-
return {
|
241
|
-
"cluster1": [
|
242
|
-
MachinePool(
|
243
|
-
id="pool1",
|
244
|
-
instance_type="m5.xlarge",
|
245
|
-
replicas=2,
|
246
|
-
labels=None,
|
247
|
-
taints=None,
|
248
|
-
cluster="cluster1",
|
249
|
-
cluster_type=ClusterType.OSD,
|
250
|
-
),
|
251
|
-
MachinePool(
|
252
|
-
id="workers",
|
253
|
-
instance_type="m5.xlarge",
|
254
|
-
replicas=2,
|
255
|
-
labels=None,
|
256
|
-
taints=None,
|
257
|
-
cluster="cluster1",
|
258
|
-
cluster_type=ClusterType.OSD,
|
259
|
-
),
|
260
|
-
]
|
261
|
-
}
|
262
|
-
|
263
|
-
|
264
|
-
def test_calculate_diff_delete(current_with_2_pools):
|
265
|
-
desired = {
|
266
|
-
"cluster1": DesiredMachinePool(
|
267
|
-
cluster_name="cluster1",
|
268
|
-
cluster_type=ClusterType.OSD,
|
269
|
-
pools=[
|
270
|
-
ClusterMachinePoolV1(
|
271
|
-
id="pool1",
|
272
|
-
instance_type="m5.xlarge",
|
273
|
-
replicas=2,
|
274
|
-
autoscale=None,
|
275
|
-
labels=None,
|
276
|
-
taints=None,
|
277
|
-
subnet="subnet1",
|
278
|
-
)
|
279
|
-
],
|
280
|
-
),
|
281
|
-
}
|
282
|
-
|
283
|
-
diff, error = calculate_diff(current_with_2_pools, desired)
|
284
|
-
assert len(diff) == 1
|
285
|
-
assert diff[0].action == "delete"
|
286
|
-
assert not error
|
287
|
-
|
288
|
-
|
289
|
-
def test_calculate_diff_delete_all_fail_validation(current_with_pool):
|
290
|
-
desired = {
|
291
|
-
"cluster1": DesiredMachinePool(
|
292
|
-
cluster_name="cluster1",
|
293
|
-
cluster_type=ClusterType.OSD,
|
294
|
-
pools=[],
|
295
|
-
),
|
296
|
-
}
|
297
|
-
|
298
|
-
diff, error = calculate_diff(current_with_pool, desired)
|
299
|
-
assert len(diff) == 0
|
300
|
-
assert len(error) == 1
|
301
|
-
|
302
|
-
|
303
|
-
def test_act_dry_run(test_pool, ocm_mock):
|
304
|
-
handler = PoolHandler(action="create", pool=test_pool)
|
305
|
-
handler.act(ocm=ocm_mock, dry_run=True)
|
306
|
-
assert not test_pool.created
|
307
|
-
assert not test_pool.deleted
|
308
|
-
assert not test_pool.updated
|
309
|
-
|
310
|
-
|
311
|
-
def test_act_create(test_pool, ocm_mock):
|
312
|
-
handler = PoolHandler(action="create", pool=test_pool)
|
313
|
-
handler.act(ocm=ocm_mock, dry_run=False)
|
314
|
-
assert test_pool.created
|
315
|
-
|
316
|
-
|
317
|
-
def test_act_update(test_pool, ocm_mock):
|
318
|
-
handler = PoolHandler(action="update", pool=test_pool)
|
319
|
-
handler.act(ocm=ocm_mock, dry_run=False)
|
320
|
-
assert test_pool.updated
|
321
|
-
|
322
|
-
|
323
|
-
def test_act_delete(test_pool, ocm_mock):
|
324
|
-
handler = PoolHandler(action="delete", pool=test_pool)
|
325
|
-
handler.act(ocm=ocm_mock, dry_run=False)
|
326
|
-
assert test_pool.deleted
|
327
|
-
|
328
|
-
|
329
|
-
def test_pool_node_pool_has_diff(node_pool, cluster_machine_pool):
|
330
|
-
assert node_pool.has_diff(cluster_machine_pool)
|
331
|
-
cluster_machine_pool.replicas = 2
|
332
|
-
assert not node_pool.has_diff(cluster_machine_pool)
|
333
|
-
|
334
|
-
|
335
|
-
def test_pool_node_pool_invalid_diff_subnet(node_pool, cluster_machine_pool):
|
336
|
-
cluster_machine_pool.subnet = "foo"
|
337
|
-
assert node_pool.invalid_diff(cluster_machine_pool)
|
338
|
-
|
339
|
-
|
340
|
-
def test_pool_node_pool_invalid_diff_instance_type(node_pool, cluster_machine_pool):
|
341
|
-
cluster_machine_pool.instance_type = "foo"
|
342
|
-
assert node_pool.invalid_diff(cluster_machine_pool)
|
343
|
-
|
344
|
-
|
345
|
-
def test_pool_machine_pool_has_diff(machine_pool, cluster_machine_pool):
|
346
|
-
assert machine_pool.has_diff(cluster_machine_pool)
|
347
|
-
cluster_machine_pool.replicas = 2
|
348
|
-
assert not machine_pool.has_diff(cluster_machine_pool)
|
349
|
-
|
350
|
-
|
351
|
-
def test_pool_machine_pool_has_new_auto_scale(machine_pool, cluster_machine_pool):
|
352
|
-
machine_pool.replicas = None
|
353
|
-
cluster_machine_pool.replicas = None
|
354
|
-
assert not machine_pool.has_diff(cluster_machine_pool)
|
355
|
-
cluster_machine_pool.autoscale = ClusterSpecAutoScaleV1(
|
356
|
-
min_replicas=1, max_replicas=2
|
357
|
-
)
|
358
|
-
assert machine_pool.has_diff(cluster_machine_pool)
|
359
|
-
|
360
|
-
|
361
|
-
def test_pool_node_pool_has_new_auto_scale(node_pool, cluster_machine_pool):
|
362
|
-
node_pool.replicas = None
|
363
|
-
cluster_machine_pool.replicas = None
|
364
|
-
assert not node_pool.has_diff(cluster_machine_pool)
|
365
|
-
cluster_machine_pool.autoscale = ClusterSpecAutoScaleV1(
|
366
|
-
min_replicas=1, max_replicas=2
|
367
|
-
)
|
368
|
-
assert node_pool.has_diff(cluster_machine_pool)
|
369
|
-
|
370
|
-
|
371
|
-
def test_pool_machine_pool_invalid_diff_instance_type(
|
372
|
-
machine_pool, cluster_machine_pool
|
373
|
-
):
|
374
|
-
cluster_machine_pool.instance_type = "foo"
|
375
|
-
assert machine_pool.invalid_diff(cluster_machine_pool)
|
376
|
-
|
377
|
-
|
378
|
-
def test_machine_pool_update(machine_pool, ocm_mock):
|
379
|
-
machine_pool.update(ocm=ocm_mock)
|
380
|
-
|
381
|
-
ocm_mock.update_machine_pool.assert_called_once_with(
|
382
|
-
"cluster1",
|
383
|
-
{"id": "pool1", "replicas": 2, "cluster": "cluster1", "autoscaling": None},
|
384
|
-
)
|
385
|
-
|
386
|
-
machine_pool.labels = {"foo": "bar"}
|
387
|
-
machine_pool.update(ocm=ocm_mock)
|
388
|
-
ocm_mock.update_machine_pool.assert_called_with(
|
389
|
-
"cluster1",
|
390
|
-
{
|
391
|
-
"id": "pool1",
|
392
|
-
"replicas": 2,
|
393
|
-
"cluster": "cluster1",
|
394
|
-
"labels": {"foo": "bar"},
|
395
|
-
"autoscaling": None,
|
396
|
-
},
|
397
|
-
)
|
398
|
-
|
399
|
-
|
400
|
-
def test_node_pool_update(node_pool, ocm_mock):
|
401
|
-
node_pool.update(ocm=ocm_mock)
|
402
|
-
|
403
|
-
ocm_mock.update_node_pool.assert_called_once_with(
|
404
|
-
"cluster1",
|
405
|
-
{"id": "pool1", "replicas": 2, "cluster": "cluster1", "autoscaling": None},
|
406
|
-
)
|
407
|
-
|
408
|
-
node_pool.labels = {"foo": "bar"}
|
409
|
-
node_pool.update(ocm=ocm_mock)
|
410
|
-
ocm_mock.update_node_pool.assert_called_with(
|
411
|
-
"cluster1",
|
412
|
-
{
|
413
|
-
"id": "pool1",
|
414
|
-
"replicas": 2,
|
415
|
-
"cluster": "cluster1",
|
416
|
-
"labels": {"foo": "bar"},
|
417
|
-
"autoscaling": None,
|
418
|
-
},
|
419
|
-
)
|
420
|
-
|
421
|
-
|
422
|
-
def setup_mocks(
|
423
|
-
mocker: MockerFixture,
|
424
|
-
clusters: list[ClusterV1] | None = None,
|
425
|
-
machine_pools: list[dict] | None = None,
|
426
|
-
node_pools: list[dict] | None = None,
|
427
|
-
) -> dict:
|
428
|
-
mocked_get_clusters = mocker.patch(
|
429
|
-
"reconcile.ocm_machine_pools.get_clusters", return_value=clusters or []
|
430
|
-
)
|
431
|
-
mocked_ocm_map = mocker.patch("reconcile.ocm_machine_pools.OCMMap", autospec=True)
|
432
|
-
mocked_ocm = mocked_ocm_map.return_value.get.return_value
|
433
|
-
mocked_ocm.get_machine_pools.return_value = machine_pools or []
|
434
|
-
mocked_ocm.get_node_pools.return_value = node_pools or []
|
435
|
-
|
436
|
-
mocked_queries = mocker.patch("reconcile.ocm_machine_pools.queries")
|
437
|
-
|
438
|
-
return {
|
439
|
-
"get_clusters": mocked_get_clusters,
|
440
|
-
"queries": mocked_queries,
|
441
|
-
"OCMMap": mocked_ocm_map,
|
442
|
-
"OCM": mocked_ocm,
|
443
|
-
}
|
444
|
-
|
445
|
-
|
446
|
-
def test_run_no_action(mocker: MockerFixture) -> None:
|
447
|
-
mocks = setup_mocks(mocker, clusters=[])
|
448
|
-
|
449
|
-
run(False)
|
450
|
-
|
451
|
-
mocks["get_clusters"].assert_called_once_with()
|
452
|
-
mocks["OCMMap"].assert_not_called()
|
453
|
-
|
454
|
-
|
455
|
-
@pytest.fixture
|
456
|
-
def osd_cluster_builder(
|
457
|
-
gql_class_factory: Callable[..., ClusterV1],
|
458
|
-
) -> Callable[..., ClusterV1]:
|
459
|
-
def builder(machine_pools: list[dict]) -> ClusterV1:
|
460
|
-
return gql_class_factory(
|
461
|
-
ClusterV1,
|
462
|
-
{
|
463
|
-
"name": "ocm-cluster",
|
464
|
-
"auth": [],
|
465
|
-
"spec": {
|
466
|
-
"product": "osd",
|
467
|
-
},
|
468
|
-
"ocm": {
|
469
|
-
"name": "ocm-name",
|
470
|
-
"environment": {
|
471
|
-
"accessTokenClientSecret": {},
|
472
|
-
},
|
473
|
-
},
|
474
|
-
"machinePools": machine_pools,
|
475
|
-
},
|
476
|
-
)
|
477
|
-
|
478
|
-
return builder
|
479
|
-
|
480
|
-
|
481
|
-
@pytest.fixture
|
482
|
-
def rosa_cluster_builder(
|
483
|
-
gql_class_factory: Callable[..., ClusterV1],
|
484
|
-
) -> Callable[..., ClusterV1]:
|
485
|
-
def builder(machine_pools: list[dict]) -> ClusterV1:
|
486
|
-
return gql_class_factory(
|
487
|
-
ClusterV1,
|
488
|
-
{
|
489
|
-
"name": "ocm-cluster",
|
490
|
-
"auth": [],
|
491
|
-
"spec": {
|
492
|
-
"product": "rosa",
|
493
|
-
},
|
494
|
-
"ocm": {
|
495
|
-
"name": "ocm-name",
|
496
|
-
"environment": {
|
497
|
-
"accessTokenClientSecret": {},
|
498
|
-
},
|
499
|
-
},
|
500
|
-
"machinePools": machine_pools,
|
501
|
-
},
|
502
|
-
)
|
503
|
-
|
504
|
-
return builder
|
505
|
-
|
506
|
-
|
507
|
-
@pytest.fixture
|
508
|
-
def default_worker_machine_pool() -> dict:
|
509
|
-
return {
|
510
|
-
"id": "worker",
|
511
|
-
"instance_type": "m5.xlarge",
|
512
|
-
"replicas": 2,
|
513
|
-
}
|
514
|
-
|
515
|
-
|
516
|
-
@pytest.fixture
|
517
|
-
def osd_cluster_with_default_machine_pool(
|
518
|
-
osd_cluster_builder,
|
519
|
-
default_worker_machine_pool: dict,
|
520
|
-
) -> ClusterV1:
|
521
|
-
return osd_cluster_builder([default_worker_machine_pool])
|
522
|
-
|
523
|
-
|
524
|
-
@pytest.fixture
|
525
|
-
def rosa_cluster_with_default_machine_pool(
|
526
|
-
rosa_cluster_builder,
|
527
|
-
default_worker_machine_pool: dict,
|
528
|
-
) -> ClusterV1:
|
529
|
-
return rosa_cluster_builder([default_worker_machine_pool])
|
530
|
-
|
531
|
-
|
532
|
-
@pytest.fixture
|
533
|
-
def new_workers_machine_pool() -> dict:
|
534
|
-
return {
|
535
|
-
"id": "workers-new",
|
536
|
-
"instance_type": "m5.2xlarge",
|
537
|
-
"replicas": 3,
|
538
|
-
}
|
539
|
-
|
540
|
-
|
541
|
-
@pytest.fixture
|
542
|
-
def osd_cluster_with_default_and_new_machine_pools(
|
543
|
-
osd_cluster_builder,
|
544
|
-
default_worker_machine_pool: dict,
|
545
|
-
new_workers_machine_pool: dict,
|
546
|
-
) -> ClusterV1:
|
547
|
-
return osd_cluster_builder([
|
548
|
-
default_worker_machine_pool,
|
549
|
-
new_workers_machine_pool,
|
550
|
-
])
|
551
|
-
|
552
|
-
|
553
|
-
@pytest.fixture
|
554
|
-
def rosa_cluster_with_default_and_new_machine_pools(
|
555
|
-
rosa_cluster_builder,
|
556
|
-
default_worker_machine_pool: dict,
|
557
|
-
new_workers_machine_pool: dict,
|
558
|
-
) -> ClusterV1:
|
559
|
-
return rosa_cluster_builder([
|
560
|
-
default_worker_machine_pool,
|
561
|
-
new_workers_machine_pool,
|
562
|
-
])
|
563
|
-
|
564
|
-
|
565
|
-
@pytest.fixture
|
566
|
-
def expected_ocm_machine_pool_create_payload() -> dict:
|
567
|
-
return {
|
568
|
-
"autoscaling": None,
|
569
|
-
"cluster": "ocm-cluster",
|
570
|
-
"id": "workers-new",
|
571
|
-
"instance_type": "m5.2xlarge",
|
572
|
-
"labels": None,
|
573
|
-
"replicas": 3,
|
574
|
-
"taints": [],
|
575
|
-
}
|
576
|
-
|
577
|
-
|
578
|
-
def test_run_create_machine_pool_for_osd_cluster(
|
579
|
-
mocker: MockerFixture,
|
580
|
-
osd_cluster_with_default_and_new_machine_pools: ClusterV1,
|
581
|
-
default_worker_machine_pool: dict,
|
582
|
-
expected_ocm_machine_pool_create_payload: dict,
|
583
|
-
) -> None:
|
584
|
-
mocks = setup_mocks(
|
585
|
-
mocker,
|
586
|
-
clusters=[osd_cluster_with_default_and_new_machine_pools],
|
587
|
-
machine_pools=[default_worker_machine_pool],
|
588
|
-
)
|
589
|
-
|
590
|
-
run(False)
|
591
|
-
|
592
|
-
mocks["OCM"].create_machine_pool.assert_called_once_with(
|
593
|
-
osd_cluster_with_default_and_new_machine_pools.name,
|
594
|
-
expected_ocm_machine_pool_create_payload,
|
595
|
-
)
|
596
|
-
|
597
|
-
|
598
|
-
def test_run_create_machine_pool_for_rosa_cluster(
|
599
|
-
mocker: MockerFixture,
|
600
|
-
rosa_cluster_with_default_and_new_machine_pools: ClusterV1,
|
601
|
-
default_worker_machine_pool: dict,
|
602
|
-
expected_ocm_machine_pool_create_payload: dict,
|
603
|
-
) -> None:
|
604
|
-
mocks = setup_mocks(
|
605
|
-
mocker,
|
606
|
-
clusters=[rosa_cluster_with_default_and_new_machine_pools],
|
607
|
-
machine_pools=[default_worker_machine_pool],
|
608
|
-
)
|
609
|
-
|
610
|
-
run(False)
|
611
|
-
|
612
|
-
mocks["OCM"].create_machine_pool.assert_called_once_with(
|
613
|
-
rosa_cluster_with_default_and_new_machine_pools.name,
|
614
|
-
expected_ocm_machine_pool_create_payload,
|
615
|
-
)
|
616
|
-
|
617
|
-
|
618
|
-
@pytest.fixture
|
619
|
-
def existing_updated_default_machine_pool() -> dict:
|
620
|
-
return {
|
621
|
-
"id": "worker",
|
622
|
-
"instance_type": "m5.xlarge",
|
623
|
-
"replicas": 3,
|
624
|
-
}
|
625
|
-
|
626
|
-
|
627
|
-
@pytest.fixture
|
628
|
-
def expected_ocm_machine_pool_update_payload() -> dict:
|
629
|
-
return {
|
630
|
-
"autoscaling": None,
|
631
|
-
"cluster": "ocm-cluster",
|
632
|
-
"id": "worker",
|
633
|
-
"replicas": 2,
|
634
|
-
}
|
635
|
-
|
636
|
-
|
637
|
-
def test_run_update_machine_pool_for_osd_cluster(
|
638
|
-
mocker: MockerFixture,
|
639
|
-
osd_cluster_with_default_machine_pool: ClusterV1,
|
640
|
-
existing_updated_default_machine_pool: dict,
|
641
|
-
expected_ocm_machine_pool_update_payload: dict,
|
642
|
-
) -> None:
|
643
|
-
mocks = setup_mocks(
|
644
|
-
mocker,
|
645
|
-
clusters=[osd_cluster_with_default_machine_pool],
|
646
|
-
machine_pools=[existing_updated_default_machine_pool],
|
647
|
-
)
|
648
|
-
|
649
|
-
run(False)
|
650
|
-
|
651
|
-
mocks["OCM"].update_machine_pool.assert_called_once_with(
|
652
|
-
osd_cluster_with_default_machine_pool.name,
|
653
|
-
expected_ocm_machine_pool_update_payload,
|
654
|
-
)
|
655
|
-
|
656
|
-
|
657
|
-
def test_run_update_machine_pool_for_rosa_cluster(
|
658
|
-
mocker: MockerFixture,
|
659
|
-
rosa_cluster_with_default_machine_pool: ClusterV1,
|
660
|
-
existing_updated_default_machine_pool: dict,
|
661
|
-
expected_ocm_machine_pool_update_payload: dict,
|
662
|
-
) -> None:
|
663
|
-
mocks = setup_mocks(
|
664
|
-
mocker,
|
665
|
-
clusters=[rosa_cluster_with_default_machine_pool],
|
666
|
-
machine_pools=[existing_updated_default_machine_pool],
|
667
|
-
)
|
668
|
-
|
669
|
-
run(False)
|
670
|
-
|
671
|
-
mocks["OCM"].update_machine_pool.assert_called_once_with(
|
672
|
-
rosa_cluster_with_default_machine_pool.name,
|
673
|
-
expected_ocm_machine_pool_update_payload,
|
674
|
-
)
|
675
|
-
|
676
|
-
|
677
|
-
@pytest.fixture
|
678
|
-
def existing_default_machine_pool_with_different_instance_type() -> dict:
|
679
|
-
return {
|
680
|
-
"id": "worker",
|
681
|
-
"instance_type": "m5.2xlarge",
|
682
|
-
"replicas": 2,
|
683
|
-
}
|
684
|
-
|
685
|
-
|
686
|
-
def test_run_update_machine_pool_error_for_osd_cluster(
|
687
|
-
mocker: MockerFixture,
|
688
|
-
osd_cluster_with_default_machine_pool: ClusterV1,
|
689
|
-
existing_default_machine_pool_with_different_instance_type: dict,
|
690
|
-
) -> None:
|
691
|
-
setup_mocks(
|
692
|
-
mocker,
|
693
|
-
clusters=[osd_cluster_with_default_machine_pool],
|
694
|
-
machine_pools=[existing_default_machine_pool_with_different_instance_type],
|
695
|
-
)
|
696
|
-
|
697
|
-
with pytest.raises(ExceptionGroup) as eg:
|
698
|
-
run(False)
|
699
|
-
|
700
|
-
assert len(eg.value.exceptions) == 1
|
701
|
-
assert isinstance(eg.value.exceptions[0], InvalidUpdateError)
|
702
|
-
|
703
|
-
|
704
|
-
def test_run_update_machine_pool_error_for_rosa_cluster(
|
705
|
-
mocker: MockerFixture,
|
706
|
-
rosa_cluster_with_default_machine_pool: ClusterV1,
|
707
|
-
existing_default_machine_pool_with_different_instance_type: dict,
|
708
|
-
) -> None:
|
709
|
-
setup_mocks(
|
710
|
-
mocker,
|
711
|
-
clusters=[rosa_cluster_with_default_machine_pool],
|
712
|
-
machine_pools=[existing_default_machine_pool_with_different_instance_type],
|
713
|
-
)
|
714
|
-
|
715
|
-
with pytest.raises(ExceptionGroup) as eg:
|
716
|
-
run(False)
|
717
|
-
|
718
|
-
assert len(eg.value.exceptions) == 1
|
719
|
-
assert isinstance(eg.value.exceptions[0], InvalidUpdateError)
|
720
|
-
|
721
|
-
|
722
|
-
@pytest.fixture
|
723
|
-
def expected_ocm_machine_pool_delete_payload() -> dict:
|
724
|
-
return {
|
725
|
-
"autoscaling": None,
|
726
|
-
"cluster": "ocm-cluster",
|
727
|
-
"id": "workers-new",
|
728
|
-
"instance_type": "m5.2xlarge",
|
729
|
-
"labels": None,
|
730
|
-
"replicas": 3,
|
731
|
-
"taints": None,
|
732
|
-
}
|
733
|
-
|
734
|
-
|
735
|
-
def test_run_delete_machine_pool_for_osd_cluster(
|
736
|
-
mocker: MockerFixture,
|
737
|
-
osd_cluster_with_default_machine_pool: ClusterV1,
|
738
|
-
default_worker_machine_pool: dict,
|
739
|
-
new_workers_machine_pool: dict,
|
740
|
-
expected_ocm_machine_pool_delete_payload: dict,
|
741
|
-
) -> None:
|
742
|
-
mocks = setup_mocks(
|
743
|
-
mocker,
|
744
|
-
clusters=[osd_cluster_with_default_machine_pool],
|
745
|
-
machine_pools=[default_worker_machine_pool, new_workers_machine_pool],
|
746
|
-
)
|
747
|
-
|
748
|
-
run(False)
|
749
|
-
|
750
|
-
mocks["OCM"].delete_machine_pool.assert_called_once_with(
|
751
|
-
osd_cluster_with_default_machine_pool.name,
|
752
|
-
expected_ocm_machine_pool_delete_payload,
|
753
|
-
)
|
754
|
-
|
755
|
-
|
756
|
-
def test_run_delete_machine_pool_for_rosa_cluster(
|
757
|
-
mocker: MockerFixture,
|
758
|
-
rosa_cluster_with_default_machine_pool: ClusterV1,
|
759
|
-
default_worker_machine_pool: dict,
|
760
|
-
new_workers_machine_pool: dict,
|
761
|
-
expected_ocm_machine_pool_delete_payload: dict,
|
762
|
-
) -> None:
|
763
|
-
mocks = setup_mocks(
|
764
|
-
mocker,
|
765
|
-
clusters=[rosa_cluster_with_default_machine_pool],
|
766
|
-
machine_pools=[default_worker_machine_pool, new_workers_machine_pool],
|
767
|
-
)
|
768
|
-
|
769
|
-
run(False)
|
770
|
-
|
771
|
-
mocks["OCM"].delete_machine_pool.assert_called_once_with(
|
772
|
-
rosa_cluster_with_default_machine_pool.name,
|
773
|
-
expected_ocm_machine_pool_delete_payload,
|
774
|
-
)
|
775
|
-
|
776
|
-
|
777
|
-
@pytest.fixture
|
778
|
-
def osd_cluster_without_machine_pools(
|
779
|
-
osd_cluster_builder,
|
780
|
-
) -> ClusterV1:
|
781
|
-
return osd_cluster_builder([])
|
782
|
-
|
783
|
-
|
784
|
-
@pytest.fixture
|
785
|
-
def rosa_cluster_without_machine_pools(
|
786
|
-
rosa_cluster_builder,
|
787
|
-
) -> ClusterV1:
|
788
|
-
return rosa_cluster_builder([])
|
789
|
-
|
790
|
-
|
791
|
-
def test_run_delete_machine_pool_fail_validation_for_osd_cluster(
|
792
|
-
mocker: MockerFixture,
|
793
|
-
osd_cluster_without_machine_pools: ClusterV1,
|
794
|
-
default_worker_machine_pool: dict,
|
795
|
-
) -> None:
|
796
|
-
setup_mocks(
|
797
|
-
mocker,
|
798
|
-
clusters=[osd_cluster_without_machine_pools],
|
799
|
-
machine_pools=[default_worker_machine_pool],
|
800
|
-
)
|
801
|
-
|
802
|
-
with pytest.raises(ExceptionGroup) as eg:
|
803
|
-
run(False)
|
804
|
-
|
805
|
-
assert len(eg.value.exceptions) == 1
|
806
|
-
assert isinstance(eg.value.exceptions[0], InvalidUpdateError)
|
807
|
-
|
808
|
-
|
809
|
-
def test_run_delete_machine_pool_fail_validation_for_rosa_cluster(
|
810
|
-
mocker: MockerFixture,
|
811
|
-
rosa_cluster_without_machine_pools: ClusterV1,
|
812
|
-
default_worker_machine_pool: dict,
|
813
|
-
) -> None:
|
814
|
-
setup_mocks(
|
815
|
-
mocker,
|
816
|
-
clusters=[rosa_cluster_without_machine_pools],
|
817
|
-
machine_pools=[default_worker_machine_pool],
|
818
|
-
)
|
819
|
-
|
820
|
-
with pytest.raises(ExceptionGroup) as eg:
|
821
|
-
run(False)
|
822
|
-
|
823
|
-
assert len(eg.value.exceptions) == 1
|
824
|
-
assert isinstance(eg.value.exceptions[0], InvalidUpdateError)
|
825
|
-
|
826
|
-
|
827
|
-
@pytest.fixture
|
828
|
-
def osd_cluster_with_new_machine_pool(
|
829
|
-
osd_cluster_builder,
|
830
|
-
new_workers_machine_pool: dict,
|
831
|
-
) -> ClusterV1:
|
832
|
-
return osd_cluster_builder([new_workers_machine_pool])
|
833
|
-
|
834
|
-
|
835
|
-
@pytest.fixture
|
836
|
-
def rosa_cluster_with_new_machine_pool(
|
837
|
-
rosa_cluster_builder,
|
838
|
-
new_workers_machine_pool: dict,
|
839
|
-
) -> ClusterV1:
|
840
|
-
return rosa_cluster_builder([new_workers_machine_pool])
|
841
|
-
|
842
|
-
|
843
|
-
def test_run_delete_default_machine_pool_fail_validation_for_osd_cluster(
|
844
|
-
mocker: MockerFixture,
|
845
|
-
osd_cluster_with_new_machine_pool: ClusterV1,
|
846
|
-
default_worker_machine_pool: dict,
|
847
|
-
new_workers_machine_pool: dict,
|
848
|
-
) -> None:
|
849
|
-
setup_mocks(
|
850
|
-
mocker,
|
851
|
-
clusters=[osd_cluster_with_new_machine_pool],
|
852
|
-
machine_pools=[default_worker_machine_pool, new_workers_machine_pool],
|
853
|
-
)
|
854
|
-
|
855
|
-
with pytest.raises(ExceptionGroup) as eg:
|
856
|
-
run(False)
|
857
|
-
|
858
|
-
assert len(eg.value.exceptions) == 1
|
859
|
-
assert isinstance(eg.value.exceptions[0], InvalidUpdateError)
|
860
|
-
|
861
|
-
|
862
|
-
def test_run_delete_default_machine_pool_success_for_rosa_cluster(
|
863
|
-
mocker: MockerFixture,
|
864
|
-
rosa_cluster_with_new_machine_pool: ClusterV1,
|
865
|
-
default_worker_machine_pool: dict,
|
866
|
-
new_workers_machine_pool: dict,
|
867
|
-
) -> None:
|
868
|
-
mocks = setup_mocks(
|
869
|
-
mocker,
|
870
|
-
clusters=[rosa_cluster_with_new_machine_pool],
|
871
|
-
machine_pools=[default_worker_machine_pool, new_workers_machine_pool],
|
872
|
-
)
|
873
|
-
|
874
|
-
run(False)
|
875
|
-
|
876
|
-
mocks["OCM"].delete_machine_pool.assert_called_once()
|
877
|
-
|
878
|
-
|
879
|
-
@pytest.fixture
|
880
|
-
def hypershift_cluster_builder(
|
881
|
-
gql_class_factory: Callable[..., ClusterV1],
|
882
|
-
) -> Callable[..., ClusterV1]:
|
883
|
-
def builder(machine_pools: Iterable[dict]) -> ClusterV1:
|
884
|
-
return gql_class_factory(
|
885
|
-
ClusterV1,
|
886
|
-
{
|
887
|
-
"name": "hypershift-cluster",
|
888
|
-
"auth": [],
|
889
|
-
"ocm": {
|
890
|
-
"name": "hypershift",
|
891
|
-
"environment": {
|
892
|
-
"accessTokenClientSecret": {},
|
893
|
-
},
|
894
|
-
},
|
895
|
-
"spec": {
|
896
|
-
"product": "rosa",
|
897
|
-
"hypershift": True,
|
898
|
-
},
|
899
|
-
"machinePools": machine_pools,
|
900
|
-
},
|
901
|
-
)
|
902
|
-
|
903
|
-
return builder
|
904
|
-
|
905
|
-
|
906
|
-
@pytest.fixture
|
907
|
-
def default_hypershift_worker_machine_pool() -> dict:
|
908
|
-
return {
|
909
|
-
"id": "workers",
|
910
|
-
"instance_type": "m5.xlarge",
|
911
|
-
"replicas": 2,
|
912
|
-
}
|
913
|
-
|
914
|
-
|
915
|
-
@pytest.fixture
|
916
|
-
def hypershift_cluster(
|
917
|
-
hypershift_cluster_builder: Callable[..., ClusterV1],
|
918
|
-
default_hypershift_worker_machine_pool: dict,
|
919
|
-
) -> ClusterV1:
|
920
|
-
return hypershift_cluster_builder([default_hypershift_worker_machine_pool])
|
921
|
-
|
922
|
-
|
923
|
-
@pytest.fixture
|
924
|
-
def expected_node_pool_create_payload() -> dict:
|
925
|
-
return {
|
926
|
-
"autoscaling": None,
|
927
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
928
|
-
"cluster": "hypershift-cluster",
|
929
|
-
"id": "workers",
|
930
|
-
"labels": None,
|
931
|
-
"replicas": 2,
|
932
|
-
"subnet": None,
|
933
|
-
"taints": [],
|
934
|
-
}
|
935
|
-
|
936
|
-
|
937
|
-
def test_run_create_node_pool(
|
938
|
-
mocker: MockerFixture,
|
939
|
-
hypershift_cluster: ClusterV1,
|
940
|
-
expected_node_pool_create_payload: dict,
|
941
|
-
) -> None:
|
942
|
-
mocks = setup_mocks(mocker, clusters=[hypershift_cluster])
|
943
|
-
|
944
|
-
run(False)
|
945
|
-
|
946
|
-
mocks["OCM"].create_node_pool.assert_called_once_with(
|
947
|
-
hypershift_cluster.name,
|
948
|
-
expected_node_pool_create_payload,
|
949
|
-
)
|
950
|
-
|
951
|
-
|
952
|
-
@pytest.fixture
|
953
|
-
def existing_updated_hypershift_node_pools() -> list[dict]:
|
954
|
-
return [
|
955
|
-
{
|
956
|
-
"id": "workers",
|
957
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
958
|
-
"replicas": 3,
|
959
|
-
}
|
960
|
-
]
|
961
|
-
|
962
|
-
|
963
|
-
@pytest.fixture
|
964
|
-
def expected_hypershift_node_pool_update_payload() -> dict:
|
965
|
-
return {
|
966
|
-
"autoscaling": None,
|
967
|
-
"cluster": "hypershift-cluster",
|
968
|
-
"id": "workers",
|
969
|
-
"replicas": 2,
|
970
|
-
}
|
971
|
-
|
972
|
-
|
973
|
-
def test_run_update_node_pool(
|
974
|
-
mocker: MockerFixture,
|
975
|
-
hypershift_cluster: ClusterV1,
|
976
|
-
existing_updated_hypershift_node_pools: list[dict],
|
977
|
-
expected_hypershift_node_pool_update_payload: dict,
|
978
|
-
) -> None:
|
979
|
-
mocks = setup_mocks(
|
980
|
-
mocker,
|
981
|
-
clusters=[hypershift_cluster],
|
982
|
-
node_pools=existing_updated_hypershift_node_pools,
|
983
|
-
)
|
984
|
-
|
985
|
-
run(False)
|
986
|
-
|
987
|
-
mocks["OCM"].update_node_pool.assert_called_once_with(
|
988
|
-
hypershift_cluster.name,
|
989
|
-
expected_hypershift_node_pool_update_payload,
|
990
|
-
)
|
991
|
-
|
992
|
-
|
993
|
-
@pytest.fixture
|
994
|
-
def non_default_hypershift_node_pool() -> dict:
|
995
|
-
return {
|
996
|
-
"id": "new-workers",
|
997
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
998
|
-
"replicas": 3,
|
999
|
-
}
|
1000
|
-
|
1001
|
-
|
1002
|
-
@pytest.fixture
|
1003
|
-
def existing_multiple_hypershift_node_pools() -> list[dict]:
|
1004
|
-
return [
|
1005
|
-
{
|
1006
|
-
"id": "workers",
|
1007
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1008
|
-
"replicas": 3,
|
1009
|
-
},
|
1010
|
-
{
|
1011
|
-
"id": "new-workers",
|
1012
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1013
|
-
"replicas": 3,
|
1014
|
-
},
|
1015
|
-
]
|
1016
|
-
|
1017
|
-
|
1018
|
-
@pytest.fixture
|
1019
|
-
def expected_hypershift_node_pool_delete_payload() -> dict:
|
1020
|
-
return {
|
1021
|
-
"autoscaling": None,
|
1022
|
-
"cluster": "hypershift-cluster",
|
1023
|
-
"id": "new-workers",
|
1024
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1025
|
-
"labels": None,
|
1026
|
-
"replicas": 3,
|
1027
|
-
"subnet": None,
|
1028
|
-
"taints": None,
|
1029
|
-
}
|
1030
|
-
|
1031
|
-
|
1032
|
-
def test_run_delete_node_pool(
|
1033
|
-
mocker: MockerFixture,
|
1034
|
-
hypershift_cluster: ClusterV1,
|
1035
|
-
existing_multiple_hypershift_node_pools: list[dict],
|
1036
|
-
expected_hypershift_node_pool_delete_payload: dict,
|
1037
|
-
) -> None:
|
1038
|
-
mocks = setup_mocks(
|
1039
|
-
mocker,
|
1040
|
-
clusters=[hypershift_cluster],
|
1041
|
-
node_pools=existing_multiple_hypershift_node_pools,
|
1042
|
-
)
|
1043
|
-
|
1044
|
-
run(False)
|
1045
|
-
|
1046
|
-
mocks["OCM"].delete_node_pool.assert_called_once_with(
|
1047
|
-
hypershift_cluster.name,
|
1048
|
-
expected_hypershift_node_pool_delete_payload,
|
1049
|
-
)
|
1050
|
-
|
1051
|
-
|
1052
|
-
@pytest.fixture
|
1053
|
-
def non_default_hypershift_worker_machine_pool() -> dict:
|
1054
|
-
return {
|
1055
|
-
"id": "new-workers",
|
1056
|
-
"instance_type": "m5.xlarge",
|
1057
|
-
"replicas": 3,
|
1058
|
-
}
|
1059
|
-
|
1060
|
-
|
1061
|
-
@pytest.fixture
|
1062
|
-
def hypershift_cluster_without_default_worker_machine_pools(
|
1063
|
-
hypershift_cluster_builder: Callable[..., ClusterV1],
|
1064
|
-
non_default_hypershift_worker_machine_pool: dict,
|
1065
|
-
) -> ClusterV1:
|
1066
|
-
return hypershift_cluster_builder([non_default_hypershift_worker_machine_pool])
|
1067
|
-
|
1068
|
-
|
1069
|
-
@pytest.fixture
|
1070
|
-
def existing_multiple_hypershift_node_pools_with_defaults() -> list[dict]:
|
1071
|
-
return [
|
1072
|
-
{
|
1073
|
-
"id": "workers",
|
1074
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1075
|
-
"replicas": 3,
|
1076
|
-
},
|
1077
|
-
{
|
1078
|
-
"id": "workers-1",
|
1079
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1080
|
-
"replicas": 3,
|
1081
|
-
},
|
1082
|
-
{
|
1083
|
-
"id": "new-workers",
|
1084
|
-
"aws_node_pool": {"instance_type": "m5.xlarge"},
|
1085
|
-
"replicas": 3,
|
1086
|
-
},
|
1087
|
-
]
|
1088
|
-
|
1089
|
-
|
1090
|
-
def test_run_delete_default_node_pool(
|
1091
|
-
mocker: MockerFixture,
|
1092
|
-
hypershift_cluster_without_default_worker_machine_pools: ClusterV1,
|
1093
|
-
existing_multiple_hypershift_node_pools_with_defaults: list[dict],
|
1094
|
-
) -> None:
|
1095
|
-
mocks = setup_mocks(
|
1096
|
-
mocker,
|
1097
|
-
clusters=[hypershift_cluster_without_default_worker_machine_pools],
|
1098
|
-
node_pools=existing_multiple_hypershift_node_pools_with_defaults,
|
1099
|
-
)
|
1100
|
-
|
1101
|
-
run(False)
|
1102
|
-
|
1103
|
-
mocks["OCM"].delete_node_pool.assert_called()
|