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,117 +0,0 @@
|
|
1
|
-
import pytest
|
2
|
-
|
3
|
-
from reconcile.gql_definitions.fragments.vault_secret import VaultSecret
|
4
|
-
from reconcile.gql_definitions.terraform_cloudflare_dns.terraform_cloudflare_zones import (
|
5
|
-
AWSAccountV1,
|
6
|
-
CloudflareAccountV1,
|
7
|
-
CloudflareDnsRecordV1,
|
8
|
-
CloudflareDnsZoneV1,
|
9
|
-
)
|
10
|
-
from reconcile.terraform_cloudflare_dns import (
|
11
|
-
DEFAULT_EXCLUDE_KEY,
|
12
|
-
DEFAULT_NAMESPACE,
|
13
|
-
DEFAULT_PROVIDER,
|
14
|
-
DEFAULT_PROVISIONER_PROVIDER,
|
15
|
-
cloudflare_dns_zone_to_external_resource,
|
16
|
-
ensure_record_number_not_exceed_max,
|
17
|
-
)
|
18
|
-
from reconcile.utils.external_resource_spec import ExternalResourceSpec
|
19
|
-
|
20
|
-
|
21
|
-
@pytest.fixture
|
22
|
-
def cloudflare_records():
|
23
|
-
return [
|
24
|
-
CloudflareDnsRecordV1(
|
25
|
-
identifier="id0",
|
26
|
-
name="subdomain",
|
27
|
-
type="CNAME",
|
28
|
-
ttl=10,
|
29
|
-
value="foo.com",
|
30
|
-
priority=None,
|
31
|
-
data=None,
|
32
|
-
proxied=None,
|
33
|
-
),
|
34
|
-
CloudflareDnsRecordV1(
|
35
|
-
identifier="id1",
|
36
|
-
name="subdomain1",
|
37
|
-
type="CNAME",
|
38
|
-
ttl=10,
|
39
|
-
value="foo1.com",
|
40
|
-
priority=None,
|
41
|
-
data=None,
|
42
|
-
proxied=None,
|
43
|
-
),
|
44
|
-
]
|
45
|
-
|
46
|
-
|
47
|
-
@pytest.fixture
|
48
|
-
def cloudflare_dns_zones(cloudflare_account, cloudflare_records):
|
49
|
-
return [
|
50
|
-
CloudflareDnsZoneV1(
|
51
|
-
identifier="zoneid",
|
52
|
-
zone="fakezone.com",
|
53
|
-
account=cloudflare_account,
|
54
|
-
records=cloudflare_records,
|
55
|
-
type="full",
|
56
|
-
plan="free",
|
57
|
-
delete=False,
|
58
|
-
max_records=1,
|
59
|
-
)
|
60
|
-
]
|
61
|
-
|
62
|
-
|
63
|
-
@pytest.fixture
|
64
|
-
def cloudflare_account(aws_account):
|
65
|
-
return CloudflareAccountV1(
|
66
|
-
name="fakeaccount",
|
67
|
-
type="free",
|
68
|
-
description="description",
|
69
|
-
providerVersion="0.0",
|
70
|
-
enforceTwofactor=False,
|
71
|
-
apiCredentials=VaultSecret(
|
72
|
-
path="foo/bar", field="foo", format="bar", version=2
|
73
|
-
),
|
74
|
-
terraformStateAccount=aws_account,
|
75
|
-
deletionApprovals=None,
|
76
|
-
)
|
77
|
-
|
78
|
-
|
79
|
-
@pytest.fixture
|
80
|
-
def aws_account():
|
81
|
-
return AWSAccountV1(
|
82
|
-
name="foo",
|
83
|
-
consoleUrl="url",
|
84
|
-
terraformUsername="bar",
|
85
|
-
automationToken=VaultSecret(path="foo", field="bar", format=None, version=None),
|
86
|
-
terraformState=None,
|
87
|
-
)
|
88
|
-
|
89
|
-
|
90
|
-
def test_cloudflare_dns_zone_to_external_resource(cloudflare_dns_zones):
|
91
|
-
expected_external_resource = ExternalResourceSpec(
|
92
|
-
provision_provider=DEFAULT_PROVISIONER_PROVIDER,
|
93
|
-
provisioner={"name": "fakeaccount-zoneid"},
|
94
|
-
namespace=DEFAULT_NAMESPACE,
|
95
|
-
resource=cloudflare_dns_zones[0].dict(
|
96
|
-
by_alias=True, exclude=DEFAULT_EXCLUDE_KEY
|
97
|
-
),
|
98
|
-
)
|
99
|
-
expected_external_resource.resource["provider"] = DEFAULT_PROVIDER
|
100
|
-
expected_external_resource.resource["records"] = [
|
101
|
-
record.dict(by_alias=True) for record in cloudflare_dns_zones[0].records
|
102
|
-
]
|
103
|
-
expected_result = [expected_external_resource]
|
104
|
-
|
105
|
-
result = cloudflare_dns_zone_to_external_resource(cloudflare_dns_zones)
|
106
|
-
|
107
|
-
assert result == expected_result
|
108
|
-
|
109
|
-
|
110
|
-
def test_evaluate_record_number_too_many_raise_exception(cloudflare_dns_zones):
|
111
|
-
with pytest.raises(RuntimeError):
|
112
|
-
ensure_record_number_not_exceed_max(cloudflare_dns_zones, default_max_records=1)
|
113
|
-
|
114
|
-
|
115
|
-
def test_evaluate_record_number_happy_path(cloudflare_dns_zones):
|
116
|
-
cloudflare_dns_zones[0].max_records = 2
|
117
|
-
ensure_record_number_not_exceed_max(cloudflare_dns_zones, default_max_records=1)
|
@@ -1,408 +0,0 @@
|
|
1
|
-
import logging
|
2
|
-
from unittest.mock import call
|
3
|
-
|
4
|
-
import pytest
|
5
|
-
|
6
|
-
import reconcile.terraform_cloudflare_resources as integ
|
7
|
-
from reconcile.gql_definitions.common.app_interface_vault_settings import (
|
8
|
-
AppInterfaceSettingsV1,
|
9
|
-
)
|
10
|
-
from reconcile.gql_definitions.fragments.vault_secret import VaultSecret
|
11
|
-
from reconcile.gql_definitions.terraform_cloudflare_resources.terraform_cloudflare_accounts import (
|
12
|
-
AWSAccountV1,
|
13
|
-
AWSTerraformStateIntegrationsV1,
|
14
|
-
DeletionApprovalV1,
|
15
|
-
TerraformCloudflareAccountsQueryData,
|
16
|
-
TerraformStateAWSV1,
|
17
|
-
)
|
18
|
-
from reconcile.gql_definitions.terraform_cloudflare_resources.terraform_cloudflare_accounts import (
|
19
|
-
CloudflareAccountV1 as CFAccountV1,
|
20
|
-
)
|
21
|
-
from reconcile.gql_definitions.terraform_cloudflare_resources.terraform_cloudflare_resources import (
|
22
|
-
CertificateSecretV1,
|
23
|
-
CloudflareAccountV1,
|
24
|
-
CloudflareCustomSSLCertificateV1,
|
25
|
-
CloudflareDnsRecordV1,
|
26
|
-
CloudflareZoneArgoV1,
|
27
|
-
CloudflareZoneCacheReserveV1,
|
28
|
-
CloudflareZoneCertificateV1,
|
29
|
-
CloudflareZoneTieredCacheV1,
|
30
|
-
CloudflareZoneWorkerV1,
|
31
|
-
ClusterV1,
|
32
|
-
NamespaceTerraformProviderResourceCloudflareV1,
|
33
|
-
NamespaceTerraformResourceCloudflareZoneV1,
|
34
|
-
NamespaceV1,
|
35
|
-
TerraformCloudflareResourcesQueryData,
|
36
|
-
)
|
37
|
-
from reconcile.status import ExitCodes
|
38
|
-
from reconcile.utils.secret_reader import (
|
39
|
-
SecretReaderBase,
|
40
|
-
)
|
41
|
-
|
42
|
-
|
43
|
-
@pytest.fixture
|
44
|
-
def query_data(external_resources):
|
45
|
-
return TerraformCloudflareResourcesQueryData(
|
46
|
-
namespaces=[
|
47
|
-
NamespaceV1(
|
48
|
-
name="namespace1",
|
49
|
-
clusterAdmin=True,
|
50
|
-
cluster=ClusterV1(
|
51
|
-
name="test-cluster",
|
52
|
-
serverUrl="http://localhost",
|
53
|
-
insecureSkipTLSVerify=None,
|
54
|
-
jumpHost=None,
|
55
|
-
automationToken=None,
|
56
|
-
clusterAdminAutomationToken=None,
|
57
|
-
spec=None,
|
58
|
-
internal=None,
|
59
|
-
disable=None,
|
60
|
-
),
|
61
|
-
managedExternalResources=True,
|
62
|
-
externalResources=[external_resources],
|
63
|
-
)
|
64
|
-
],
|
65
|
-
)
|
66
|
-
|
67
|
-
|
68
|
-
@pytest.fixture
|
69
|
-
def provisioner_config():
|
70
|
-
return CloudflareAccountV1(
|
71
|
-
name="cfaccount",
|
72
|
-
)
|
73
|
-
|
74
|
-
|
75
|
-
@pytest.fixture
|
76
|
-
def external_resources(provisioner_config):
|
77
|
-
return NamespaceTerraformProviderResourceCloudflareV1(
|
78
|
-
provider="cloudflare",
|
79
|
-
provisioner=provisioner_config,
|
80
|
-
resources=[
|
81
|
-
NamespaceTerraformResourceCloudflareZoneV1(
|
82
|
-
provider="zone",
|
83
|
-
identifier="testzone-com",
|
84
|
-
zone="testzone.com",
|
85
|
-
plan="enterprise",
|
86
|
-
type="full",
|
87
|
-
settings='{"foo": "bar"}',
|
88
|
-
argo=CloudflareZoneArgoV1(
|
89
|
-
tiered_caching=True,
|
90
|
-
smart_routing=True,
|
91
|
-
),
|
92
|
-
tiered_cache=CloudflareZoneTieredCacheV1(
|
93
|
-
cache_type="smart",
|
94
|
-
),
|
95
|
-
cache_reserve=CloudflareZoneCacheReserveV1(enabled=True),
|
96
|
-
records=[
|
97
|
-
CloudflareDnsRecordV1(
|
98
|
-
name="record",
|
99
|
-
type="CNAME",
|
100
|
-
ttl=5,
|
101
|
-
value="example.com",
|
102
|
-
proxied=False,
|
103
|
-
identifier="record",
|
104
|
-
),
|
105
|
-
],
|
106
|
-
workers=[
|
107
|
-
CloudflareZoneWorkerV1(
|
108
|
-
identifier="testworker",
|
109
|
-
pattern="testzone.com/.*",
|
110
|
-
script_name="testscript",
|
111
|
-
)
|
112
|
-
],
|
113
|
-
certificates=[
|
114
|
-
CloudflareZoneCertificateV1(
|
115
|
-
identifier="testcert",
|
116
|
-
type="advanced",
|
117
|
-
hosts=["testzone.com"],
|
118
|
-
validation_method="txt",
|
119
|
-
validity_days=90,
|
120
|
-
certificate_authority="lets_encrypt",
|
121
|
-
cloudflare_branding=False,
|
122
|
-
wait_for_active_status=False,
|
123
|
-
)
|
124
|
-
],
|
125
|
-
custom_ssl_certificates=[
|
126
|
-
CloudflareCustomSSLCertificateV1(
|
127
|
-
identifier="testcustomssl",
|
128
|
-
type="legacy_custom",
|
129
|
-
bundle_method="ubiquitous",
|
130
|
-
geo_restrictions="us",
|
131
|
-
certificate_secret=CertificateSecretV1(
|
132
|
-
certificate=VaultSecret(
|
133
|
-
path="certificate/secret/cert/path",
|
134
|
-
field="certificate.crt",
|
135
|
-
format="plain",
|
136
|
-
version=1,
|
137
|
-
),
|
138
|
-
key=VaultSecret(
|
139
|
-
path="certificate/secret/key/path",
|
140
|
-
field="certificate.key",
|
141
|
-
format="plain",
|
142
|
-
version=1,
|
143
|
-
),
|
144
|
-
),
|
145
|
-
)
|
146
|
-
],
|
147
|
-
),
|
148
|
-
],
|
149
|
-
)
|
150
|
-
|
151
|
-
|
152
|
-
@pytest.fixture
|
153
|
-
def mock_gql(mocker):
|
154
|
-
mocker.patch("reconcile.terraform_cloudflare_resources.gql", autospec=True)
|
155
|
-
|
156
|
-
|
157
|
-
@pytest.fixture
|
158
|
-
def mock_app_interface_vault_settings(mocker):
|
159
|
-
mocked_app_interface_vault_settings = mocker.patch(
|
160
|
-
"reconcile.terraform_cloudflare_resources.get_app_interface_vault_settings",
|
161
|
-
autospec=True,
|
162
|
-
)
|
163
|
-
mocked_app_interface_vault_settings.return_value = AppInterfaceSettingsV1(
|
164
|
-
vault=True
|
165
|
-
)
|
166
|
-
|
167
|
-
|
168
|
-
def secret_reader_side_effect(*args):
|
169
|
-
if args[0] == {
|
170
|
-
"path": "aws-account-path",
|
171
|
-
"field": "token",
|
172
|
-
"version": 1,
|
173
|
-
"q_format": "plain",
|
174
|
-
}:
|
175
|
-
aws_acct_creds = {}
|
176
|
-
aws_acct_creds["aws_access_key_id"] = "key_id"
|
177
|
-
aws_acct_creds["aws_secret_access_key"] = "access_key"
|
178
|
-
return aws_acct_creds
|
179
|
-
|
180
|
-
if args[0] == {
|
181
|
-
"path": "cf-account-path",
|
182
|
-
"field": "key",
|
183
|
-
"version": 1,
|
184
|
-
"q_format": "plain",
|
185
|
-
}:
|
186
|
-
cf_acct_creds = {}
|
187
|
-
cf_acct_creds["api_token"] = "api_token"
|
188
|
-
cf_acct_creds["account_id"] = "account_id"
|
189
|
-
return cf_acct_creds
|
190
|
-
|
191
|
-
|
192
|
-
@pytest.fixture
|
193
|
-
def mock_create_secret_reader(mocker):
|
194
|
-
secret_reader = mocker.Mock(SecretReaderBase)
|
195
|
-
secret_reader.read_all_secret.side_effect = secret_reader_side_effect
|
196
|
-
|
197
|
-
mocked_create_secret_reader = mocker.patch(
|
198
|
-
"reconcile.terraform_cloudflare_resources.create_secret_reader",
|
199
|
-
autospec=True,
|
200
|
-
)
|
201
|
-
|
202
|
-
mocked_create_secret_reader.return_value = secret_reader
|
203
|
-
|
204
|
-
|
205
|
-
@pytest.fixture
|
206
|
-
def mock_cloudflare_accounts(mocker):
|
207
|
-
mocked_cloudflare_accounts = mocker.patch(
|
208
|
-
"reconcile.terraform_cloudflare_resources.terraform_cloudflare_accounts",
|
209
|
-
autospec=True,
|
210
|
-
)
|
211
|
-
mocked_cloudflare_accounts.query.return_value = (
|
212
|
-
TerraformCloudflareAccountsQueryData(
|
213
|
-
accounts=[
|
214
|
-
CFAccountV1(
|
215
|
-
name="cfaccount",
|
216
|
-
description="cfaccount",
|
217
|
-
providerVersion="0.33.x",
|
218
|
-
apiCredentials=VaultSecret(
|
219
|
-
path="cf-account-path",
|
220
|
-
field="key",
|
221
|
-
version=1,
|
222
|
-
format="plain",
|
223
|
-
),
|
224
|
-
terraformStateAccount=AWSAccountV1(
|
225
|
-
name="awsaccoutn",
|
226
|
-
automationToken=VaultSecret(
|
227
|
-
path="aws-account-path",
|
228
|
-
field="token",
|
229
|
-
version=1,
|
230
|
-
format="plain",
|
231
|
-
),
|
232
|
-
terraformState=TerraformStateAWSV1(
|
233
|
-
provider="s3",
|
234
|
-
bucket="app-interface",
|
235
|
-
region="us-east-1",
|
236
|
-
integrations=[
|
237
|
-
AWSTerraformStateIntegrationsV1(
|
238
|
-
integration="terraform-cloudflare-resources",
|
239
|
-
key="somekey.tfstate",
|
240
|
-
)
|
241
|
-
],
|
242
|
-
),
|
243
|
-
),
|
244
|
-
deletionApprovals=[
|
245
|
-
DeletionApprovalV1(expiration="", name="", type="")
|
246
|
-
],
|
247
|
-
enforceTwofactor=False,
|
248
|
-
type="?????",
|
249
|
-
)
|
250
|
-
]
|
251
|
-
)
|
252
|
-
)
|
253
|
-
|
254
|
-
|
255
|
-
@pytest.fixture
|
256
|
-
def mock_cloudflare_resources(mocker, query_data):
|
257
|
-
mocked_cloudflare_resources = mocker.patch(
|
258
|
-
"reconcile.terraform_cloudflare_resources.terraform_cloudflare_resources",
|
259
|
-
autospec=True,
|
260
|
-
)
|
261
|
-
mocked_cloudflare_resources.query.return_value = query_data
|
262
|
-
|
263
|
-
|
264
|
-
@pytest.fixture
|
265
|
-
def mock_terraform_client(mocker):
|
266
|
-
mocked_tf_client = mocker.patch(
|
267
|
-
"reconcile.terraform_cloudflare_resources.TerraformClient", autospec=True
|
268
|
-
)
|
269
|
-
mocked_tf_client.return_value.plan.return_value = False, None
|
270
|
-
return mocked_tf_client
|
271
|
-
|
272
|
-
|
273
|
-
def test_cloudflare_accounts_validation(
|
274
|
-
mocker,
|
275
|
-
caplog,
|
276
|
-
mock_gql,
|
277
|
-
mock_app_interface_vault_settings,
|
278
|
-
mock_cloudflare_resources,
|
279
|
-
):
|
280
|
-
# Mocking accounts with an empty response
|
281
|
-
mocked_cloudflare_accounts = mocker.patch(
|
282
|
-
"reconcile.terraform_cloudflare_resources.terraform_cloudflare_accounts",
|
283
|
-
autospec=True,
|
284
|
-
)
|
285
|
-
mocked_cloudflare_accounts.query.return_value = (
|
286
|
-
TerraformCloudflareAccountsQueryData(accounts=[])
|
287
|
-
)
|
288
|
-
|
289
|
-
with caplog.at_level(logging.INFO), pytest.raises(SystemExit) as sample:
|
290
|
-
integ.run(True, None, False, 10)
|
291
|
-
assert sample.value.code == 0
|
292
|
-
assert [rec.message for rec in caplog.records] == [
|
293
|
-
"No Cloudflare accounts were detected, nothing to do."
|
294
|
-
]
|
295
|
-
|
296
|
-
|
297
|
-
def test_namespace_validation(
|
298
|
-
mocker,
|
299
|
-
caplog,
|
300
|
-
mock_gql,
|
301
|
-
mock_app_interface_vault_settings,
|
302
|
-
mock_cloudflare_accounts,
|
303
|
-
):
|
304
|
-
# Mocking resources without namespaces
|
305
|
-
mocked_resources = mocker.patch(
|
306
|
-
"reconcile.terraform_cloudflare_resources.terraform_cloudflare_resources",
|
307
|
-
autospec=True,
|
308
|
-
)
|
309
|
-
mocked_resources.query.return_value = TerraformCloudflareResourcesQueryData(
|
310
|
-
namespaces=[],
|
311
|
-
)
|
312
|
-
|
313
|
-
with caplog.at_level(logging.INFO), pytest.raises(SystemExit) as sample:
|
314
|
-
integ.run(True, None, False, 10)
|
315
|
-
assert sample.value.code == 0
|
316
|
-
assert [rec.message for rec in caplog.records] == [
|
317
|
-
"No namespaces were detected, nothing to do."
|
318
|
-
]
|
319
|
-
|
320
|
-
|
321
|
-
def test_cloudflare_namespace_validation(
|
322
|
-
mocker,
|
323
|
-
caplog,
|
324
|
-
mock_gql,
|
325
|
-
mock_app_interface_vault_settings,
|
326
|
-
mock_cloudflare_accounts,
|
327
|
-
):
|
328
|
-
# Mocking resources without cloudflare namespaces
|
329
|
-
mocked_resources = mocker.patch(
|
330
|
-
"reconcile.terraform_cloudflare_resources.terraform_cloudflare_resources",
|
331
|
-
autospec=True,
|
332
|
-
)
|
333
|
-
|
334
|
-
mocked_resources.query.return_value = TerraformCloudflareResourcesQueryData(
|
335
|
-
namespaces=[
|
336
|
-
NamespaceV1(
|
337
|
-
name="namespace1",
|
338
|
-
clusterAdmin=True,
|
339
|
-
cluster=ClusterV1(
|
340
|
-
name="test-cluster",
|
341
|
-
serverUrl="http://localhost",
|
342
|
-
insecureSkipTLSVerify=None,
|
343
|
-
jumpHost=None,
|
344
|
-
automationToken=None,
|
345
|
-
clusterAdminAutomationToken=None,
|
346
|
-
spec=None,
|
347
|
-
internal=None,
|
348
|
-
disable=None,
|
349
|
-
),
|
350
|
-
managedExternalResources=True,
|
351
|
-
externalResources=[],
|
352
|
-
)
|
353
|
-
],
|
354
|
-
)
|
355
|
-
|
356
|
-
with caplog.at_level(logging.INFO), pytest.raises(SystemExit) as sample:
|
357
|
-
integ.run(True, None, False, 10)
|
358
|
-
assert sample.value.code == 0
|
359
|
-
assert [rec.message for rec in caplog.records] == [
|
360
|
-
"No cloudflare namespaces were detected, nothing to do."
|
361
|
-
]
|
362
|
-
|
363
|
-
|
364
|
-
def custom_ssl_secret_reader_side_effect(*args):
|
365
|
-
"""For use of secret_reader inside cloudflare client"""
|
366
|
-
if args[0] == {
|
367
|
-
"path": "certificate/secret/cert/path",
|
368
|
-
"field": "certificate.crt",
|
369
|
-
"version": 1,
|
370
|
-
"q_format": "plain",
|
371
|
-
}:
|
372
|
-
return "----- CERTIFICATE -----"
|
373
|
-
|
374
|
-
if args[0] == {
|
375
|
-
"path": "certificate/secret/cert/path",
|
376
|
-
"field": "certificate.key",
|
377
|
-
"version": 1,
|
378
|
-
"q_format": "plain",
|
379
|
-
}:
|
380
|
-
return "----- KEY -----"
|
381
|
-
|
382
|
-
|
383
|
-
def test_terraform_cloudflare_resources_dry_run(
|
384
|
-
mocker,
|
385
|
-
mock_gql,
|
386
|
-
mock_create_secret_reader,
|
387
|
-
mock_terraform_client,
|
388
|
-
mock_app_interface_vault_settings,
|
389
|
-
mock_cloudflare_accounts,
|
390
|
-
mock_cloudflare_resources,
|
391
|
-
):
|
392
|
-
# Mocking vault settings and secret reader inside cloudflare_client
|
393
|
-
mocker.patch(
|
394
|
-
"reconcile.utils.terrascript.cloudflare_resources.get_app_interface_vault_settings",
|
395
|
-
atospec=True,
|
396
|
-
)
|
397
|
-
secret_reader = mocker.Mock(SecretReaderBase)
|
398
|
-
secret_reader.read.side_effect = custom_ssl_secret_reader_side_effect
|
399
|
-
create_secret_reader = mocker.patch(
|
400
|
-
"reconcile.utils.terrascript.cloudflare_resources.create_secret_reader",
|
401
|
-
autospec=True,
|
402
|
-
)
|
403
|
-
create_secret_reader.return_value = secret_reader
|
404
|
-
with pytest.raises(SystemExit) as sample:
|
405
|
-
integ.run(True, None, False, 10)
|
406
|
-
assert sample.value.code == ExitCodes.SUCCESS
|
407
|
-
assert mock_terraform_client.called is True
|
408
|
-
assert call().apply() not in mock_terraform_client.method_calls
|