func describeDeploymentStatus(deploy *kapi.ReplicationController, first bool) string { timeAt := strings.ToLower(formatRelativeTime(deploy.CreationTimestamp.Time)) status := deployutil.DeploymentStatusFor(deploy) version := deployutil.DeploymentVersionFor(deploy) switch status { case deployapi.DeploymentStatusFailed: reason := deployutil.DeploymentStatusReasonFor(deploy) if len(reason) > 0 { reason = fmt.Sprintf(": %s", reason) } // TODO: encode fail time in the rc return fmt.Sprintf("#%d deployment failed %s ago%s%s", version, timeAt, reason, describeDeploymentPodSummaryInline(deploy, false)) case deployapi.DeploymentStatusComplete: // TODO: pod status output return fmt.Sprintf("#%d deployed %s ago%s", version, timeAt, describeDeploymentPodSummaryInline(deploy, first)) case deployapi.DeploymentStatusRunning: return fmt.Sprintf("#%d deployment running for %s%s", version, timeAt, describeDeploymentPodSummaryInline(deploy, false)) default: return fmt.Sprintf("#%d deployment %s %s ago%s", version, strings.ToLower(string(status)), timeAt, describeDeploymentPodSummaryInline(deploy, false)) } }
// TestCmdDeploy_retryOk ensures that a failed deployment can be retried. func TestCmdDeploy_retryOk(t *testing.T) { deletedPods := []string{} config := deploytest.OkDeploymentConfig(1) existingDeployment := deploymentFor(config, deployapi.DeploymentStatusFailed) existingDeployment.Annotations[deployapi.DeploymentCancelledAnnotation] = deployapi.DeploymentCancelledAnnotationValue existingDeployment.Annotations[deployapi.DeploymentStatusReasonAnnotation] = deployapi.DeploymentCancelledByUser existingDeployerPods := []kapi.Pod{ {ObjectMeta: kapi.ObjectMeta{Name: "prehook"}}, {ObjectMeta: kapi.ObjectMeta{Name: "posthook"}}, {ObjectMeta: kapi.ObjectMeta{Name: "deployerpod"}}, } var updatedDeployment *kapi.ReplicationController commandClient := &deployCommandClientImpl{ GetDeploymentFn: func(namespace, name string) (*kapi.ReplicationController, error) { return existingDeployment, nil }, UpdateDeploymentConfigFn: func(config *deployapi.DeploymentConfig) (*deployapi.DeploymentConfig, error) { t.Fatalf("unexpected call to UpdateDeploymentConfig") return nil, nil }, UpdateDeploymentFn: func(deployment *kapi.ReplicationController) (*kapi.ReplicationController, error) { updatedDeployment = deployment return deployment, nil }, ListDeployerPodsForFn: func(namespace, name string) (*kapi.PodList, error) { return &kapi.PodList{Items: existingDeployerPods}, nil }, DeletePodFn: func(pod *kapi.Pod) error { deletedPods = append(deletedPods, pod.Name) return nil }, } c := &retryDeploymentCommand{client: commandClient} err := c.retry(config, ioutil.Discard) if err != nil { t.Fatalf("unexpected error: %v", err) } if updatedDeployment == nil { t.Fatalf("expected updated config") } if deployutil.IsDeploymentCancelled(updatedDeployment) { t.Fatalf("deployment should not have the cancelled flag set anymore") } if deployutil.DeploymentStatusReasonFor(updatedDeployment) != "" { t.Fatalf("deployment status reason should be empty") } sort.Strings(deletedPods) if !reflect.DeepEqual(deletedPods, []string{"deployerpod", "posthook", "prehook"}) { t.Fatalf("Not all deployer pods for the failed deployment were deleted") } if e, a := deployapi.DeploymentStatusNew, deployutil.DeploymentStatusFor(updatedDeployment); e != a { t.Fatalf("expected deployment status %s, got %s", e, a) } }