pull/6/head
Chao Xu 2016-11-18 12:58:22 -08:00
parent 068a7eb415
commit 96cd71d8f6
13 changed files with 149 additions and 45 deletions

View File

@ -132,6 +132,18 @@ func GetDeploymentCondition(status extensions.DeploymentStatus, condType extensi
return nil return nil
} }
// TODO: remove the duplicate
// GetDeploymentConditionInternal returns the condition with the provided type.
func GetDeploymentConditionInternal(status internalextensions.DeploymentStatus, condType internalextensions.DeploymentConditionType) *internalextensions.DeploymentCondition {
for i := range status.Conditions {
c := status.Conditions[i]
if c.Type == condType {
return &c
}
}
return nil
}
// SetDeploymentCondition updates the deployment to include the provided condition. If the condition that // SetDeploymentCondition updates the deployment to include the provided condition. If the condition that
// we are about to add already exists and has the same status and reason then we are not going to update. // we are about to add already exists and has the same status and reason then we are not going to update.
func SetDeploymentCondition(status *extensions.DeploymentStatus, condition extensions.DeploymentCondition) { func SetDeploymentCondition(status *extensions.DeploymentStatus, condition extensions.DeploymentCondition) {
@ -729,8 +741,8 @@ func GetNewReplicaSetTemplate(deployment *extensions.Deployment) v1.PodTemplateS
} }
// TODO: remove the duplicate // TODO: remove the duplicate
// GetNewInternalReplicaSetTemplate returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet. // GetNewReplicaSetTemplateInternal returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet.
func GetNewInternalReplicaSetTemplate(deployment *internalextensions.Deployment) api.PodTemplateSpec { func GetNewReplicaSetTemplateInternal(deployment *internalextensions.Deployment) api.PodTemplateSpec {
// newRS will have the same template as in deployment spec, plus a unique label in some cases. // newRS will have the same template as in deployment spec, plus a unique label in some cases.
newRSTemplate := api.PodTemplateSpec{ newRSTemplate := api.PodTemplateSpec{
ObjectMeta: deployment.Spec.Template.ObjectMeta, ObjectMeta: deployment.Spec.Template.ObjectMeta,
@ -925,6 +937,19 @@ func WaitForObservedDeployment(getDeploymentFunc func() (*extensions.Deployment,
}) })
} }
// TODO: remove the duplicate
// WaitForObservedInternalDeployment polls for deployment to be updated so that deployment.Status.ObservedGeneration >= desiredGeneration.
// Returns error if polling timesout.
func WaitForObservedDeploymentInternal(getDeploymentFunc func() (*internalextensions.Deployment, error), desiredGeneration int64, interval, timeout time.Duration) error {
return wait.Poll(interval, timeout, func() (bool, error) {
deployment, err := getDeploymentFunc()
if err != nil {
return false, err
}
return deployment.Status.ObservedGeneration >= desiredGeneration, nil
})
}
// ResolveFenceposts resolves both maxSurge and maxUnavailable. This needs to happen in one // ResolveFenceposts resolves both maxSurge and maxUnavailable. This needs to happen in one
// step. For example: // step. For example:
// //

View File

