mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 02:08:13 +00:00 
			
		
		
		
	 dfdf88d4fa
			
		
	
	dfdf88d4fa
	
	
	
		
			
			This is the result of automatically editing source files like this:
    go install golang.org/x/tools/cmd/goimports@latest
    find ./test/e2e* -name "*.go" | xargs env PATH=$GOPATH/bin:$PATH ./e2e-framework-sed.sh
with e2e-framework-sed.sh containing this:
sed -i \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainer(/e2epod.ExecCommandInContainer(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecCommandInContainerWithFullOutput(/e2epod.ExecCommandInContainerWithFullOutput(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInContainer(/e2epod.ExecShellInContainer(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPod(/e2epod.ExecShellInPod(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecShellInPodWithFullOutput(/e2epod.ExecShellInPodWithFullOutput(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.ExecWithOptions(/e2epod.ExecWithOptions(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.MatchContainerOutput(/e2eoutput.MatchContainerOutput(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClient(/e2epod.NewPodClient(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.PodClientNS(/e2epod.PodClientNS(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutput(/e2eoutput.TestContainerOutput(\1, /" \
    -e "s/\(f\|fr\|\w\w*\.[fF]\w*\)\.TestContainerOutputRegexp(/e2eoutput.TestContainerOutputRegexp(\1, /" \
    -e "s/framework.AddOrUpdateLabelOnNode\b/e2enode.AddOrUpdateLabelOnNode/" \
    -e "s/framework.AllNodes\b/e2edebug.AllNodes/" \
    -e "s/framework.AllNodesReady\b/e2enode.AllNodesReady/" \
    -e "s/framework.ContainerResourceGatherer\b/e2edebug.ContainerResourceGatherer/" \
    -e "s/framework.ContainerResourceUsage\b/e2edebug.ContainerResourceUsage/" \
    -e "s/framework.CreateEmptyFileOnPod\b/e2eoutput.CreateEmptyFileOnPod/" \
    -e "s/framework.DefaultPodDeletionTimeout\b/e2epod.DefaultPodDeletionTimeout/" \
    -e "s/framework.DumpAllNamespaceInfo\b/e2edebug.DumpAllNamespaceInfo/" \
    -e "s/framework.DumpDebugInfo\b/e2eoutput.DumpDebugInfo/" \
    -e "s/framework.DumpNodeDebugInfo\b/e2edebug.DumpNodeDebugInfo/" \
    -e "s/framework.EtcdUpgrade\b/e2eproviders.EtcdUpgrade/" \
    -e "s/framework.EventsLister\b/e2edebug.EventsLister/" \
    -e "s/framework.ExecOptions\b/e2epod.ExecOptions/" \
    -e "s/framework.ExpectNodeHasLabel\b/e2enode.ExpectNodeHasLabel/" \
    -e "s/framework.ExpectNodeHasTaint\b/e2enode.ExpectNodeHasTaint/" \
    -e "s/framework.GCEUpgradeScript\b/e2eproviders.GCEUpgradeScript/" \
    -e "s/framework.ImagePrePullList\b/e2epod.ImagePrePullList/" \
    -e "s/framework.KubectlBuilder\b/e2ekubectl.KubectlBuilder/" \
    -e "s/framework.LocationParamGKE\b/e2eproviders.LocationParamGKE/" \
    -e "s/framework.LogSizeDataTimeseries\b/e2edebug.LogSizeDataTimeseries/" \
    -e "s/framework.LogSizeGatherer\b/e2edebug.LogSizeGatherer/" \
    -e "s/framework.LogsSizeData\b/e2edebug.LogsSizeData/" \
    -e "s/framework.LogsSizeDataSummary\b/e2edebug.LogsSizeDataSummary/" \
    -e "s/framework.LogsSizeVerifier\b/e2edebug.LogsSizeVerifier/" \
    -e "s/framework.LookForStringInLog\b/e2eoutput.LookForStringInLog/" \
    -e "s/framework.LookForStringInPodExec\b/e2eoutput.LookForStringInPodExec/" \
    -e "s/framework.LookForStringInPodExecToContainer\b/e2eoutput.LookForStringInPodExecToContainer/" \
    -e "s/framework.MasterAndDNSNodes\b/e2edebug.MasterAndDNSNodes/" \
    -e "s/framework.MasterNodes\b/e2edebug.MasterNodes/" \
    -e "s/framework.MasterUpgradeGKE\b/e2eproviders.MasterUpgradeGKE/" \
    -e "s/framework.NewKubectlCommand\b/e2ekubectl.NewKubectlCommand/" \
    -e "s/framework.NewLogsVerifier\b/e2edebug.NewLogsVerifier/" \
    -e "s/framework.NewNodeKiller\b/e2enode.NewNodeKiller/" \
    -e "s/framework.NewResourceUsageGatherer\b/e2edebug.NewResourceUsageGatherer/" \
    -e "s/framework.NodeHasTaint\b/e2enode.NodeHasTaint/" \
    -e "s/framework.NodeKiller\b/e2enode.NodeKiller/" \
    -e "s/framework.NodesSet\b/e2edebug.NodesSet/" \
    -e "s/framework.PodClient\b/e2epod.PodClient/" \
    -e "s/framework.RemoveLabelOffNode\b/e2enode.RemoveLabelOffNode/" \
    -e "s/framework.ResourceConstraint\b/e2edebug.ResourceConstraint/" \
    -e "s/framework.ResourceGathererOptions\b/e2edebug.ResourceGathererOptions/" \
    -e "s/framework.ResourceUsagePerContainer\b/e2edebug.ResourceUsagePerContainer/" \
    -e "s/framework.ResourceUsageSummary\b/e2edebug.ResourceUsageSummary/" \
    -e "s/framework.RunHostCmd\b/e2eoutput.RunHostCmd/" \
    -e "s/framework.RunHostCmdOrDie\b/e2eoutput.RunHostCmdOrDie/" \
    -e "s/framework.RunHostCmdWithFullOutput\b/e2eoutput.RunHostCmdWithFullOutput/" \
    -e "s/framework.RunHostCmdWithRetries\b/e2eoutput.RunHostCmdWithRetries/" \
    -e "s/framework.RunKubectl\b/e2ekubectl.RunKubectl/" \
    -e "s/framework.RunKubectlInput\b/e2ekubectl.RunKubectlInput/" \
    -e "s/framework.RunKubectlOrDie\b/e2ekubectl.RunKubectlOrDie/" \
    -e "s/framework.RunKubectlOrDieInput\b/e2ekubectl.RunKubectlOrDieInput/" \
    -e "s/framework.RunKubectlWithFullOutput\b/e2ekubectl.RunKubectlWithFullOutput/" \
    -e "s/framework.RunKubemciCmd\b/e2ekubectl.RunKubemciCmd/" \
    -e "s/framework.RunKubemciWithKubeconfig\b/e2ekubectl.RunKubemciWithKubeconfig/" \
    -e "s/framework.SingleContainerSummary\b/e2edebug.SingleContainerSummary/" \
    -e "s/framework.SingleLogSummary\b/e2edebug.SingleLogSummary/" \
    -e "s/framework.TimestampedSize\b/e2edebug.TimestampedSize/" \
    -e "s/framework.WaitForAllNodesSchedulable\b/e2enode.WaitForAllNodesSchedulable/" \
    -e "s/framework.WaitForSSHTunnels\b/e2enode.WaitForSSHTunnels/" \
    -e "s/framework.WorkItem\b/e2edebug.WorkItem/" \
    "$@"
for i in "$@"; do
    # Import all sub packages and let goimports figure out which of those
    # are redundant (= already imported) or not needed.
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2edebug "k8s.io/kubernetes/test/e2e/framework/debug"' "$i"
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2ekubectl "k8s.io/kubernetes/test/e2e/framework/kubectl"' "$i"
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2enode "k8s.io/kubernetes/test/e2e/framework/node"' "$i"
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eoutput "k8s.io/kubernetes/test/e2e/framework/pod/output"' "$i"
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2epod "k8s.io/kubernetes/test/e2e/framework/pod"' "$i"
    sed -i -e '/"k8s.io.kubernetes.test.e2e.framework"/a e2eproviders "k8s.io/kubernetes/test/e2e/framework/providers"' "$i"
    goimports -w "$i"
done
		
	
		
			
				
	
	
		
			130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			130 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| /*
 | |
| Copyright 2017 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 timer
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| 
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 
 | |
| 	"sync"
 | |
| 
 | |
| 	"k8s.io/kubernetes/test/e2e/framework"
 | |
| 	"k8s.io/kubernetes/test/e2e/perftype"
 | |
| )
 | |
| 
 | |
| var now = time.Now
 | |
| 
 | |
| // Phase represents a phase of a test. Phases can overlap.
 | |
| type Phase struct {
 | |
| 	sequenceNumber int
 | |
| 	name           string
 | |
| 	startTime      time.Time
 | |
| 	endTime        time.Time
 | |
| }
 | |
| 
 | |
| func (phase *Phase) ended() bool {
 | |
| 	return !phase.endTime.IsZero()
 | |
| }
 | |
| 
 | |
| // End marks the phase as ended, unless it had already been ended before.
 | |
| func (phase *Phase) End() {
 | |
| 	if !phase.ended() {
 | |
| 		phase.endTime = now()
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (phase *Phase) label() string {
 | |
| 	return fmt.Sprintf("%03d-%s", phase.sequenceNumber, phase.name)
 | |
| }
 | |
| 
 | |
| func (phase *Phase) duration() time.Duration {
 | |
| 	endTime := phase.endTime
 | |
| 	if !phase.ended() {
 | |
| 		endTime = now()
 | |
| 	}
 | |
| 	return endTime.Sub(phase.startTime)
 | |
| }
 | |
| 
 | |
| func (phase *Phase) humanReadable() string {
 | |
| 	if phase.ended() {
 | |
| 		return fmt.Sprintf("Phase %s: %v\n", phase.label(), phase.duration())
 | |
| 	}
 | |
| 	return fmt.Sprintf("Phase %s: %v so far\n", phase.label(), phase.duration())
 | |
| }
 | |
| 
 | |
| // A TestPhaseTimer groups phases and provides a way to export their measurements as JSON or human-readable text.
 | |
| // It is safe to use concurrently.
 | |
| type TestPhaseTimer struct {
 | |
| 	lock   sync.Mutex
 | |
| 	phases []*Phase
 | |
| }
 | |
| 
 | |
| // NewTestPhaseTimer creates a new TestPhaseTimer.
 | |
| func NewTestPhaseTimer() *TestPhaseTimer {
 | |
| 	return &TestPhaseTimer{}
 | |
| }
 | |
| 
 | |
| // StartPhase starts a new phase.
 | |
| // sequenceNumber is an integer prepended to phaseName in the output, such that lexicographic sorting
 | |
| // of phases in perfdash reconstructs the order of execution. Unfortunately it needs to be
 | |
| // provided manually, since a simple incrementing counter would have the effect that inserting
 | |
| // a new phase would renumber subsequent phases, breaking the continuity of historical records.
 | |
| func (timer *TestPhaseTimer) StartPhase(sequenceNumber int, phaseName string) *Phase {
 | |
| 	timer.lock.Lock()
 | |
| 	defer timer.lock.Unlock()
 | |
| 	newPhase := &Phase{sequenceNumber: sequenceNumber, name: phaseName, startTime: now()}
 | |
| 	timer.phases = append(timer.phases, newPhase)
 | |
| 	return newPhase
 | |
| }
 | |
| 
 | |
| // SummaryKind returns the summary of test summary.
 | |
| func (timer *TestPhaseTimer) SummaryKind() string {
 | |
| 	return "TestPhaseTimer"
 | |
| }
 | |
| 
 | |
| // PrintHumanReadable returns durations of all phases.
 | |
| func (timer *TestPhaseTimer) PrintHumanReadable() string {
 | |
| 	buf := bytes.Buffer{}
 | |
| 	timer.lock.Lock()
 | |
| 	defer timer.lock.Unlock()
 | |
| 	for _, phase := range timer.phases {
 | |
| 		buf.WriteString(phase.humanReadable())
 | |
| 	}
 | |
| 	return buf.String()
 | |
| }
 | |
| 
 | |
| // PrintJSON returns durations of all phases with JSON format.
 | |
| func (timer *TestPhaseTimer) PrintJSON() string {
 | |
| 	data := perftype.PerfData{
 | |
| 		Version: "v1",
 | |
| 		DataItems: []perftype.DataItem{{
 | |
| 			Unit:   "s",
 | |
| 			Labels: map[string]string{"test": "phases"},
 | |
| 			Data:   make(map[string]float64)}}}
 | |
| 	timer.lock.Lock()
 | |
| 	defer timer.lock.Unlock()
 | |
| 	for _, phase := range timer.phases {
 | |
| 		data.DataItems[0].Data[phase.label()] = phase.duration().Seconds()
 | |
| 		if !phase.ended() {
 | |
| 			data.DataItems[0].Labels["ended"] = "false"
 | |
| 		}
 | |
| 	}
 | |
| 	return framework.PrettyPrintJSON(data)
 | |
| }
 |