Skip to content

Commit

Permalink
Remove support of neutron-lbaas from lb_l7rule (#1674)
Browse files Browse the repository at this point in the history
  • Loading branch information
nikParasyr committed Mar 5, 2024
1 parent 7422240 commit 023070e
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 159 deletions.
84 changes: 84 additions & 0 deletions openstack/lb_v2_octavia.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,90 @@ import (
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
)

func getListenerIDForL7PolicyOctavia(lbClient *gophercloud.ServiceClient, id string) (string, error) {
log.Printf("[DEBUG] Trying to get Listener ID associated with the %s L7 Policy ID", id)
lbsPages, err := loadbalancers.List(lbClient, loadbalancers.ListOpts{}).AllPages()
if err != nil {
return "", fmt.Errorf("No Load Balancers were found: %s", err)
}

lbs, err := loadbalancers.ExtractLoadBalancers(lbsPages)
if err != nil {
return "", fmt.Errorf("Unable to extract Load Balancers list: %s", err)
}

for _, lb := range lbs {
statuses, err := loadbalancers.GetStatuses(lbClient, lb.ID).Extract()
if err != nil {
return "", fmt.Errorf("Failed to get Load Balancer statuses: %s", err)
}
for _, listener := range statuses.Loadbalancer.Listeners {
for _, l7policy := range listener.L7Policies {
if l7policy.ID == id {
return listener.ID, nil
}
}
}
}

return "", fmt.Errorf("Unable to find Listener ID associated with the %s L7 Policy ID", id)
}

func waitForLBV2L7RuleOctavia(ctx context.Context, lbClient *gophercloud.ServiceClient, parentListener *listeners.Listener, parentL7policy *l7policies.L7Policy, l7rule *l7policies.Rule, target string, pending []string, timeout time.Duration) error {
log.Printf("[DEBUG] Waiting for l7rule %s to become %s.", l7rule.ID, target)

if len(parentListener.Loadbalancers) == 0 {
return fmt.Errorf("Unable to determine loadbalancer ID from listener %s", parentListener.ID)
}

lbID := parentListener.Loadbalancers[0].ID

stateConf := &resource.StateChangeConf{
Target: []string{target},
Pending: pending,
Refresh: resourceLBV2L7RuleRefreshFuncOctavia(lbClient, lbID, parentL7policy.ID, l7rule),
Timeout: timeout,
Delay: 1 * time.Second,
MinTimeout: 1 * time.Second,
}

_, err := stateConf.WaitForStateContext(ctx)
if err != nil {
if _, ok := err.(gophercloud.ErrDefault404); ok {
if target == "DELETED" {
return nil
}
}

return fmt.Errorf("Error waiting for l7rule %s to become %s: %s", l7rule.ID, target, err)
}

return nil
}

func resourceLBV2L7RuleRefreshFuncOctavia(lbClient *gophercloud.ServiceClient, lbID string, l7policyID string, l7rule *l7policies.Rule) resource.StateRefreshFunc {
if l7rule.ProvisioningStatus == "" {
return resourceLBV2LoadBalancerStatusRefreshFuncOctavia(lbClient, lbID, "l7rule", l7rule.ID, l7policyID)
}

return func() (interface{}, string, error) {
lb, status, err := resourceLBV2LoadBalancerRefreshFunc(lbClient, lbID)()
if err != nil {
return lb, status, err
}
if !strSliceContains(getLbSkipStatuses(), status) {
return lb, status, nil
}

l7rule, err := l7policies.GetRule(lbClient, l7policyID, l7rule.ID).Extract()
if err != nil {
return nil, "", err
}

return l7rule, l7rule.ProvisioningStatus, nil
}
}

func resourceLBV2ListenerRefreshFuncOctavia(lbClient *gophercloud.ServiceClient, lbID string, listener *listeners.Listener) resource.StateRefreshFunc {
if listener.ProvisioningStatus == "" {
return resourceLBV2LoadBalancerStatusRefreshFuncOctavia(lbClient, lbID, "listener", listener.ID, "")
Expand Down
139 changes: 0 additions & 139 deletions openstack/lb_v2_shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -1007,145 +1007,6 @@ func resourceLBV2LoadBalancerStatusRefreshFuncNeutron(lbClient *gophercloud.Serv
}
}

func resourceLBV2L7PolicyRefreshFunc(lbClient *gophercloud.ServiceClient, lbID string, l7policy *neutronl7policies.L7Policy) resource.StateRefreshFunc {
if l7policy.ProvisioningStatus != "" {
return func() (interface{}, string, error) {
lb, status, err := resourceLBV2LoadBalancerRefreshFunc(lbClient, lbID)()
if err != nil {
return lb, status, err
}
if !strSliceContains(getLbSkipStatuses(), status) {
return lb, status, nil
}

l7policy, err := neutronl7policies.Get(lbClient, l7policy.ID).Extract()
if err != nil {
return nil, "", err
}

return l7policy, l7policy.ProvisioningStatus, nil
}
}

return resourceLBV2LoadBalancerStatusRefreshFuncNeutron(lbClient, lbID, "l7policy", l7policy.ID, "")
}

func waitForLBV2L7Policy(ctx context.Context, lbClient *gophercloud.ServiceClient, parentListener *neutronlisteners.Listener, l7policy *neutronl7policies.L7Policy, target string, pending []string, timeout time.Duration) error {
log.Printf("[DEBUG] Waiting for l7policy %s to become %s.", l7policy.ID, target)

if len(parentListener.Loadbalancers) == 0 {
return fmt.Errorf("Unable to determine loadbalancer ID from listener %s", parentListener.ID)
}

lbID := parentListener.Loadbalancers[0].ID

stateConf := &resource.StateChangeConf{
Target: []string{target},
Pending: pending,
Refresh: resourceLBV2L7PolicyRefreshFunc(lbClient, lbID, l7policy),
Timeout: timeout,
Delay: 1 * time.Second,
MinTimeout: 1 * time.Second,
}

_, err := stateConf.WaitForStateContext(ctx)
if err != nil {
if _, ok := err.(gophercloud.ErrDefault404); ok {
if target == "DELETED" {
return nil
}
}

return fmt.Errorf("Error waiting for l7policy %s to become %s: %s", l7policy.ID, target, err)
}

return nil
}

func getListenerIDForL7Policy(lbClient *gophercloud.ServiceClient, id string) (string, error) {
log.Printf("[DEBUG] Trying to get Listener ID associated with the %s L7 Policy ID", id)
lbsPages, err := neutronloadbalancers.List(lbClient, neutronloadbalancers.ListOpts{}).AllPages()
if err != nil {
return "", fmt.Errorf("No Load Balancers were found: %s", err)
}

lbs, err := neutronloadbalancers.ExtractLoadBalancers(lbsPages)
if err != nil {
return "", fmt.Errorf("Unable to extract Load Balancers list: %s", err)
}

for _, lb := range lbs {
statuses, err := neutronloadbalancers.GetStatuses(lbClient, lb.ID).Extract()
if err != nil {
return "", fmt.Errorf("Failed to get Load Balancer statuses: %s", err)
}
for _, listener := range statuses.Loadbalancer.Listeners {
for _, l7policy := range listener.L7Policies {
if l7policy.ID == id {
return listener.ID, nil
}
}
}
}

return "", fmt.Errorf("Unable to find Listener ID associated with the %s L7 Policy ID", id)
}

func resourceLBV2L7RuleRefreshFunc(lbClient *gophercloud.ServiceClient, lbID string, l7policyID string, l7rule *neutronl7policies.Rule) resource.StateRefreshFunc {
if l7rule.ProvisioningStatus != "" {
return func() (interface{}, string, error) {
lb, status, err := resourceLBV2LoadBalancerRefreshFunc(lbClient, lbID)()
if err != nil {
return lb, status, err
}
if !strSliceContains(getLbSkipStatuses(), status) {
return lb, status, nil
}

l7rule, err := neutronl7policies.GetRule(lbClient, l7policyID, l7rule.ID).Extract()
if err != nil {
return nil, "", err
}

return l7rule, l7rule.ProvisioningStatus, nil
}
}

return resourceLBV2LoadBalancerStatusRefreshFuncNeutron(lbClient, lbID, "l7rule", l7rule.ID, l7policyID)
}

func waitForLBV2L7Rule(ctx context.Context, lbClient *gophercloud.ServiceClient, parentListener *neutronlisteners.Listener, parentL7policy *neutronl7policies.L7Policy, l7rule *neutronl7policies.Rule, target string, pending []string, timeout time.Duration) error {
log.Printf("[DEBUG] Waiting for l7rule %s to become %s.", l7rule.ID, target)

if len(parentListener.Loadbalancers) == 0 {
return fmt.Errorf("Unable to determine loadbalancer ID from listener %s", parentListener.ID)
}

lbID := parentListener.Loadbalancers[0].ID

stateConf := &resource.StateChangeConf{
Target: []string{target},
Pending: pending,
Refresh: resourceLBV2L7RuleRefreshFunc(lbClient, lbID, parentL7policy.ID, l7rule),
Timeout: timeout,
Delay: 1 * time.Second,
MinTimeout: 1 * time.Second,
}

_, err := stateConf.WaitForStateContext(ctx)
if err != nil {
if _, ok := err.(gophercloud.ErrDefault404); ok {
if target == "DELETED" {
return nil
}
}

return fmt.Errorf("Error waiting for l7rule %s to become %s: %s", l7rule.ID, target, err)
}

return nil
}

func flattenLBPoolPersistenceV2(p neutronpools.SessionPersistence) []map[string]interface{} {
return []map[string]interface{}{
{
Expand Down
2 changes: 1 addition & 1 deletion openstack/resource_openstack_lb_l7policy_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ func resourceL7PolicyV2Import(d *schema.ResourceData, meta interface{}) ([]*sche
d.Set("listener_id", l7Policy.ListenerID)
} else {
// Fallback for the Neutron LBaaSv2 extension
listenerID, err := getListenerIDForL7Policy(lbClient, d.Id())
listenerID, err := getListenerIDForL7PolicyOctavia(lbClient, d.Id())
if err != nil {
return nil, err
}
Expand Down
Loading

0 comments on commit 023070e

Please sign in to comment.