-
Notifications
You must be signed in to change notification settings - Fork 359
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Networking V2: add Address-scope resource (#634)
* Vendor: add "address-scopes" support Add Gophercloud "networking/v2/extensions/layer3/addressscopes" package. * Networking V2: add Address-scope resource Add "openstack_networking_addressscope_v2" resource with acceptance test. * Networking V2: add Address-scope import test Add TestAccNetworkingV2AddressScopeImportBasic() acceptance test. * Networking V2: add Address-scopes docs Add website documentation for the addressscope_v2 resource. * Vendor: sync Gophercloud Use e102249148e2e09eb5efab07b7c3ea74c161e935 commit. * Networking V2 Addr scopes: remove value specs Remove unused value_specs as it won't be used for now. * Vendor: fix address-scopes dependency Fetch only e102249148e2e09eb5efab07b7c3ea74c161e935 commit for Neutron address-scopes extension. * Vendor: remove unversioned address-scopes Run govendor remove on bad dependency. * Networking V2 Addr scopes: fix create Run resourceNetworkingAddressScopeV2Read() after Create method. This commit also removes unnecessary d.SetId("") from the Delete method and renames import test.
- Loading branch information
1 parent
5bf3355
commit 68fb125
Showing
13 changed files
with
964 additions
and
184 deletions.
There are no files selected for viewing
29 changes: 29 additions & 0 deletions
29
openstack/import_openstack_networking_addressscope_v2_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
}, | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
192 changes: 192 additions & 0 deletions
192
openstack/resource_openstack_networking_addressscope_v2.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
106
openstack/resource_openstack_networking_addressscope_v2_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
Oops, something went wrong.