From b95828a4e6e0ac69851abb14c74c6ffca1db966b Mon Sep 17 00:00:00 2001 From: Marin Salinas Date: Tue, 4 Feb 2020 16:10:34 -0600 Subject: [PATCH] feat: add regex to validate the resource id when import snapshots --- go.sum | 9 ++++ mongodbatlas/provider_test.go | 27 ++++++++++++ ...ce_mongodbatlas_cloud_provider_snapshot.go | 41 ++++++++++++------- ...ngodbatlas_cloud_provider_snapshot_test.go | 26 ++++++++++++ mongodbatlas/resource_mongodbatlas_cluster.go | 3 ++ 5 files changed, 91 insertions(+), 15 deletions(-) diff --git a/go.sum b/go.sum index 26b2c5d34b..c1cf53ff12 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,7 @@ github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wK github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -203,9 +204,11 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -268,6 +271,7 @@ github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI= @@ -281,6 +285,7 @@ github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhg github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/uuid v1.2.0 h1:6TFY4nxn5XwBx0gDfzbEMCNT6k4N/4FNIuN8RACZ0KI= github.com/satori/uuid v1.2.0/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -327,13 +332,16 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d/go.mod h1:BSTlc8jOjh0niykqEGVXOLXdi9o0r0kR8tCYiMvjFgw= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/terraform-providers/terraform-provider-aws v1.9.0 h1:qVNAfabuXWQOnV6JLFu7XEVU085lQSF5RTZTr1hV2+4= github.com/terraform-providers/terraform-provider-aws v1.9.0/go.mod h1:uvqaeKnm2ydZ2LuKuW1NDNBu6heC/7IDGXWm36/6oKs= github.com/terraform-providers/terraform-provider-openstack v1.15.0/go.mod h1:2aQ6n/BtChAl1y2S60vebhyJyZXBsuAI5G4+lHrT1Ew= +github.com/terraform-providers/terraform-provider-template v1.0.0 h1:g2pyFaAJu369iAb7qGWmVwtQ15/35lRAfW91Je8wLjE= github.com/terraform-providers/terraform-provider-template v1.0.0/go.mod h1:/J+B8me5DCMa0rEBH5ic2aKPjhtpWNeScmxFJWxB1EU= +github.com/terraform-providers/terraform-provider-tls v1.2.0 h1:wcD0InKzNh8fanUYQwim62WCd4toeD9WJnPw/RjBI4o= github.com/terraform-providers/terraform-provider-tls v1.2.0/go.mod h1:Mxe/v5u31LDW4m32O1z6Ursdh95dpc9Puq6otkYg7tU= github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v0.0.0-20180813092308-00b869d2f4a5/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= @@ -452,6 +460,7 @@ google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3 google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/mongodbatlas/provider_test.go b/mongodbatlas/provider_test.go index 16d9721282..5cfd30b9ac 100644 --- a/mongodbatlas/provider_test.go +++ b/mongodbatlas/provider_test.go @@ -4,6 +4,7 @@ import ( "os" "testing" + "github.com/go-test/deep" "github.com/terraform-providers/terraform-provider-aws/aws" "github.com/hashicorp/terraform/helper/schema" @@ -75,3 +76,29 @@ func checkAwsEnv(t *testing.T) { t.Fatal("`AWS_ACCESS_KEY_ID`, `AWS_VPC_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_CUSTOMER_MASTER_KEY_ID` must be set for acceptance testing") } } + +func TestEncodeDecodeID(t *testing.T) { + expected := map[string]string{ + "project_id": "5cf5a45a9ccf6400e60981b6", + "cluster_name": "test-acc-q4y272zo9y", + "snapshot_id": "5e42e646553855a5aee40138", + } + + got := decodeStateID(encodeStateID(expected)) + + if diff := deep.Equal(expected, got); diff != nil { + t.Fatalf("Bad testEncodeDecodeID return \n got = %#v\nwant = %#v \ndiff = %#v", expected, got, diff) + } +} + +func TestDecodeID(t *testing.T) { + expected := "Y2x1c3Rlcl9uYW1l:dGVzdC1hY2MtcTR5Mjcyem85eQ==-c25hcHNob3RfaWQ=:NWU0MmU2NDY1NTM4NTVhNWFlZTQwMTM4-cHJvamVjdF9pZA==:NWNmNWE0NWE5Y2NmNjQwMGU2MDk4MWI2" + expected2 := "c25hcHNob3RfaWQ=:NWU0MmU2NDY1NTM4NTVhNWFlZTQwMTM4-cHJvamVjdF9pZA==:NWNmNWE0NWE5Y2NmNjQwMGU2MDk4MWI2-Y2x1c3Rlcl9uYW1l:dGVzdC1hY2MtcTR5Mjcyem85eQ==" + + got := decodeStateID(expected) + got2 := decodeStateID(expected2) + + if diff := deep.Equal(got, got2); diff != nil { + t.Fatalf("Bad TestDecodeID return \n got = %#v\nwant = %#v \ndiff = %#v", got, got2, diff) + } +} diff --git a/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot.go b/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot.go index be493514f4..b33d7df374 100644 --- a/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot.go +++ b/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot.go @@ -5,7 +5,7 @@ import ( "errors" "fmt" "log" - "strings" + "regexp" "time" "github.com/hashicorp/terraform/helper/resource" @@ -166,10 +166,11 @@ func resourceMongoDBAtlasCloudProviderSnapshotCreate(d *schema.ResourceData, met } d.SetId(encodeStateID(map[string]string{ - "snapshot_id": snapshot.ID, "project_id": d.Get("project_id").(string), "cluster_name": d.Get("cluster_name").(string), + "snapshot_id": snapshot.ID, })) + return resourceMongoDBAtlasCloudProviderSnapshotRead(d, meta) } @@ -217,15 +218,9 @@ func resourceCloudProviderSnapshotRefreshFunc(requestParameters *matlas.Snapshot func resourceMongoDBAtlasCloudProviderSnapshotImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { conn := meta.(*matlas.Client) - parts := strings.SplitN(d.Id(), "-", 3) - if len(parts) != 3 { - return nil, errors.New("import format error: to import a snapshot, use the format {project_id}-{cluster_name}-{snapshot_id}") - } - - requestParameters := &matlas.SnapshotReqPathParameters{ - GroupID: parts[0], - ClusterName: parts[1], - SnapshotID: parts[2], + requestParameters, err := splitSnapshotImportID(d.Id()) + if err != nil { + return nil, err } u, _, err := conn.CloudProviderSnapshots.GetOneCloudProviderSnapshot(context.Background(), requestParameters) @@ -234,20 +229,36 @@ func resourceMongoDBAtlasCloudProviderSnapshotImportState(d *schema.ResourceData } d.SetId(encodeStateID(map[string]string{ - "snapshot_id": requestParameters.SnapshotID, "project_id": requestParameters.GroupID, "cluster_name": requestParameters.ClusterName, + "snapshot_id": requestParameters.SnapshotID, })) if err := d.Set("project_id", requestParameters.GroupID); err != nil { - log.Printf("[WARN] Error setting project_id for (%s): %s", d.Id(), err) + log.Printf("[WARN] Error setting project_id for (%s): %s", requestParameters.SnapshotID, err) } if err := d.Set("cluster_name", requestParameters.ClusterName); err != nil { - log.Printf("[WARN] Error setting cluster_name for (%s): %s", d.Id(), err) + log.Printf("[WARN] Error setting cluster_name for (%s): %s", requestParameters.SnapshotID, err) } if err := d.Set("description", u.Description); err != nil { - log.Printf("[WARN] Error setting description for (%s): %s", d.Id(), err) + log.Printf("[WARN] Error setting description for (%s): %s", requestParameters.SnapshotID, err) } return []*schema.ResourceData{d}, nil } + +func splitSnapshotImportID(ID string) (*matlas.SnapshotReqPathParameters, error) { + var re = regexp.MustCompile(`(?s)^([0-9a-fA-F]{24})-(.*)-([0-9a-fA-F]{24})$`) + + parts := re.FindStringSubmatch(ID) + + if len(parts) != 4 { + return nil, errors.New("import format error: to import a snapshot, use the format {project_id}-{cluster_name}-{snapshot_id}") + } + + return &matlas.SnapshotReqPathParameters{ + GroupID: parts[1], + ClusterName: parts[2], + SnapshotID: parts[3], + }, nil +} diff --git a/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot_test.go b/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot_test.go index f767a2a529..9b6f11bd45 100644 --- a/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot_test.go +++ b/mongodbatlas/resource_mongodbatlas_cloud_provider_snapshot_test.go @@ -7,6 +7,7 @@ import ( "os" "testing" + "github.com/go-test/deep" "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" @@ -138,6 +139,9 @@ func testAccCheckMongoDBAtlasCloudProviderSnapshotImportStateIDFunc(resourceName if !ok { return "", fmt.Errorf("Not found: %s", resourceName) } + + log.Printf("%s-%s-%s", rs.Primary.Attributes["project_id"], rs.Primary.Attributes["cluster_name"], rs.Primary.Attributes["snapshot_id"]) + return fmt.Sprintf("%s-%s-%s", rs.Primary.Attributes["project_id"], rs.Primary.Attributes["cluster_name"], rs.Primary.Attributes["snapshot_id"]), nil } } @@ -166,3 +170,25 @@ func testAccMongoDBAtlasCloudProviderSnapshotConfig(projectID, clusterName, desc } `, projectID, clusterName, description, retentionInDays) } + +func TestResourceMongoDBAtlasCloudProviderSnapshot_snapshotID(t *testing.T) { + got, err := splitSnapshotImportID("5cf5a45a9ccf6400e60981b6-projectname-environment-mongo-global-cluster-5cf5a45a9ccf6400e60981b7") + if err != nil { + t.Errorf("splitSnapshotImportID returned error(%s), expected error=nil", err) + } + + expected := &matlas.SnapshotReqPathParameters{ + GroupID: "5cf5a45a9ccf6400e60981b6", + ClusterName: "projectname-environment-mongo-global-cluster", + SnapshotID: "5cf5a45a9ccf6400e60981b7", + } + + if diff := deep.Equal(expected, got); diff != nil { + t.Errorf("Bad splitSnapshotImportID return \n got = %#v\nwant = %#v \ndiff = %#v", expected, *got, diff) + } + + if _, err := splitSnapshotImportID("5cf5a45a9ccf6400e60981b6projectname-environment-mongo-global-cluster5cf5a45a9ccf6400e60981b7"); err == nil { + t.Error("splitSnapshotImportID expected to have error") + } + +} diff --git a/mongodbatlas/resource_mongodbatlas_cluster.go b/mongodbatlas/resource_mongodbatlas_cluster.go index db10f5fbbd..86d02a75ef 100644 --- a/mongodbatlas/resource_mongodbatlas_cluster.go +++ b/mongodbatlas/resource_mongodbatlas_cluster.go @@ -55,6 +55,7 @@ func resourceMongoDBAtlasCluster() *schema.Resource { "auto_scaling_disk_gb_enabled": { Type: schema.TypeBool, Optional: true, + Computed: true, }, "backup_enabled": { Type: schema.TypeBool, @@ -508,6 +509,8 @@ func resourceMongoDBAtlasClusterRead(d *schema.ResourceData, meta interface{}) e return fmt.Errorf(errorClusterRead, clusterName, err) } + log.Printf("[DEBUG] GET Cluster %+v", cluster) + if err := d.Set("cluster_id", cluster.ID); err != nil { return fmt.Errorf(errorClusterSetting, "cluster_id", clusterName, err) }