func status(container *docker.Container, config *api.MasterConfig) string { mountMap := make(map[string]string) for _, mount := range container.Mounts { mountMap[mount.Destination] = mount.Source } duration := strings.ToLower(units.HumanDuration(time.Now().Sub(container.State.StartedAt))) status := fmt.Sprintf("The OpenShift cluster was started %s ago\n\n", duration) status = status + fmt.Sprintf("Web console URL: %s\n", config.AssetConfig.MasterPublicURL) if config.AssetConfig.MetricsPublicURL != "" { status = status + fmt.Sprintf("Metrics URL: %s\n", config.AssetConfig.MetricsPublicURL) } if config.AssetConfig.LoggingPublicURL != "" { status = status + fmt.Sprintf("Logging URL: %s\n", config.AssetConfig.LoggingPublicURL) } status = status + fmt.Sprintf("\n") status = status + fmt.Sprintf("Config is at host directory %s\n", mountMap["/var/lib/origin/openshift.local.config"]) status = status + fmt.Sprintf("Volumes are at host directory %s\n", mountMap["/var/lib/origin/openshift.local.volumes"]) if _, hasKey := mountMap["/var/lib/origin/openshift.local.etcd"]; hasKey { status = status + fmt.Sprintf("Data is at host directory %s\n", mountMap["/var/lib/origin/openshift.local.etcd"]) } else { status = status + fmt.Sprintf("Data will be discarded when cluster is destroyed\n") } return status }
// cancel cancels any deployment process in progress for config. func (o DeployOptions) cancel(config *deployapi.DeploymentConfig) error { if config.Spec.Paused { return fmt.Errorf("cannot cancel a paused deployment config") } deployments, err := o.kubeClient.ReplicationControllers(config.Namespace).List(kapi.ListOptions{LabelSelector: deployutil.ConfigSelector(config.Name)}) if err != nil { return err } if len(deployments.Items) == 0 { fmt.Fprintf(o.out, "There have been no deployments for %s/%s\n", config.Namespace, config.Name) return nil } sort.Sort(deployutil.ByLatestVersionDesc(deployments.Items)) failedCancellations := []string{} anyCancelled := false for _, deployment := range deployments.Items { status := deployutil.DeploymentStatusFor(&deployment) switch status { case deployapi.DeploymentStatusNew, deployapi.DeploymentStatusPending, deployapi.DeploymentStatusRunning: if deployutil.IsDeploymentCancelled(&deployment) { continue } deployment.Annotations[deployapi.DeploymentCancelledAnnotation] = deployapi.DeploymentCancelledAnnotationValue deployment.Annotations[deployapi.DeploymentStatusReasonAnnotation] = deployapi.DeploymentCancelledByUser _, err := o.kubeClient.ReplicationControllers(deployment.Namespace).Update(&deployment) if err == nil { fmt.Fprintf(o.out, "Cancelled deployment #%d\n", config.Status.LatestVersion) anyCancelled = true } else { fmt.Fprintf(o.out, "Couldn't cancel deployment #%d (status: %s): %v\n", deployutil.DeploymentVersionFor(&deployment), status, err) failedCancellations = append(failedCancellations, strconv.FormatInt(deployutil.DeploymentVersionFor(&deployment), 10)) } } } if len(failedCancellations) > 0 { return fmt.Errorf("couldn't cancel deployment %s", strings.Join(failedCancellations, ", ")) } if !anyCancelled { latest := &deployments.Items[0] maybeCancelling := "" if deployutil.IsDeploymentCancelled(latest) && !deployutil.IsTerminatedDeployment(latest) { maybeCancelling = " (cancelling)" } timeAt := strings.ToLower(units.HumanDuration(time.Now().Sub(latest.CreationTimestamp.Time))) fmt.Fprintf(o.out, "No deployments are in progress (latest deployment #%d %s%s %s ago)\n", deployutil.DeploymentVersionFor(latest), strings.ToLower(string(deployutil.DeploymentStatusFor(latest))), maybeCancelling, timeAt) } return nil }
func (ctx *serviceInspectContext) UpdateStatusCompleted() string { return units.HumanDuration(time.Since(*ctx.Service.UpdateStatus.CompletedAt)) }
func formatImageStreamTags(out *tabwriter.Writer, stream *imageapi.ImageStream) { if len(stream.Status.Tags) == 0 && len(stream.Spec.Tags) == 0 { fmt.Fprintf(out, "Tags:\t<none>\n") return } now := timeNowFn() images := make(map[string]string) for tag, tags := range stream.Status.Tags { for _, item := range tags.Items { switch { case len(item.Image) > 0: if _, ok := images[item.Image]; !ok { images[item.Image] = tag } case len(item.DockerImageReference) > 0: if _, ok := images[item.DockerImageReference]; !ok { images[item.Image] = item.DockerImageReference } } } } sortedTags := []string{} for k := range stream.Status.Tags { sortedTags = append(sortedTags, k) } var localReferences sets.String var referentialTags map[string]sets.String for k := range stream.Spec.Tags { if target, _, ok, multiple := imageapi.FollowTagReference(stream, k); ok && multiple { if referentialTags == nil { referentialTags = make(map[string]sets.String) } if localReferences == nil { localReferences = sets.NewString() } localReferences.Insert(k) v := referentialTags[target] if v == nil { v = sets.NewString() referentialTags[target] = v } v.Insert(k) } if _, ok := stream.Status.Tags[k]; !ok { sortedTags = append(sortedTags, k) } } fmt.Fprintf(out, "Unique Images:\t%d\nTags:\t%d\n\n", len(images), len(sortedTags)) first := true imageapi.PrioritizeTags(sortedTags) for _, tag := range sortedTags { if localReferences.Has(tag) { continue } if first { first = false } else { fmt.Fprintf(out, "\n") } taglist, _ := stream.Status.Tags[tag] tagRef, hasSpecTag := stream.Spec.Tags[tag] scheduled := false insecure := false importing := false var name string if hasSpecTag && tagRef.From != nil { if len(tagRef.From.Namespace) > 0 && tagRef.From.Namespace != stream.Namespace { name = fmt.Sprintf("%s/%s", tagRef.From.Namespace, tagRef.From.Name) } else { name = tagRef.From.Name } scheduled, insecure = tagRef.ImportPolicy.Scheduled, tagRef.ImportPolicy.Insecure gen := imageapi.LatestObservedTagGeneration(stream, tag) importing = !tagRef.Reference && tagRef.Generation != nil && *tagRef.Generation != gen } // updates whenever tag :5.2 is changed // :latest (30 minutes ago) -> 102.205.358.453/foo/bar@sha256:abcde734 // error: last import failed 20 minutes ago // updates automatically from index.docker.io/mysql/bar // will use insecure HTTPS connections or HTTP // // MySQL 5.5 // --------- // Describes a system for updating based on practical changes to a database system // with some other data involved // // 20 minutes ago <import failed> // Failed to locate the server in time // 30 minutes ago 102.205.358.453/foo/bar@sha256:abcdef // 1 hour ago 102.205.358.453/foo/bar@sha256:bfedfc //var shortErrors []string /* var internalReference *imageapi.DockerImageReference if value := stream.Status.DockerImageRepository; len(value) > 0 { ref, err := imageapi.ParseDockerImageReference(value) if err != nil { internalReference = &ref } } */ if referentialTags[tag].Len() > 0 { references := referentialTags[tag].List() imageapi.PrioritizeTags(references) fmt.Fprintf(out, "%s (%s)\n", tag, strings.Join(references, ", ")) } else { fmt.Fprintf(out, "%s\n", tag) } switch { case !hasSpecTag || tagRef.From == nil: fmt.Fprintf(out, " pushed image\n") case tagRef.From.Kind == "ImageStreamTag": switch { case tagRef.Reference: fmt.Fprintf(out, " reference to %s\n", name) case scheduled: fmt.Fprintf(out, " updates automatically from %s\n", name) default: fmt.Fprintf(out, " tagged from %s\n", name) } case tagRef.From.Kind == "DockerImage": switch { case tagRef.Reference: fmt.Fprintf(out, " reference to registry %s\n", name) case scheduled: fmt.Fprintf(out, " updates automatically from registry %s\n", name) default: fmt.Fprintf(out, " tagged from %s\n", name) } case tagRef.From.Kind == "ImageStreamImage": switch { case tagRef.Reference: fmt.Fprintf(out, " reference to image %s\n", name) default: fmt.Fprintf(out, " tagged from %s\n", name) } default: switch { case tagRef.Reference: fmt.Fprintf(out, " reference to %s %s\n", tagRef.From.Kind, name) default: fmt.Fprintf(out, " updates from %s %s\n", tagRef.From.Kind, name) } } if insecure { fmt.Fprintf(out, " will use insecure HTTPS or HTTP connections\n") } fmt.Fprintln(out) extraOutput := false if d := tagRef.Annotations["description"]; len(d) > 0 { fmt.Fprintf(out, " %s\n", d) extraOutput = true } if t := tagRef.Annotations["tags"]; len(t) > 0 { fmt.Fprintf(out, " Tags: %s\n", strings.Join(strings.Split(t, ","), ", ")) extraOutput = true } if t := tagRef.Annotations["supports"]; len(t) > 0 { fmt.Fprintf(out, " Supports: %s\n", strings.Join(strings.Split(t, ","), ", ")) extraOutput = true } if t := tagRef.Annotations["sampleRepo"]; len(t) > 0 { fmt.Fprintf(out, " Example Repo: %s\n", t) extraOutput = true } if extraOutput { fmt.Fprintln(out) } if importing { fmt.Fprintf(out, " ~ importing latest image ...\n") } for i := range taglist.Conditions { condition := &taglist.Conditions[i] switch condition.Type { case imageapi.ImportSuccess: if condition.Status == api.ConditionFalse { d := now.Sub(condition.LastTransitionTime.Time) fmt.Fprintf(out, " ! error: Import failed (%s): %s\n %s ago\n", condition.Reason, condition.Message, units.HumanDuration(d)) } } } if len(taglist.Items) == 0 { continue } for i, event := range taglist.Items { d := now.Sub(event.Created.Time) if i == 0 { fmt.Fprintf(out, " * %s\n", event.DockerImageReference) } else { fmt.Fprintf(out, " %s\n", event.DockerImageReference) } ref, err := imageapi.ParseDockerImageReference(event.DockerImageReference) id := event.Image if len(id) > 0 && err == nil && ref.ID != id { fmt.Fprintf(out, " %s ago\t%s\n", units.HumanDuration(d), id) } else { fmt.Fprintf(out, " %s ago\n", units.HumanDuration(d)) } } } }
func formatRelativeTime(t time.Time) string { return units.HumanDuration(timeNowFn().Sub(t)) }
// Receives a time.Duration and returns Docker go-utils' // human-readable output func formatToHumanDuration(dur time.Duration) string { return units.HumanDuration(dur) }
func (c *imageContext) CreatedSince() string { c.AddHeader(createdSinceHeader) createdAt := time.Unix(int64(c.i.Created), 0) return units.HumanDuration(time.Now().UTC().Sub(createdAt)) }
func (c *containerContext) RunningFor() string { c.AddHeader(runningForHeader) createdAt := time.Unix(int64(c.c.Created), 0) return units.HumanDuration(time.Now().UTC().Sub(createdAt)) }
func (o CancelOptions) Run() error { allErrs := []error{} for _, info := range o.Infos { config, ok := info.Object.(*deployapi.DeploymentConfig) if !ok { allErrs = append(allErrs, kcmdutil.AddSourceToErr("cancelling", info.Source, fmt.Errorf("expected deployment configuration, got %T", info.Object))) } if config.Spec.Paused { allErrs = append(allErrs, kcmdutil.AddSourceToErr("cancelling", info.Source, fmt.Errorf("unable to cancel paused deployment %s/%s", config.Namespace, config.Name))) } mapping, err := o.Mapper.RESTMapping(kapi.Kind("ReplicationController")) if err != nil { return err } mutateFn := func(rc *kapi.ReplicationController) bool { if deployutil.IsDeploymentCancelled(rc) { kcmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "already cancelled") return false } patches := set.CalculatePatches([]*resource.Info{{Object: rc, Mapping: mapping}}, o.Encoder, func(*resource.Info) (bool, error) { rc.Annotations[deployapi.DeploymentCancelledAnnotation] = deployapi.DeploymentCancelledAnnotationValue rc.Annotations[deployapi.DeploymentStatusReasonAnnotation] = deployapi.DeploymentCancelledByUser return true, nil }) if len(patches) == 0 { kcmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "already cancelled") return false } _, err := o.Clientset.ReplicationControllers(rc.Namespace).Patch(rc.Name, kapi.StrategicMergePatchType, patches[0].Patch) if err != nil { allErrs = append(allErrs, kcmdutil.AddSourceToErr("cancelling", info.Source, err)) return false } kcmdutil.PrintSuccess(o.Mapper, false, o.Out, info.Mapping.Resource, info.Name, false, "cancelling") return true } deployments, cancelled, err := o.forEachControllerInConfig(config.Namespace, config.Name, mutateFn) if err != nil { allErrs = append(allErrs, kcmdutil.AddSourceToErr("cancelling", info.Source, err)) continue } if !cancelled { latest := &deployments[0] maybeCancelling := "" if deployutil.IsDeploymentCancelled(latest) && !deployutil.IsTerminatedDeployment(latest) { maybeCancelling = " (cancelling)" } timeAt := strings.ToLower(units.HumanDuration(time.Now().Sub(latest.CreationTimestamp.Time))) fmt.Fprintf(o.Out, "No rollout is in progress (latest rollout #%d %s%s %s ago)\n", deployutil.DeploymentVersionFor(latest), strings.ToLower(string(deployutil.DeploymentStatusFor(latest))), maybeCancelling, timeAt) } } return utilerrors.NewAggregate(allErrs) }