mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Merge pull request #80761 from seans3/refactor-kubectl-condition
Refactor pkg/kubectl/conditions.go to remove file
This commit is contained in:
		@@ -2,21 +2,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
 | 
			
		||||
 | 
			
		||||
go_library(
 | 
			
		||||
    name = "go_default_library",
 | 
			
		||||
    srcs = [
 | 
			
		||||
        "conditions.go",
 | 
			
		||||
        "doc.go",
 | 
			
		||||
    ],
 | 
			
		||||
    srcs = ["doc.go"],
 | 
			
		||||
    importpath = "k8s.io/kubernetes/pkg/kubectl",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//staging/src/k8s.io/api/core/v1:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library",
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
filegroup(
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ go_library(
 | 
			
		||||
    importpath = "k8s.io/kubernetes/pkg/kubectl/cmd/run",
 | 
			
		||||
    visibility = ["//visibility:public"],
 | 
			
		||||
    deps = [
 | 
			
		||||
        "//pkg/kubectl:go_default_library",
 | 
			
		||||
        "//pkg/kubectl/cmd/attach:go_default_library",
 | 
			
		||||
        "//pkg/kubectl/cmd/delete:go_default_library",
 | 
			
		||||
        "//pkg/kubectl/cmd/exec:go_default_library",
 | 
			
		||||
@@ -17,6 +16,7 @@ go_library(
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/fields:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library",
 | 
			
		||||
        "//staging/src/k8s.io/cli-runtime/pkg/genericclioptions:go_default_library",
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/fields"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	utilerrors "k8s.io/apimachinery/pkg/util/errors"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/watch"
 | 
			
		||||
	"k8s.io/cli-runtime/pkg/genericclioptions"
 | 
			
		||||
@@ -49,7 +50,6 @@ import (
 | 
			
		||||
	"k8s.io/kubectl/pkg/util/i18n"
 | 
			
		||||
	"k8s.io/kubectl/pkg/util/interrupt"
 | 
			
		||||
	"k8s.io/kubectl/pkg/util/templates"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/kubectl"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/kubectl/cmd/attach"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/kubectl/cmd/delete"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/kubectl/cmd/exec"
 | 
			
		||||
@@ -423,7 +423,7 @@ func (o *RunOptions) Run(f cmdutil.Factory, cmd *cobra.Command, args []string) e
 | 
			
		||||
		leaveStdinOpen := o.LeaveStdinOpen
 | 
			
		||||
		waitForExitCode := !leaveStdinOpen && restartPolicy == corev1.RestartPolicyNever
 | 
			
		||||
		if waitForExitCode {
 | 
			
		||||
			pod, err = waitForPod(clientset.CoreV1(), attachablePod.Namespace, attachablePod.Name, kubectl.PodCompleted)
 | 
			
		||||
			pod, err = waitForPod(clientset.CoreV1(), attachablePod.Namespace, attachablePod.Name, podCompleted)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
@@ -540,8 +540,8 @@ func waitForPod(podClient corev1client.PodsGetter, ns, name string, exitConditio
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleAttachPod(f cmdutil.Factory, podClient corev1client.PodsGetter, ns, name string, opts *attach.AttachOptions) error {
 | 
			
		||||
	pod, err := waitForPod(podClient, ns, name, kubectl.PodRunningAndReady)
 | 
			
		||||
	if err != nil && err != kubectl.ErrPodCompleted {
 | 
			
		||||
	pod, err := waitForPod(podClient, ns, name, podRunningAndReady)
 | 
			
		||||
	if err != nil && err != ErrPodCompleted {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -718,3 +718,53 @@ func (o *RunOptions) createGeneratedObject(f cmdutil.Factory, cmd *cobra.Command
 | 
			
		||||
		Mapping: mapping,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrPodCompleted is returned by PodRunning or PodContainerRunning to indicate that
 | 
			
		||||
// the pod has already reached completed state.
 | 
			
		||||
var ErrPodCompleted = fmt.Errorf("pod ran to completion")
 | 
			
		||||
 | 
			
		||||
// podCompleted returns true if the pod has run to completion, false if the pod has not yet
 | 
			
		||||
// reached running state, or an error in any other case.
 | 
			
		||||
func podCompleted(event watch.Event) (bool, error) {
 | 
			
		||||
	switch event.Type {
 | 
			
		||||
	case watch.Deleted:
 | 
			
		||||
		return false, errors.NewNotFound(schema.GroupResource{Resource: "pods"}, "")
 | 
			
		||||
	}
 | 
			
		||||
	switch t := event.Object.(type) {
 | 
			
		||||
	case *corev1.Pod:
 | 
			
		||||
		switch t.Status.Phase {
 | 
			
		||||
		case corev1.PodFailed, corev1.PodSucceeded:
 | 
			
		||||
			return true, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// podRunningAndReady returns true if the pod is running and ready, false if the pod has not
 | 
			
		||||
// yet reached those states, returns ErrPodCompleted if the pod has run to completion, or
 | 
			
		||||
// an error in any other case.
 | 
			
		||||
func podRunningAndReady(event watch.Event) (bool, error) {
 | 
			
		||||
	switch event.Type {
 | 
			
		||||
	case watch.Deleted:
 | 
			
		||||
		return false, errors.NewNotFound(schema.GroupResource{Resource: "pods"}, "")
 | 
			
		||||
	}
 | 
			
		||||
	switch t := event.Object.(type) {
 | 
			
		||||
	case *corev1.Pod:
 | 
			
		||||
		switch t.Status.Phase {
 | 
			
		||||
		case corev1.PodFailed, corev1.PodSucceeded:
 | 
			
		||||
			return false, ErrPodCompleted
 | 
			
		||||
		case corev1.PodRunning:
 | 
			
		||||
			conditions := t.Status.Conditions
 | 
			
		||||
			if conditions == nil {
 | 
			
		||||
				return false, nil
 | 
			
		||||
			}
 | 
			
		||||
			for i := range conditions {
 | 
			
		||||
				if conditions[i].Type == corev1.PodReady &&
 | 
			
		||||
					conditions[i].Status == corev1.ConditionTrue {
 | 
			
		||||
					return true, nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,107 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2014 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 kubectl
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	corev1 "k8s.io/api/core/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/api/errors"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime/schema"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/util/wait"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/watch"
 | 
			
		||||
	corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func valOrZero(val *int32) int32 {
 | 
			
		||||
	if val == nil {
 | 
			
		||||
		return int32(0)
 | 
			
		||||
	}
 | 
			
		||||
	return *val
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ControllerHasDesiredReplicas returns a condition that will be true if and only if
 | 
			
		||||
// the desired replica count for a controller's ReplicaSelector equals the Replicas count.
 | 
			
		||||
func ControllerHasDesiredReplicas(rcClient corev1client.ReplicationControllersGetter, controller *corev1.ReplicationController) wait.ConditionFunc {
 | 
			
		||||
 | 
			
		||||
	// If we're given a controller where the status lags the spec, it either means that the controller is stale,
 | 
			
		||||
	// or that the rc manager hasn't noticed the update yet. Polling status.Replicas is not safe in the latter case.
 | 
			
		||||
	desiredGeneration := controller.Generation
 | 
			
		||||
 | 
			
		||||
	return func() (bool, error) {
 | 
			
		||||
		ctrl, err := rcClient.ReplicationControllers(controller.Namespace).Get(controller.Name, metav1.GetOptions{})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return false, err
 | 
			
		||||
		}
 | 
			
		||||
		// There's a chance a concurrent update modifies the Spec.Replicas causing this check to pass,
 | 
			
		||||
		// or, after this check has passed, a modification causes the rc manager to create more pods.
 | 
			
		||||
		// This will not be an issue once we've implemented graceful delete for rcs, but till then
 | 
			
		||||
		// concurrent stop operations on the same rc might have unintended side effects.
 | 
			
		||||
		return ctrl.Status.ObservedGeneration >= desiredGeneration && ctrl.Status.Replicas == valOrZero(ctrl.Spec.Replicas), nil
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrPodCompleted is returned by PodRunning or PodContainerRunning to indicate that
 | 
			
		||||
// the pod has already reached completed state.
 | 
			
		||||
var ErrPodCompleted = fmt.Errorf("pod ran to completion")
 | 
			
		||||
 | 
			
		||||
// PodCompleted returns true if the pod has run to completion, false if the pod has not yet
 | 
			
		||||
// reached running state, or an error in any other case.
 | 
			
		||||
func PodCompleted(event watch.Event) (bool, error) {
 | 
			
		||||
	switch event.Type {
 | 
			
		||||
	case watch.Deleted:
 | 
			
		||||
		return false, errors.NewNotFound(schema.GroupResource{Resource: "pods"}, "")
 | 
			
		||||
	}
 | 
			
		||||
	switch t := event.Object.(type) {
 | 
			
		||||
	case *corev1.Pod:
 | 
			
		||||
		switch t.Status.Phase {
 | 
			
		||||
		case corev1.PodFailed, corev1.PodSucceeded:
 | 
			
		||||
			return true, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PodRunningAndReady returns true if the pod is running and ready, false if the pod has not
 | 
			
		||||
// yet reached those states, returns ErrPodCompleted if the pod has run to completion, or
 | 
			
		||||
// an error in any other case.
 | 
			
		||||
func PodRunningAndReady(event watch.Event) (bool, error) {
 | 
			
		||||
	switch event.Type {
 | 
			
		||||
	case watch.Deleted:
 | 
			
		||||
		return false, errors.NewNotFound(schema.GroupResource{Resource: "pods"}, "")
 | 
			
		||||
	}
 | 
			
		||||
	switch t := event.Object.(type) {
 | 
			
		||||
	case *corev1.Pod:
 | 
			
		||||
		switch t.Status.Phase {
 | 
			
		||||
		case corev1.PodFailed, corev1.PodSucceeded:
 | 
			
		||||
			return false, ErrPodCompleted
 | 
			
		||||
		case corev1.PodRunning:
 | 
			
		||||
			conditions := t.Status.Conditions
 | 
			
		||||
			if conditions == nil {
 | 
			
		||||
				return false, nil
 | 
			
		||||
			}
 | 
			
		||||
			for i := range conditions {
 | 
			
		||||
				if conditions[i].Type == corev1.PodReady &&
 | 
			
		||||
					conditions[i].Status == corev1.ConditionTrue {
 | 
			
		||||
					return true, nil
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user