Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Networking V2: add Address-scope resource #634

Merged
merged 9 commits into from
Jan 24, 2019
29 changes: 29 additions & 0 deletions openstack/import_openstack_networking_addressscope_v2_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package openstack

import (
"testing"

"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
)

func TestAccNetworkingV2AddressScopeImport_basic(t *testing.T) {
resourceName := "openstack_networking_addressscope_v2.addressscope_1"
name := acctest.RandomWithPrefix("tf-acc-addrscope")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckNetworkingV2AddressScopeDestroy,
Steps: []resource.TestStep{
{
Config: testAccNetworkingV2AddressScopeBasic(name),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}
22 changes: 22 additions & 0 deletions openstack/networking_addressscope_v2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package openstack

import (
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/addressscopes"
"github.com/hashicorp/terraform/helper/resource"
)

func resourceNetworkingAddressScopeV2StateRefreshFunc(client *gophercloud.ServiceClient, id string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
a, err := addressscopes.Get(client, id).Extract()
if err != nil {
if _, ok := err.(gophercloud.ErrDefault404); ok {
return a, "DELETED", nil
}

return nil, "", err
}

return a, "ACTIVE", nil
}
}
1 change: 1 addition & 0 deletions openstack/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,7 @@ func Provider() terraform.ResourceProvider {
"openstack_networking_subnet_v2": resourceNetworkingSubnetV2(),
"openstack_networking_subnet_route_v2": resourceNetworkingSubnetRouteV2(),
"openstack_networking_subnetpool_v2": resourceNetworkingSubnetPoolV2(),
"openstack_networking_addressscope_v2": resourceNetworkingAddressScopeV2(),
"openstack_networking_trunk_v2": resourceNetworkingTrunkV2(),
"openstack_objectstorage_container_v1": resourceObjectStorageContainerV1(),
"openstack_objectstorage_object_v1": resourceObjectStorageObjectV1(),
Expand Down
192 changes: 192 additions & 0 deletions openstack/resource_openstack_networking_addressscope_v2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,192 @@
package openstack

import (
"fmt"
"log"
"time"

"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/helper/schema"

"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/addressscopes"
)

func resourceNetworkingAddressScopeV2() *schema.Resource {
return &schema.Resource{
Create: resourceNetworkingAddressScopeV2Create,
Read: resourceNetworkingAddressScopeV2Read,
Update: resourceNetworkingAddressScopeV2Update,
Delete: resourceNetworkingAddressScopeV2Delete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Delete: schema.DefaultTimeout(10 * time.Minute),
},

Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},

"name": {
Type: schema.TypeString,
Required: true,
ForceNew: false,
},

"ip_version": {
Type: schema.TypeInt,
Optional: true,
Default: 4,
ForceNew: true,
},

"shared": {
Type: schema.TypeBool,
Optional: true,
ForceNew: false,
Computed: true,
},

"project_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Computed: true,
},
},
}
}

func resourceNetworkingAddressScopeV2Create(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
networkingClient, err := config.networkingV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

createOpts := addressscopes.CreateOpts{
Name: d.Get("name").(string),
ProjectID: d.Get("project_id").(string),
IPVersion: d.Get("ip_version").(int),
Shared: d.Get("shared").(bool),
}

log.Printf("[DEBUG] openstack_networking_addressscope_v2 create options: %#v", createOpts)
a, err := addressscopes.Create(networkingClient, createOpts).Extract()
if err != nil {
return fmt.Errorf("Error creating openstack_networking_addressscope_v2: %s", err)
}

log.Printf("[DEBUG] Waiting for openstack_networking_addressscope_v2 %s to become available", a.ID)

stateConf := &resource.StateChangeConf{
Target: []string{"ACTIVE"},
Refresh: resourceNetworkingAddressScopeV2StateRefreshFunc(networkingClient, a.ID),
Timeout: d.Timeout(schema.TimeoutCreate),
Delay: 5 * time.Second,
MinTimeout: 3 * time.Second,
}

_, err = stateConf.WaitForState()
if err != nil {
return fmt.Errorf("Error waiting for openstack_networking_addressscope_v2 %s to become available: %s", a.ID, err)
}

d.SetId(a.ID)

log.Printf("[DEBUG] Created openstack_networking_addressscope_v2 %s: %#v", a.ID, a)
return resourceNetworkingAddressScopeV2Read(d, meta)
}

