// Describe returns the description of a DeploymentConfig func (d *DeploymentConfigDescriber) Describe(namespace, name string) (string, error) { deploymentConfig, err := d.client.getDeploymentConfig(namespace, name) if err != nil { return "", err } events, err := d.client.listEvents(deploymentConfig) if err != nil { return "", err } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, deploymentConfig.ObjectMeta) if deploymentConfig.LatestVersion == 0 { formatString(out, "Latest Version", "Not deployed") } else { formatString(out, "Latest Version", strconv.Itoa(deploymentConfig.LatestVersion)) } printTriggers(deploymentConfig.Triggers, out) formatString(out, "Strategy", deploymentConfig.Template.Strategy.Type) printStrategy(deploymentConfig.Template.Strategy, out) printReplicationControllerSpec(deploymentConfig.Template.ControllerTemplate, out) deploymentName := deployutil.LatestDeploymentNameForConfig(deploymentConfig) deployment, err := d.client.getDeployment(namespace, deploymentName) if err != nil { if kerrors.IsNotFound(err) { formatString(out, "Latest Deployment", "<none>") } else { formatString(out, "Latest Deployment", fmt.Sprintf("error: %v", err)) } } else { header := fmt.Sprintf("Deployment #%d (latest)", deployutil.DeploymentVersionFor(deployment)) printDeploymentRc(deployment, d.client, out, header, true) } deploymentsHistory, err := d.client.listDeployments(namespace, labels.Everything()) if err == nil { sorted := rcSorter{} sorted = append(sorted, deploymentsHistory.Items...) sort.Sort(sorted) for _, item := range sorted { if item.Name != deploymentName && deploymentConfig.Name == deployutil.DeploymentConfigNameFor(&item) { header := fmt.Sprintf("Deployment #%d", deployutil.DeploymentVersionFor(&item)) printDeploymentRc(&item, d.client, out, header, false) } } } if events != nil { kctl.DescribeEvents(events, out) } return nil }) }
// Describe returns the description of a build func (d *BuildDescriber) Describe(namespace, name string) (string, error) { c := d.osClient.Builds(namespace) build, err := c.Get(name) if err != nil { return "", err } events, _ := d.kubeClient.Events(namespace).Search(build) if events == nil { events = &kapi.EventList{} } // get also pod events and merge it all into one list for describe if pod, err := d.kubeClient.Pods(namespace).Get(buildutil.GetBuildPodName(build)); err == nil { if podEvents, _ := d.kubeClient.Events(namespace).Search(pod); podEvents != nil { events.Items = append(events.Items, podEvents.Items...) } } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, build.ObjectMeta) if build.Config != nil { formatString(out, "Build Config", build.Config.Name) } status := bold(build.Status) if build.Status == buildapi.BuildStatusFailed { status += " (" + build.Message + ")" } formatString(out, "Status", status) if build.StartTimestamp != nil { formatString(out, "Started", build.StartTimestamp.Time) } if build.CompletionTimestamp != nil { formatString(out, "Finished", build.CompletionTimestamp.Time) } // Create the time object with second-level precision so we don't get // output like "duration: 1.2724395728934s" formatString(out, "Duration", describeBuildDuration(build)) formatString(out, "Build Pod", buildutil.GetBuildPodName(build)) describeBuildParameters(build.Parameters, out) kctl.DescribeEvents(events, out) return nil }) }