Implements kubectl rollout status and history for StatefulSet

This commit is contained in:
Kenneth Owens
2017-06-04 15:31:23 -07:00
parent 1b55f57391
commit cec4171775
3 changed files with 285 additions and 0 deletions

View File

@@ -52,6 +52,8 @@ func HistoryViewerFor(kind schema.GroupKind, c clientset.Interface) (HistoryView
switch kind {
case extensions.Kind("Deployment"), apps.Kind("Deployment"):
return &DeploymentHistoryViewer{c}, nil
case apps.Kind("StatefulSet"):
return &StatefulSetHistoryViewer{c}, nil
case extensions.Kind("DaemonSet"):
return &DaemonSetHistoryViewer{c}, nil
}
@@ -200,6 +202,58 @@ func (h *DaemonSetHistoryViewer) ViewHistory(namespace, name string, revision in
})
}
type StatefulSetHistoryViewer struct {
c clientset.Interface
}
func getOwner(revision apps.ControllerRevision) *metav1.OwnerReference {
ownerRefs := revision.GetOwnerReferences()
for i := range ownerRefs {
owner := &ownerRefs[i]
if owner.Controller != nil && *owner.Controller == true {
return owner
}
}
return nil
}
// ViewHistory returns a list of the revision history of a statefulset
// TODO: this should be a describer
// TODO: needs to implement detailed revision view
func (h *StatefulSetHistoryViewer) ViewHistory(namespace, name string, revision int64) (string, error) {
sts, err := h.c.Apps().StatefulSets(namespace).Get(name, metav1.GetOptions{})
if err != nil {
return "", fmt.Errorf("failed to retrieve statefulset %s", err)
}
selector, err := metav1.LabelSelectorAsSelector(sts.Spec.Selector)
if err != nil {
return "", fmt.Errorf("failed to retrieve statefulset history %s", err)
}
revisions, err := h.c.Apps().ControllerRevisions(namespace).List(metav1.ListOptions{LabelSelector: selector.String()})
if err != nil {
return "", fmt.Errorf("failed to retrieve statefulset history %s", err)
}
if len(revisions.Items) <= 0 {
return "No rollout history found.", nil
}
revisionNumbers := make([]int64, len(revisions.Items))
for i := range revisions.Items {
if owner := getOwner(revisions.Items[i]); owner != nil && owner.UID == sts.UID {
revisionNumbers[i] = revisions.Items[i].Revision
}
}
sliceutil.SortInts64(revisionNumbers)
return tabbedString(func(out io.Writer) error {
fmt.Fprintf(out, "REVISION\n")
for _, r := range revisionNumbers {
fmt.Fprintf(out, "%d\n", r)
}
return nil
})
}
// controlledHistories returns all ControllerRevisions controlled by the given DaemonSet
// TODO: Use external version DaemonSet instead when #3955 is fixed
func controlledHistories(c clientset.Interface, ds *extensions.DaemonSet) ([]*appsv1beta1.ControllerRevision, error) {