Skip to content

Commit 1fa70e5

Browse files
authored
Merge pull request #5863 from cloudflare/tamas/zero_trust_access_mtls_certificate
chore: modernize zero_trust_access_mtls_certificate tests
2 parents 281aa68 + ea33b4b commit 1fa70e5

File tree

3 files changed

+223
-28
lines changed

3 files changed

+223
-28
lines changed

internal/services/zero_trust_access_mtls_certificate/resource_test.go

Lines changed: 164 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import (
1212
"github.com/cloudflare/terraform-provider-cloudflare/internal/utils"
1313
"github.com/hashicorp/terraform-plugin-log/tflog"
1414
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
15+
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
16+
"github.com/hashicorp/terraform-plugin-testing/statecheck"
1517
"github.com/hashicorp/terraform-plugin-testing/terraform"
18+
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
1619
)
1720

1821
func init() {
@@ -62,7 +65,6 @@ func testSweepCloudflareAccessMutualTLSCertificate(r string) error {
6265
}
6366

6467
func TestAccCloudflareAccessMutualTLSBasic(t *testing.T) {
65-
t.Skip(`FIXME: "DELETE, 409 Conflict, access.api.error.conflict: certificate has active associations"`)
6668
// Temporarily unset CLOUDFLARE_API_TOKEN if it is set as the Access
6769
// service does not yet support the API tokens and it results in
6870
// misleading state error messages.
@@ -71,7 +73,7 @@ func TestAccCloudflareAccessMutualTLSBasic(t *testing.T) {
7173
}
7274

7375
rnd := utils.GenerateRandomResourceName()
74-
name := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
76+
resourceName := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
7577
cert := os.Getenv("CLOUDFLARE_MUTUAL_TLS_CERTIFICATE")
7678
domain := os.Getenv("CLOUDFLARE_DOMAIN")
7779
accountID := os.Getenv("CLOUDFLARE_ACCOUNT_ID")
@@ -86,12 +88,22 @@ func TestAccCloudflareAccessMutualTLSBasic(t *testing.T) {
8688
Steps: []resource.TestStep{
8789
{
8890
Config: testAccessMutualTLSCertificateConfigBasic(rnd, cloudflare.AccountIdentifier(accountID), cert, domain),
89-
Check: resource.ComposeTestCheckFunc(
90-
resource.TestCheckResourceAttr(name, consts.AccountIDSchemaKey, accountID),
91-
resource.TestCheckResourceAttr(name, "name", rnd),
92-
resource.TestCheckResourceAttrSet(name, "certificate"),
93-
resource.TestCheckResourceAttr(name, "associated_hostnames.#", "2"),
94-
),
91+
ConfigStateChecks: []statecheck.StateCheck{
92+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.AccountIDSchemaKey), knownvalue.StringExact(accountID)),
93+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
94+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
95+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(2)),
96+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
97+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
98+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
99+
},
100+
},
101+
{
102+
ResourceName: resourceName,
103+
ImportState: true,
104+
ImportStateVerify: true,
105+
ImportStateIdPrefix: fmt.Sprintf("accounts/%s/", accountID),
106+
ImportStateVerifyIgnore: []string{"certificate"},
95107
},
96108
{
97109
// Ensures no diff on last plan
@@ -100,12 +112,15 @@ func TestAccCloudflareAccessMutualTLSBasic(t *testing.T) {
100112
},
101113
{
102114
Config: testAccessMutualTLSCertificateUpdated(rnd, cloudflare.AccountIdentifier(accountID), cert),
103-
Check: resource.ComposeTestCheckFunc(
104-
resource.TestCheckResourceAttr(name, consts.AccountIDSchemaKey, accountID),
105-
resource.TestCheckResourceAttr(name, "name", rnd),
106-
resource.TestCheckResourceAttrSet(name, "certificate"),
107-
resource.TestCheckResourceAttr(name, "associated_hostnames.#", "0"),
108-
),
115+
ConfigStateChecks: []statecheck.StateCheck{
116+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.AccountIDSchemaKey), knownvalue.StringExact(accountID)),
117+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
118+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
119+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(0)),
120+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
121+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
122+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
123+
},
109124
},
110125
{
111126
// Ensures no diff on last plan
@@ -117,7 +132,6 @@ func TestAccCloudflareAccessMutualTLSBasic(t *testing.T) {
117132
}
118133

119134
func TestAccCloudflareAccessMutualTLSBasicWithZoneID(t *testing.T) {
120-
t.Skip(`FIXME: "POST, 409 Conflict, access.api.error.conflict: certificate already exists"`)
121135
// Temporarily unset CLOUDFLARE_API_TOKEN if it is set as the Access
122136
// service does not yet support the API tokens and it results in
123137
// misleading state error messages.
@@ -126,7 +140,7 @@ func TestAccCloudflareAccessMutualTLSBasicWithZoneID(t *testing.T) {
126140
}
127141

128142
rnd := utils.GenerateRandomResourceName()
129-
name := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
143+
resourceName := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
130144
cert := os.Getenv("CLOUDFLARE_MUTUAL_TLS_CERTIFICATE")
131145
domain := os.Getenv("CLOUDFLARE_DOMAIN")
132146
zoneID := os.Getenv("CLOUDFLARE_ZONE_ID")
@@ -140,12 +154,22 @@ func TestAccCloudflareAccessMutualTLSBasicWithZoneID(t *testing.T) {
140154
Steps: []resource.TestStep{
141155
{
142156
Config: testAccessMutualTLSCertificateConfigBasic(rnd, cloudflare.ZoneIdentifier(zoneID), cert, domain),
143-
Check: resource.ComposeTestCheckFunc(
144-
resource.TestCheckResourceAttr(name, consts.ZoneIDSchemaKey, zoneID),
145-
resource.TestCheckResourceAttr(name, "name", rnd),
146-
resource.TestCheckResourceAttrSet(name, "certificate"),
147-
resource.TestCheckResourceAttr(name, "associated_hostnames.#", "2"),
148-
),
157+
ConfigStateChecks: []statecheck.StateCheck{
158+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.ZoneIDSchemaKey), knownvalue.StringExact(zoneID)),
159+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
160+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
161+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(2)),
162+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
163+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
164+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
165+
},
166+
},
167+
{
168+
ResourceName: resourceName,
169+
ImportState: true,
170+
ImportStateVerify: true,
171+
ImportStateIdPrefix: fmt.Sprintf("zones/%s/", zoneID),
172+
ImportStateVerifyIgnore: []string{"certificate"},
149173
},
150174
{
151175
// Ensures no diff on last plan
@@ -154,12 +178,15 @@ func TestAccCloudflareAccessMutualTLSBasicWithZoneID(t *testing.T) {
154178
},
155179
{
156180
Config: testAccessMutualTLSCertificateUpdated(rnd, cloudflare.ZoneIdentifier(zoneID), cert),
157-
Check: resource.ComposeTestCheckFunc(
158-
resource.TestCheckResourceAttr(name, consts.ZoneIDSchemaKey, zoneID),
159-
resource.TestCheckResourceAttr(name, "name", rnd),
160-
resource.TestCheckResourceAttrSet(name, "certificate"),
161-
resource.TestCheckResourceAttr(name, "associated_hostnames.#", "0"),
162-
),
181+
ConfigStateChecks: []statecheck.StateCheck{
182+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.ZoneIDSchemaKey), knownvalue.StringExact(zoneID)),
183+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
184+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
185+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(0)),
186+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
187+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
188+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
189+
},
163190
},
164191
{
165192
// Ensures no diff on last plan
@@ -170,6 +197,107 @@ func TestAccCloudflareAccessMutualTLSBasicWithZoneID(t *testing.T) {
170197
})
171198
}
172199

200+
func TestAccCloudflareAccessMutualTLSMinimal(t *testing.T) {
201+
// Temporarily unset CLOUDFLARE_API_TOKEN if it is set as the Access
202+
// service does not yet support the API tokens and it results in
203+
// misleading state error messages.
204+
if os.Getenv("CLOUDFLARE_API_TOKEN") != "" {
205+
t.Setenv("CLOUDFLARE_API_TOKEN", "")
206+
}
207+
208+
rnd := utils.GenerateRandomResourceName()
209+
resourceName := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
210+
cert := os.Getenv("CLOUDFLARE_MUTUAL_TLS_CERTIFICATE")
211+
accountID := os.Getenv("CLOUDFLARE_ACCOUNT_ID")
212+
213+
resource.Test(t, resource.TestCase{
214+
PreCheck: func() {
215+
acctest.TestAccPreCheck(t)
216+
acctest.TestAccPreCheck_AccountID(t)
217+
},
218+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
219+
CheckDestroy: testAccCheckCloudflareAccessMutualTLSCertificateDestroy,
220+
Steps: []resource.TestStep{
221+
{
222+
Config: testAccessMutualTLSCertificateMinimal(rnd, cloudflare.AccountIdentifier(accountID), cert),
223+
ConfigStateChecks: []statecheck.StateCheck{
224+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.AccountIDSchemaKey), knownvalue.StringExact(accountID)),
225+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
226+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
227+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.Null()),
228+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
229+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
230+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
231+
},
232+
},
233+
{
234+
ResourceName: resourceName,
235+
ImportState: true,
236+
ImportStateVerify: true,
237+
ImportStateIdPrefix: fmt.Sprintf("accounts/%s/", accountID),
238+
ImportStateVerifyIgnore: []string{"certificate"},
239+
},
240+
},
241+
})
242+
}
243+
244+
func TestAccCloudflareAccessMutualTLSNameUpdate(t *testing.T) {
245+
// Temporarily unset CLOUDFLARE_API_TOKEN if it is set as the Access
246+
// service does not yet support the API tokens and it results in
247+
// misleading state error messages.
248+
if os.Getenv("CLOUDFLARE_API_TOKEN") != "" {
249+
t.Setenv("CLOUDFLARE_API_TOKEN", "")
250+
}
251+
252+
rnd := utils.GenerateRandomResourceName()
253+
resourceName := fmt.Sprintf("cloudflare_zero_trust_access_mtls_certificate.%s", rnd)
254+
cert := os.Getenv("CLOUDFLARE_MUTUAL_TLS_CERTIFICATE")
255+
domain := os.Getenv("CLOUDFLARE_DOMAIN")
256+
accountID := os.Getenv("CLOUDFLARE_ACCOUNT_ID")
257+
258+
resource.Test(t, resource.TestCase{
259+
PreCheck: func() {
260+
acctest.TestAccPreCheck(t)
261+
acctest.TestAccPreCheck_AccountID(t)
262+
},
263+
ProtoV6ProviderFactories: acctest.TestAccProtoV6ProviderFactories,
264+
CheckDestroy: testAccCheckCloudflareAccessMutualTLSCertificateDestroy,
265+
Steps: []resource.TestStep{
266+
{
267+
Config: testAccessMutualTLSCertificateConfigBasic(rnd, cloudflare.AccountIdentifier(accountID), cert, domain),
268+
ConfigStateChecks: []statecheck.StateCheck{
269+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.AccountIDSchemaKey), knownvalue.StringExact(accountID)),
270+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd)),
271+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
272+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(2)),
273+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
274+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
275+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
276+
},
277+
},
278+
{
279+
Config: testAccessMutualTLSCertificateNameUpdated(rnd, cloudflare.AccountIdentifier(accountID), cert, domain),
280+
ConfigStateChecks: []statecheck.StateCheck{
281+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New(consts.AccountIDSchemaKey), knownvalue.StringExact(accountID)),
282+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("name"), knownvalue.StringExact(rnd+"-updated")),
283+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("certificate"), knownvalue.NotNull()),
284+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("associated_hostnames"), knownvalue.ListSizeExact(1)),
285+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("id"), knownvalue.NotNull()),
286+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("fingerprint"), knownvalue.NotNull()),
287+
statecheck.ExpectKnownValue(resourceName, tfjsonpath.New("expires_on"), knownvalue.NotNull()),
288+
},
289+
},
290+
{
291+
ResourceName: resourceName,
292+
ImportState: true,
293+
ImportStateVerify: true,
294+
ImportStateIdPrefix: fmt.Sprintf("accounts/%s/", accountID),
295+
ImportStateVerifyIgnore: []string{"certificate"},
296+
},
297+
},
298+
})
299+
}
300+
173301
func testAccCheckCloudflareAccessMutualTLSCertificateDestroy(s *terraform.State) error {
174302
client, clientErr := acctest.SharedV1Client() // TODO(terraform): replace with SharedV2Clent
175303
if clientErr != nil {
@@ -206,3 +334,11 @@ func testAccessMutualTLSCertificateConfigBasic(rnd string, identifier *cloudflar
206334
func testAccessMutualTLSCertificateUpdated(rnd string, identifier *cloudflare.ResourceContainer, cert string) string {
207335
return acctest.LoadTestCase("accessmutualtlscertificateupdated.tf", rnd, identifier.Type, identifier.Identifier, cert)
208336
}
337+
338+
func testAccessMutualTLSCertificateMinimal(rnd string, identifier *cloudflare.ResourceContainer, cert string) string {
339+
return acctest.LoadTestCase("accessmutualtlscertificateminimal.tf", rnd, identifier.Type, identifier.Identifier, cert)
340+
}
341+
342+
func testAccessMutualTLSCertificateNameUpdated(rnd string, identifier *cloudflare.ResourceContainer, cert, domain string) string {
343+
return acctest.LoadTestCase("accessmutualtlscertificatenameupdated.tf", rnd, identifier.Type, identifier.Identifier, cert, domain)
344+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
resource "cloudflare_zero_trust_access_mtls_certificate" "%[1]s" {
2+
name = "%[1]s"
3+
%[2]s_id = "%[3]s"
4+
certificate = <<EOT
5+
-----BEGIN CERTIFICATE-----
6+
MIID3jCCAsagAwIBAgIUciOXgGvXP8FX1ALvZ0NDqjKu1SMwDQYJKoZIhvcNAQEL
7+
BQAwgYUxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVUZXhhczEPMA0GA1UEBxMGQXVz
8+
dGluMRcwFQYDVQQKEw5BY2Nlc3MgVGVzdGluZzELMAkGA1UECxMCVFgxLzAtBgNV
9+
BAMTJlRlcnJhZm9ybSBaZXJvIFRydXN0IEFjY2VzcyBUZXN0aW5nIENBMCAXDTI1
10+
MDcwMzAzNTYwMFoYDzIxMjUwNjA5MDM1NjAwWjCBhTELMAkGA1UEBhMCVVMxDjAM
11+
BgNVBAgTBVRleGFzMQ8wDQYDVQQHEwZBdXN0aW4xFzAVBgNVBAoTDkFjY2VzcyBU
12+
ZXN0aW5nMQswCQYDVQQLEwJUWDEvMC0GA1UEAxMmVGVycmFmb3JtIFplcm8gVHJ1
13+
c3QgQWNjZXNzIFRlc3RpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
14+
AoIBAQDEz6bGjvmQjDRSfEk/9MIKTi2L6qtCCy9o5ySYDMmU217G3gNjjEdEzTFl
15+
7u548ohskl2zaL1I8uty+egGiH6tqUl4th+5eXCOilPXskH9kC4BqEHUXtaz+I0X
16+
7oWMXHm0pyua81W3tJ+8pX4bl6+chthML18eVSY3lDCJ8CfODXknjMevjxqqANTF
17+
IqQh6+xhXQxB0U8HyibfdcMSxIAwUxs4t69ytmyC5NrIAbyzB+Y5Ifh9sgyyUM5x
18+
VdOBtyTnmOiEVYqMIE51yRyvmQOirhJ5FTOhKpTVQw2dIWzSXqPwl4iRlgIfNPQn
19+
rp+wdo2YKfiyog7zPIMloMHofEb7AgMBAAGjQjBAMA0GA1UdDwEB/wQEAwIBBjAP
20+
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQyNb1vM2Lip+HlmCE1HdSk0948zDAN
21+
BgkqhkiG9w0BAQsFAAOCAQEAngoeqEOLehP6xIbhxth/TIDJb+13TuLJWZFc8ggD
22+
/BT/lMMm5BT6Wp5rA2v4QTBrfqP1ly2gKF9IQvI6vH39Rt9fHpLrejx8DZtDSkX3
23+
z+ZtE9Gd1Fj4InJUhVK8VPPcXYbvZ52h87qCc8/WwXCE4uh4XIhUPjU2JfLXqMuO
24+
uY0+PHW1AxlJWnvzj0nyH/ucjWgNyfFr+9Gvd5O1UpPvbUcx3j1RXBlqV0h8dA4h
25+
PZ5Ik8uuugHbWhFaPGYIo4e/zP8Hz5XNi52RYErFPs5tRnYX+7N5Vrfr2qOZd81M
26+
rXsidsZdH6J5zN7l8Sis98lSMWNOlrluV/3Q94wQJdT27g==
27+
-----END CERTIFICATE-----
28+
EOT
29+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
resource "cloudflare_zero_trust_access_mtls_certificate" "%[1]s" {
2+
name = "%[1]s-updated"
3+
%[2]s_id = "%[3]s"
4+
associated_hostnames = ["updated.%[5]s"]
5+
certificate = <<EOT
6+
-----BEGIN CERTIFICATE-----
7+
MIID3jCCAsagAwIBAgIUciOXgGvXP8FX1ALvZ0NDqjKu1SMwDQYJKoZIhvcNAQEL
8+
BQAwgYUxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIEwVUZXhhczEPMA0GA1UEBxMGQXVz
9+
dGluMRcwFQYDVQQKEw5BY2Nlc3MgVGVzdGluZzELMAkGA1UECxMCVFgxLzAtBgNV
10+
BAMTJlRlcnJhZm9ybSBaZXJvIFRydXN0IEFjY2VzcyBUZXN0aW5nIENBMCAXDTI1
11+
MDcwMzAzNTYwMFoYDzIxMjUwNjA5MDM1NjAwWjCBhTELMAkGA1UEBhMCVVMxDjAM
12+
BgNVBAgTBVRleGFzMQ8wDQYDVQQHEwZBdXN0aW4xFzAVBgNVBAoTDkFjY2VzcyBU
13+
ZXN0aW5nMQswCQYDVQQLEwJUWDEvMC0GA1UEAxMmVGVycmFmb3JtIFplcm8gVHJ1
14+
c3QgQWNjZXNzIFRlc3RpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
15+
AoIBAQDEz6bGjvmQjDRSfEk/9MIKTi2L6qtCCy9o5ySYDMmU217G3gNjjEdEzTFl
16+
7u548ohskl2zaL1I8uty+egGiH6tqUl4th+5eXCOilPXskH9kC4BqEHUXtaz+I0X
17+
7oWMXHm0pyua81W3tJ+8pX4bl6+chthML18eVSY3lDCJ8CfODXknjMevjxqqANTF
18+
IqQh6+xhXQxB0U8HyibfdcMSxIAwUxs4t69ytmyC5NrIAbyzB+Y5Ifh9sgyyUM5x
19+
VdOBtyTnmOiEVYqMIE51yRyvmQOirhJ5FTOhKpTVQw2dIWzSXqPwl4iRlgIfNPQn
20+
rp+wdo2YKfiyog7zPIMloMHofEb7AgMBAAGjQjBAMA0GA1UdDwEB/wQEAwIBBjAP
21+
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQyNb1vM2Lip+HlmCE1HdSk0948zDAN
22+
BgkqhkiG9w0BAQsFAAOCAQEAngoeqEOLehP6xIbhxth/TIDJb+13TuLJWZFc8ggD
23+
/BT/lMMm5BT6Wp5rA2v4QTBrfqP1ly2gKF9IQvI6vH39Rt9fHpLrejx8DZtDSkX3
24+
z+ZtE9Gd1Fj4InJUhVK8VPPcXYbvZ52h87qCc8/WwXCE4uh4XIhUPjU2JfLXqMuO
25+
uY0+PHW1AxlJWnvzj0nyH/ucjWgNyfFr+9Gvd5O1UpPvbUcx3j1RXBlqV0h8dA4h
26+
PZ5Ik8uuugHbWhFaPGYIo4e/zP8Hz5XNi52RYErFPs5tRnYX+7N5Vrfr2qOZd81M
27+
rXsidsZdH6J5zN7l8Sis98lSMWNOlrluV/3Q94wQJdT27g==
28+
-----END CERTIFICATE-----
29+
EOT
30+
}

0 commit comments

Comments
 (0)