mirror of https://github.com/kubernetes/kops.git
Merge pull request #7045 from drekle/openstack_delete_dynamic_floating_ip
Openstack delete dynamic floating ip in delete cluster
This commit is contained in:
commit
d4bf54cb7c
|
@ -25,9 +25,8 @@ go_library(
|
|||
"//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/dns/v2/zones:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups:go_default_library",
|
||||
|
|
|
@ -17,11 +17,9 @@ limitations under the License.
|
|||
package openstack
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
|
||||
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
|
||||
"k8s.io/klog"
|
||||
"k8s.io/kops/pkg/resources"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
|
@ -29,15 +27,17 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
typeLB = "LoadBalancer"
|
||||
typeLBL = "LBListener"
|
||||
typeLBP = "LBPool"
|
||||
typeLB = "LoadBalancer"
|
||||
typeLBL = "LBListener"
|
||||
typeLBP = "LBPool"
|
||||
typeLBPM = "LBPoolMonitor"
|
||||
)
|
||||
|
||||
func (os *clusterDiscoveryOS) ListLB() ([]*resources.Resource, error) {
|
||||
func (os *clusterDiscoveryOS) DeleteSubnetLBs(subnet subnets.Subnet) ([]*resources.Resource, error) {
|
||||
var resourceTrackers []*resources.Resource
|
||||
|
||||
opts := loadbalancers.ListOpts{
|
||||
Name: "api." + os.clusterName,
|
||||
VipSubnetID: subnet.ID,
|
||||
}
|
||||
lbs, err := os.osCloud.ListLBs(opts)
|
||||
if err != nil {
|
||||
|
@ -57,25 +57,33 @@ func (os *clusterDiscoveryOS) ListLB() ([]*resources.Resource, error) {
|
|||
},
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func (os *clusterDiscoveryOS) ListLBPools() ([]*resources.Resource, error) {
|
||||
var resourceTrackers []*resources.Resource
|
||||
if os.osCloud.UseOctavia() {
|
||||
klog.V(2).Info("skipping LB Children because using Octavia")
|
||||
continue
|
||||
}
|
||||
|
||||
if os.osCloud.UseOctavia() {
|
||||
klog.V(2).Info("skipping ListLBPools because using Octavia")
|
||||
return nil, nil
|
||||
}
|
||||
//Identify pools associated to this LB
|
||||
for _, pool := range lb.Pools {
|
||||
|
||||
pools, err := os.osCloud.ListPools(v2pools.ListOpts{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
monitorList, err := os.cloud.(openstack.OpenstackCloud).ListMonitors(monitors.ListOpts{
|
||||
PoolID: pool.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, monitor := range monitorList {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: monitor.Name,
|
||||
ID: monitor.ID,
|
||||
Type: typeLBPM,
|
||||
Deleter: func(cloud fi.Cloud, r *resources.Resource) error {
|
||||
return cloud.(openstack.OpenstackCloud).DeleteMonitor(r.ID)
|
||||
},
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
|
||||
for _, pool := range pools {
|
||||
if strings.Contains(pool.Name, os.clusterName) {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: pool.Name,
|
||||
ID: pool.ID,
|
||||
|
@ -86,25 +94,9 @@ func (os *clusterDiscoveryOS) ListLBPools() ([]*resources.Resource, error) {
|
|||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
}
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
||||
func (os *clusterDiscoveryOS) ListLBListener() ([]*resources.Resource, error) {
|
||||
var resourceTrackers []*resources.Resource
|
||||
|
||||
if os.osCloud.UseOctavia() {
|
||||
klog.V(2).Info("skipping ListLBListener because using Octavia")
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
listeners, err := os.osCloud.ListListeners(listeners.ListOpts{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, listener := range listeners {
|
||||
if strings.Contains(listener.Name, os.clusterName) {
|
||||
//Identify listeners associated to this LB
|
||||
for _, listener := range lb.Listeners {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: listener.Name,
|
||||
ID: listener.ID,
|
||||
|
@ -116,5 +108,6 @@ func (os *clusterDiscoveryOS) ListLBListener() ([]*resources.Resource, error) {
|
|||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
}
|
||||
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
|
|
@ -97,6 +97,13 @@ func (os *clusterDiscoveryOS) ListNetwork() ([]*resources.Resource, error) {
|
|||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
//associated load balancers
|
||||
lbTrackers, err := os.DeleteSubnetLBs(subnet)
|
||||
if err != nil {
|
||||
return resourceTrackers, err
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, lbTrackers...)
|
||||
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: subnet.Name,
|
||||
ID: subnet.ID,
|
||||
|
@ -106,7 +113,16 @@ func (os *clusterDiscoveryOS) ListNetwork() ([]*resources.Resource, error) {
|
|||
},
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
|
||||
}
|
||||
|
||||
// Ports
|
||||
portTrackers, err := os.ListPorts(network)
|
||||
if err != nil {
|
||||
return resourceTrackers, err
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, portTrackers...)
|
||||
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: network.Name,
|
||||
ID: network.ID,
|
||||
|
|
|
@ -47,10 +47,6 @@ func ListResources(cloud openstack.OpenstackCloud, clusterName string) (map[stri
|
|||
os.ListInstances,
|
||||
os.ListServerGroups,
|
||||
os.ListVolumes,
|
||||
os.ListLBListener,
|
||||
os.ListLBPools,
|
||||
os.ListLB,
|
||||
os.ListPorts,
|
||||
os.ListSecurityGroups,
|
||||
os.ListNetwork,
|
||||
os.ListDNSRecordsets,
|
||||
|
|
|
@ -17,8 +17,7 @@ limitations under the License.
|
|||
package openstack
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/networks"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
|
||||
"k8s.io/kops/pkg/resources"
|
||||
"k8s.io/kops/upup/pkg/fi"
|
||||
|
@ -29,27 +28,27 @@ const (
|
|||
typePort = "Port"
|
||||
)
|
||||
|
||||
func (os *clusterDiscoveryOS) ListPorts() ([]*resources.Resource, error) {
|
||||
func (os *clusterDiscoveryOS) ListPorts(network networks.Network) ([]*resources.Resource, error) {
|
||||
var resourceTrackers []*resources.Resource
|
||||
|
||||
ports, err := os.osCloud.ListPorts(ports.ListOpts{})
|
||||
ports, err := os.osCloud.ListPorts(ports.ListOpts{
|
||||
TenantID: network.ProjectID,
|
||||
NetworkID: network.ID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, port := range ports {
|
||||
clusteReplaced := strings.Replace(os.clusterName, ".", "-", -1)
|
||||
if strings.HasSuffix(port.Name, clusteReplaced) {
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: port.Name,
|
||||
ID: port.ID,
|
||||
Type: typePort,
|
||||
Deleter: func(cloud fi.Cloud, r *resources.Resource) error {
|
||||
return cloud.(openstack.OpenstackCloud).DeletePort(r.ID)
|
||||
},
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
resourceTracker := &resources.Resource{
|
||||
Name: port.Name,
|
||||
ID: port.ID,
|
||||
Type: typePort,
|
||||
Deleter: func(cloud fi.Cloud, r *resources.Resource) error {
|
||||
return cloud.(openstack.OpenstackCloud).DeletePort(r.ID)
|
||||
},
|
||||
}
|
||||
resourceTrackers = append(resourceTrackers, resourceTracker)
|
||||
}
|
||||
return resourceTrackers, nil
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ go_library(
|
|||
"//vendor/github.com/gophercloud/gophercloud/openstack/dns/v2/zones:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external:go_default_library",
|
||||
"//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips:go_default_library",
|
||||
|
|
|
@ -38,6 +38,7 @@ import (
|
|||
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
|
||||
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
|
||||
l3floatingip "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
|
||||
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers"
|
||||
|
@ -250,6 +251,12 @@ type OpenstackCloud interface {
|
|||
|
||||
ListPools(v2pools.ListOpts) ([]v2pools.Pool, error)
|
||||
|
||||
// ListMonitors will list HealthMonitors matching the provided options
|
||||
ListMonitors(monitors.ListOpts) ([]monitors.Monitor, error)
|
||||
|
||||
// DeleteMonitor will delete a Pool resources Health Monitor
|
||||
DeleteMonitor(monitorID string) error
|
||||
|
||||
// DeletePool will delete loadbalancer pool
|
||||
DeletePool(poolID string) error
|
||||
|
||||
|
|
|
@ -22,11 +22,51 @@ import (
|
|||
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/listeners"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/loadbalancers"
|
||||
"github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/monitors"
|
||||
v2pools "github.com/gophercloud/gophercloud/openstack/loadbalancer/v2/pools"
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
"k8s.io/kops/util/pkg/vfs"
|
||||
)
|
||||
|
||||
func (c *openstackCloud) ListMonitors(opts monitors.ListOpts) (monitorList []monitors.Monitor, err error) {
|
||||
|
||||
done, err := vfs.RetryWithBackoff(readBackoff, func() (bool, error) {
|
||||
allPages, err := monitors.List(c.LoadBalancerClient(), opts).AllPages()
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to list monitors: %s", err)
|
||||
}
|
||||
monitorList, err = monitors.ExtractMonitors(allPages)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to extract monitor pages: %s", err)
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
if !done {
|
||||
if err == nil {
|
||||
err = wait.ErrWaitTimeout
|
||||
}
|
||||
return monitorList, err
|
||||
}
|
||||
return monitorList, nil
|
||||
}
|
||||
|
||||
func (c *openstackCloud) DeleteMonitor(monitorID string) error {
|
||||
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
|
||||
err := monitors.Delete(c.LoadBalancerClient(), monitorID).ExtractErr()
|
||||
if err != nil && !isNotFound(err) {
|
||||
return false, fmt.Errorf("error deleting pool: %v", err)
|
||||
}
|
||||
return true, nil
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
} else if done {
|
||||
return nil
|
||||
} else {
|
||||
return wait.ErrWaitTimeout
|
||||
}
|
||||
}
|
||||
|
||||
func (c *openstackCloud) DeletePool(poolID string) error {
|
||||
done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
|
||||
err := v2pools.Delete(c.LoadBalancerClient(), poolID).ExtractErr()
|
||||
|
|
Loading…
Reference in New Issue