Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit be56c7d

Browse files
jzbrunostack72
authored andcommitted
provider/aws: Add AWS DMS (data migration service) resources (hashicorp#11122)
* Add aws dms vendoring * Add aws dms endpoint resource * Add aws dms replication instance resource * Add aws dms replication subnet group resource * Add aws dms replication task resource * Fix aws dms resource go vet errors * Review fixes: Add id validators for all resources. Add validator for endpoint engine_name. * Add aws dms resources to importability list * Review fixes: Add aws dms iam role dependencies to test cases * Review fixes: Adjustments for handling input values * Add aws dms replication subnet group tagging * Fix aws dms subnet group doesn't use standard error for resource not found * Missed update of aws dms vendored version * Add aws dms certificate resource * Update aws dms resources to force new for immutable attributes * Fix tests failing on subnet deletion by adding explicit dependencies. Combine import tests with basic tests to cut down runtime.
1 parent b30ef0f commit be56c7d

26 files changed

Lines changed: 10480 additions & 0 deletions

builtin/providers/aws/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
2727
"github.com/aws/aws-sdk-go/service/codecommit"
2828
"github.com/aws/aws-sdk-go/service/codedeploy"
29+
"github.com/aws/aws-sdk-go/service/databasemigrationservice"
2930
"github.com/aws/aws-sdk-go/service/directoryservice"
3031
"github.com/aws/aws-sdk-go/service/dynamodb"
3132
"github.com/aws/aws-sdk-go/service/ec2"
@@ -106,6 +107,7 @@ type AWSClient struct {
106107
cloudwatchconn *cloudwatch.CloudWatch
107108
cloudwatchlogsconn *cloudwatchlogs.CloudWatchLogs
108109
cloudwatcheventsconn *cloudwatchevents.CloudWatchEvents
110+
dmsconn *databasemigrationservice.DatabaseMigrationService
109111
dsconn *directoryservice.DirectoryService
110112
dynamodbconn *dynamodb.DynamoDB
111113
ec2conn *ec2.EC2
@@ -276,6 +278,7 @@ func (c *Config) Client() (interface{}, error) {
276278
client.cloudwatchlogsconn = cloudwatchlogs.New(sess)
277279
client.codecommitconn = codecommit.New(sess)
278280
client.codedeployconn = codedeploy.New(sess)
281+
client.dmsconn = databasemigrationservice.New(sess)
279282
client.dsconn = directoryservice.New(sess)
280283
client.dynamodbconn = dynamodb.New(dynamoSess)
281284
client.ec2conn = ec2.New(awsEc2Sess)

builtin/providers/aws/provider.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ func Provider() terraform.ResourceProvider {
246246
"aws_db_security_group": resourceAwsDbSecurityGroup(),
247247
"aws_db_subnet_group": resourceAwsDbSubnetGroup(),
248248
"aws_directory_service_directory": resourceAwsDirectoryServiceDirectory(),
249+
"aws_dms_certificate": resourceAwsDmsCertificate(),
250+
"aws_dms_endpoint": resourceAwsDmsEndpoint(),
251+
"aws_dms_replication_instance": resourceAwsDmsReplicationInstance(),
252+
"aws_dms_replication_subnet_group": resourceAwsDmsReplicationSubnetGroup(),
253+
"aws_dms_replication_task": resourceAwsDmsReplicationTask(),
249254
"aws_dynamodb_table": resourceAwsDynamoDbTable(),
250255
"aws_ebs_snapshot": resourceAwsEbsSnapshot(),
251256
"aws_ebs_volume": resourceAwsEbsVolume(),
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"log"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
"github.com/aws/aws-sdk-go/aws/awserr"
9+
dms "github.com/aws/aws-sdk-go/service/databasemigrationservice"
10+
"github.com/hashicorp/terraform/helper/schema"
11+
)
12+
13+
func resourceAwsDmsCertificate() *schema.Resource {
14+
return &schema.Resource{
15+
Create: resourceAwsDmsCertificateCreate,
16+
Read: resourceAwsDmsCertificateRead,
17+
Delete: resourceAwsDmsCertificateDelete,
18+
19+
Importer: &schema.ResourceImporter{
20+
State: schema.ImportStatePassthrough,
21+
},
22+
23+
Schema: map[string]*schema.Schema{
24+
"certificate_arn": {
25+
Type: schema.TypeString,
26+
Computed: true,
27+
},
28+
"certificate_id": {
29+
Type: schema.TypeString,
30+
Required: true,
31+
ForceNew: true,
32+
ValidateFunc: validateDmsCertificateId,
33+
},
34+
"certificate_pem": {
35+
Type: schema.TypeString,
36+
Optional: true,
37+
ForceNew: true,
38+
Sensitive: true,
39+
},
40+
"certificate_wallet": {
41+
Type: schema.TypeString,
42+
Optional: true,
43+
ForceNew: true,
44+
Sensitive: true,
45+
},
46+
},
47+
}
48+
}
49+
50+
func resourceAwsDmsCertificateCreate(d *schema.ResourceData, meta interface{}) error {
51+
conn := meta.(*AWSClient).dmsconn
52+
53+
request := &dms.ImportCertificateInput{
54+
CertificateIdentifier: aws.String(d.Get("certificate_id").(string)),
55+
}
56+
57+
pem, pemSet := d.GetOk("certificate_pem")
58+
wallet, walletSet := d.GetOk("certificate_wallet")
59+
60+
if !pemSet && !walletSet {
61+
return fmt.Errorf("Must set either certificate_pem and certificate_wallet.")
62+
}
63+
if pemSet && walletSet {
64+
return fmt.Errorf("Cannot set both certificate_pem and certificate_wallet.")
65+
}
66+
67+
if pemSet {
68+
request.CertificatePem = aws.String(pem.(string))
69+
}
70+
if walletSet {
71+
request.CertificateWallet = []byte(wallet.(string))
72+
}
73+
74+
log.Println("[DEBUG] DMS import certificate:", request)
75+
76+
_, err := conn.ImportCertificate(request)
77+
if err != nil {
78+
return err
79+
}
80+
81+
d.SetId(d.Get("certificate_id").(string))
82+
return resourceAwsDmsCertificateRead(d, meta)
83+
}
84+
85+
func resourceAwsDmsCertificateRead(d *schema.ResourceData, meta interface{}) error {
86+
conn := meta.(*AWSClient).dmsconn
87+
88+
response, err := conn.DescribeCertificates(&dms.DescribeCertificatesInput{
89+
Filters: []*dms.Filter{
90+
{
91+
Name: aws.String("certificate-id"),
92+
Values: []*string{aws.String(d.Id())}, // Must use d.Id() to work with import.
93+
},
94+
},
95+
})
96+
if err != nil {
97+
if dmserr, ok := err.(awserr.Error); ok && dmserr.Code() == "ResourceNotFoundFault" {
98+
d.SetId("")
99+
return nil
100+
}
101+
return err
102+
}
103+
104+
return resourceAwsDmsCertificateSetState(d, response.Certificates[0])
105+
}
106+
107+
func resourceAwsDmsCertificateDelete(d *schema.ResourceData, meta interface{}) error {
108+
conn := meta.(*AWSClient).dmsconn
109+
110+
request := &dms.DeleteCertificateInput{
111+
CertificateArn: aws.String(d.Get("certificate_arn").(string)),
112+
}
113+
114+
log.Printf("[DEBUG] DMS delete certificate: %#v", request)
115+
116+
_, err := conn.DeleteCertificate(request)
117+
if err != nil {
118+
return err
119+
}
120+
121+
return nil
122+
}
123+
124+
func resourceAwsDmsCertificateSetState(d *schema.ResourceData, cert *dms.Certificate) error {
125+
d.SetId(*cert.CertificateIdentifier)
126+
127+
d.Set("certificate_id", cert.CertificateIdentifier)
128+
d.Set("certificate_arn", cert.CertificateArn)
129+
130+
if cert.CertificatePem != nil && *cert.CertificatePem != "" {
131+
d.Set("certificate_pem", cert.CertificatePem)
132+
}
133+
if cert.CertificateWallet != nil && len(cert.CertificateWallet) == 0 {
134+
d.Set("certificate_wallet", cert.CertificateWallet)
135+
}
136+
137+
return nil
138+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package aws
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/aws/aws-sdk-go/aws"
8+
dms "github.com/aws/aws-sdk-go/service/databasemigrationservice"
9+
"github.com/hashicorp/terraform/helper/acctest"
10+
"github.com/hashicorp/terraform/helper/resource"
11+
"github.com/hashicorp/terraform/helper/schema"
12+
"github.com/hashicorp/terraform/terraform"
13+
)
14+
15+
func TestAccAwsDmsCertificateBasic(t *testing.T) {
16+
resourceName := "aws_dms_certificate.dms_certificate"
17+
randId := acctest.RandString(8)
18+
19+
resource.Test(t, resource.TestCase{
20+
PreCheck: func() { testAccPreCheck(t) },
21+
Providers: testAccProviders,
22+
CheckDestroy: dmsCertificateDestroy,
23+
Steps: []resource.TestStep{
24+
{
25+
Config: dmsCertificateConfig(randId),
26+
Check: resource.ComposeTestCheckFunc(
27+
checkDmsCertificateExists(resourceName),
28+
resource.TestCheckResourceAttrSet(resourceName, "certificate_arn"),
29+
),
30+
},
31+
{
32+
ResourceName: resourceName,
33+
ImportState: true,
34+
ImportStateVerify: true,
35+
},
36+
},
37+
})
38+
}
39+
40+
func dmsCertificateDestroy(s *terraform.State) error {
41+
for _, rs := range s.RootModule().Resources {
42+
if rs.Type != "aws_dms_certificate" {
43+
continue
44+
}
45+
46+
err := checkDmsCertificateExists(rs.Primary.ID)
47+
if err == nil {
48+
return fmt.Errorf("Found a certificate that was not destroyed: %s", rs.Primary.ID)
49+
}
50+
}
51+
52+
return nil
53+
}
54+
55+
func checkDmsCertificateExists(n string) resource.TestCheckFunc {
56+
providers := []*schema.Provider{testAccProvider}
57+
return checkDmsCertificateExistsWithProviders(n, &providers)
58+
}
59+
60+
func checkDmsCertificateExistsWithProviders(n string, providers *[]*schema.Provider) resource.TestCheckFunc {
61+
return func(s *terraform.State) error {
62+
rs, ok := s.RootModule().Resources[n]
63+
if !ok {
64+
return fmt.Errorf("Not found: %s", n)
65+
}
66+
67+
if rs.Primary.ID == "" {
68+
return fmt.Errorf("No ID is set")
69+
}
70+
for _, provider := range *providers {
71+
// Ignore if Meta is empty, this can happen for validation providers
72+
if provider.Meta() == nil {
73+
continue
74+
}
75+
76+
conn := provider.Meta().(*AWSClient).dmsconn
77+
_, err := conn.DescribeCertificates(&dms.DescribeCertificatesInput{
78+
Filters: []*dms.Filter{
79+
{
80+
Name: aws.String("certificate-id"),
81+
Values: []*string{aws.String(rs.Primary.ID)},
82+
},
83+
},
84+
})
85+
86+
if err != nil {
87+
return fmt.Errorf("DMS certificate error: %v", err)
88+
}
89+
return nil
90+
}
91+
92+
return fmt.Errorf("DMS certificate not found")
93+
}
94+
}
95+
96+
func dmsCertificateConfig(randId string) string {
97+
return fmt.Sprintf(`
98+
resource "aws_dms_certificate" "dms_certificate" {
99+
certificate_id = "tf-test-dms-certificate-%[1]s"
100+
certificate_pem = "-----BEGIN CERTIFICATE-----\nMIID2jCCAsKgAwIBAgIJAJ58TJVjU7G1MA0GCSqGSIb3DQEBBQUAMFExCzAJBgNV\nBAYTAlVTMREwDwYDVQQIEwhDb2xvcmFkbzEPMA0GA1UEBxMGRGVudmVyMRAwDgYD\nVQQKEwdDaGFydGVyMQwwCgYDVQQLEwNDU0UwHhcNMTcwMTMwMTkyMDA4WhcNMjYx\nMjA5MTkyMDA4WjBRMQswCQYDVQQGEwJVUzERMA8GA1UECBMIQ29sb3JhZG8xDzAN\nBgNVBAcTBkRlbnZlcjEQMA4GA1UEChMHQ2hhcnRlcjEMMAoGA1UECxMDQ1NFMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv6dq6VLIImlAaTrckb5w3X6J\nWP7EGz2ChGAXlkEYto6dPCba0v5+f+8UlMOpeB25XGoai7gdItqNWVFpYsgmndx3\nvTad3ukO1zeElKtw5oHPH2plOaiv/gVJaDa9NTeINj0EtGZs74fCOclAzGFX5vBc\nb08ESWBceRgGjGv3nlij4JzHfqTkCKQz6P6pBivQBfk62rcOkkH5rKoaGltRHROS\nMbkwOhu2hN0KmSYTXRvts0LXnZU4N0l2ms39gmr7UNNNlKYINL2JoTs9dNBc7APD\ndZvlEHd+/FjcLCI8hC3t4g4AbfW0okIBCNG0+oVjqGb2DeONSJKsThahXt89MQID\nAQABo4G0MIGxMB0GA1UdDgQWBBQKq8JxjY1GmeZXJjfOMfW0kBIzPDCBgQYDVR0j\nBHoweIAUCqvCcY2NRpnmVyY3zjH1tJASMzyhVaRTMFExCzAJBgNVBAYTAlVTMREw\nDwYDVQQIEwhDb2xvcmFkbzEPMA0GA1UEBxMGRGVudmVyMRAwDgYDVQQKEwdDaGFy\ndGVyMQwwCgYDVQQLEwNDU0WCCQCefEyVY1OxtTAMBgNVHRMEBTADAQH/MA0GCSqG\nSIb3DQEBBQUAA4IBAQAWifoMk5kbv+yuWXvFwHiB4dWUUmMlUlPU/E300yVTRl58\np6DfOgJs7MMftd1KeWqTO+uW134QlTt7+jwI8Jq0uyKCu/O2kJhVtH/Ryog14tGl\n+wLcuIPLbwJI9CwZX4WMBrq4DnYss+6F47i8NCc+Z3MAiG4vtq9ytBmaod0dj2bI\ng4/Lac0e00dql9RnqENh1+dF0V+QgTJCoPkMqDNAlSB8vOodBW81UAb2z12t+IFi\n3X9J3WtCK2+T5brXL6itzewWJ2ALvX3QpmZx7fMHJ3tE+SjjyivE1BbOlzYHx83t\nTeYnm7pS9un7A/UzTDHbs7hPUezLek+H3xTPAnnq\n-----END CERTIFICATE-----\n"
101+
}
102+
`, randId)
103+
}

0 commit comments

Comments
 (0)