Skip to content

Commit

Permalink
Merge pull request #22435 from DrFaust92/customer-gtw-cert
Browse files Browse the repository at this point in the history
r/customer_gateway - cleanup + `certificate_arn`
  • Loading branch information
ewbankkit authored Jan 7, 2022
2 parents 4778c58 + a128aee commit 323eece
Show file tree
Hide file tree
Showing 25 changed files with 931 additions and 935 deletions.
7 changes: 7 additions & 0 deletions .changelog/22435.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
```release-note:enhancement
resource/aws_customer_gateway: Add `certificate_arn` argument
```

```release-note:enhancement
data-source/aws_customer_gateway: Add `certificate_arn` attribute
```
117 changes: 100 additions & 17 deletions internal/acctest/acctest.go
Original file line number Diff line number Diff line change
Expand Up @@ -1302,22 +1302,27 @@ func ACMCertificateRandomSubDomain(rootDomain string) string {
rootDomain)
}

func CheckACMPCACertificateAuthorityActivateCA(certificateAuthority *acmpca.CertificateAuthority) resource.TestCheckFunc {
func CheckACMPCACertificateAuthorityActivateRootCA(certificateAuthority *acmpca.CertificateAuthority) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := Provider.Meta().(*conns.AWSClient).ACMPCAConn

if v := aws.StringValue(certificateAuthority.Type); v != acmpca.CertificateAuthorityTypeRoot {
return fmt.Errorf("attempting to activate ACM PCA %s Certificate Authority", v)
}

arn := aws.StringValue(certificateAuthority.Arn)

getCsrResp, err := conn.GetCertificateAuthorityCsr(&acmpca.GetCertificateAuthorityCsrInput{
getCsrOutput, err := conn.GetCertificateAuthorityCsr(&acmpca.GetCertificateAuthorityCsrInput{
CertificateAuthorityArn: aws.String(arn),
})

if err != nil {
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) CSR: %s", arn, err)
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) CSR: %w", arn, err)
}

issueCertResp, err := conn.IssueCertificate(&acmpca.IssueCertificateInput{
issueCertOutput, err := conn.IssueCertificate(&acmpca.IssueCertificateInput{
CertificateAuthorityArn: aws.String(arn),
Csr: []byte(aws.StringValue(getCsrResp.Csr)),
Csr: []byte(aws.StringValue(getCsrOutput.Csr)),
IdempotencyToken: aws.String(resource.UniqueId()),
SigningAlgorithm: certificateAuthority.CertificateAuthorityConfiguration.SigningAlgorithm,
TemplateArn: aws.String(fmt.Sprintf("arn:%s:acm-pca:::template/RootCACertificate/V1", Partition())),
Expand All @@ -1326,33 +1331,106 @@ func CheckACMPCACertificateAuthorityActivateCA(certificateAuthority *acmpca.Cert
Value: aws.Int64(10),
},
})

if err != nil {
return fmt.Errorf("error issuing ACM PCA Certificate Authority (%s) Root CA certificate from CSR: %s", arn, err)
return fmt.Errorf("error issuing ACM PCA Certificate Authority (%s) Root CA certificate from CSR: %w", arn, err)
}

// Wait for certificate status to become ISSUED.
err = conn.WaitUntilCertificateIssued(&acmpca.GetCertificateInput{
CertificateAuthorityArn: aws.String(arn),
CertificateArn: issueCertResp.CertificateArn,
CertificateArn: issueCertOutput.CertificateArn,
})

if err != nil {
return fmt.Errorf("error waiting for ACM PCA Certificate Authority (%s) Root CA certificate to become ISSUED: %w", arn, err)
}

getCertOutput, err := conn.GetCertificate(&acmpca.GetCertificateInput{
CertificateAuthorityArn: aws.String(arn),
CertificateArn: issueCertOutput.CertificateArn,
})

if err != nil {
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) issued Root CA certificate: %w", arn, err)
}

_, err = conn.ImportCertificateAuthorityCertificate(&acmpca.ImportCertificateAuthorityCertificateInput{
CertificateAuthorityArn: aws.String(arn),
Certificate: []byte(aws.StringValue(getCertOutput.Certificate)),
})

if err != nil {
return fmt.Errorf("error waiting for ACM PCA Certificate Authority (%s) Root CA certificate to become ISSUED: %s", arn, err)
return fmt.Errorf("error importing ACM PCA Certificate Authority (%s) Root CA certificate: %w", arn, err)
}

getCertResp, err := conn.GetCertificate(&acmpca.GetCertificateInput{
return err
}
}

func CheckACMPCACertificateAuthorityActivateSubordinateCA(rootCertificateAuthority, certificateAuthority *acmpca.CertificateAuthority) resource.TestCheckFunc {
return func(s *terraform.State) error {
conn := Provider.Meta().(*conns.AWSClient).ACMPCAConn

if v := aws.StringValue(certificateAuthority.Type); v != acmpca.CertificateAuthorityTypeSubordinate {
return fmt.Errorf("attempting to activate ACM PCA %s Certificate Authority", v)
}

arn := aws.StringValue(certificateAuthority.Arn)

getCsrOutput, err := conn.GetCertificateAuthorityCsr(&acmpca.GetCertificateAuthorityCsrInput{
CertificateAuthorityArn: aws.String(arn),
CertificateArn: issueCertResp.CertificateArn,
})

if err != nil {
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) CSR: %w", arn, err)
}

rootCertificateAuthorityArn := aws.StringValue(rootCertificateAuthority.Arn)

issueCertOutput, err := conn.IssueCertificate(&acmpca.IssueCertificateInput{
CertificateAuthorityArn: aws.String(rootCertificateAuthorityArn),
Csr: []byte(aws.StringValue(getCsrOutput.Csr)),
IdempotencyToken: aws.String(resource.UniqueId()),
SigningAlgorithm: certificateAuthority.CertificateAuthorityConfiguration.SigningAlgorithm,
TemplateArn: aws.String(fmt.Sprintf("arn:%s:acm-pca:::template/SubordinateCACertificate_PathLen0/V1", Partition())),
Validity: &acmpca.Validity{
Type: aws.String(acmpca.ValidityPeriodTypeYears),
Value: aws.Int64(3),
},
})

if err != nil {
return fmt.Errorf("error issuing ACM PCA Certificate Authority (%s) Subordinate CA certificate from CSR: %w", arn, err)
}

// Wait for certificate status to become ISSUED.
err = conn.WaitUntilCertificateIssued(&acmpca.GetCertificateInput{
CertificateAuthorityArn: aws.String(rootCertificateAuthorityArn),
CertificateArn: issueCertOutput.CertificateArn,
})

if err != nil {
return fmt.Errorf("error waiting for ACM PCA Certificate Authority (%s) Subordinate CA certificate to become ISSUED: %w", arn, err)
}

getCertOutput, err := conn.GetCertificate(&acmpca.GetCertificateInput{
CertificateAuthorityArn: aws.String(rootCertificateAuthorityArn),
CertificateArn: issueCertOutput.CertificateArn,
})

if err != nil {
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) issued Root CA certificate: %s", arn, err)
return fmt.Errorf("error getting ACM PCA Certificate Authority (%s) issued Subordinate CA certificate: %w", arn, err)
}

_, err = conn.ImportCertificateAuthorityCertificate(&acmpca.ImportCertificateAuthorityCertificateInput{
CertificateAuthorityArn: aws.String(arn),
Certificate: []byte(aws.StringValue(getCertResp.Certificate)),
Certificate: []byte(aws.StringValue(getCertOutput.Certificate)),
CertificateChain: []byte(aws.StringValue(getCertOutput.CertificateChain)),
})

if err != nil {
return fmt.Errorf("error importing ACM PCA Certificate Authority (%s) Root CA certificate: %s", arn, err)
return fmt.Errorf("error importing ACM PCA Certificate Authority (%s) Subordinate CA certificate: %w", arn, err)
}

return err
Expand All @@ -1372,14 +1450,19 @@ func CheckACMPCACertificateAuthorityDisableCA(certificateAuthority *acmpca.Certi
}
}

func CheckACMPCACertificateAuthorityExists(resourceName string, certificateAuthority *acmpca.CertificateAuthority) resource.TestCheckFunc {
func CheckACMPCACertificateAuthorityExists(n string, certificateAuthority *acmpca.CertificateAuthority) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[resourceName]
rs, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Not found: %s", resourceName)
return fmt.Errorf("Not found: %s", n)
}

if rs.Primary.ID == "" {
return fmt.Errorf("No ACM PCA Certificate Authority ID is set")
}

conn := Provider.Meta().(*conns.AWSClient).ACMPCAConn

input := &acmpca.DescribeCertificateAuthorityInput{
CertificateAuthorityArn: aws.String(rs.Primary.ID),
}
Expand All @@ -1391,7 +1474,7 @@ func CheckACMPCACertificateAuthorityExists(resourceName string, certificateAutho
}

if output == nil || output.CertificateAuthority == nil {
return fmt.Errorf("ACM PCA Certificate Authority %q does not exist", rs.Primary.ID)
return fmt.Errorf("ACM PCA Certificate Authority %s does not exist", rs.Primary.ID)
}

*certificateAuthority = *output.CertificateAuthority
Expand Down
2 changes: 1 addition & 1 deletion internal/service/acmpca/certificate_authority_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func TestAccACMPCACertificateAuthority_enabled(t *testing.T) {
resource.TestCheckResourceAttr(resourceName, "type", acmpca.CertificateAuthorityTypeRoot),
resource.TestCheckResourceAttr(resourceName, "enabled", "true"),
resource.TestCheckResourceAttr(resourceName, "status", acmpca.CertificateAuthorityStatusPendingCertificate),
acctest.CheckACMPCACertificateAuthorityActivateCA(&certificateAuthority),
acctest.CheckACMPCACertificateAuthorityActivateRootCA(&certificateAuthority),
),
},
{
Expand Down
2 changes: 1 addition & 1 deletion internal/service/appmesh/virtual_gateway_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,7 @@ func testAccVirtualGateway_ListenerTLS(t *testing.T) {
Config: testAccAppmeshVirtualGatewayConfigRootCA(domain),
Check: resource.ComposeTestCheckFunc(
acctest.CheckACMPCACertificateAuthorityExists(acmCAResourceName, &ca),
acctest.CheckACMPCACertificateAuthorityActivateCA(&ca),
acctest.CheckACMPCACertificateAuthorityActivateRootCA(&ca),
),
},
{
Expand Down
4 changes: 2 additions & 2 deletions internal/service/appmesh/virtual_node_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func testAccVirtualNode_backendClientPolicyACM(t *testing.T) {
Config: testAccAppmeshVirtualNodeConfigRootCA(domain),
Check: resource.ComposeTestCheckFunc(
acctest.CheckACMPCACertificateAuthorityExists(acmCAResourceName, &ca),
acctest.CheckACMPCACertificateAuthorityActivateCA(&ca),
acctest.CheckACMPCACertificateAuthorityActivateRootCA(&ca),
),
},
{
Expand Down Expand Up @@ -940,7 +940,7 @@ func testAccVirtualNode_listenerTLS(t *testing.T) {
Config: testAccAppmeshVirtualNodeConfigRootCA(domain),
Check: resource.ComposeTestCheckFunc(
acctest.CheckACMPCACertificateAuthorityExists(acmCAResourceName, &ca),
acctest.CheckACMPCACertificateAuthorityActivateCA(&ca),
acctest.CheckACMPCACertificateAuthorityActivateRootCA(&ca),
),
},
{
Expand Down
Loading

0 comments on commit 323eece

Please sign in to comment.