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.
Files changed (138) hide show
  1. qontract_reconcile-0.10.2.dev2.dist-info/METADATA +500 -0
  2. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.dist-info}/RECORD +12 -130
  3. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.dist-info}/WHEEL +1 -2
  4. {qontract_reconcile-0.10.1rc1202.dist-info → qontract_reconcile-0.10.2.dev2.dist-info}/entry_points.txt +1 -0
  5. reconcile/aws_account_manager/README.md +5 -0
  6. reconcile/change_owners/README.md +34 -0
  7. reconcile/glitchtip/README.md +150 -0
  8. reconcile/gql_definitions/introspection.json +51176 -0
  9. reconcile/run_integration.py +293 -0
  10. reconcile/utils/binary.py +2 -2
  11. reconcile/utils/mr/README.md +198 -0
  12. reconcile/utils/oc_map.py +2 -2
  13. tools/qontract_cli.py +0 -0
  14. qontract_reconcile-0.10.1rc1202.dist-info/METADATA +0 -64
  15. qontract_reconcile-0.10.1rc1202.dist-info/top_level.txt +0 -3
  16. reconcile/test/__init__.py +0 -0
  17. reconcile/test/conftest.py +0 -157
  18. reconcile/test/fixtures.py +0 -24
  19. reconcile/test/saas_auto_promotions_manager/__init__.py +0 -0
  20. reconcile/test/saas_auto_promotions_manager/conftest.py +0 -170
  21. reconcile/test/saas_auto_promotions_manager/merge_request_manager/__init__.py +0 -0
  22. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/__init__.py +0 -0
  23. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/conftest.py +0 -115
  24. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/data_keys.py +0 -19
  25. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_desired_state.py +0 -66
  26. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_merge_request_manager.py +0 -86
  27. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_mr_parser.py +0 -352
  28. reconcile/test/saas_auto_promotions_manager/merge_request_manager/merge_request_manager/test_reconciler.py +0 -494
  29. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/__init__.py +0 -0
  30. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/conftest.py +0 -25
  31. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_multiple_namespaces.py +0 -37
  32. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_namespace.py +0 -81
  33. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_content_single_target.py +0 -61
  34. reconcile/test/saas_auto_promotions_manager/merge_request_manager/renderer/test_json_path_selector.py +0 -74
  35. reconcile/test/saas_auto_promotions_manager/test_integration_test.py +0 -52
  36. reconcile/test/saas_auto_promotions_manager/utils/__init__.py +0 -0
  37. reconcile/test/test_acs_notifiers.py +0 -393
  38. reconcile/test/test_acs_policies.py +0 -497
  39. reconcile/test/test_acs_rbac.py +0 -865
  40. reconcile/test/test_aggregated_list.py +0 -237
  41. reconcile/test/test_amtool.py +0 -37
  42. reconcile/test/test_aws_ami_cleanup.py +0 -230
  43. reconcile/test/test_aws_ami_share.py +0 -68
  44. reconcile/test/test_aws_cloudwatch_log_retention.py +0 -434
  45. reconcile/test/test_aws_iam_keys.py +0 -70
  46. reconcile/test/test_aws_iam_password_reset.py +0 -35
  47. reconcile/test/test_aws_support_cases_sos.py +0 -23
  48. reconcile/test/test_checkpoint.py +0 -178
  49. reconcile/test/test_cli.py +0 -41
  50. reconcile/test/test_closedbox_endpoint_monitoring.py +0 -207
  51. reconcile/test/test_dashdotdb_dora.py +0 -245
  52. reconcile/test/test_database_access_manager.py +0 -660
  53. reconcile/test/test_deadmanssnitch.py +0 -290
  54. reconcile/test/test_gabi_authorized_users.py +0 -72
  55. reconcile/test/test_gcr_mirror.py +0 -14
  56. reconcile/test/test_github_org.py +0 -156
  57. reconcile/test/test_github_repo_invites.py +0 -119
  58. reconcile/test/test_gitlab_housekeeping.py +0 -333
  59. reconcile/test/test_gitlab_labeler.py +0 -126
  60. reconcile/test/test_gitlab_members.py +0 -219
  61. reconcile/test/test_gitlab_permissions.py +0 -164
  62. reconcile/test/test_instrumented_wrappers.py +0 -18
  63. reconcile/test/test_integrations_manager.py +0 -1252
  64. reconcile/test/test_jenkins_worker_fleets.py +0 -57
  65. reconcile/test/test_jira_permissions_validator.py +0 -519
  66. reconcile/test/test_jump_host.py +0 -114
  67. reconcile/test/test_ldap_users.py +0 -125
  68. reconcile/test/test_make.py +0 -28
  69. reconcile/test/test_ocm_additional_routers.py +0 -133
  70. reconcile/test/test_ocm_clusters.py +0 -798
  71. reconcile/test/test_ocm_clusters_manifest_updates.py +0 -87
  72. reconcile/test/test_ocm_machine_pools.py +0 -1103
  73. reconcile/test/test_ocm_update_recommended_version.py +0 -145
  74. reconcile/test/test_ocm_upgrade_scheduler_org_updater.py +0 -125
  75. reconcile/test/test_openshift_base.py +0 -1269
  76. reconcile/test/test_openshift_cluster_bots.py +0 -240
  77. reconcile/test/test_openshift_namespace_labels.py +0 -344
  78. reconcile/test/test_openshift_namespaces.py +0 -256
  79. reconcile/test/test_openshift_resource.py +0 -443
  80. reconcile/test/test_openshift_resources_base.py +0 -478
  81. reconcile/test/test_openshift_saas_deploy.py +0 -188
  82. reconcile/test/test_openshift_saas_deploy_change_tester.py +0 -308
  83. reconcile/test/test_openshift_saas_deploy_trigger_cleaner.py +0 -65
  84. reconcile/test/test_openshift_serviceaccount_tokens.py +0 -282
  85. reconcile/test/test_openshift_tekton_resources.py +0 -265
  86. reconcile/test/test_openshift_upgrade_watcher.py +0 -223
  87. reconcile/test/test_prometheus_rules_tester.py +0 -151
  88. reconcile/test/test_quay_membership.py +0 -86
  89. reconcile/test/test_quay_mirror.py +0 -172
  90. reconcile/test/test_quay_mirror_org.py +0 -82
  91. reconcile/test/test_quay_repos.py +0 -59
  92. reconcile/test/test_queries.py +0 -53
  93. reconcile/test/test_repo_owners.py +0 -47
  94. reconcile/test/test_requests_sender.py +0 -139
  95. reconcile/test/test_saasherder.py +0 -1611
  96. reconcile/test/test_saasherder_allowed_secret_paths.py +0 -125
  97. reconcile/test/test_secret_reader.py +0 -153
  98. reconcile/test/test_slack_base.py +0 -183
  99. reconcile/test/test_slack_usergroups.py +0 -785
  100. reconcile/test/test_sql_query.py +0 -316
  101. reconcile/test/test_status_board.py +0 -258
  102. reconcile/test/test_terraform_aws_route53.py +0 -29
  103. reconcile/test/test_terraform_cloudflare_dns.py +0 -117
  104. reconcile/test/test_terraform_cloudflare_resources.py +0 -408
  105. reconcile/test/test_terraform_cloudflare_users.py +0 -747
  106. reconcile/test/test_terraform_repo.py +0 -440
  107. reconcile/test/test_terraform_resources.py +0 -519
  108. reconcile/test/test_terraform_tgw_attachments.py +0 -1295
  109. reconcile/test/test_terraform_users.py +0 -152
  110. reconcile/test/test_terraform_vpc_peerings.py +0 -576
  111. reconcile/test/test_terraform_vpc_peerings_build_desired_state.py +0 -1434
  112. reconcile/test/test_three_way_diff_strategy.py +0 -131
  113. reconcile/test/test_utils_jinja2.py +0 -130
  114. reconcile/test/test_vault_replication.py +0 -534
  115. reconcile/test/test_vault_utils.py +0 -47
  116. reconcile/test/test_version_bump.py +0 -18
  117. reconcile/test/test_vpc_peerings_validator.py +0 -194
  118. reconcile/test/test_wrong_region.py +0 -78
  119. release/__init__.py +0 -0
  120. release/test_version.py +0 -50
  121. release/version.py +0 -104
  122. tools/cli_commands/test/__init__.py +0 -0
  123. tools/cli_commands/test/conftest.py +0 -332
  124. tools/cli_commands/test/test_aws_cost_report.py +0 -258
  125. tools/cli_commands/test/test_cost_management_api.py +0 -326
  126. tools/cli_commands/test/test_gpg_encrypt.py +0 -235
  127. tools/cli_commands/test/test_openshift_cost_optimization_report.py +0 -255
  128. tools/cli_commands/test/test_openshift_cost_report.py +0 -295
  129. tools/cli_commands/test/test_util.py +0 -70
  130. tools/test/__init__.py +0 -0
  131. tools/test/conftest.py +0 -77
  132. tools/test/test_app_interface_metrics_exporter.py +0 -48
  133. tools/test/test_erv2.py +0 -80
  134. tools/test/test_get_container_images.py +0 -230
  135. tools/test/test_qontract_cli.py +0 -197
  136. tools/test/test_saas_promotion_state.py +0 -187
  137. tools/test/test_sd_app_sre_alert_report.py +0 -74
  138. tools/test/test_sre_checkpoints.py +0 -79
