Commit 5590c1fb authored by Kenneth Owens's avatar Kenneth Owens

gets the correct version of kubernetes client for DaemonSet and StatefulSet…

gets the correct version of kubernetes client for DaemonSet and StatefulSet History and Rollback and updates test-cmd for new versions
parent 7c772ab2
...@@ -1390,7 +1390,7 @@ run_kubectl_get_tests() { ...@@ -1390,7 +1390,7 @@ run_kubectl_get_tests() {
kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/pods 200 OK" kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/pods 200 OK"
kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/replicationcontrollers 200 OK" kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/replicationcontrollers 200 OK"
kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/services 200 OK" kube::test::if_has_string "${output_message}" "/api/v1/namespaces/default/services 200 OK"
kube::test::if_has_string "${output_message}" "/apis/apps/v1beta1/namespaces/default/statefulsets 200 OK" kube::test::if_has_string "${output_message}" "/apis/apps/v1/namespaces/default/statefulsets 200 OK"
kube::test::if_has_string "${output_message}" "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers 200" kube::test::if_has_string "${output_message}" "/apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers 200"
kube::test::if_has_string "${output_message}" "/apis/batch/v1/namespaces/default/jobs 200 OK" kube::test::if_has_string "${output_message}" "/apis/batch/v1/namespaces/default/jobs 200 OK"
kube::test::if_has_string "${output_message}" "/apis/extensions/v1beta1/namespaces/default/deployments 200 OK" kube::test::if_has_string "${output_message}" "/apis/extensions/v1beta1/namespaces/default/deployments 200 OK"
...@@ -2749,7 +2749,7 @@ run_deployment_tests() { ...@@ -2749,7 +2749,7 @@ run_deployment_tests() {
output_message=$(kubectl get deployment.extensions -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}") output_message=$(kubectl get deployment.extensions -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}")
kube::test::if_has_string "${output_message}" 'extensions/v1beta1' kube::test::if_has_string "${output_message}" 'extensions/v1beta1'
output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}") output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}")
kube::test::if_has_string "${output_message}" 'apps/v1beta1' kube::test::if_has_string "${output_message}" 'apps/v1'
# Clean up # Clean up
kubectl delete deployment test-nginx-extensions "${kube_flags[@]}" kubectl delete deployment test-nginx-extensions "${kube_flags[@]}"
...@@ -2764,7 +2764,7 @@ run_deployment_tests() { ...@@ -2764,7 +2764,7 @@ run_deployment_tests() {
output_message=$(kubectl get deployment.extensions -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}") output_message=$(kubectl get deployment.extensions -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}")
kube::test::if_has_string "${output_message}" 'extensions/v1beta1' kube::test::if_has_string "${output_message}" 'extensions/v1beta1'
output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}") output_message=$(kubectl get deployment.apps -o=jsonpath='{.items[0].apiVersion}' 2>&1 "${kube_flags[@]}")
kube::test::if_has_string "${output_message}" 'apps/v1beta1' kube::test::if_has_string "${output_message}" 'apps/v1'
# Describe command (resource only) should print detailed information # Describe command (resource only) should print detailed information
kube::test::describe_resource_assert rs "Name:" "Pod Template:" "Labels:" "Selector:" "Controlled By" "Replicas:" "Pods Status:" "Volumes:" kube::test::describe_resource_assert rs "Name:" "Pod Template:" "Labels:" "Selector:" "Controlled By" "Replicas:" "Pods Status:" "Volumes:"
# Describe command (resource only) should print detailed information # Describe command (resource only) should print detailed information
......
...@@ -171,6 +171,7 @@ go_library( ...@@ -171,6 +171,7 @@ go_library(
"//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/watch:go_default_library", "//vendor/k8s.io/apimachinery/pkg/watch:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", "//vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library", "//vendor/k8s.io/client-go/rest:go_default_library",
......
...@@ -314,21 +314,19 @@ func (f *ring1Factory) Reaper(mapping *meta.RESTMapping) (kubectl.Reaper, error) ...@@ -314,21 +314,19 @@ func (f *ring1Factory) Reaper(mapping *meta.RESTMapping) (kubectl.Reaper, error)
} }
func (f *ring1Factory) HistoryViewer(mapping *meta.RESTMapping) (kubectl.HistoryViewer, error) { func (f *ring1Factory) HistoryViewer(mapping *meta.RESTMapping) (kubectl.HistoryViewer, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() external, err := f.clientAccessFactory.KubernetesClientSet()
clientset, err := f.clientAccessFactory.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kubectl.HistoryViewerFor(mapping.GroupVersionKind.GroupKind(), clientset) return kubectl.HistoryViewerFor(mapping.GroupVersionKind.GroupKind(), external)
} }
func (f *ring1Factory) Rollbacker(mapping *meta.RESTMapping) (kubectl.Rollbacker, error) { func (f *ring1Factory) Rollbacker(mapping *meta.RESTMapping) (kubectl.Rollbacker, error) {
mappingVersion := mapping.GroupVersionKind.GroupVersion() external, err := f.clientAccessFactory.KubernetesClientSet()
clientset, err := f.clientAccessFactory.ClientSetForVersion(&mappingVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return kubectl.RollbackerFor(mapping.GroupVersionKind.GroupKind(), clientset) return kubectl.RollbackerFor(mapping.GroupVersionKind.GroupKind(), external)
} }
func (f *ring1Factory) StatusViewer(mapping *meta.RESTMapping) (kubectl.StatusViewer, error) { func (f *ring1Factory) StatusViewer(mapping *meta.RESTMapping) (kubectl.StatusViewer, error) {
......
...@@ -26,18 +26,19 @@ import ( ...@@ -26,18 +26,19 @@ import (
appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta1 "k8s.io/api/apps/v1beta1"
"k8s.io/api/core/v1" "k8s.io/api/core/v1"
externalextensions "k8s.io/api/extensions/v1beta1" extv1beta1 "k8s.io/api/extensions/v1beta1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/api/legacyscheme"
apiv1 "k8s.io/kubernetes/pkg/api/v1" apiv1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/apis/extensions"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/controller/daemon" "k8s.io/kubernetes/pkg/controller/daemon"
deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util"
"k8s.io/kubernetes/pkg/controller/statefulset" "k8s.io/kubernetes/pkg/controller/statefulset"
...@@ -55,7 +56,7 @@ type Rollbacker interface { ...@@ -55,7 +56,7 @@ type Rollbacker interface {
Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error)
} }
func RollbackerFor(kind schema.GroupKind, c clientset.Interface) (Rollbacker, error) { func RollbackerFor(kind schema.GroupKind, c kubernetes.Interface) (Rollbacker, error) {
switch kind { switch kind {
case extensions.Kind("Deployment"), apps.Kind("Deployment"): case extensions.Kind("Deployment"), apps.Kind("Deployment"):
return &DeploymentRollbacker{c}, nil return &DeploymentRollbacker{c}, nil
...@@ -68,7 +69,7 @@ func RollbackerFor(kind schema.GroupKind, c clientset.Interface) (Rollbacker, er ...@@ -68,7 +69,7 @@ func RollbackerFor(kind schema.GroupKind, c clientset.Interface) (Rollbacker, er
} }
type DeploymentRollbacker struct { type DeploymentRollbacker struct {
c clientset.Interface c kubernetes.Interface
} }
func (r *DeploymentRollbacker) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) { func (r *DeploymentRollbacker) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) {
...@@ -82,26 +83,26 @@ func (r *DeploymentRollbacker) Rollback(obj runtime.Object, updatedAnnotations m ...@@ -82,26 +83,26 @@ func (r *DeploymentRollbacker) Rollback(obj runtime.Object, updatedAnnotations m
if d.Spec.Paused { if d.Spec.Paused {
return "", fmt.Errorf("you cannot rollback a paused deployment; resume it first with 'kubectl rollout resume deployment/%s' and try again", d.Name) return "", fmt.Errorf("you cannot rollback a paused deployment; resume it first with 'kubectl rollout resume deployment/%s' and try again", d.Name)
} }
deploymentRollback := &extensions.DeploymentRollback{ deploymentRollback := &extv1beta1.DeploymentRollback{
Name: d.Name, Name: d.Name,
UpdatedAnnotations: updatedAnnotations, UpdatedAnnotations: updatedAnnotations,
RollbackTo: extensions.RollbackConfig{ RollbackTo: extv1beta1.RollbackConfig{
Revision: toRevision, Revision: toRevision,
}, },
} }
result := "" result := ""
// Get current events // Get current events
events, err := r.c.Core().Events(d.Namespace).List(metav1.ListOptions{}) events, err := r.c.CoreV1().Events(d.Namespace).List(metav1.ListOptions{})
if err != nil { if err != nil {
return result, err return result, err
} }
// Do the rollback // Do the rollback
if err := r.c.Extensions().Deployments(d.Namespace).Rollback(deploymentRollback); err != nil { if err := r.c.ExtensionsV1beta1().Deployments(d.Namespace).Rollback(deploymentRollback); err != nil {
return result, err return result, err
} }
// Watch for the changes of events // Watch for the changes of events
watch, err := r.c.Core().Events(d.Namespace).Watch(metav1.ListOptions{Watch: true, ResourceVersion: events.ResourceVersion}) watch, err := r.c.CoreV1().Events(d.Namespace).Watch(metav1.ListOptions{Watch: true, ResourceVersion: events.ResourceVersion})
if err != nil { if err != nil {
return result, err return result, err
} }
...@@ -150,13 +151,13 @@ func isRollbackEvent(e *api.Event) (bool, string) { ...@@ -150,13 +151,13 @@ func isRollbackEvent(e *api.Event) (bool, string) {
return false, "" return false, ""
} }
func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRevision int64) (string, error) { func simpleDryRun(deployment *extensions.Deployment, c kubernetes.Interface, toRevision int64) (string, error) {
externalDeployment := &externalextensions.Deployment{} externalDeployment := &extv1beta1.Deployment{}
if err := legacyscheme.Scheme.Convert(deployment, externalDeployment, nil); err != nil { if err := legacyscheme.Scheme.Convert(deployment, externalDeployment, nil); err != nil {
return "", fmt.Errorf("failed to convert deployment, %v", err) return "", fmt.Errorf("failed to convert deployment, %v", err)
} }
versionedExtensionsClient := versionedExtensionsClientV1beta1(c)
_, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(externalDeployment, versionedExtensionsClient) _, allOldRSs, newRS, err := deploymentutil.GetAllReplicaSets(externalDeployment, c.ExtensionsV1beta1())
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)
} }
...@@ -213,40 +214,32 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe ...@@ -213,40 +214,32 @@ func simpleDryRun(deployment *extensions.Deployment, c clientset.Interface, toRe
} }
type DaemonSetRollbacker struct { type DaemonSetRollbacker struct {
c clientset.Interface c kubernetes.Interface
} }
func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) { func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations map[string]string, toRevision int64, dryRun bool) (string, error) {
if toRevision < 0 { if toRevision < 0 {
return "", revisionNotFoundErr(toRevision) return "", revisionNotFoundErr(toRevision)
} }
accessor, err := meta.Accessor(obj)
ds, ok := obj.(*extensions.DaemonSet)
if !ok {
return "", fmt.Errorf("passed object is not a DaemonSet: %#v", obj)
}
versionedAppsClient := versionedAppsClientV1beta1(r.c)
versionedExtensionsClient := versionedExtensionsClientV1beta1(r.c)
versionedObj, allHistory, err := controlledHistories(versionedAppsClient, versionedExtensionsClient, ds.Namespace, ds.Name, "DaemonSet")
if err != nil { if err != nil {
return "", fmt.Errorf("unable to find history controlled by DaemonSet %s: %v", ds.Name, err) return "", fmt.Errorf("failed to create accessor for kind %v: %s", obj.GetObjectKind(), err.Error())
} }
versionedDS, ok := versionedObj.(*externalextensions.DaemonSet) ds, history, err := daemonSetHistory(r.c.ExtensionsV1beta1(), r.c.AppsV1beta1(), accessor.GetNamespace(), accessor.GetName())
if !ok { if err != nil {
return "", fmt.Errorf("unexpected non-DaemonSet object returned: %v", versionedDS) return "", err
} }
if toRevision == 0 && len(history) <= 1 {
if toRevision == 0 && len(allHistory) <= 1 {
return "", fmt.Errorf("no last revision to roll back to") return "", fmt.Errorf("no last revision to roll back to")
} }
toHistory := findHistory(toRevision, allHistory) toHistory := findHistory(toRevision, history)
if toHistory == nil { if toHistory == nil {
return "", revisionNotFoundErr(toRevision) return "", revisionNotFoundErr(toRevision)
} }
if dryRun { if dryRun {
appliedDS, err := applyHistory(versionedDS, toHistory) appliedDS, err := applyDaemonSetHistory(ds, toHistory)
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -254,7 +247,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma ...@@ -254,7 +247,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma
} }
// Skip if the revision already matches current DaemonSet // Skip if the revision already matches current DaemonSet
done, err := daemon.Match(versionedDS, toHistory) done, err := daemon.Match(ds, toHistory)
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -263,7 +256,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma ...@@ -263,7 +256,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma
} }
// Restore revision // Restore revision
if _, err = versionedExtensionsClient.DaemonSets(ds.Namespace).Patch(ds.Name, types.StrategicMergePatchType, toHistory.Data.Raw); err != nil { if _, err = r.c.ExtensionsV1beta1().DaemonSets(accessor.GetNamespace()).Patch(accessor.GetName(), types.StrategicMergePatchType, toHistory.Data.Raw); err != nil {
return "", fmt.Errorf("failed restoring revision %d: %v", toRevision, err) return "", fmt.Errorf("failed restoring revision %d: %v", toRevision, err)
} }
...@@ -271,7 +264,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma ...@@ -271,7 +264,7 @@ func (r *DaemonSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ma
} }
type StatefulSetRollbacker struct { type StatefulSetRollbacker struct {
c clientset.Interface c kubernetes.Interface
} }
// toRevision is a non-negative integer, with 0 being reserved to indicate rolling back to previous configuration // toRevision is a non-negative integer, with 0 being reserved to indicate rolling back to previous configuration
...@@ -279,34 +272,25 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ...@@ -279,34 +272,25 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations
if toRevision < 0 { if toRevision < 0 {
return "", revisionNotFoundErr(toRevision) return "", revisionNotFoundErr(toRevision)
} }
accessor, err := meta.Accessor(obj)
ss, ok := obj.(*apps.StatefulSet)
if !ok {
return "", fmt.Errorf("passed object is not a StatefulSet: %#v", obj)
}
versionedAppsClient := versionedAppsClientV1beta1(r.c)
versionedExtensionsClient := versionedExtensionsClientV1beta1(r.c)
versionedObj, allHistory, err := controlledHistories(versionedAppsClient, versionedExtensionsClient, ss.Namespace, ss.Name, "StatefulSet")
if err != nil { if err != nil {
return "", fmt.Errorf("unable to find history controlled by StatefulSet %s: %v", ss.Name, err) return "", fmt.Errorf("failed to create accessor for kind %v: %s", obj.GetObjectKind(), err.Error())
} }
sts, history, err := statefulSetHistory(r.c.AppsV1beta1(), accessor.GetNamespace(), accessor.GetName())
versionedSS, ok := versionedObj.(*appsv1beta1.StatefulSet) if err != nil {
if !ok { return "", err
return "", fmt.Errorf("unexpected non-StatefulSet object returned: %v", versionedSS)
} }
if toRevision == 0 && len(history) <= 1 {
if toRevision == 0 && len(allHistory) <= 1 {
return "", fmt.Errorf("no last revision to roll back to") return "", fmt.Errorf("no last revision to roll back to")
} }
toHistory := findHistory(toRevision, allHistory) toHistory := findHistory(toRevision, history)
if toHistory == nil { if toHistory == nil {
return "", revisionNotFoundErr(toRevision) return "", revisionNotFoundErr(toRevision)
} }
if dryRun { if dryRun {
appliedSS, err := statefulset.ApplyRevision(versionedSS, toHistory) appliedSS, err := statefulset.ApplyRevision(sts, toHistory)
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -314,7 +298,7 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ...@@ -314,7 +298,7 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations
} }
// Skip if the revision already matches current StatefulSet // Skip if the revision already matches current StatefulSet
done, err := statefulset.Match(versionedSS, toHistory) done, err := statefulset.Match(sts, toHistory)
if err != nil { if err != nil {
return "", err return "", err
} }
...@@ -323,7 +307,7 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations ...@@ -323,7 +307,7 @@ func (r *StatefulSetRollbacker) Rollback(obj runtime.Object, updatedAnnotations
} }
// Restore revision // Restore revision
if _, err = versionedAppsClient.StatefulSets(ss.Namespace).Patch(ss.Name, types.StrategicMergePatchType, toHistory.Data.Raw); err != nil { if _, err = r.c.AppsV1beta1().StatefulSets(sts.Namespace).Patch(sts.Name, types.StrategicMergePatchType, toHistory.Data.Raw); err != nil {
return "", fmt.Errorf("failed restoring revision %d: %v", toRevision, err) return "", fmt.Errorf("failed restoring revision %d: %v", toRevision, err)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment