mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Merge pull request #46979 from shashidharatd/fed-cleanup-cp-resource
Automatic merge from submit-queue (batch tested with PRs 46979, 47078, 47138, 46916) [federation][e2e] Fix cleanupServiceShardLoadBalancer **What this PR does / why we need it**: Fixes the issue mentioned in #46976 **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes #46976 **Special notes for your reviewer**: ```release-note NONE ```
This commit is contained in:
commit
6bc4006d23
@ -1300,9 +1300,17 @@ func VerifyServeHostnameServiceDown(c clientset.Interface, host string, serviceI
|
|||||||
return fmt.Errorf("waiting for service to be down timed out")
|
return fmt.Errorf("waiting for service to be down timed out")
|
||||||
}
|
}
|
||||||
|
|
||||||
func CleanupServiceGCEResources(loadBalancerName string) {
|
func CleanupServiceResources(loadBalancerName, zone string) {
|
||||||
|
if TestContext.Provider == "gce" || TestContext.Provider == "gke" {
|
||||||
|
CleanupServiceGCEResources(loadBalancerName, zone)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: we need to add this function with other cloud providers, if there is a need.
|
||||||
|
}
|
||||||
|
|
||||||
|
func CleanupServiceGCEResources(loadBalancerName, zone string) {
|
||||||
if pollErr := wait.Poll(5*time.Second, LoadBalancerCleanupTimeout, func() (bool, error) {
|
if pollErr := wait.Poll(5*time.Second, LoadBalancerCleanupTimeout, func() (bool, error) {
|
||||||
if err := CleanupGCEResources(loadBalancerName); err != nil {
|
if err := CleanupGCEResources(loadBalancerName, zone); err != nil {
|
||||||
Logf("Still waiting for glbc to cleanup: %v", err)
|
Logf("Still waiting for glbc to cleanup: %v", err)
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
@ -5158,21 +5158,25 @@ func (p *E2ETestNodePreparer) CleanupNodes() error {
|
|||||||
// CleanupGCEResources cleans up GCE Service Type=LoadBalancer resources with
|
// CleanupGCEResources cleans up GCE Service Type=LoadBalancer resources with
|
||||||
// the given name. The name is usually the UUID of the Service prefixed with an
|
// the given name. The name is usually the UUID of the Service prefixed with an
|
||||||
// alpha-numeric character ('a') to work around cloudprovider rules.
|
// alpha-numeric character ('a') to work around cloudprovider rules.
|
||||||
func CleanupGCEResources(loadBalancerName string) (retErr error) {
|
func CleanupGCEResources(loadBalancerName, zone string) (retErr error) {
|
||||||
gceCloud, err := GetGCECloud()
|
gceCloud, err := GetGCECloud()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
region, err := gcecloud.GetGCERegion(zone)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error parsing GCE/GKE region from zone %q: %v", zone, err)
|
||||||
|
}
|
||||||
if err := gceCloud.DeleteFirewall(loadBalancerName); err != nil &&
|
if err := gceCloud.DeleteFirewall(loadBalancerName); err != nil &&
|
||||||
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
||||||
retErr = err
|
retErr = err
|
||||||
}
|
}
|
||||||
if err := gceCloud.DeleteRegionForwardingRule(loadBalancerName, gceCloud.Region()); err != nil &&
|
if err := gceCloud.DeleteRegionForwardingRule(loadBalancerName, region); err != nil &&
|
||||||
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
||||||
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
||||||
|
|
||||||
}
|
}
|
||||||
if err := gceCloud.DeleteRegionAddress(loadBalancerName, gceCloud.Region()); err != nil &&
|
if err := gceCloud.DeleteRegionAddress(loadBalancerName, region); err != nil &&
|
||||||
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
||||||
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
||||||
}
|
}
|
||||||
@ -5185,7 +5189,7 @@ func CleanupGCEResources(loadBalancerName string) (retErr error) {
|
|||||||
if hc != nil {
|
if hc != nil {
|
||||||
hcNames = append(hcNames, hc.Name)
|
hcNames = append(hcNames, hc.Name)
|
||||||
}
|
}
|
||||||
if err := gceCloud.DeleteExternalTargetPoolAndChecks(loadBalancerName, gceCloud.Region(), hcNames...); err != nil &&
|
if err := gceCloud.DeleteExternalTargetPoolAndChecks(loadBalancerName, region, hcNames...); err != nil &&
|
||||||
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
!IsGoogleAPIHTTPErrorCode(err, http.StatusNotFound) {
|
||||||
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
retErr = fmt.Errorf("%v\n%v", retErr, err)
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ var _ = framework.KubeDescribe("Services", func() {
|
|||||||
}
|
}
|
||||||
for _, lb := range serviceLBNames {
|
for _, lb := range serviceLBNames {
|
||||||
framework.Logf("cleaning gce resource for %s", lb)
|
framework.Logf("cleaning gce resource for %s", lb)
|
||||||
framework.CleanupServiceGCEResources(lb)
|
framework.CleanupServiceGCEResources(lb, framework.TestContext.CloudConfig.Zone)
|
||||||
}
|
}
|
||||||
//reset serviceLBNames
|
//reset serviceLBNames
|
||||||
serviceLBNames = []string{}
|
serviceLBNames = []string{}
|
||||||
@ -1266,7 +1266,7 @@ var _ = framework.KubeDescribe("ESIPP [Slow]", func() {
|
|||||||
}
|
}
|
||||||
for _, lb := range serviceLBNames {
|
for _, lb := range serviceLBNames {
|
||||||
framework.Logf("cleaning gce resource for %s", lb)
|
framework.Logf("cleaning gce resource for %s", lb)
|
||||||
framework.CleanupServiceGCEResources(lb)
|
framework.CleanupServiceGCEResources(lb, framework.TestContext.CloudConfig.Zone)
|
||||||
}
|
}
|
||||||
//reset serviceLBNames
|
//reset serviceLBNames
|
||||||
serviceLBNames = []string{}
|
serviceLBNames = []string{}
|
||||||
|
@ -35,6 +35,7 @@ go_library(
|
|||||||
"//pkg/api/v1:go_default_library",
|
"//pkg/api/v1:go_default_library",
|
||||||
"//pkg/apis/extensions/v1beta1:go_default_library",
|
"//pkg/apis/extensions/v1beta1:go_default_library",
|
||||||
"//pkg/client/clientset_generated/clientset:go_default_library",
|
"//pkg/client/clientset_generated/clientset:go_default_library",
|
||||||
|
"//pkg/cloudprovider:go_default_library",
|
||||||
"//test/e2e/chaosmonkey:go_default_library",
|
"//test/e2e/chaosmonkey:go_default_library",
|
||||||
"//test/e2e/common:go_default_library",
|
"//test/e2e/common:go_default_library",
|
||||||
"//test/e2e/framework:go_default_library",
|
"//test/e2e/framework:go_default_library",
|
||||||
|
@ -18,6 +18,7 @@ package framework
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
@ -231,3 +232,9 @@ func restConfigForCluster(clusterConf *clusterConfig) *restclient.Config {
|
|||||||
framework.ExpectNoError(err, fmt.Sprintf("Error creating client for cluster %q: %+v", clusterConf.name, err))
|
framework.ExpectNoError(err, fmt.Sprintf("Error creating client for cluster %q: %+v", clusterConf.name, err))
|
||||||
return restConfig
|
return restConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetZoneFromClusterName(clusterName string) string {
|
||||||
|
// Ref: https://github.com/kubernetes/kubernetes/blob/master/cluster/kube-util.sh#L55
|
||||||
|
prefix := "federation-e2e-" + framework.TestContext.Provider + "-"
|
||||||
|
return strings.TrimPrefix(clusterName, prefix)
|
||||||
|
}
|
||||||
|
@ -27,9 +27,9 @@ import (
|
|||||||
"k8s.io/apimachinery/pkg/util/wait"
|
"k8s.io/apimachinery/pkg/util/wait"
|
||||||
federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
federationapi "k8s.io/kubernetes/federation/apis/federation/v1beta1"
|
||||||
fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
|
fedclientset "k8s.io/kubernetes/federation/client/clientset_generated/federation_clientset"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
|
||||||
|
"k8s.io/kubernetes/pkg/cloudprovider"
|
||||||
"k8s.io/kubernetes/test/e2e/common"
|
"k8s.io/kubernetes/test/e2e/common"
|
||||||
"k8s.io/kubernetes/test/e2e/framework"
|
"k8s.io/kubernetes/test/e2e/framework"
|
||||||
fedframework "k8s.io/kubernetes/test/e2e_federation/framework"
|
fedframework "k8s.io/kubernetes/test/e2e_federation/framework"
|
||||||
@ -243,16 +243,18 @@ func cleanupServiceShardsAndProviderResources(namespace string, service *v1.Serv
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if cSvc.Spec.Type == v1.ServiceTypeLoadBalancer {
|
||||||
|
// In federation tests, e2e zone names are used to derive federation member cluster names
|
||||||
|
zone := fedframework.GetZoneFromClusterName(name)
|
||||||
|
serviceLBName := cloudprovider.GetLoadBalancerName(cSvc)
|
||||||
|
framework.Logf("cleaning cloud provider resource for service %q in namespace %q, in cluster %q", service.Name, namespace, name)
|
||||||
|
framework.CleanupServiceResources(serviceLBName, zone)
|
||||||
|
}
|
||||||
|
|
||||||
err = cleanupServiceShard(c.Clientset, name, namespace, cSvc, fedframework.FederatedDefaultTestTimeout)
|
err = cleanupServiceShard(c.Clientset, name, namespace, cSvc, fedframework.FederatedDefaultTestTimeout)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
framework.Logf("Failed to delete service %q in namespace %q, in cluster %q: %v", service.Name, namespace, name, err)
|
framework.Logf("Failed to delete service %q in namespace %q, in cluster %q: %v", service.Name, namespace, name, err)
|
||||||
}
|
}
|
||||||
if service.Spec.Type == v1.ServiceTypeLoadBalancer {
|
|
||||||
err = cleanupServiceShardLoadBalancer(name, cSvc, fedframework.FederatedDefaultTestTimeout)
|
|
||||||
if err != nil {
|
|
||||||
framework.Logf("Failed to delete cloud provider resources for service %q in namespace %q, in cluster %q, err: %v", service.Name, namespace, name, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,35 +272,6 @@ func cleanupServiceShard(clientset *kubeclientset.Clientset, clusterName, namesp
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func cleanupServiceShardLoadBalancer(clusterName string, service *v1.Service, timeout time.Duration) error {
|
|
||||||
provider := framework.TestContext.CloudConfig.Provider
|
|
||||||
if provider == nil {
|
|
||||||
return fmt.Errorf("cloud provider undefined")
|
|
||||||
}
|
|
||||||
|
|
||||||
internalSvc := &v1.Service{}
|
|
||||||
err := api.Scheme.Convert(service, internalSvc, nil)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("failed to convert versioned service object to internal type: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = wait.PollImmediate(framework.Poll, timeout, func() (bool, error) {
|
|
||||||
lbi, supported := provider.LoadBalancer()
|
|
||||||
if !supported {
|
|
||||||
return false, fmt.Errorf("%q doesn't support load balancers", provider.ProviderName())
|
|
||||||
}
|
|
||||||
err := lbi.EnsureLoadBalancerDeleted(clusterName, internalSvc)
|
|
||||||
if err != nil {
|
|
||||||
// Deletion failed with an error, try again.
|
|
||||||
framework.Logf("Failed to delete cloud provider resources for service %q in namespace %q, in cluster %q: %v", service.Name, service.Namespace, clusterName, err)
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
By(fmt.Sprintf("Cloud provider resources for Service %q in namespace %q in cluster %q deleted", service.Name, service.Namespace, clusterName))
|
|
||||||
return true, nil
|
|
||||||
})
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func podExitCodeDetector(f *fedframework.Framework, name, namespace string, code int32) func() error {
|
func podExitCodeDetector(f *fedframework.Framework, name, namespace string, code int32) func() error {
|
||||||
// If we ever get any container logs, stash them here.
|
// If we ever get any container logs, stash them here.
|
||||||
logs := ""
|
logs := ""
|
||||||
|
Loading…
Reference in New Issue
Block a user