@@ -1,332 +0,0 @@
1
- from collections.abc import Callable
2
- from pathlib import Path
3
-
4
- import pytest
5
-
6
- from tools.cli_commands.cost_report.response import (
7
- OpenShiftCostOptimizationReportResponse,
8
- OpenShiftCostOptimizationResponse,
9
- RecommendationEngineResponse,
10
- RecommendationEnginesResponse,
11
- RecommendationResourcesResponse,
12
- RecommendationsResponse,
13
- RecommendationTermResponse,
14
- RecommendationTermsResponse,
15
- ResourceConfigResponse,
16
- ResourceResponse,
17
- )
18
-
19
-
20
- @pytest.fixture
21
- def fx() -> Callable:
22
- def _fx(name: str) -> str:
23
- return (Path(__file__).parent / "fixtures" / name).read_text()
24
-
25
- return _fx
26
-
27
-
28
- COST_MANAGEMENT_CONSOLE_BASE_URL = (
29
- "https://console.redhat.com/openshift/cost-management"
30
- )
31
-
32
- COST_MANAGEMENT_API_HOST = "https://host/"
33
-
34
- COST_REPORT_SECRET = {
35
- "api_base_url": f"{COST_MANAGEMENT_API_HOST}/v1",
36
- "token_url": "token_url",
37
- "client_id": "client_id",
38
- "client_secret": "client_secret",
39
- "scope": "scope",
40
- "console_base_url": COST_MANAGEMENT_CONSOLE_BASE_URL,
41
- }
42
-
43
- OPENSHIFT_COST_OPTIMIZATION_RESPONSE = OpenShiftCostOptimizationReportResponse(
44
- data=[
45
- OpenShiftCostOptimizationResponse(
46
- cluster_alias="some-cluster",
47
- cluster_uuid="some-cluster-uuid",
48
- container="test",
49
- id="id-uuid",
50
- project="some-project",
51
- workload="test-deployment",
52
- workload_type="deployment",
53
- recommendations=RecommendationsResponse(
54
- current=RecommendationResourcesResponse(
55
- limits=ResourceResponse(
56
- cpu=ResourceConfigResponse(amount=4),
57
- memory=ResourceConfigResponse(amount=5, format="Gi"),
58
- ),
59
- requests=ResourceResponse(
60
- cpu=ResourceConfigResponse(amount=1),
61
- memory=ResourceConfigResponse(amount=400, format="Mi"),
62
- ),
63
- ),
64
- recommendation_terms=RecommendationTermsResponse(
65
- long_term=RecommendationTermResponse(),
66
- medium_term=RecommendationTermResponse(),
67
- short_term=RecommendationTermResponse(
68
- recommendation_engines=RecommendationEnginesResponse(
69
- cost=RecommendationEngineResponse(
70
- config=RecommendationResourcesResponse(
71
- limits=ResourceResponse(
72
- cpu=ResourceConfigResponse(amount=5),
73
- memory=ResourceConfigResponse(
74
- amount=6, format="Gi"
75
- ),
76
- ),
77
- requests=ResourceResponse(
78
- cpu=ResourceConfigResponse(amount=3),
79
- memory=ResourceConfigResponse(
80
- amount=700, format="Mi"
81
- ),
82
- ),
83
- ),
84
- variation=RecommendationResourcesResponse(
85
- limits=ResourceResponse(
86
- cpu=ResourceConfigResponse(amount=1),
87
- memory=ResourceConfigResponse(
88
- amount=1, format="Gi"
89
- ),
90
- ),
91
- requests=ResourceResponse(
92
- cpu=ResourceConfigResponse(amount=2),
93
- memory=ResourceConfigResponse(
94
- amount=300, format="Mi"
95
- ),
96
- ),
97
- ),
98
- ),
99
- performance=RecommendationEngineResponse(
100
- config=RecommendationResourcesResponse(
101
- limits=ResourceResponse(
102
- cpu=ResourceConfigResponse(amount=3),
103
- memory=ResourceConfigResponse(
104
- amount=6, format="Gi"
105
- ),
106
- ),
107
- requests=ResourceResponse(
108
- cpu=ResourceConfigResponse(
109
- amount=600, format="millicores"
110
- ),
111
- memory=ResourceConfigResponse(
112
- amount=700, format="Mi"
113
- ),
114
- ),
115
- ),
116
- variation=RecommendationResourcesResponse(
117
- limits=ResourceResponse(
118
- cpu=ResourceConfigResponse(amount=-1),
119
- memory=ResourceConfigResponse(
120
- amount=1, format="Gi"
121
- ),
122
- ),
123
- requests=ResourceResponse(
124
- cpu=ResourceConfigResponse(
125
- amount=-400, format="millicores"
126
- ),
127
- memory=ResourceConfigResponse(
128
- amount=300, format="Mi"
129
- ),
130
- ),
131
- ),
132
- ),
133
- )
134
- ),
135
- ),
136
- ),
137
- )
138
- ]
139
- )
140
-
141
- OPENSHIFT_COST_OPTIMIZATION_WITH_FUZZY_MATCH_RESPONSE = (
142
- OpenShiftCostOptimizationReportResponse(
143
- data=[
144
- OpenShiftCostOptimizationResponse(
145
- cluster_alias="some-cluster",
146
- cluster_uuid="some-cluster-uuid",
147
- container="test",
148
- id="id-uuid",
149
- project="some-project",
150
- workload="test-deployment",
151
- workload_type="deployment",
152
- recommendations=RecommendationsResponse(
153
- current=RecommendationResourcesResponse(
154
- limits=ResourceResponse(
155
- cpu=ResourceConfigResponse(amount=4),
156
- memory=ResourceConfigResponse(amount=5, format="Gi"),
157
- ),
158
- requests=ResourceResponse(
159
- cpu=ResourceConfigResponse(amount=1),
160
- memory=ResourceConfigResponse(amount=400, format="Mi"),
161
- ),
162
- ),
163
- recommendation_terms=RecommendationTermsResponse(
164
- long_term=RecommendationTermResponse(),
165
- medium_term=RecommendationTermResponse(),
166
- short_term=RecommendationTermResponse(
167
- recommendation_engines=RecommendationEnginesResponse(
168
- cost=RecommendationEngineResponse(
169
- config=RecommendationResourcesResponse(
170
- limits=ResourceResponse(
171
- cpu=ResourceConfigResponse(amount=5),
172
- memory=ResourceConfigResponse(
173
- amount=6, format="Gi"
174
- ),
175
- ),
176
- requests=ResourceResponse(
177
- cpu=ResourceConfigResponse(amount=3),
178
- memory=ResourceConfigResponse(
179
- amount=700, format="Mi"
180
- ),
181
- ),
182
- ),
183
- variation=RecommendationResourcesResponse(
184
- limits=ResourceResponse(
185
- cpu=ResourceConfigResponse(amount=1),
186
- memory=ResourceConfigResponse(
187
- amount=1, format="Gi"
188
- ),
189
- ),
190
- requests=ResourceResponse(
191
- cpu=ResourceConfigResponse(amount=2),
192
- memory=ResourceConfigResponse(
193
- amount=300, format="Mi"
194
- ),
195
- ),
196
- ),
197
- ),
198
- performance=RecommendationEngineResponse(
199
- config=RecommendationResourcesResponse(
200
- limits=ResourceResponse(
201
- cpu=ResourceConfigResponse(amount=3),
202
- memory=ResourceConfigResponse(
203
- amount=6, format="Gi"
204
- ),
205
- ),
206
- requests=ResourceResponse(
207
- cpu=ResourceConfigResponse(
208
- amount=600, format="millicores"
209
- ),
210
- memory=ResourceConfigResponse(
211
- amount=700, format="Mi"
212
- ),
213
- ),
214
- ),
215
- variation=RecommendationResourcesResponse(
216
- limits=ResourceResponse(
217
- cpu=ResourceConfigResponse(amount=-1),
218
- memory=ResourceConfigResponse(
219
- amount=1, format="Gi"
220
- ),
221
- ),
222
- requests=ResourceResponse(
223
- cpu=ResourceConfigResponse(
224
- amount=-400, format="millicores"
225
- ),
226
- memory=ResourceConfigResponse(
227
- amount=300, format="Mi"
228
- ),
229
- ),
230
- ),
231
- ),
232
- )
233
- ),
234
- ),
235
- ),
236
- ),
237
- OpenShiftCostOptimizationResponse(
238
- cluster_alias="some-cluster2",
239
- cluster_uuid="some-cluster-uuid2",
240
- container="test",
241
- id="id-uuid",
242
- project="some-project2",
243
- workload="test-deployment",
244
- workload_type="deployment",
245
- recommendations=RecommendationsResponse(
246
- current=RecommendationResourcesResponse(
247
- limits=ResourceResponse(
248
- cpu=ResourceConfigResponse(amount=4),
249
- memory=ResourceConfigResponse(amount=5, format="Gi"),
250
- ),
251
- requests=ResourceResponse(
252
- cpu=ResourceConfigResponse(amount=1),
253
- memory=ResourceConfigResponse(amount=400, format="Mi"),
254
- ),
255
- ),
256
- recommendation_terms=RecommendationTermsResponse(
257
- long_term=RecommendationTermResponse(),
258
- medium_term=RecommendationTermResponse(),
259
- short_term=RecommendationTermResponse(
260
- recommendation_engines=RecommendationEnginesResponse(
261
- cost=RecommendationEngineResponse(
262
- config=RecommendationResourcesResponse(
263
- limits=ResourceResponse(
264
- cpu=ResourceConfigResponse(amount=5),
265
- memory=ResourceConfigResponse(
266
- amount=6, format="Gi"
267
- ),
268
- ),
269
- requests=ResourceResponse(
270
- cpu=ResourceConfigResponse(amount=3),
271
- memory=ResourceConfigResponse(
272
- amount=700, format="Mi"
273
- ),
274
- ),
275
- ),
276
- variation=RecommendationResourcesResponse(
277
- limits=ResourceResponse(
278
- cpu=ResourceConfigResponse(amount=1),
279
- memory=ResourceConfigResponse(
280
- amount=1, format="Gi"
281
- ),
282
- ),
283
- requests=ResourceResponse(
284
- cpu=ResourceConfigResponse(amount=2),
285
- memory=ResourceConfigResponse(
286
- amount=300, format="Mi"
287
- ),
288
- ),
289
- ),
290
- ),
291
- performance=RecommendationEngineResponse(
292
- config=RecommendationResourcesResponse(
293
- limits=ResourceResponse(
294
- cpu=ResourceConfigResponse(amount=3),
295
- memory=ResourceConfigResponse(
296
- amount=6, format="Gi"
297
- ),
298
- ),
299
- requests=ResourceResponse(
300
- cpu=ResourceConfigResponse(
301
- amount=600, format="millicores"
302
- ),
303
- memory=ResourceConfigResponse(
304
- amount=700, format="Mi"
305
- ),
306
- ),
307
- ),
308
- variation=RecommendationResourcesResponse(
309
- limits=ResourceResponse(
310
- cpu=ResourceConfigResponse(amount=-1),
311
- memory=ResourceConfigResponse(
312
- amount=1, format="Gi"
313
- ),
314
- ),
315
- requests=ResourceResponse(
316
- cpu=ResourceConfigResponse(
317
- amount=-400, format="millicores"
318
- ),
319
- memory=ResourceConfigResponse(
320
- amount=300, format="Mi"
321
- ),
322
- ),
323
- ),
324
- ),
325
- )
326
- ),
327
- ),
328
- ),
329
- ),
330
- ]
331
- )
332
- )
@@ -1,258 +0,0 @@
1
- from collections.abc import Callable
2
- from decimal import Decimal
3
- from typing import Any
4
-
5
- import pytest
6
- from pytest_mock import MockerFixture
7
-
8
- from reconcile.typed_queries.cost_report.app_names import App
9
- from tools.cli_commands.cost_report.aws import AwsCostReportCommand
10
- from tools.cli_commands.cost_report.model import ChildAppReport, Report, ReportItem
11
- from tools.cli_commands.cost_report.response import AwsReportCostResponse
12
- from tools.cli_commands.test.conftest import (
13
- COST_REPORT_SECRET,
14
- )
15
-
16
- COST_MANAGEMENT_CONSOLE_BASE_URL = (
17
- "https://console.redhat.com/openshift/cost-management"
18
- )
19
-
20
-
21
- @pytest.fixture
22
- def mock_gql(mocker: MockerFixture) -> Any:
23
- return mocker.patch("tools.cli_commands.cost_report.aws.gql")
24
-
25
-
26
- @pytest.fixture
27
- def mock_cost_management_api(mocker: MockerFixture) -> Any:
28
- return mocker.patch(
29
- "tools.cli_commands.cost_report.aws.CostManagementApi",
30
- autospec=True,
31
- )
32
-
33
-
34
- @pytest.fixture
35
- def mock_fetch_cost_report_secret(mocker: MockerFixture) -> Any:
36
- return mocker.patch(
37
- "tools.cli_commands.cost_report.aws.fetch_cost_report_secret",
38
- return_value=COST_REPORT_SECRET,
39
- )
40
-
41
-
42
- def test_aws_cost_report_create(
43
- mock_gql: Any,
44
- mock_cost_management_api: Any,
45
- mock_fetch_cost_report_secret: Any,
46
- ) -> None:
47
- cost_report_command = AwsCostReportCommand.create()
48
-
49
- assert isinstance(cost_report_command, AwsCostReportCommand)
50
- assert cost_report_command.gql_api == mock_gql.get_api.return_value
51
- assert (
52
- cost_report_command.cost_management_console_base_url
53
- == COST_MANAGEMENT_CONSOLE_BASE_URL
54
- )
55
- assert (
56
- cost_report_command.cost_management_api
57
- == mock_cost_management_api.create_from_secret.return_value
58
- )
59
- assert cost_report_command.thread_pool_size == 10
60
- mock_cost_management_api.create_from_secret.assert_called_once_with(
61
- COST_REPORT_SECRET
62
- )
63
- mock_fetch_cost_report_secret.assert_called_once_with(mock_gql.get_api.return_value)
64
-
65
-
66
- @pytest.fixture
67
- def aws_cost_report_command(
68
- mock_gql: Any,
69
- mock_cost_management_api: Any,
70
- mock_fetch_cost_report_secret: Any,
71
- ) -> AwsCostReportCommand:
72
- return AwsCostReportCommand.create()
73
-
74
-
75
- @pytest.fixture
76
- def mock_get_app_names(mocker: MockerFixture) -> Any:
77
- return mocker.patch("tools.cli_commands.cost_report.aws.get_app_names")
78
-
79
-
80
- PARENT_APP = App(name="parent", parent_app_name=None)
81
- CHILD_APP = App(name="child", parent_app_name="parent")
82
-
83
-
84
- def test_aws_cost_report_execute(
85
- aws_cost_report_command: AwsCostReportCommand,
86
- mock_get_app_names: Any,
87
- fx: Callable,
88
- ) -> None:
89
- expected_output = fx("empty_aws_cost_report.md")
90
- mock_get_app_names.return_value = []
91
-
92
- output = aws_cost_report_command.execute()
93
-
94
- assert output.rstrip() == expected_output.rstrip()
95
-
96
-
97
- def test_aws_cost_report_get_apps(
98
- aws_cost_report_command: AwsCostReportCommand,
99
- mock_get_app_names: Any,
100
- ) -> None:
101
- expected_apps = [PARENT_APP, CHILD_APP]
102
- mock_get_app_names.return_value = expected_apps
103
-
104
- apps = aws_cost_report_command.get_apps()
105
-
106
- assert apps == expected_apps
107
-
108
-
109
- def aws_report_cost_response_builder(
110
- delta_value: int,
111
- delta_percent: int,
112
- total: int,
113
- service: str,
114
- ) -> AwsReportCostResponse:
115
- return AwsReportCostResponse.parse_obj({
116
- "meta": {
117
- "delta": {
118
- "value": delta_value,
119
- "percent": delta_percent,
120
- },
121
- "total": {
122
- "cost": {
123
- "total": {
124
- "value": total,
125
- "units": "USD",
126
- }
127
- }
128
- },
129
- },
130
- "data": [
131
- {
132
- "date": "2024-02",
133
- "services": [
134
- {
135
- "service": service,
136
- "values": [
137
- {
138
- "delta_value": delta_value,
139
- "delta_percent": delta_percent,
140
- "cost": {
141
- "total": {
142
- "value": total,
143
- "units": "USD",
144
- }
145
- },
146
- }
147
- ],
148
- },
149
- ],
150
- }
151
- ],
152
- })
153
-
154
-
155
- PARENT_APP_COST_RESPONSE = aws_report_cost_response_builder(
156
- delta_value=100,
157
- delta_percent=10,
158
- total=1000,
159
- service="service1",
160
- )
161
-
162
- CHILD_APP_COST_RESPONSE = aws_report_cost_response_builder(
163
- delta_value=200,
164
- delta_percent=20,
165
- total=2000,
166
- service="service2",
167
- )
168
-
169
- PARENT_APP_REPORT = Report(
170
- app_name="parent",
171
- parent_app_name=None,
172
- child_apps=[
173
- ChildAppReport(name="child", total=Decimal(2000)),
174
- ],
175
- child_apps_total=Decimal(2000),
176
- date="2024-02",
177
- items=[
178
- ReportItem(
179
- name="service1",
180
- delta_value=Decimal(100),
181
- delta_percent=10,
182
- total=Decimal(1000),
183
- )
184
- ],
185
- items_total=Decimal(1000),
186
- items_delta_value=Decimal(100),
187
- items_delta_percent=10,
188
- total=Decimal(3000),
189
- )
190
-
191
- CHILD_APP_REPORT = Report(
192
- app_name="child",
193
- parent_app_name="parent",
194
- child_apps=[],
195
- child_apps_total=Decimal(0),
196
- date="2024-02",
197
- items=[
198
- ReportItem(
199
- name="service2",
200
- delta_value=Decimal(200),
201
- delta_percent=20,
202
- total=Decimal(2000),
203
- )
204
- ],
205
- items_total=Decimal(2000),
206
- items_delta_value=Decimal(200),
207
- items_delta_percent=20,
208
- total=Decimal(2000),
209
- )
210
-
211
-
212
- def test_aws_cost_report_get_reports(
213
- aws_cost_report_command: AwsCostReportCommand,
214
- mock_cost_management_api: Any,
215
- ) -> None:
216
- mocked_api = mock_cost_management_api.create_from_secret.return_value
217
- mocked_api.get_aws_costs_report.return_value = PARENT_APP_COST_RESPONSE
218
-
219
- reports = aws_cost_report_command.get_reports([PARENT_APP])
220
-
221
- assert reports == {
222
- "parent": PARENT_APP_COST_RESPONSE,
223
- }
224
- mocked_api.get_aws_costs_report.assert_called_once_with("parent")
225
-
226
-
227
- def test_aws_cost_report_process_reports(
228
- aws_cost_report_command: AwsCostReportCommand,
229
- ) -> None:
230
- expected_reports = {
231
- "parent": PARENT_APP_REPORT,
232
- "child": CHILD_APP_REPORT,
233
- }
234
-
235
- reports = aws_cost_report_command.process_reports(
236
- [PARENT_APP, CHILD_APP],
237
- {
238
- "parent": PARENT_APP_COST_RESPONSE,
239
- "child": CHILD_APP_COST_RESPONSE,
240
- },
241
- )
242
-
243
- assert reports == expected_reports
244
-
245
-
246
- def test_aws_cost_report_render(
247
- aws_cost_report_command: AwsCostReportCommand,
248
- fx: Callable,
249
- ) -> None:
250
- expected_output = fx("aws_cost_report.md")
251
- reports = {
252
- "parent": PARENT_APP_REPORT,
253
- "child": CHILD_APP_REPORT,
254
- }
255
-
256
- output = aws_cost_report_command.render(reports)
257
-
258
- assert output == expected_output