Merge pull request #7045 from drekle/openstack_delete_dynamic_floating_ip

Openstack delete dynamic floating ip in delete cluster
This commit is contained in:
Kubernetes Prow Robot 2019-06-03 06:34:21 -07:00 committed by GitHub
commit d4bf54cb7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 114 additions and 63 deletions

View File

@ -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",

View File

@ -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
}

View File

@ -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,

View File

@ -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,

View File

@ -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
}

View File

@ -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",

View File

@ -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

View File

@ -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()