Skip to content

Commit

Permalink
feat(registry): add scaleway_registry_namespace_beta resource (scalew…
Browse files Browse the repository at this point in the history
  • Loading branch information
VoyTechnology authored Feb 5, 2020
1 parent 11f6428 commit a066b56
Show file tree
Hide file tree
Showing 34 changed files with 1,819 additions and 126 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk v1.0.0
github.com/mitchellh/go-homedir v1.1.0
github.com/nicolai86/scaleway-sdk v0.0.0-20181024210327-b20018e944c4
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200114152133-51f964aadcd2
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200130170711-05d27d10a3b8
github.com/stretchr/testify v1.3.0
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/posener/complete v1.2.1 h1:LrvDIY//XNo65Lq84G/akBuMGlawHvGBABv8f/ZN6DI=
github.com/posener/complete v1.2.1/go.mod h1:6gapUrK/U1TAN7ciCoNRIdVC5sbdBTUh1DKN0g6uH7E=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200114152133-51f964aadcd2 h1:JDlvlTHI+2rn0amYbT28bH9eVbbKKRPLyHgZOGu2kLs=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200114152133-51f964aadcd2/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200130170711-05d27d10a3b8 h1:+y+U0MHG110iL4TkTKEb3Wh07OK7ALY2XbNFxeAEb80=
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.5.0.20200130170711-05d27d10a3b8/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8=
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
Expand Down
25 changes: 25 additions & 0 deletions scaleway/helpers_registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package scaleway

import (
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/scaleway/scaleway-sdk-go/api/registry/v1"
"github.com/scaleway/scaleway-sdk-go/scw"
)

// registryNamespaceAPIWithRegion returns a new container registry API and the region.
func registryNamespaceAPIWithRegion(d *schema.ResourceData, m interface{}) (*registry.API, scw.Region, error) {
meta := m.(*Meta)
api := registry.NewAPI(meta.scwClient)

region, err := extractRegion(d, meta)
return api, region, err
}

// registryNamespaceAPIWithRegionAndID returns a new container registry API, region and ID.
func registryNamespaceAPIWithRegionAndID(m interface{}, id string) (*registry.API, scw.Region, string, error) {
meta := m.(*Meta)
api := registry.NewAPI(meta.scwClient)

region, id, err := parseRegionalID(id)
return api, region, id, err
}
1 change: 1 addition & 0 deletions scaleway/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ func Provider() terraform.ResourceProvider {
"scaleway_security_group_rule": resourceScalewaySecurityGroupRule(),
"scaleway_volume": resourceScalewayVolume(),
"scaleway_volume_attachment": resourceScalewayVolumeAttachment(),
"scaleway_registry_namespace_beta": resourceScalewayRegistryNamespaceBeta(),
},

DataSourcesMap: map[string]*schema.Resource{
Expand Down
134 changes: 134 additions & 0 deletions scaleway/resource_registry_namespace_beta.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package scaleway

import (
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/scaleway/scaleway-sdk-go/api/registry/v1"
"github.com/scaleway/scaleway-sdk-go/scw"
)

func resourceScalewayRegistryNamespaceBeta() *schema.Resource {
return &schema.Resource{
Create: resourceScalewayRegistryNamespaceBetaCreate,
Read: resourceScalewayRegistryNamespaceBetaRead,
Update: resourceScalewayRegistryNamespaceBetaUpdate,
Delete: resourceScalewayRegistryNamespaceBetaDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
SchemaVersion: 0,
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "The name of the container registry namespace",
},
"description": {
Type: schema.TypeString,
Optional: true,
Description: "The description of the container registry namespace",
},
"is_public": {
Type: schema.TypeBool,
Optional: true,
Description: "Define the default visibity policy",
},
"endpoint": {
Type: schema.TypeString,
Computed: true,
Description: "The endpoint reachable by docker",
},
"region": regionSchema(),
"organization_id": organizationIDSchema(),
},
}
}

func resourceScalewayRegistryNamespaceBetaCreate(d *schema.ResourceData, m interface{}) error {
api, region, err := registryNamespaceAPIWithRegion(d, m)
if err != nil {
return err
}

ns, err := api.CreateNamespace(&registry.CreateNamespaceRequest{
Region: region,
OrganizationID: d.Get("organization_id").(string),
Name: d.Get("name").(string),
Description: d.Get("description").(string),
IsPublic: d.Get("is_public").(bool),
})
if err != nil {
return err
}

d.SetId(newRegionalId(region, ns.ID))

return resourceScalewayRegistryNamespaceBetaRead(d, m)
}

