Implement more robust create and delete methods for PFW
This commit is contained in:
@@ -33,7 +33,6 @@ import (
|
|||||||
func flattenPfw(d *schema.ResourceData, pfwFacts string) error {
|
func flattenPfw(d *schema.ResourceData, pfwFacts string) error {
|
||||||
// NOTE: this function modifies ResourceData argument - as such it should never be called
|
// NOTE: this function modifies ResourceData argument - as such it should never be called
|
||||||
// from resourcePfwExists(...) method
|
// from resourcePfwExists(...) method
|
||||||
// log.Debugf("flattenPfw: ready to decode response body from API %s", pfwFacts)
|
|
||||||
pfwRecord := ComputePfwListResp{}
|
pfwRecord := ComputePfwListResp{}
|
||||||
err := json.Unmarshal([]byte(pfwFacts), &pfwRecord)
|
err := json.Unmarshal([]byte(pfwFacts), &pfwRecord)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -44,6 +43,25 @@ func flattenPfw(d *schema.ResourceData, pfwFacts string) error {
|
|||||||
len(pfwRecord.Rules), pfwRecord.Header.VinsID, pfwRecord.Header.VinsID)
|
len(pfwRecord.Rules), pfwRecord.Header.VinsID, pfwRecord.Header.VinsID)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Here it gets a little bit interesting.
|
||||||
|
Unlike compute or disk, port forwaring rules are NOT represented by any cloud
|
||||||
|
platform resource, which might have had a unique ID. They are just a subset of
|
||||||
|
rules in the list maintained by the corresponding ViNS instance. However,
|
||||||
|
Terraform needs a unique ID for each resource it manages so that it could be
|
||||||
|
stored in the state file and retrieved for use.
|
||||||
|
|
||||||
|
Therefore we need to make up an ID and supply it to Terraform in a standard
|
||||||
|
way (i.e. by calling d.SetId(...)).
|
||||||
|
|
||||||
|
Fortunately, a combination of Compute ID and ViNS ID with GW VNF, where this
|
||||||
|
compute is plugged in, makes a unique string, so we use it as an ID for
|
||||||
|
the PFW ruleset.
|
||||||
|
|
||||||
|
The following few lines are legacy from the first attempt to make an ID
|
||||||
|
as a hash of concatenated Compute ID & ViNS ID, but it did not work as
|
||||||
|
expected for a number of reasons, which explanation is not a primary
|
||||||
|
intent of the comment in the source code.
|
||||||
|
|
||||||
combo := fmt.Sprintf("%d:%d", compId.(int), pfwRecord.ViNS.VinsID)
|
combo := fmt.Sprintf("%d:%d", compId.(int), pfwRecord.ViNS.VinsID)
|
||||||
hasher := fnv.New32a()
|
hasher := fnv.New32a()
|
||||||
hasher.Write([]byte(combo))
|
hasher.Write([]byte(combo))
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ func resourceComputeRead(d *schema.ResourceData, m interface{}) error {
|
|||||||
|
|
||||||
compFacts, err := utilityComputeCheckPresence(d, m)
|
compFacts, err := utilityComputeCheckPresence(d, m)
|
||||||
if compFacts == "" {
|
if compFacts == "" {
|
||||||
|
d.SetId("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import (
|
|||||||
func resourcePfwCreate(d *schema.ResourceData, m interface{}) error {
|
func resourcePfwCreate(d *schema.ResourceData, m interface{}) error {
|
||||||
compId := d.Get("compute_id")
|
compId := d.Get("compute_id")
|
||||||
|
|
||||||
rules_set, ok := d.GetOk("rules")
|
rules_set, ok := d.GetOk("rule")
|
||||||
if !ok || rules_set.(*schema.Set).Len() == 0 {
|
if !ok || rules_set.(*schema.Set).Len() == 0 {
|
||||||
log.Debugf("resourcePfwCreate: empty new PFW rules set requested for compute ID %d - nothing to create", compId.(int))
|
log.Debugf("resourcePfwCreate: empty new PFW rules set requested for compute ID %d - nothing to create", compId.(int))
|
||||||
return nil
|
return nil
|
||||||
@@ -74,7 +74,7 @@ func resourcePfwCreate(d *schema.ResourceData, m interface{}) error {
|
|||||||
return lastSavedError
|
return lastSavedError
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return resourcePfwRead(d, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourcePfwRead(d *schema.ResourceData, m interface{}) error {
|
func resourcePfwRead(d *schema.ResourceData, m interface{}) error {
|
||||||
@@ -94,14 +94,16 @@ func resourcePfwUpdate(d *schema.ResourceData, m interface{}) error {
|
|||||||
// TODO: update not implemented yet
|
// TODO: update not implemented yet
|
||||||
compId := d.Get("compute_id")
|
compId := d.Get("compute_id")
|
||||||
return fmt.Errorf("resourcePfwUpdate: method is not implemented yet (Compute ID %d)", compId.(int))
|
return fmt.Errorf("resourcePfwUpdate: method is not implemented yet (Compute ID %d)", compId.(int))
|
||||||
|
|
||||||
|
// return resourcePfwRead(d, m)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourcePfwDelete(d *schema.ResourceData, m interface{}) error {
|
func resourcePfwDelete(d *schema.ResourceData, m interface{}) error {
|
||||||
compId := d.Get("compute_id")
|
compId := d.Get("compute_id")
|
||||||
|
|
||||||
rules_set, ok := d.GetOk("rules")
|
rules_set, ok := d.GetOk("rule")
|
||||||
if !ok || rules_set.(*schema.Set).Len() == 0 {
|
if !ok || rules_set.(*schema.Set).Len() == 0 {
|
||||||
log.Debugf("resourcePfwCreate: no PFW rules defined for compute ID %d - nothing to delete", compId.(int))
|
log.Debugf("resourcePfwDelete: no PFW rules defined for compute ID %d - nothing to delete", compId.(int))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,16 +118,16 @@ func resourcePfwDelete(d *schema.ResourceData, m interface{}) error {
|
|||||||
rule := runner.(map[string]interface{})
|
rule := runner.(map[string]interface{})
|
||||||
params := &url.Values{}
|
params := &url.Values{}
|
||||||
params.Add("computeId", fmt.Sprintf("%d", compId.(int)))
|
params.Add("computeId", fmt.Sprintf("%d", compId.(int)))
|
||||||
params.Add("ruleId", fmt.Sprintf("%d", rule["id"].(int)))
|
params.Add("ruleId", fmt.Sprintf("%d", rule["rule_id"].(int)))
|
||||||
log.Debugf("resourcePfwCreate: ready to delete rule ID%s (%d:%d -> %d %s) from Compute ID %d",
|
log.Debugf("resourcePfwCreate: ready to delete rule ID%s (%d:%d -> %d %s) from Compute ID %d",
|
||||||
rule["id"].(int),
|
rule["rule_id"].(int),
|
||||||
rule["pub_port_start"].(int),rule["pub_port_end"].(int),
|
rule["pub_port_start"].(int),rule["pub_port_end"].(int),
|
||||||
rule["local_port"].(int), rule["proto"].(string),
|
rule["local_port"].(int), rule["proto"].(string),
|
||||||
compId.(int))
|
compId.(int))
|
||||||
_, err, _ := controller.decortAPICall("POST", ComputePfwDelAPI, params)
|
_, err, _ := controller.decortAPICall("POST", ComputePfwDelAPI, params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("resourcePfwDelete: error deleting rule ID %d (%d:%d -> %d %s) from Compute ID %d: %s",
|
log.Errorf("resourcePfwDelete: error deleting rule ID %d (%d:%d -> %d %s) from Compute ID %d: %s",
|
||||||
rule["id"].(int),
|
rule["rule_id"].(int),
|
||||||
rule["pub_port_start"].(int),rule["pub_port_end"].(int),
|
rule["pub_port_start"].(int),rule["pub_port_end"].(int),
|
||||||
rule["local_port"].(int), rule["proto"].(string),
|
rule["local_port"].(int), rule["proto"].(string),
|
||||||
compId.(int),
|
compId.(int),
|
||||||
|
|||||||
Reference in New Issue
Block a user