func resourceNetworkingAddressScopeV2Read(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
networkingClient, err := config.networkingV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

a, err := addressscopes.Get(networkingClient, d.Id()).Extract()
if err != nil {
return CheckDeleted(d, err, "Error getting openstack_networking_addressscope_v2")
}

log.Printf("[DEBUG] Retrieved openstack_networking_addressscope_v2 %s: %#v", d.Id(), a)

d.Set("region", GetRegion(d, config))
d.Set("name", a.Name)
d.Set("project_id", a.ProjectID)
d.Set("ip_version", a.IPVersion)
d.Set("shared", a.Shared)

return nil
}

func resourceNetworkingAddressScopeV2Update(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
networkingClient, err := config.networkingV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

var (
hasChange bool
updateOpts addressscopes.UpdateOpts
)

if d.HasChange("name") {
hasChange = true
v := d.Get("name").(string)
updateOpts.Name = &v
}

if d.HasChange("shared") {
hasChange = true
v := d.Get("shared").(bool)
updateOpts.Shared = &v
}

if hasChange {
log.Printf("[DEBUG] openstack_networking_addressscope_v2 %s update options: %#v", d.Id(), updateOpts)
_, err = addressscopes.Update(networkingClient, d.Id(), updateOpts).Extract()
if err != nil {
return fmt.Errorf("Error updating openstack_networking_addressscope_v2 %s: %s", d.Id(), err)
}
}

return resourceNetworkingAddressScopeV2Read(d, meta)
}

func resourceNetworkingAddressScopeV2Delete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
networkingClient, err := config.networkingV2Client(GetRegion(d, config))
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

if err := addressscopes.Delete(networkingClient, d.Id()).ExtractErr(); err != nil {
return CheckDeleted(d, err, "Error deleting openstack_networking_addressscope_v2")
}

stateConf := &resource.StateChangeConf{
Pending: []string{"ACTIVE"},
Target: []string{"DELETED"},
Refresh: resourceNetworkingAddressScopeV2StateRefreshFunc(networkingClient, d.Id()),
Timeout: d.Timeout(schema.TimeoutDelete),
Delay: 5 * time.Second,
MinTimeout: 3 * time.Second,
}

_, err = stateConf.WaitForState()
if err != nil {
return fmt.Errorf("Error waiting for openstack_networking_addressscope_v2 %s to delete: %s", d.Id(), err)
}

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

import (
"fmt"
"testing"

"github.com/hashicorp/terraform/helper/acctest"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"

"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/addressscopes"
)

func TestAccNetworkingV2AddressScope_basic(t *testing.T) {
var addressScope addressscopes.AddressScope

name := acctest.RandomWithPrefix("tf-acc-addrscope")
newName := acctest.RandomWithPrefix("tf-acc-addrscope")

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testAccCheckNetworkingV2AddressScopeDestroy,
Steps: []resource.TestStep{
{
Config: testAccNetworkingV2AddressScopeBasic(name),
Check: resource.ComposeTestCheckFunc(
testAccCheckNetworkingV2AddressScopeExists("openstack_networking_addressscope_v2.addressscope_1", &addressScope),
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "name", name),
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "ip_version", "4"),
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "shared", "false"),
),
},
{
Config: testAccNetworkingV2AddressScopeBasic(newName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "name", newName),
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "ip_version", "4"),
resource.TestCheckResourceAttr("openstack_networking_addressscope_v2.addressscope_1", "shared", "false"),
),
},
},
})
}

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

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

config := testAccProvider.Meta().(*Config)
networkingClient, err := config.networkingV2Client(OS_REGION_NAME)
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

found, err := addressscopes.Get(networkingClient, rs.Primary.ID).Extract()
if err != nil {
return err
}

if found.ID != rs.Primary.ID {
return fmt.Errorf("Address-scope not found")
}

*addressScope = *found

return nil
}
}

func testAccCheckNetworkingV2AddressScopeDestroy(s *terraform.State) error {
config := testAccProvider.Meta().(*Config)
networkingClient, err := config.networkingV2Client(OS_REGION_NAME)
if err != nil {
return fmt.Errorf("Error creating OpenStack networking client: %s", err)
}

for _, rs := range s.RootModule().Resources {
if rs.Type != "openstack_networking_addressscope_v2" {
continue
}

_, err := addressscopes.Get(networkingClient, rs.Primary.ID).Extract()
if err == nil {
return fmt.Errorf("Address-scope still exists")
}
}

return nil
}

func testAccNetworkingV2AddressScopeBasic(name string) string {
return fmt.Sprintf(`
resource "openstack_networking_addressscope_v2" "addressscope_1" {
name = "%s"
ip_version = 4
}
`, name)
}
Loading