func resourceScalewayRegistryNamespaceBetaRead(d *schema.ResourceData, m interface{}) error {
api, region, id, err := registryNamespaceAPIWithRegionAndID(m, d.Id())
if err != nil {
return err
}

ns, err := api.GetNamespace(&registry.GetNamespaceRequest{
Region: region,
NamespaceID: id,
})

if err != nil {
if is404Error(err) {
d.SetId("")
return nil
}
return err
}

d.Set("name", ns.Name)
d.Set("description", ns.Description)
d.Set("organization_id", ns.OrganizationID)
d.Set("is_public", ns.IsPublic)
d.Set("endpoint", ns.Endpoint)
d.Set("region", ns.Region)

return nil
}

func resourceScalewayRegistryNamespaceBetaUpdate(d *schema.ResourceData, m interface{}) error {
api, region, id, err := registryNamespaceAPIWithRegionAndID(m, d.Id())
if err != nil {
return err
}

if d.HasChange("description") || d.HasChange("is_public") {
if _, err := api.UpdateNamespace(&registry.UpdateNamespaceRequest{
Region: region,
NamespaceID: id,
Description: scw.StringPtr(d.Get("description").(string)),
IsPublic: scw.BoolPtr(d.Get("is_public").(bool)),
}); err != nil {
return err
}
}

return resourceScalewayRegistryNamespaceBetaRead(d, m)
}

func resourceScalewayRegistryNamespaceBetaDelete(d *schema.ResourceData, m interface{}) error {
api, region, id, err := registryNamespaceAPIWithRegionAndID(m, d.Id())
if err != nil {
return err
}

_, err = api.DeleteNamespace(&registry.DeleteNamespaceRequest{
Region: region,
NamespaceID: id,
})

if err != nil && !is404Error(err) {
return err
}

return nil
}
100 changes: 100 additions & 0 deletions scaleway/resource_registry_namespace_beta_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package scaleway

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/terraform"
"github.com/scaleway/scaleway-sdk-go/api/registry/v1"
)

func TestRegistryNamespaceBeta(t *testing.T) {
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckScalewayRegistryNamespaceBetaDestroy,
Steps: []resource.TestStep{
{
Config: `
resource scaleway_registry_namespace_beta cr01 {
name = "test-cr"
}
`,
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayRegistryNamespaceBetaExists("scaleway_registry_namespace_beta.cr01"),
resource.TestCheckResourceAttr("scaleway_registry_namespace_beta.cr01", "name", "test-cr"),
testCheckResourceAttrUUID("scaleway_registry_namespace_beta.cr01", "id"),
),
},
{
Config: `
resource scaleway_registry_namespace_beta cr01 {
name = "test-cr"
description = "test registry namespace"
is_public = true
}
`,
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayRegistryNamespaceBetaExists("scaleway_registry_namespace_beta.cr01"),
resource.TestCheckResourceAttr("scaleway_registry_namespace_beta.cr01", "description", "test registry namespace"),
resource.TestCheckResourceAttr("scaleway_registry_namespace_beta.cr01", "is_public", "true"),
testCheckResourceAttrUUID("scaleway_registry_namespace_beta.cr01", "id"),
),
},
},
})
}

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

api, region, id, err := registryNamespaceAPIWithRegionAndID(testAccProvider.Meta(), rs.Primary.ID)
if err != nil {
return nil
}

_, err = api.GetNamespace(&registry.GetNamespaceRequest{
NamespaceID: id,
Region: region,
})

if err != nil {
return err
}

return nil
}
}

func testAccCheckScalewayRegistryNamespaceBetaDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "scaleway_registry_namespace_beta" {
continue
}

api, region, id, err := registryNamespaceAPIWithRegionAndID(testAccProvider.Meta(), rs.Primary.ID)
if err != nil {
return err
}

_, err = api.DeleteNamespace(&registry.DeleteNamespaceRequest{
NamespaceID: id,
Region: region,
})

if err == nil {
return fmt.Errorf("namespace (%s) still exists", rs.Primary.ID)
}

if !is404Error(err) {
return err
}
}

return nil
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a066b56

Please sign in to comment.