forked from gophercloud/gophercloud
-
Notifications
You must be signed in to change notification settings - Fork 0
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 QoS DSCP marking rule resource (gophercloud#784)
Add "openstack_networking_qos_dscp_marking_rule_v2" resource with tests and website documentation.
- Loading branch information
1 parent
fc29f83
commit 9028aa4
Showing
7 changed files
with
429 additions
and
0 deletions.
There are no files selected for viewing
31 changes: 31 additions & 0 deletions
31
openstack/import_openstack_networking_qos_dscp_marking_rule_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,31 @@ | ||
package openstack | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform/helper/resource" | ||
) | ||
|
||
func TestAccNetworkingV2QoSDSCPMarkingRule_importBasic(t *testing.T) { | ||
resourceName := "openstack_networking_qos_dscp_marking_rule_v2.dscp_marking_rule_1" | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { | ||
testAccPreCheck(t) | ||
testAccPreCheckAdminOnly(t) | ||
}, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckNetworkingV2QoSDSCPMarkingRuleDestroy, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccNetworkingV2QoSDSCPMarkingRule_basic, | ||
}, | ||
|
||
{ | ||
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
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
177 changes: 177 additions & 0 deletions
177
openstack/resource_openstack_networking_qos_dscp_marking_rule_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,177 @@ | ||
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/qos/rules" | ||
) | ||
|
||
func resourceNetworkingQoSDSCPMarkingRuleV2() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceNetworkingQoSDSCPMarkingRuleV2Create, | ||
Read: resourceNetworkingQoSDSCPMarkingRuleV2Read, | ||
Update: resourceNetworkingQoSDSCPMarkingRuleV2Update, | ||
Delete: resourceNetworkingQoSDSCPMarkingRuleV2Delete, | ||
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, | ||
}, | ||
|
||
"qos_policy_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
}, | ||
|
||
"dscp_mark": { | ||
Type: schema.TypeInt, | ||
Required: true, | ||
ForceNew: false, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceNetworkingQoSDSCPMarkingRuleV2Create(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 := rules.CreateDSCPMarkingRuleOpts{ | ||
DSCPMark: d.Get("dscp_mark").(int), | ||
} | ||
qosPolicyID := d.Get("qos_policy_id").(string) | ||
|
||
log.Printf("[DEBUG] openstack_networking_qos_dscp_marking_rule_v2 create options: %#v", createOpts) | ||
r, err := rules.CreateDSCPMarkingRule(networkingClient, qosPolicyID, createOpts).ExtractDSCPMarkingRule() | ||
if err != nil { | ||
return fmt.Errorf("Error creating openstack_networking_qos_dscp_marking_rule_v2: %s", err) | ||
} | ||
|
||
log.Printf("[DEBUG] Waiting for openstack_networking_qos_dscp_marking_rule_v2 %s to become available.", r.ID) | ||
|
||
stateConf := &resource.StateChangeConf{ | ||
Target: []string{"ACTIVE"}, | ||
Refresh: networkingQoSDSCPMarkingRuleV2StateRefreshFunc(networkingClient, qosPolicyID, r.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_qos_dscp_marking_rule_v2 %s to become available: %s", r.ID, err) | ||
} | ||
|
||
id := resourceNetworkingQoSRuleV2BuildID(qosPolicyID, r.ID) | ||
d.SetId(id) | ||
|
||
log.Printf("[DEBUG] Created openstack_networking_qos_dscp_marking_rule_v2 %s: %#v", id, r) | ||
|
||
return resourceNetworkingQoSDSCPMarkingRuleV2Read(d, meta) | ||
} | ||
|
||
func resourceNetworkingQoSDSCPMarkingRuleV2Read(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) | ||
} | ||
|
||
qosPolicyID, qosRuleID, err := resourceNetworkingQoSRuleV2ParseID(d.Id()) | ||
if err != nil { | ||
return fmt.Errorf("Error reading openstack_networking_qos_dscp_marking_rule_v2 ID %s: %s", d.Id(), err) | ||
} | ||
|
||
r, err := rules.GetDSCPMarkingRule(networkingClient, qosPolicyID, qosRuleID).ExtractDSCPMarkingRule() | ||
if err != nil { | ||
return CheckDeleted(d, err, "Error getting openstack_networking_qos_dscp_marking_rule_v2") | ||
} | ||
|
||
log.Printf("[DEBUG] Retrieved openstack_networking_qos_dscp_marking_rule_v2 %s: %#v", d.Id(), r) | ||
|
||
d.Set("qos_policy_id", qosPolicyID) | ||
d.Set("dscp_mark", r.DSCPMark) | ||
d.Set("region", GetRegion(d, config)) | ||
|
||
return nil | ||
} | ||
|
||
func resourceNetworkingQoSDSCPMarkingRuleV2Update(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) | ||
} | ||
|
||
qosPolicyID, qosRuleID, err := resourceNetworkingQoSRuleV2ParseID(d.Id()) | ||
if err != nil { | ||
return fmt.Errorf("Error reading openstack_networking_qos_dscp_marking_rule_v2 ID %s: %s", d.Id(), err) | ||
} | ||
|
||
if d.HasChange("dscp_mark") { | ||
dscpMark := d.Get("dscp_mark").(int) | ||
updateOpts := rules.UpdateDSCPMarkingRuleOpts{ | ||
DSCPMark: &dscpMark, | ||
} | ||
log.Printf("[DEBUG] openstack_networking_qos_dscp_marking_rule_v2 %s update options: %#v", d.Id(), updateOpts) | ||
_, err = rules.UpdateDSCPMarkingRule(networkingClient, qosPolicyID, qosRuleID, updateOpts).ExtractDSCPMarkingRule() | ||
if err != nil { | ||
return fmt.Errorf("Error updating openstack_networking_qos_dscp_marking_rule_v2 %s: %s", d.Id(), err) | ||
} | ||
} | ||
|
||
return resourceNetworkingQoSDSCPMarkingRuleV2Read(d, meta) | ||
} | ||
|
||
func resourceNetworkingQoSDSCPMarkingRuleV2Delete(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) | ||
} | ||
|
||
qosPolicyID, qosRuleID, err := resourceNetworkingQoSRuleV2ParseID(d.Id()) | ||
if err != nil { | ||
return fmt.Errorf("Error reading openstack_networking_qos_dscp_marking_rule_v2 ID %s: %s", d.Id(), err) | ||
} | ||
|
||
if err := rules.DeleteDSCPMarkingRule(networkingClient, qosPolicyID, qosRuleID).ExtractErr(); err != nil { | ||
return CheckDeleted(d, err, "Error getting openstack_networking_qos_dscp_marking_rule_v2") | ||
} | ||
|
||
stateConf := &resource.StateChangeConf{ | ||
Pending: []string{"ACTIVE"}, | ||
Target: []string{"DELETED"}, | ||
Refresh: networkingQoSDSCPMarkingRuleV2StateRefreshFunc(networkingClient, qosPolicyID, 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_qos_dscp_marking_rule_v2 %s to delete: %s", d.Id(), err) | ||
} | ||
|
||
return nil | ||
} |
143 changes: 143 additions & 0 deletions
143
openstack/resource_openstack_networking_qos_dscp_marking_rule_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,143 @@ | ||
package openstack | ||
|
||
import ( | ||
"fmt" | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/terraform" | ||
|
||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/qos/policies" | ||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/qos/rules" | ||
) | ||
|
||
func TestAccNetworkingV2QoSDSCPMarkingRule_basic(t *testing.T) { | ||
var ( | ||
policy policies.Policy | ||
rule rules.DSCPMarkingRule | ||
) | ||
|
||
resource.Test(t, resource.TestCase{ | ||
PreCheck: func() { | ||
testAccPreCheck(t) | ||
testAccPreCheckAdminOnly(t) | ||
}, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckNetworkingV2QoSDSCPMarkingRuleDestroy, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccNetworkingV2QoSDSCPMarkingRule_basic, | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckNetworkingV2QoSPolicyExists( | ||
"openstack_networking_qos_policy_v2.qos_policy_1", &policy), | ||
resource.TestCheckResourceAttr( | ||
"openstack_networking_qos_policy_v2.qos_policy_1", "name", "qos_policy_1"), | ||
testAccCheckNetworkingV2QoSDSCPMarkingRuleExists( | ||
"openstack_networking_qos_dscp_marking_rule_v2.dscp_marking_rule_1", &rule), | ||
resource.TestCheckResourceAttr( | ||
"openstack_networking_qos_dscp_marking_rule_v2.dscp_marking_rule_1", "dscp_mark", "26"), | ||
), | ||
}, | ||
{ | ||
Config: testAccNetworkingV2QoSDSCPMarkingRule_update, | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckNetworkingV2QoSPolicyExists( | ||
"openstack_networking_qos_policy_v2.qos_policy_1", &policy), | ||
resource.TestCheckResourceAttr( | ||
"openstack_networking_qos_policy_v2.qos_policy_1", "name", "qos_policy_1"), | ||
testAccCheckNetworkingV2QoSDSCPMarkingRuleExists( | ||
"openstack_networking_qos_dscp_marking_rule_v2.dscp_marking_rule_1", &rule), | ||
resource.TestCheckResourceAttr( | ||
"openstack_networking_qos_dscp_marking_rule_v2.dscp_marking_rule_1", "dscp_mark", "20"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccCheckNetworkingV2QoSDSCPMarkingRuleExists(n string, rule *rules.DSCPMarkingRule) 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) | ||
} | ||
|
||
qosPolicyID, qosRuleID, err := resourceNetworkingQoSRuleV2ParseID(rs.Primary.ID) | ||
if err != nil { | ||
return fmt.Errorf("Error reading openstack_networking_qos_dscp_marking_rule_v2 ID %s: %s", rs.Primary.ID, err) | ||
} | ||
|
||
found, err := rules.GetDSCPMarkingRule(networkingClient, qosPolicyID, qosRuleID).ExtractDSCPMarkingRule() | ||
if err != nil { | ||
return err | ||
} | ||
|
||
foundID := resourceNetworkingQoSRuleV2BuildID(qosPolicyID, found.ID) | ||
|
||
if foundID != rs.Primary.ID { | ||
return fmt.Errorf("QoS dscp marking rule not found") | ||
} | ||
|
||
*rule = *found | ||
|
||
return nil | ||
} | ||
} | ||
|
||
func testAccCheckNetworkingV2QoSDSCPMarkingRuleDestroy(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_qos_dscp_marking_rule_v2" { | ||
continue | ||
} | ||
|
||
qosPolicyID, qosRuleID, err := resourceNetworkingQoSRuleV2ParseID(rs.Primary.ID) | ||
if err != nil { | ||
return fmt.Errorf("Error reading openstack_networking_qos_dscp_marking_rule_v2 ID %s: %s", rs.Primary.ID, err) | ||
} | ||
|
||
_, err = rules.GetDSCPMarkingRule(networkingClient, qosPolicyID, qosRuleID).ExtractDSCPMarkingRule() | ||
if err == nil { | ||
return fmt.Errorf("QoS rule still exists") | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
|
||
const testAccNetworkingV2QoSDSCPMarkingRule_basic = ` | ||
resource "openstack_networking_qos_policy_v2" "qos_policy_1" { | ||
name = "qos_policy_1" | ||
} | ||
resource "openstack_networking_qos_dscp_marking_rule_v2" "dscp_marking_rule_1" { | ||
qos_policy_id = "${openstack_networking_qos_policy_v2.qos_policy_1.id}" | ||
dscp_mark = 26 | ||
} | ||
` | ||
|
||
const testAccNetworkingV2QoSDSCPMarkingRule_update = ` | ||
resource "openstack_networking_qos_policy_v2" "qos_policy_1" { | ||
name = "qos_policy_1" | ||
} | ||
resource "openstack_networking_qos_dscp_marking_rule_v2" "dscp_marking_rule_1" { | ||
qos_policy_id = "${openstack_networking_qos_policy_v2.qos_policy_1.id}" | ||
dscp_mark = 20 | ||
} | ||
` |
Oops, something went wrong.