qontract-reconcile 0.10.1rc1201__py3-none-any.whl → 0.10.2.dev1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qontract_reconcile-0.10.2.dev1.dist-info/METADATA +500 -0
- {qontract_reconcile-0.10.1rc1201.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/RECORD +14 -132
- {qontract_reconcile-0.10.1rc1201.dist-info → qontract_reconcile-0.10.2.dev1.dist-info}/WHEEL +1 -2
- {qontract_reconcile-0.10.1rc1201.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/external_resources/manager.py +12 -1
- reconcile/external_resources/model.py +11 -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.1rc1201.dist-info/METADATA +0 -64
- qontract_reconcile-0.10.1rc1201.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,125 +0,0 @@
|
|
1
|
-
from collections.abc import Callable
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
from reconcile.typed_queries.saas_files import SaasFile
|
6
|
-
from reconcile.utils.saasherder import SaasHerder
|
7
|
-
from reconcile.utils.secret_reader import SecretReader
|
8
|
-
|
9
|
-
|
10
|
-
@pytest.mark.parametrize(
|
11
|
-
"allowed_secret_parameter_path,referenced_secret_path,expected_valid",
|
12
|
-
[
|
13
|
-
# covered by parent directory
|
14
|
-
("foobar", "foobar/baz", True),
|
15
|
-
# not covered by parent directory even though there is a common name prefix
|
16
|
-
("foo", "foobar/baz", False),
|
17
|
-
# multilevel allowed path
|
18
|
-
("foo/bar", "foo/bar/baz", True),
|
19
|
-
# multilevel but different intermediary path
|
20
|
-
("foo/bar", "foo/baz/bar", False),
|
21
|
-
],
|
22
|
-
)
|
23
|
-
def test_saasherder_allowed_secret_paths(
|
24
|
-
allowed_secret_parameter_path: str,
|
25
|
-
referenced_secret_path: str,
|
26
|
-
expected_valid: bool,
|
27
|
-
secret_reader: SecretReader,
|
28
|
-
gql_class_factory: Callable[
|
29
|
-
...,
|
30
|
-
SaasFile,
|
31
|
-
],
|
32
|
-
):
|
33
|
-
"""
|
34
|
-
ensure a parent directory in allowed_secret_parameter_paths matches correctly
|
35
|
-
"""
|
36
|
-
saas_files = [
|
37
|
-
gql_class_factory(
|
38
|
-
SaasFile,
|
39
|
-
{
|
40
|
-
"path": "path1",
|
41
|
-
"name": "a1",
|
42
|
-
"managedResourceTypes": [],
|
43
|
-
"managedResourceNames": None,
|
44
|
-
"allowedSecretParameterPaths": [allowed_secret_parameter_path],
|
45
|
-
"app": {"name": "app1", "selfServiceRoles": [{"name": "test"}]},
|
46
|
-
"pipelinesProvider": {
|
47
|
-
"name": "tekton-app-sre-pipelines-appsres03ue1",
|
48
|
-
"provider": "tekton",
|
49
|
-
"namespace": {
|
50
|
-
"name": "app-sre-pipelines",
|
51
|
-
"cluster": {
|
52
|
-
"name": "appsres03ue1",
|
53
|
-
"serverUrl": "https://api.appsres03ue1.5nvu.p1.openshiftapps.com:6443",
|
54
|
-
"consoleUrl": "https://console.appsres03ue1.5nvu.p1.openshiftapps.com:6443",
|
55
|
-
"internal": True,
|
56
|
-
},
|
57
|
-
},
|
58
|
-
"defaults": {
|
59
|
-
"pipelineTemplates": {
|
60
|
-
"openshiftSaasDeploy": {"name": "openshift-saas-deploy"}
|
61
|
-
}
|
62
|
-
},
|
63
|
-
"pipelineTemplates": {
|
64
|
-
"openshiftSaasDeploy": {"name": "openshift-saas-deploy"}
|
65
|
-
},
|
66
|
-
},
|
67
|
-
"imagePatterns": [],
|
68
|
-
"resourceTemplates": [
|
69
|
-
{
|
70
|
-
"path": "path1",
|
71
|
-
"name": "test",
|
72
|
-
"url": "url",
|
73
|
-
"targets": [
|
74
|
-
{
|
75
|
-
"namespace": {
|
76
|
-
"name": "test-ns-subscriber",
|
77
|
-
"environment": {
|
78
|
-
"name": "App-SRE",
|
79
|
-
"parameters": "{}",
|
80
|
-
},
|
81
|
-
"app": {"name": "test-saas-deployments"},
|
82
|
-
"cluster": {
|
83
|
-
"name": "appsres03ue1",
|
84
|
-
"serverUrl": "https://api.appsres03ue1.5nvu.p1.openshiftapps.com:6443",
|
85
|
-
"internal": True,
|
86
|
-
},
|
87
|
-
},
|
88
|
-
"ref": "main",
|
89
|
-
"upstream": {
|
90
|
-
"instance": {
|
91
|
-
"name": "ci",
|
92
|
-
"serverUrl": "https://jenkins.com",
|
93
|
-
},
|
94
|
-
"name": "job",
|
95
|
-
},
|
96
|
-
"parameters": "{}",
|
97
|
-
"secretParameters": [
|
98
|
-
{
|
99
|
-
"name": "secret",
|
100
|
-
"secret": {
|
101
|
-
"path": referenced_secret_path,
|
102
|
-
"field": "db.endpoint",
|
103
|
-
},
|
104
|
-
},
|
105
|
-
],
|
106
|
-
},
|
107
|
-
],
|
108
|
-
},
|
109
|
-
],
|
110
|
-
},
|
111
|
-
)
|
112
|
-
]
|
113
|
-
|
114
|
-
saasherder = SaasHerder(
|
115
|
-
saas_files,
|
116
|
-
secret_reader=secret_reader,
|
117
|
-
thread_pool_size=1,
|
118
|
-
integration="",
|
119
|
-
integration_version="",
|
120
|
-
hash_length=7,
|
121
|
-
repo_url="https://repo-url.com",
|
122
|
-
validate=True,
|
123
|
-
)
|
124
|
-
|
125
|
-
assert saasherder.valid == expected_valid
|
@@ -1,153 +0,0 @@
|
|
1
|
-
from unittest.mock import create_autospec
|
2
|
-
|
3
|
-
import pytest
|
4
|
-
|
5
|
-
import reconcile.utils.secret_reader
|
6
|
-
from reconcile.utils import vault
|
7
|
-
from reconcile.utils.secret_reader import (
|
8
|
-
ConfigSecretReader,
|
9
|
-
SecretNotFound,
|
10
|
-
SecretReader,
|
11
|
-
VaultSecretReader,
|
12
|
-
)
|
13
|
-
from reconcile.utils.vault import _VaultClient
|
14
|
-
|
15
|
-
VAULT_READ_EXPECTED = {"key": "value"}
|
16
|
-
VAULT_READ_ALL_EXPECTED = {"key2": "value2"}
|
17
|
-
|
18
|
-
|
19
|
-
@pytest.fixture
|
20
|
-
def vault_mock():
|
21
|
-
vault_mock = create_autospec(_VaultClient)
|
22
|
-
vault_mock.read.side_effect = [VAULT_READ_EXPECTED] * 100
|
23
|
-
vault_mock.read_all.side_effect = [VAULT_READ_ALL_EXPECTED] * 100
|
24
|
-
return vault_mock
|
25
|
-
|
26
|
-
|
27
|
-
def test_vault_secret_reader_typed_read(vault_mock, vault_secret):
|
28
|
-
vault_secret_reader = VaultSecretReader(vault_client=vault_mock)
|
29
|
-
result = vault_secret_reader.read_secret(vault_secret)
|
30
|
-
|
31
|
-
assert result == VAULT_READ_EXPECTED
|
32
|
-
vault_mock.read.assert_called_once_with(SecretReader.to_dict(vault_secret))
|
33
|
-
vault_mock.read_all.assert_not_called()
|
34
|
-
|
35
|
-
|
36
|
-
def test_vault_secret_reader_typed_read_all(vault_mock, vault_secret):
|
37
|
-
vault_secret_reader = VaultSecretReader(vault_client=vault_mock)
|
38
|
-
result = vault_secret_reader.read_all_secret(vault_secret)
|
39
|
-
|
40
|
-
assert result == VAULT_READ_ALL_EXPECTED
|
41
|
-
vault_mock.read_all.assert_called_once_with(SecretReader.to_dict(vault_secret))
|
42
|
-
vault_mock.read.assert_not_called()
|
43
|
-
|
44
|
-
|
45
|
-
def test_vault_secret_reader_parameters_read(vault_mock, vault_secret):
|
46
|
-
vault_secret_reader = VaultSecretReader(vault_client=vault_mock)
|
47
|
-
result = vault_secret_reader.read_with_parameters(
|
48
|
-
path=vault_secret.path,
|
49
|
-
field=vault_secret.field,
|
50
|
-
format=vault_secret.q_format,
|
51
|
-
version=vault_secret.version,
|
52
|
-
)
|
53
|
-
|
54
|
-
assert result == VAULT_READ_EXPECTED
|
55
|
-
vault_mock.read.assert_called_once_with(SecretReader.to_dict(vault_secret))
|
56
|
-
vault_mock.read_all.assert_not_called()
|
57
|
-
|
58
|
-
|
59
|
-
def test_vault_secret_reader_parameters_read_all(vault_mock, vault_secret):
|
60
|
-
vault_secret_reader = VaultSecretReader(vault_client=vault_mock)
|
61
|
-
result = vault_secret_reader.read_all_with_parameters(
|
62
|
-
path=vault_secret.path,
|
63
|
-
field=vault_secret.field,
|
64
|
-
format=vault_secret.q_format,
|
65
|
-
version=vault_secret.version,
|
66
|
-
)
|
67
|
-
|
68
|
-
assert result == VAULT_READ_ALL_EXPECTED
|
69
|
-
vault_mock.read_all.assert_called_once_with(SecretReader.to_dict(vault_secret))
|
70
|
-
vault_mock.read.assert_not_called()
|
71
|
-
|
72
|
-
|
73
|
-
def test_vault_secret_reader_raises(vault_mock, vault_secret, patch_sleep):
|
74
|
-
vault_mock.read.side_effect = [vault.SecretNotFound] * 100
|
75
|
-
vault_secret_reader = VaultSecretReader(vault_client=vault_mock)
|
76
|
-
|
77
|
-
with pytest.raises(SecretNotFound):
|
78
|
-
vault_secret_reader.read_secret(vault_secret)
|
79
|
-
|
80
|
-
vault_mock.read.assert_called_with(SecretReader.to_dict(vault_secret))
|
81
|
-
vault_mock.read_all.assert_not_called()
|
82
|
-
|
83
|
-
|
84
|
-
def test_config_secret_reader_raises(vault_secret, patch_sleep):
|
85
|
-
config_secret_reader = ConfigSecretReader()
|
86
|
-
|
87
|
-
with pytest.raises(SecretNotFound):
|
88
|
-
config_secret_reader.read_secret(vault_secret)
|
89
|
-
|
90
|
-
|
91
|
-
def test_read_vault_raises(mocker, patch_sleep):
|
92
|
-
"""
|
93
|
-
Ensure that secret_reader.SecretNotFound is raised instead of
|
94
|
-
vault.SecretNotFound.
|
95
|
-
"""
|
96
|
-
mock_vault_client = mocker.patch.object(
|
97
|
-
reconcile.utils.secret_reader, "VaultClient", autospec=_VaultClient
|
98
|
-
)
|
99
|
-
settings = {"vault": True}
|
100
|
-
mock_vault_client.return_value.read.side_effect = vault.SecretNotFound
|
101
|
-
|
102
|
-
secret_reader = SecretReader(settings=settings)
|
103
|
-
|
104
|
-
with pytest.raises(SecretNotFound):
|
105
|
-
secret_reader.read({"path": "test", "field": "some-field"})
|
106
|
-
|
107
|
-
|
108
|
-
def test_read_config_raises(mocker, patch_sleep):
|
109
|
-
"""
|
110
|
-
Ensure that secret_reader.SecretNotFound is raised instead of
|
111
|
-
config.SecretNotFound.
|
112
|
-
"""
|
113
|
-
mocker.patch.object(
|
114
|
-
reconcile.utils.secret_reader, "VaultClient", autospec=_VaultClient
|
115
|
-
)
|
116
|
-
|
117
|
-
secret_reader = SecretReader()
|
118
|
-
|
119
|
-
with pytest.raises(SecretNotFound):
|
120
|
-
secret_reader.read({"path": "test", "field": "some-field"})
|
121
|
-
|
122
|
-
|
123
|
-
def test_read_all_vault_raises(mocker, patch_sleep):
|
124
|
-
"""
|
125
|
-
Ensure that secret_reader.SecretNotFound is raised instead of
|
126
|
-
vault.SecretNotFound.
|
127
|
-
"""
|
128
|
-
mock_vault_client = mocker.patch.object(
|
129
|
-
reconcile.utils.secret_reader, "VaultClient", autospec=_VaultClient
|
130
|
-
)
|
131
|
-
|
132
|
-
settings = {"vault": True}
|
133
|
-
mock_vault_client.return_value.read_all.side_effect = vault.SecretNotFound
|
134
|
-
|
135
|
-
secret_reader = SecretReader(settings=settings)
|
136
|
-
|
137
|
-
with pytest.raises(SecretNotFound):
|
138
|
-
secret_reader.read_all({"path": "test", "field": "some-field"})
|
139
|
-
|
140
|
-
|
141
|
-
def test_read_all_config_raises(mocker, patch_sleep):
|
142
|
-
"""
|
143
|
-
Ensure that secret_reader.SecretNotFound is raised instead of
|
144
|
-
config.SecretNotFound.
|
145
|
-
"""
|
146
|
-
mocker.patch.object(
|
147
|
-
reconcile.utils.secret_reader, "VaultClient", autospec=_VaultClient
|
148
|
-
)
|
149
|
-
|
150
|
-
secret_reader = SecretReader()
|
151
|
-
|
152
|
-
with pytest.raises(SecretNotFound):
|
153
|
-
secret_reader.read_all({"path": "test", "field": "some-field"})
|
@@ -1,183 +0,0 @@
|
|
1
|
-
import pytest
|
2
|
-
from pydantic import (
|
3
|
-
BaseModel,
|
4
|
-
Json,
|
5
|
-
)
|
6
|
-
|
7
|
-
from reconcile.slack_base import (
|
8
|
-
get_slackapi,
|
9
|
-
slackapi_from_permissions,
|
10
|
-
slackapi_from_slack_workspace,
|
11
|
-
)
|
12
|
-
from reconcile.utils.secret_reader import SecretReader
|
13
|
-
|
14
|
-
|
15
|
-
def create_api_config():
|
16
|
-
return {
|
17
|
-
"global": {"max_retries": 5, "timeout": 30},
|
18
|
-
"methods": [
|
19
|
-
{"name": "users.list", "args": '{"limit":123}'},
|
20
|
-
],
|
21
|
-
}
|
22
|
-
|
23
|
-
|
24
|
-
@pytest.fixture
|
25
|
-
def slack_workspace():
|
26
|
-
return {
|
27
|
-
"workspace": {
|
28
|
-
"name": "coreos",
|
29
|
-
"integrations": [
|
30
|
-
{
|
31
|
-
"name": "dummy",
|
32
|
-
"token": {
|
33
|
-
"path": "some/path",
|
34
|
-
"field": "bot_token",
|
35
|
-
},
|
36
|
-
"channel": "test",
|
37
|
-
"icon_emoji": "test_emoji",
|
38
|
-
"username": "foo",
|
39
|
-
},
|
40
|
-
],
|
41
|
-
"api_client": create_api_config(),
|
42
|
-
}
|
43
|
-
}
|
44
|
-
|
45
|
-
|
46
|
-
@pytest.fixture
|
47
|
-
def unleash_slack_workspace():
|
48
|
-
return {
|
49
|
-
"workspace": {
|
50
|
-
"name": "coreos",
|
51
|
-
"integrations": [
|
52
|
-
{
|
53
|
-
"name": "slack-usergroups",
|
54
|
-
"token": {
|
55
|
-
"path": "some/path",
|
56
|
-
"field": "bot_token",
|
57
|
-
},
|
58
|
-
},
|
59
|
-
],
|
60
|
-
"api_client": create_api_config(),
|
61
|
-
},
|
62
|
-
"channel": "test",
|
63
|
-
"icon_emoji": "unleash",
|
64
|
-
"username": "test",
|
65
|
-
}
|
66
|
-
|
67
|
-
|
68
|
-
@pytest.fixture
|
69
|
-
def permissions_workspace():
|
70
|
-
return {
|
71
|
-
"workspace": {
|
72
|
-
"name": "coreos",
|
73
|
-
"token": {
|
74
|
-
"path": "some/path",
|
75
|
-
"field": "bot_token",
|
76
|
-
},
|
77
|
-
"api_client": create_api_config(),
|
78
|
-
"managedUsergroups": ["foo"],
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
|
83
|
-
@pytest.fixture
|
84
|
-
def patch_secret_reader(mocker):
|
85
|
-
return mocker.patch(
|
86
|
-
"reconcile.utils.secret_reader.SecretReader.read",
|
87
|
-
return_value="secret",
|
88
|
-
autospec=True,
|
89
|
-
)
|
90
|
-
|
91
|
-
|
92
|
-
@pytest.fixture
|
93
|
-
def patch__initiate_usergroups(mocker):
|
94
|
-
return mocker.patch(
|
95
|
-
"reconcile.utils.slack_api.SlackApi._initiate_usergroups", autospec=True
|
96
|
-
)
|
97
|
-
|
98
|
-
|
99
|
-
def test_slack_workspace_raises():
|
100
|
-
with pytest.raises(ValueError):
|
101
|
-
slackapi_from_slack_workspace({}, SecretReader(), "foo")
|
102
|
-
|
103
|
-
|
104
|
-
def test_slack_workspace_ok(
|
105
|
-
patch_secret_reader, patch__initiate_usergroups, slack_workspace
|
106
|
-
):
|
107
|
-
slack_api = slackapi_from_slack_workspace(slack_workspace, SecretReader(), "dummy")
|
108
|
-
patch_secret_reader.assert_called_once()
|
109
|
-
patch__initiate_usergroups.assert_called_once()
|
110
|
-
assert slack_api.channel == "test"
|
111
|
-
assert slack_api.chat_kwargs["icon_emoji"] == "test_emoji"
|
112
|
-
assert slack_api.config.get_method_config("users.list") == {"limit": 123}
|
113
|
-
|
114
|
-
|
115
|
-
def test_slack_workspace_channel_overwrite(
|
116
|
-
patch_secret_reader, patch__initiate_usergroups, slack_workspace
|
117
|
-
):
|
118
|
-
slack_api = slackapi_from_slack_workspace(
|
119
|
-
slack_workspace, SecretReader(), "dummy", channel="foo"
|
120
|
-
)
|
121
|
-
assert slack_api.channel == "foo"
|
122
|
-
|
123
|
-
|
124
|
-
def test_unleash_workspace_ok(
|
125
|
-
patch_secret_reader, patch__initiate_usergroups, unleash_slack_workspace
|
126
|
-
):
|
127
|
-
slack_api = slackapi_from_slack_workspace(
|
128
|
-
unleash_slack_workspace, SecretReader(), "slack-usergroups"
|
129
|
-
)
|
130
|
-
patch_secret_reader.assert_called_once()
|
131
|
-
patch__initiate_usergroups.assert_called_once()
|
132
|
-
assert slack_api.channel == "test"
|
133
|
-
assert slack_api.chat_kwargs["icon_emoji"] == "unleash"
|
134
|
-
assert slack_api.config.get_method_config("users.list") == {"limit": 123}
|
135
|
-
|
136
|
-
|
137
|
-
def test_slack_workspace_no_init(
|
138
|
-
patch_secret_reader, patch__initiate_usergroups, slack_workspace
|
139
|
-
):
|
140
|
-
slackapi_from_slack_workspace(
|
141
|
-
slack_workspace, SecretReader(), "dummy", init_usergroups=False
|
142
|
-
)
|
143
|
-
patch__initiate_usergroups.assert_not_called()
|
144
|
-
|
145
|
-
|
146
|
-
def test_permissions_workspace(
|
147
|
-
patch_secret_reader, patch__initiate_usergroups, permissions_workspace
|
148
|
-
):
|
149
|
-
slack_api = slackapi_from_permissions(permissions_workspace, SecretReader())
|
150
|
-
patch_secret_reader.assert_called_once()
|
151
|
-
patch__initiate_usergroups.assert_called_once()
|
152
|
-
|
153
|
-
assert slack_api.channel is None
|
154
|
-
assert slack_api.config.get_method_config("users.list") == {"limit": 123}
|
155
|
-
|
156
|
-
|
157
|
-
class ClientGlobalConfig(BaseModel):
|
158
|
-
max_retries: int | None
|
159
|
-
timeout: int | None
|
160
|
-
|
161
|
-
|
162
|
-
class ClientMethodConfig(BaseModel):
|
163
|
-
name: str
|
164
|
-
args: Json
|
165
|
-
|
166
|
-
|
167
|
-
class ClientConfig(BaseModel):
|
168
|
-
q_global: ClientGlobalConfig | None
|
169
|
-
methods: list[ClientMethodConfig] | None
|
170
|
-
|
171
|
-
|
172
|
-
def test_get_slackapi():
|
173
|
-
slack_api = get_slackapi(
|
174
|
-
"workspace",
|
175
|
-
"token",
|
176
|
-
client_config=ClientConfig(
|
177
|
-
q_global=ClientGlobalConfig(max_retries=1, timeout=4),
|
178
|
-
methods=[ClientMethodConfig(name="users.list", args='{"limit":1000}')],
|
179
|
-
),
|
180
|
-
init_usergroups=False,
|
181
|
-
)
|
182
|
-
assert slack_api.channel is None
|
183
|
-
assert slack_api.config.get_method_config("users.list") == {"limit": 1000}
|