@ -42,6 +42,7 @@ import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/service" "k8s.io/kubernetes/pkg/api/service"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
@ -596,7 +597,7 @@ func (f *factory) LogsForObject(object, options runtime.Object) (*restclient.Req
return nil, errors.New("provided options object is not a PodLogOptions") return nil, errors.New("provided options object is not a PodLogOptions")
} }
selector := labels.SelectorFromSet(t.Spec.Selector) selector := labels.SelectorFromSet(t.Spec.Selector)
sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) } sortBy := func(pods []*v1.Pod) sort.Interface { return controller.ByLogging(pods) }
pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy) pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy)
if err != nil { if err != nil {
return nil, err return nil, err
@ -616,7 +617,7 @@ func (f *factory) LogsForObject(object, options runtime.Object) (*restclient.Req
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) } sortBy := func(pods []*v1.Pod) sort.Interface { return controller.ByLogging(pods) }
pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy) pod, numPods, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 20*time.Second, sortBy)
if err != nil { if err != nil {
return nil, err return nil, err
@ -797,7 +798,7 @@ func (f *factory) AttachablePodForObject(object runtime.Object) (*api.Pod, error
switch t := object.(type) { switch t := object.(type) {
case *api.ReplicationController: case *api.ReplicationController:
selector := labels.SelectorFromSet(t.Spec.Selector) selector := labels.SelectorFromSet(t.Spec.Selector)
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*v1.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *extensions.Deployment: case *extensions.Deployment:
@ -805,7 +806,7 @@ func (f *factory) AttachablePodForObject(object runtime.Object) (*api.Pod, error
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*v1.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *batch.Job: case *batch.Job:
@ -813,7 +814,7 @@ func (f *factory) AttachablePodForObject(object runtime.Object) (*api.Pod, error
if err != nil { if err != nil {
return nil, fmt.Errorf("invalid label selector: %v", err) return nil, fmt.Errorf("invalid label selector: %v", err)
} }
sortBy := func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) } sortBy := func(pods []*v1.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }
pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy) pod, _, err := GetFirstPod(clientset.Core(), t.Namespace, selector, 1*time.Minute, sortBy)
return pod, err return pod, err
case *api.Pod: case *api.Pod:
@ -886,21 +887,25 @@ See http://kubernetes.io/docs/user-guide/services-firewalls for more details.
// GetFirstPod returns a pod matching the namespace and label selector // GetFirstPod returns a pod matching the namespace and label selector
// and the number of all pods that match the label selector. // and the number of all pods that match the label selector.
func GetFirstPod(client coreclient.PodsGetter, namespace string, selector labels.Selector, timeout time.Duration, sortBy func([]*api.Pod) sort.Interface) (*api.Pod, int, error) { func GetFirstPod(client coreclient.PodsGetter, namespace string, selector labels.Selector, timeout time.Duration, sortBy func([]*v1.Pod) sort.Interface) (*api.Pod, int, error) {
options := api.ListOptions{LabelSelector: selector} options := api.ListOptions{LabelSelector: selector}
podList, err := client.Pods(namespace).List(options) podList, err := client.Pods(namespace).List(options)
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err
} }
pods := []*api.Pod{} pods := []*v1.Pod{}
for i := range podList.Items { for i := range podList.Items {
pod := podList.Items[i] pod := podList.Items[i]
pods = append(pods, &pod) externalPod := &v1.Pod{}
v1.Convert_api_Pod_To_v1_Pod(&pod, externalPod, nil)
pods = append(pods, externalPod)
} }
if len(pods) > 0 { if len(pods) > 0 {
sort.Sort(sortBy(pods)) sort.Sort(sortBy(pods))
return pods[0], len(podList.Items), nil internalPod := &api.Pod{}
v1.Convert_v1_Pod_To_api_Pod(pods[0], internalPod, nil)
return internalPod, len(podList.Items), nil
} }
// Watch until we observe a pod // Watch until we observe a pod

View File

@ -35,6 +35,7 @@ import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
@ -471,7 +472,7 @@ func TestGetFirstPod(t *testing.T) {
podList *api.PodList podList *api.PodList
watching []watch.Event watching []watch.Event
sortBy func([]*api.Pod) sort.Interface sortBy func([]*v1.Pod) sort.Interface
expected *api.Pod expected *api.Pod
expectedNum int expectedNum int
@ -480,7 +481,7 @@ func TestGetFirstPod(t *testing.T) {
{ {
name: "kubectl logs - two ready pods", name: "kubectl logs - two ready pods",
podList: newPodList(2, -1, -1, labelSet), podList: newPodList(2, -1, -1, labelSet),
sortBy: func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) }, sortBy: func(pods []*v1.Pod) sort.Interface { return controller.ByLogging(pods) },
expected: &api.Pod{ expected: &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "pod-1", Name: "pod-1",
@ -502,7 +503,7 @@ func TestGetFirstPod(t *testing.T) {
{ {
name: "kubectl logs - one unhealthy, one healthy", name: "kubectl logs - one unhealthy, one healthy",
podList: newPodList(2, -1, 1, labelSet), podList: newPodList(2, -1, 1, labelSet),
sortBy: func(pods []*api.Pod) sort.Interface { return controller.ByLogging(pods) }, sortBy: func(pods []*v1.Pod) sort.Interface { return controller.ByLogging(pods) },
expected: &api.Pod{ expected: &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "pod-2", Name: "pod-2",
@ -525,7 +526,7 @@ func TestGetFirstPod(t *testing.T) {
{ {
name: "kubectl attach - two ready pods", name: "kubectl attach - two ready pods",
podList: newPodList(2, -1, -1, labelSet), podList: newPodList(2, -1, -1, labelSet),
sortBy: func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }, sortBy: func(pods []*v1.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) },
expected: &api.Pod{ expected: &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "pod-1", Name: "pod-1",
@ -568,7 +569,7 @@ func TestGetFirstPod(t *testing.T) {
}, },
}, },
}, },
sortBy: func(pods []*api.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) }, sortBy: func(pods []*v1.Pod) sort.Interface { return sort.Reverse(controller.ActivePods(pods)) },
expected: &api.Pod{ expected: &api.Pod{
ObjectMeta: api.ObjectMeta{ ObjectMeta: api.ObjectMeta{
Name: "pod-1", Name: "pod-1",
@ -607,6 +608,7 @@ func TestGetFirstPod(t *testing.T) {
selector := labels.Set(labelSet).AsSelector() selector := labels.Set(labelSet).AsSelector()
pod, numPods, err := GetFirstPod(fake.Core(), api.NamespaceDefault, selector, 1*time.Minute, test.sortBy) pod, numPods, err := GetFirstPod(fake.Core(), api.NamespaceDefault, selector, 1*time.Minute, test.sortBy)
pod.Spec.SecurityContext = nil
if !test.expectedErr && err != nil { if !test.expectedErr && err != nil {
t.Errorf("%s: unexpected error: %v", test.name, err) t.Errorf("%s: unexpected error: %v", test.name, err)
continue continue

View File

@ -40,12 +40,14 @@ import (
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/certificates" "k8s.io/kubernetes/pkg/apis/certificates"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
versionedextension "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
storageutil "k8s.io/kubernetes/pkg/apis/storage/util" storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion" extensionsclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion"
versionedclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/fieldpath" "k8s.io/kubernetes/pkg/fieldpath"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
@ -113,7 +115,7 @@ func describerMap(c clientset.Interface) map[unversioned.GroupKind]Describer {
extensions.Kind("NetworkPolicy"): &NetworkPolicyDescriber{c}, extensions.Kind("NetworkPolicy"): &NetworkPolicyDescriber{c},
autoscaling.Kind("HorizontalPodAutoscaler"): &HorizontalPodAutoscalerDescriber{c}, autoscaling.Kind("HorizontalPodAutoscaler"): &HorizontalPodAutoscalerDescriber{c},
extensions.Kind("DaemonSet"): &DaemonSetDescriber{c}, extensions.Kind("DaemonSet"): &DaemonSetDescriber{c},
extensions.Kind("Deployment"): &DeploymentDescriber{c}, extensions.Kind("Deployment"): &DeploymentDescriber{c, versionedClientsetForDeployment(c)},
extensions.Kind("Job"): &JobDescriber{c}, extensions.Kind("Job"): &JobDescriber{c},
extensions.Kind("Ingress"): &IngressDescriber{c}, extensions.Kind("Ingress"): &IngressDescriber{c},
batch.Kind("Job"): &JobDescriber{c}, batch.Kind("Job"): &JobDescriber{c},
@ -505,7 +507,7 @@ func describePod(pod *api.Pod, events *api.EventList) (string, error) {
} }
} }
describeVolumes(pod.Spec.Volumes, out, "") describeVolumes(pod.Spec.Volumes, out, "")
fmt.Fprintf(out, "QoS Class:\t%s\n", qos.GetPodQOS(pod)) fmt.Fprintf(out, "QoS Class:\t%s\n", qos.InternalGetPodQOS(pod))
printTolerationsInAnnotationMultiline(out, "Tolerations", pod.Annotations) printTolerationsInAnnotationMultiline(out, "Tolerations", pod.Annotations)
if events != nil { if events != nil {
DescribeEvents(events, out) DescribeEvents(events, out)
@ -955,7 +957,7 @@ func describeContainers(label string, containers []api.Container, containerStatu
} }
fmt.Fprintf(out, " %s:\t%s (%s:%s)\n", e.Name, valueFrom, e.ValueFrom.FieldRef.APIVersion, e.ValueFrom.FieldRef.FieldPath) fmt.Fprintf(out, " %s:\t%s (%s:%s)\n", e.Name, valueFrom, e.ValueFrom.FieldRef.APIVersion, e.ValueFrom.FieldRef.FieldPath)
case e.ValueFrom.ResourceFieldRef != nil: case e.ValueFrom.ResourceFieldRef != nil:
valueFrom, err := fieldpath.ExtractContainerResourceValue(e.ValueFrom.ResourceFieldRef, &container) valueFrom, err := fieldpath.InternalExtractContainerResourceValue(e.ValueFrom.ResourceFieldRef, &container)
if err != nil { if err != nil {
valueFrom = "" valueFrom = ""
} }
@ -2152,10 +2154,11 @@ func DescribeEvents(el *api.EventList, w io.Writer) {
// DeploymentDescriber generates information about a deployment. // DeploymentDescriber generates information about a deployment.
type DeploymentDescriber struct { type DeploymentDescriber struct {
clientset.Interface clientset.Interface
versionedClient versionedclientset.Interface
} }
func (dd *DeploymentDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) { func (dd *DeploymentDescriber) Describe(namespace, name string, describerSettings DescriberSettings) (string, error) {
d, err := dd.Extensions().Deployments(namespace).Get(name) d, err := dd.versionedClient.Extensions().Deployments(namespace).Get(name)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -2183,10 +2186,10 @@ func (dd *DeploymentDescriber) Describe(namespace, name string, describerSetting
fmt.Fprintf(out, " %v \t%v\t%v\n", c.Type, c.Status, c.Reason) fmt.Fprintf(out, " %v \t%v\t%v\n", c.Type, c.Status, c.Reason)
} }
} }
oldRSs, _, newRS, err := deploymentutil.GetAllReplicaSets(d, dd) oldRSs, _, newRS, err := deploymentutil.GetAllReplicaSets(d, dd.versionedClient)
if err == nil { if err == nil {
fmt.Fprintf(out, "OldReplicaSets:\t%s\n", printReplicaSetsByLabels(oldRSs)) fmt.Fprintf(out, "OldReplicaSets:\t%s\n", printReplicaSetsByLabels(oldRSs))
var newRSs []*extensions.ReplicaSet var newRSs []*versionedextension.ReplicaSet
if newRS != nil { if newRS != nil {
newRSs = append(newRSs, newRS) newRSs = append(newRSs, newRS)
} }
@ -2248,7 +2251,7 @@ func printReplicationControllersByLabels(matchingRCs []*api.ReplicationControlle
return list return list
} }
func printReplicaSetsByLabels(matchingRSs []*extensions.ReplicaSet) string { func printReplicaSetsByLabels(matchingRSs []*versionedextension.ReplicaSet) string {
// Format the matching ReplicaSets into strings. // Format the matching ReplicaSets into strings.
rsStrings := make([]string, 0, len(matchingRSs)) rsStrings := make([]string, 0, len(matchingRSs))
for _, rs := range matchingRSs { for _, rs := range matchingRSs {

View File

@ -30,11 +30,14 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy"
"k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/apis/storage"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
versionedfake "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/fake"
"k8s.io/kubernetes/pkg/util/intstr" "k8s.io/kubernetes/pkg/util/intstr"
) )
@ -618,16 +621,18 @@ func TestPersistentVolumeDescriber(t *testing.T) {
} }
func TestDescribeDeployment(t *testing.T) { func TestDescribeDeployment(t *testing.T) {
fake := fake.NewSimpleClientset(&extensions.Deployment{ fake := fake.NewSimpleClientset()
ObjectMeta: api.ObjectMeta{ versionedFake := versionedfake.NewSimpleClientset(&v1beta1.Deployment{
ObjectMeta: v1.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
}, },
Spec: extensions.DeploymentSpec{ Spec: v1beta1.DeploymentSpec{
Template: api.PodTemplateSpec{}, Selector: &unversioned.LabelSelector{},
Template: v1.PodTemplateSpec{},
}, },
}) })
d := DeploymentDescriber{fake} d := DeploymentDescriber{fake, versionedFake}
out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true}) out, err := d.Describe("foo", "bar", DescriberSettings{ShowEvents: true})
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -748,12 +753,16 @@ func TestDescribeEvents(t *testing.T) {
}, events), }, events),
}, },
"DeploymentDescriber": &DeploymentDescriber{ "DeploymentDescriber": &DeploymentDescriber{
fake.NewSimpleClientset(&extensions.Deployment{ fake.NewSimpleClientset(events),
ObjectMeta: api.ObjectMeta{ versionedfake.NewSimpleClientset(&v1beta1.Deployment{
ObjectMeta: v1.ObjectMeta{
Name: "bar", Name: "bar",
Namespace: "foo", Namespace: "foo",
}, },
}, events), Spec: v1beta1.DeploymentSpec{
Selector: &unversioned.LabelSelector{},
},
}),
}, },
"EndpointsDescriber": &EndpointsDescriber{ "EndpointsDescriber": &EndpointsDescriber{
fake.NewSimpleClientset(&api.Endpoints{ fake.NewSimpleClientset(&api.Endpoints{

View File

@ -24,6 +24,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
@ -54,11 +55,12 @@ type DeploymentHistoryViewer struct {
// ViewHistory returns a revision-to-replicaset map as the revision history of a deployment // ViewHistory returns a revision-to-replicaset map as the revision history of a deployment
func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision int64) (string, error) { func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision int64) (string, error) {
deployment, err := h.c.Extensions().Deployments(namespace).Get(name) versionedClient := versionedClientsetForDeployment(h.c)
deployment, err := versionedClient.Extensions().Deployments(namespace).Get(name)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to retrieve deployment %s: %v", name, err) return "", fmt.Errorf("failed to retrieve deployment %s: %v", name, err)
} }
_, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(deployment, h.c) _, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(deployment, versionedClient)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to retrieve replica sets from deployment %s: %v", name, err) return "", fmt.Errorf("failed to retrieve replica sets from deployment %s: %v", name, err)
} }
@ -67,7 +69,7 @@ func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision i
allRSs = append(allRSs, newRS) allRSs = append(allRSs, newRS)
} }
historyInfo := make(map[int64]*api.PodTemplateSpec) historyInfo := make(map[int64]*v1.PodTemplateSpec)
for _, rs := range allRSs { for _, rs := range allRSs {
v, err := deploymentutil.Revision(rs) v, err := deploymentutil.Revision(rs)
if err != nil { if err != nil {
@ -94,7 +96,11 @@ func (h *DeploymentHistoryViewer) ViewHistory(namespace, name string, revision i
return "", fmt.Errorf("unable to find the specified revision") return "", fmt.Errorf("unable to find the specified revision")
} }
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
DescribePodTemplate(template, buf) internalTemplate := &api.PodTemplateSpec{}
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
DescribePodTemplate(internalTemplate, buf)
return buf.String(), nil return buf.String(), nil
} }

View File

@ -25,7 +25,9 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
externalextensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -130,7 +132,12 @@ func isRollbackEvent(e *api.Event) (bool, string) {
} }
func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRevision int64) (string, error) { func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRevision int64) (string, error) {
_, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(deployment, c) externalDeployment := &externalextensions.Deployment{}
if err := api.Scheme.Convert(deployment, externalDeployment, nil); err != nil {
return "", fmt.Errorf("failed to convert deployment, %v", err)
}
versionedClient := versionedClientsetForDeployment(c)
_, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(externalDeployment, versionedClient)
if err != nil { if err != nil {
return "", fmt.Errorf("failed to retrieve replica sets from deployment %s: %v", deployment.Name, err) return "", fmt.Errorf("failed to retrieve replica sets from deployment %s: %v", deployment.Name, err)
} }
@ -139,7 +146,7 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
allRSs = append(allRSs, newRS) allRSs = append(allRSs, newRS)
} }
revisionToSpec := make(map[int64]*api.PodTemplateSpec) revisionToSpec := make(map[int64]*v1.PodTemplateSpec)
for _, rs := range allRSs { for _, rs := range allRSs {
v, err := deploymentutil.Revision(rs) v, err := deploymentutil.Revision(rs)
if err != nil { if err != nil {
@ -158,7 +165,11 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
return "", fmt.Errorf("unable to find specified revision") return "", fmt.Errorf("unable to find specified revision")
} }
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
DescribePodTemplate(template, buf) internalTemplate := &api.PodTemplateSpec{}
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
DescribePodTemplate(internalTemplate, buf)
return buf.String(), nil return buf.String(), nil
} }
@ -172,6 +183,10 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
template, _ := revisionToSpec[revisions[len(revisions)-1]] template, _ := revisionToSpec[revisions[len(revisions)-1]]
buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
buf.WriteString("\n") buf.WriteString("\n")
DescribePodTemplate(template, buf) internalTemplate := &api.PodTemplateSpec{}
if err := v1.Convert_v1_PodTemplateSpec_To_api_PodTemplateSpec(template, internalTemplate, nil); err != nil {
return "", fmt.Errorf("failed to convert podtemplate, %v", err)
}
DescribePodTemplate(internalTemplate, buf)
return buf.String(), nil return buf.String(), nil
} }

View File

@ -27,6 +27,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/v1"
coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
"k8s.io/kubernetes/pkg/client/retry" "k8s.io/kubernetes/pkg/client/retry"
client "k8s.io/kubernetes/pkg/client/unversioned" client "k8s.io/kubernetes/pkg/client/unversioned"
@ -420,7 +421,11 @@ func (r *RollingUpdater) readyPods(oldRc, newRc *api.ReplicationController, minR
return 0, 0, err return 0, 0, err
} }
for _, pod := range pods.Items { for _, pod := range pods.Items {
if !deploymentutil.IsPodAvailable(&pod, minReadySeconds, r.nowFn().Time) { v1Pod := &v1.Pod{}
if err := v1.Convert_api_Pod_To_v1_Pod(&pod, v1Pod, nil); err != nil {
return 0, 0, err
}
if !deploymentutil.IsPodAvailable(v1Pod, minReadySeconds, r.nowFn().Time) {
continue continue
} }
switch controller.Name { switch controller.Name {

View File

@ -59,7 +59,7 @@ func (s *DeploymentStatusViewer) Status(namespace, name string, revision int64)
} }
} }
if deployment.Generation <= deployment.Status.ObservedGeneration { if deployment.Generation <= deployment.Status.ObservedGeneration {
cond := util.GetDeploymentCondition(deployment.Status, extensions.DeploymentProgressing) cond := util.GetDeploymentConditionInternal(deployment.Status, extensions.DeploymentProgressing)
if cond != nil && cond.Reason == util.TimedOutReason { if cond != nil && cond.Reason == util.TimedOutReason {
return "", false, fmt.Errorf("deployment %q exceeded its progress deadline", name) return "", false, fmt.Errorf("deployment %q exceeded its progress deadline", name)
} }

View File

@ -79,7 +79,7 @@ func (list SortableVolumeMounts) Less(i, j int) bool {
func SortedQoSResourceNames(list qos.QOSList) []api.ResourceName { func SortedQoSResourceNames(list qos.QOSList) []api.ResourceName {
resources := make([]api.ResourceName, 0, len(list)) resources := make([]api.ResourceName, 0, len(list))
for res := range list { for res := range list {
resources = append(resources, res) resources = append(resources, api.ResourceName(res))
} }
sort.Sort(SortableResourceNames(resources)) sort.Sort(SortableResourceNames(resources))
return resources return resources

View File

@ -429,7 +429,7 @@ func (reaper *DeploymentReaper) Stop(namespace, name string, timeout time.Durati
} }
// Use observedGeneration to determine if the deployment controller noticed the pause. // Use observedGeneration to determine if the deployment controller noticed the pause.
if err := deploymentutil.WaitForObservedDeployment(func() (*extensions.Deployment, error) { if err := deploymentutil.WaitForObservedDeploymentInternal(func() (*extensions.Deployment, error) {
return deployments.Get(name) return deployments.Get(name)
}, deployment.Generation, 1*time.Second, 1*time.Minute); err != nil { }, deployment.Generation, 1*time.Second, 1*time.Minute); err != nil {
return err return err

View File

@ -438,7 +438,7 @@ func TestDeploymentStop(t *testing.T) {
Replicas: 0, Replicas: 0,
}, },
} }
template := deploymentutil.GetNewReplicaSetTemplate(&deployment) template := deploymentutil.GetNewReplicaSetTemplateInternal(&deployment)
tests := []struct { tests := []struct {
Name string Name string
Objs []runtime.Object Objs []runtime.Object
@ -675,7 +675,7 @@ func TestDeploymentNotFoundError(t *testing.T) {
Replicas: 0, Replicas: 0,
}, },
} }
template := deploymentutil.GetNewReplicaSetTemplate(deployment) template := deploymentutil.GetNewReplicaSetTemplateInternal(deployment)
fake := fake.NewSimpleClientset( fake := fake.NewSimpleClientset(
deployment, deployment,

View File

@ -0,0 +1,34 @@
/*
Copyright 2016 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 (
internalclientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
externalclientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5"
core "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/core/v1"
extensions "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_5/typed/extensions/v1beta1"
)
func versionedClientsetForDeployment(internalClient internalclientset.Interface) externalclientset.Interface {
if internalClient == nil {
return &externalclientset.Clientset{}
}
return &externalclientset.Clientset{
CoreV1Client: core.New(internalClient.Core().RESTClient()),
ExtensionsV1beta1Client: extensions.New(internalClient.Extensions().RESTClient()),
}
}