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

Remove support of neutron-lbaas from lb_l7rule #1674

Merged
merged 1 commit into from
Mar 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading