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,187 +0,0 @@
|
|
1
|
-
from collections.abc import (
|
2
|
-
Callable,
|
3
|
-
Iterable,
|
4
|
-
Mapping,
|
5
|
-
)
|
6
|
-
from unittest.mock import (
|
7
|
-
create_autospec,
|
8
|
-
)
|
9
|
-
|
10
|
-
from pytest import raises
|
11
|
-
|
12
|
-
from reconcile.typed_queries.saas_files import SaasFile
|
13
|
-
from reconcile.utils.promotion_state import PromotionData, PromotionState
|
14
|
-
from tools.saas_promotion_state.saas_promotion_state import (
|
15
|
-
SaasPromotionState,
|
16
|
-
SaasPromotionStateException,
|
17
|
-
SaasPromotionStateMissingException,
|
18
|
-
)
|
19
|
-
|
20
|
-
|
21
|
-
def test_get_saas_promotion_state(
|
22
|
-
saas_files_builder: Callable[[Iterable[Mapping]], list[SaasFile]],
|
23
|
-
) -> None:
|
24
|
-
saas_files = saas_files_builder([
|
25
|
-
{
|
26
|
-
"path": "/saas1.yml",
|
27
|
-
"name": "saas_1",
|
28
|
-
"resourceTemplates": [
|
29
|
-
{
|
30
|
-
"name": "template_1",
|
31
|
-
"url": "repo1/url",
|
32
|
-
"targets": [
|
33
|
-
{
|
34
|
-
"ref": "main",
|
35
|
-
"namespace": {"path": "/namespace1.yml"},
|
36
|
-
"promotion": {
|
37
|
-
"publish": ["channel-a"],
|
38
|
-
},
|
39
|
-
}
|
40
|
-
],
|
41
|
-
}
|
42
|
-
],
|
43
|
-
},
|
44
|
-
{
|
45
|
-
"path": "/saas2.yml",
|
46
|
-
"name": "saas_2",
|
47
|
-
"resourceTemplates": [
|
48
|
-
{
|
49
|
-
"name": "template_2",
|
50
|
-
"url": "repo2/url",
|
51
|
-
"targets": [
|
52
|
-
{
|
53
|
-
"ref": "main",
|
54
|
-
"namespace": {"path": "/namespace2.yml"},
|
55
|
-
"promotion": {
|
56
|
-
"publish": ["channel-b"],
|
57
|
-
"subscribe": ["channel-a"],
|
58
|
-
},
|
59
|
-
},
|
60
|
-
{
|
61
|
-
"ref": "main",
|
62
|
-
"namespace": {"path": "/namespace3.yml"},
|
63
|
-
},
|
64
|
-
],
|
65
|
-
}
|
66
|
-
],
|
67
|
-
},
|
68
|
-
])
|
69
|
-
|
70
|
-
expected = PromotionData(
|
71
|
-
check_in="test1",
|
72
|
-
saas_file="test2",
|
73
|
-
success=True,
|
74
|
-
target_config_hash="test3",
|
75
|
-
)
|
76
|
-
promotion_state = create_autospec(spec=PromotionState)
|
77
|
-
promotion_state.get_promotion_data.return_value = expected
|
78
|
-
saas_promotion_state = SaasPromotionState.create(
|
79
|
-
promotion_state=promotion_state, saas_files=saas_files
|
80
|
-
)
|
81
|
-
result = saas_promotion_state.get(channel="channel-a", sha="main")
|
82
|
-
|
83
|
-
assert result == {"616af45d7fad7f4eea8d52b8b5e8a058cef82ab0": expected}
|
84
|
-
promotion_state.get_promotion_data.assert_called_once_with(
|
85
|
-
sha="main",
|
86
|
-
channel="channel-a",
|
87
|
-
use_cache=False,
|
88
|
-
target_uid="616af45d7fad7f4eea8d52b8b5e8a058cef82ab0",
|
89
|
-
pre_check_sha_exists=False,
|
90
|
-
)
|
91
|
-
|
92
|
-
|
93
|
-
def test_set_saas_promotion_state_success(
|
94
|
-
saas_files_builder: Callable[[Iterable[Mapping]], list[SaasFile]],
|
95
|
-
) -> None:
|
96
|
-
saas_files = saas_files_builder([{"resourceTemplates": []}])
|
97
|
-
|
98
|
-
current_data = PromotionData(
|
99
|
-
check_in="test1",
|
100
|
-
saas_file="test2",
|
101
|
-
success=False,
|
102
|
-
target_config_hash="test3",
|
103
|
-
)
|
104
|
-
promotion_state = create_autospec(spec=PromotionState)
|
105
|
-
promotion_state.get_promotion_data.return_value = current_data
|
106
|
-
saas_promotion_state = SaasPromotionState.create(
|
107
|
-
promotion_state=promotion_state, saas_files=saas_files
|
108
|
-
)
|
109
|
-
saas_promotion_state.set_successful(
|
110
|
-
channel="test-channel", sha="test-sha", publisher_uid="test-uid"
|
111
|
-
)
|
112
|
-
|
113
|
-
promotion_state.get_promotion_data.assert_called_once_with(
|
114
|
-
sha="test-sha",
|
115
|
-
channel="test-channel",
|
116
|
-
use_cache=False,
|
117
|
-
target_uid="test-uid",
|
118
|
-
pre_check_sha_exists=False,
|
119
|
-
)
|
120
|
-
promotion_state.publish_promotion_data.assert_called_once_with(
|
121
|
-
data=PromotionData(
|
122
|
-
check_in="test1",
|
123
|
-
saas_file="test2",
|
124
|
-
success=True,
|
125
|
-
target_config_hash="test3",
|
126
|
-
),
|
127
|
-
channel="test-channel",
|
128
|
-
sha="test-sha",
|
129
|
-
target_uid="test-uid",
|
130
|
-
)
|
131
|
-
|
132
|
-
|
133
|
-
def test_set_saas_promotion_state_missing(
|
134
|
-
saas_files_builder: Callable[[Iterable[Mapping]], list[SaasFile]],
|
135
|
-
) -> None:
|
136
|
-
saas_files = saas_files_builder([{"resourceTemplates": []}])
|
137
|
-
promotion_state = create_autospec(spec=PromotionState)
|
138
|
-
promotion_state.get_promotion_data.return_value = None
|
139
|
-
saas_promotion_state = SaasPromotionState.create(
|
140
|
-
promotion_state=promotion_state, saas_files=saas_files
|
141
|
-
)
|
142
|
-
|
143
|
-
with raises(SaasPromotionStateMissingException):
|
144
|
-
saas_promotion_state.set_successful(
|
145
|
-
channel="test-channel", sha="test-sha", publisher_uid="test-uid"
|
146
|
-
)
|
147
|
-
|
148
|
-
promotion_state.get_promotion_data.assert_called_once_with(
|
149
|
-
sha="test-sha",
|
150
|
-
channel="test-channel",
|
151
|
-
use_cache=False,
|
152
|
-
target_uid="test-uid",
|
153
|
-
pre_check_sha_exists=False,
|
154
|
-
)
|
155
|
-
promotion_state.publish_promotion_data.assert_not_called()
|
156
|
-
|
157
|
-
|
158
|
-
def test_set_saas_promotion_state_already_successful(
|
159
|
-
saas_files_builder: Callable[[Iterable[Mapping]], list[SaasFile]],
|
160
|
-
) -> None:
|
161
|
-
saas_files = saas_files_builder([{"resourceTemplates": []}])
|
162
|
-
|
163
|
-
current_data = PromotionData(
|
164
|
-
check_in="test1",
|
165
|
-
saas_file="test2",
|
166
|
-
success=True,
|
167
|
-
target_config_hash="test3",
|
168
|
-
)
|
169
|
-
promotion_state = create_autospec(spec=PromotionState)
|
170
|
-
promotion_state.get_promotion_data.return_value = current_data
|
171
|
-
saas_promotion_state = SaasPromotionState.create(
|
172
|
-
promotion_state=promotion_state, saas_files=saas_files
|
173
|
-
)
|
174
|
-
|
175
|
-
with raises(SaasPromotionStateException):
|
176
|
-
saas_promotion_state.set_successful(
|
177
|
-
channel="test-channel", sha="test-sha", publisher_uid="test-uid"
|
178
|
-
)
|
179
|
-
|
180
|
-
promotion_state.get_promotion_data.assert_called_once_with(
|
181
|
-
sha="test-sha",
|
182
|
-
channel="test-channel",
|
183
|
-
use_cache=False,
|
184
|
-
target_uid="test-uid",
|
185
|
-
pre_check_sha_exists=False,
|
186
|
-
)
|
187
|
-
promotion_state.publish_promotion_data.assert_not_called()
|
@@ -1,74 +0,0 @@
|
|
1
|
-
from statistics import median
|
2
|
-
|
3
|
-
from reconcile.test.fixtures import Fixtures
|
4
|
-
from tools.sd_app_sre_alert_report import (
|
5
|
-
gen_alert_stats,
|
6
|
-
group_alerts,
|
7
|
-
)
|
8
|
-
|
9
|
-
messages = Fixtures("slack_api").get_anymarkup("conversations_history_messages.yaml")
|
10
|
-
|
11
|
-
|
12
|
-
def test_group_alerts():
|
13
|
-
alerts = group_alerts(messages)
|
14
|
-
|
15
|
-
ptf = alerts["PrometheusTargetFlapping"]
|
16
|
-
assert ptf
|
17
|
-
assert len(ptf) == 6
|
18
|
-
|
19
|
-
sma = alerts["SLOMetricAbsent"]
|
20
|
-
assert sma
|
21
|
-
assert len(sma) == 4
|
22
|
-
|
23
|
-
paed = alerts["PatchmanAlertEvalDelay"]
|
24
|
-
assert paed
|
25
|
-
assert len(paed) == 2
|
26
|
-
|
27
|
-
csopc = alerts["ContainerSecurityOperatorPodCount"]
|
28
|
-
assert csopc
|
29
|
-
assert len(csopc) == 1
|
30
|
-
|
31
|
-
art = alerts["AlertmanagerReceiverTest"]
|
32
|
-
assert art
|
33
|
-
assert len(art) == 2
|
34
|
-
|
35
|
-
# This means one of the list elements has been ignored as it didn't have alertname
|
36
|
-
# as the total alerts we have from the above tests is 13 and the total of messages
|
37
|
-
# from the fixture is 14.
|
38
|
-
assert set(alerts.keys()) == {
|
39
|
-
"PrometheusTargetFlapping",
|
40
|
-
"SLOMetricAbsent",
|
41
|
-
"PatchmanAlertEvalDelay",
|
42
|
-
"ContainerSecurityOperatorPodCount",
|
43
|
-
"AlertmanagerReceiverTest",
|
44
|
-
}
|
45
|
-
assert len(messages) == 14
|
46
|
-
|
47
|
-
|
48
|
-
def test_alert_stats():
|
49
|
-
alert_stats = gen_alert_stats(group_alerts(messages))
|
50
|
-
|
51
|
-
ptf = alert_stats["PrometheusTargetFlapping"]
|
52
|
-
assert ptf.triggered_alerts == 3
|
53
|
-
assert ptf.resolved_alerts == 3
|
54
|
-
assert median(ptf.elapsed_times) == 600
|
55
|
-
|
56
|
-
sma = alert_stats["SLOMetricAbsent"]
|
57
|
-
assert sma.triggered_alerts == 2
|
58
|
-
assert sma.resolved_alerts == 2
|
59
|
-
assert median(sma.elapsed_times) == 3600
|
60
|
-
|
61
|
-
paed = alert_stats["PatchmanAlertEvalDelay"]
|
62
|
-
assert paed.triggered_alerts == 1
|
63
|
-
assert paed.resolved_alerts == 1
|
64
|
-
assert not paed.elapsed_times
|
65
|
-
|
66
|
-
csopc = alert_stats["ContainerSecurityOperatorPodCount"]
|
67
|
-
assert csopc.triggered_alerts == 0
|
68
|
-
assert csopc.resolved_alerts == 1
|
69
|
-
assert not csopc.elapsed_times
|
70
|
-
|
71
|
-
art = alert_stats["AlertmanagerReceiverTest"]
|
72
|
-
assert art.triggered_alerts == 1
|
73
|
-
assert art.resolved_alerts == 1
|
74
|
-
assert median(art.elapsed_times) == 300
|
@@ -1,79 +0,0 @@
|
|
1
|
-
from unittest.mock import patch
|
2
|
-
|
3
|
-
from tools.qontract_cli import sre_checkpoints
|
4
|
-
|
5
|
-
# from reconcile import queries
|
6
|
-
from tools.sre_checkpoints import (
|
7
|
-
full_name,
|
8
|
-
get_latest_sre_checkpoints,
|
9
|
-
)
|
10
|
-
|
11
|
-
|
12
|
-
class TestFullName:
|
13
|
-
@staticmethod
|
14
|
-
def test_with_parent():
|
15
|
-
app = {
|
16
|
-
"parentApp": {"name": "app1"},
|
17
|
-
"name": "app2",
|
18
|
-
}
|
19
|
-
assert full_name(app) == "app1/app2"
|
20
|
-
|
21
|
-
@staticmethod
|
22
|
-
def test_without_parent():
|
23
|
-
app = {
|
24
|
-
"name": "app2",
|
25
|
-
}
|
26
|
-
assert full_name(app) == "app2"
|
27
|
-
|
28
|
-
|
29
|
-
class TestLatestSRECheckpoints:
|
30
|
-
@staticmethod
|
31
|
-
@patch("reconcile.queries.get_sre_checkpoints")
|
32
|
-
def test_latest(get_sre_checkpoints):
|
33
|
-
get_sre_checkpoints.return_value = [
|
34
|
-
{"date": "2020-01-01", "app": {"name": "app_single"}},
|
35
|
-
{"date": "2021-01-01", "app": {"name": "app_single"}},
|
36
|
-
{"date": "2020-03-01", "app": {"name": "app_single"}},
|
37
|
-
{
|
38
|
-
"date": "2020-01-02",
|
39
|
-
"app": {"parentApp": {"name": "app1"}, "name": "app2"},
|
40
|
-
},
|
41
|
-
]
|
42
|
-
|
43
|
-
latest_sre_checkpoints = get_latest_sre_checkpoints()
|
44
|
-
assert latest_sre_checkpoints["app_single"] == "2021-01-01"
|
45
|
-
assert latest_sre_checkpoints["app1/app2"] == "2020-01-02"
|
46
|
-
|
47
|
-
|
48
|
-
class TestGetSRECheckpoints:
|
49
|
-
@staticmethod
|
50
|
-
@patch("tools.qontract_cli.print_output")
|
51
|
-
@patch("reconcile.queries.get_sre_checkpoints")
|
52
|
-
@patch("reconcile.queries.get_apps")
|
53
|
-
def test_sre_checkpoints(get_apps, get_sre_checkpoints, print_output):
|
54
|
-
get_apps.return_value = [
|
55
|
-
{"name": "app1", "path": "/app1", "onboardingStatus": "OnBoarded"},
|
56
|
-
{"name": "app2", "path": "/app2", "onboardingStatus": "OnBoarded"},
|
57
|
-
{"name": "app3", "path": "/app3", "onboardingStatus": "OnBoarded"},
|
58
|
-
{"name": "app4", "path": "/app4", "onboardingStatus": "InProgress"},
|
59
|
-
]
|
60
|
-
|
61
|
-
get_sre_checkpoints.return_value = [
|
62
|
-
{"app": {"name": "app1"}, "date": "2021-01-02"},
|
63
|
-
{"app": {"name": "app1"}, "date": "2021-01-01"},
|
64
|
-
]
|
65
|
-
|
66
|
-
expected_data = [
|
67
|
-
{"name": "app1", "latest": "2021-01-02"},
|
68
|
-
{"name": "app2", "latest": ""},
|
69
|
-
{"name": "app3", "latest": ""},
|
70
|
-
]
|
71
|
-
|
72
|
-
with sre_checkpoints.make_context(info_name="info", args=[]) as ctx:
|
73
|
-
ctx.obj = {"options": {"output": "json"}}
|
74
|
-
sre_checkpoints.invoke(ctx)
|
75
|
-
|
76
|
-
cols = ["name", "latest"]
|
77
|
-
print_output.assert_called_once_with(
|
78
|
-
{"output": "json"}, expected_data, cols
|
79
|
-
)
|