
The previous approach with grabbing via a nginx proxy had some drawbacks: - it did not work when the pods only listened on localhost (as configured by kubeadm) and the proxy got deployed on a different node - starting the proxy raced with starting the pods, causing sporadic test failures because the proxy was not set up properly unless it saw all pods when starting the e2e.test - the proxy was always started, whether it is needed or not - the proxy was left running after a test and then the next test run triggered potentially confusing messages when it failed to create objects for the proxy The new approach is similar to "kubectl port-forward" + "kubectl get --raw". It uses the port forwarding feature to establish a TCP connection via a custom dialer, then lets client-go handle TLS and credentials. Somehow verifying the server certificate did not work. As this shouldn't be a big concern for E2E testing, certificate checking gets disabled on the client side instead of investigating this further.
92 lines
3.1 KiB
Go
92 lines
3.1 KiB
Go
/*
|
|
Copyright 2019 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package e2e
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"path"
|
|
"time"
|
|
|
|
clientset "k8s.io/client-go/kubernetes"
|
|
"k8s.io/kubernetes/test/e2e/framework"
|
|
e2emetrics "k8s.io/kubernetes/test/e2e/framework/metrics"
|
|
)
|
|
|
|
// CleanupSuite is the boilerplate that can be used after tests on ginkgo were run, on the SynchronizedAfterSuite step.
|
|
// Similar to SynchronizedBeforeSuite, we want to run some operations only once (such as collecting cluster logs).
|
|
// Here, the order of functions is reversed; first, the function which runs everywhere,
|
|
// and then the function that only runs on the first Ginkgo node.
|
|
func CleanupSuite() {
|
|
// Run on all Ginkgo nodes
|
|
framework.Logf("Running AfterSuite actions on all nodes")
|
|
framework.RunCleanupActions()
|
|
}
|
|
|
|
// AfterSuiteActions are actions that are run on ginkgo's SynchronizedAfterSuite
|
|
func AfterSuiteActions() {
|
|
// Run only Ginkgo on node 1
|
|
framework.Logf("Running AfterSuite actions on node 1")
|
|
if framework.TestContext.ReportDir != "" {
|
|
framework.CoreDump(framework.TestContext.ReportDir)
|
|
}
|
|
if framework.TestContext.GatherSuiteMetricsAfterTest {
|
|
if err := gatherTestSuiteMetrics(); err != nil {
|
|
framework.Logf("Error gathering metrics: %v", err)
|
|
}
|
|
}
|
|
if framework.TestContext.NodeKiller.Enabled {
|
|
close(framework.TestContext.NodeKiller.NodeKillerStopCh)
|
|
}
|
|
}
|
|
|
|
func gatherTestSuiteMetrics() error {
|
|
framework.Logf("Gathering metrics")
|
|
config, err := framework.LoadConfig()
|
|
if err != nil {
|
|
return fmt.Errorf("error loading client config: %v", err)
|
|
}
|
|
c, err := clientset.NewForConfig(config)
|
|
if err != nil {
|
|
return fmt.Errorf("error creating client: %v", err)
|
|
}
|
|
|
|
// Grab metrics for apiserver, scheduler, controller-manager, kubelet (for non-kubemark case) and cluster autoscaler (optionally).
|
|
grabber, err := e2emetrics.NewMetricsGrabber(c, nil, config, !framework.ProviderIs("kubemark"), true, true, true, framework.TestContext.IncludeClusterAutoscalerMetrics, false)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to create MetricsGrabber: %v", err)
|
|
}
|
|
|
|
received, err := grabber.Grab()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to grab metrics: %v", err)
|
|
}
|
|
|
|
metricsForE2E := (*e2emetrics.ComponentCollection)(&received)
|
|
metricsJSON := metricsForE2E.PrintJSON()
|
|
if framework.TestContext.ReportDir != "" {
|
|
filePath := path.Join(framework.TestContext.ReportDir, "MetricsForE2ESuite_"+time.Now().Format(time.RFC3339)+".json")
|
|
if err := ioutil.WriteFile(filePath, []byte(metricsJSON), 0644); err != nil {
|
|
return fmt.Errorf("error writing to %q: %v", filePath, err)
|
|
}
|
|
} else {
|
|
framework.Logf("\n\nTest Suite Metrics:\n%s\n", metricsJSON)
|
|
}
|
|
|
|
return nil
|
|
}
|