// 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.Status.LatestVersion == 0 { formatString(out, "Latest Version", "Not deployed") } else { formatString(out, "Latest Version", strconv.Itoa(deploymentConfig.Status.LatestVersion)) } printTriggers(deploymentConfig.Spec.Triggers, out) formatString(out, "Strategy", deploymentConfig.Spec.Strategy.Type) printStrategy(deploymentConfig.Spec.Strategy, out) printDeploymentConfigSpec(deploymentConfig.Spec, out) if deploymentConfig.Status.Details != nil && len(deploymentConfig.Status.Details.Message) > 0 { fmt.Fprintf(out, "Warning:\t%s\n", deploymentConfig.Status.Details.Message) } 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, settings kctl.DescriberSettings) (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(buildapi.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) fmt.Fprintln(out, "") status := bold(build.Status.Phase) if build.Status.Message != "" { status += " (" + build.Status.Message + ")" } formatString(out, "Status", status) if build.Status.StartTimestamp != nil && !build.Status.StartTimestamp.IsZero() { formatString(out, "Started", build.Status.StartTimestamp.Time.Format(time.RFC1123)) } // Create the time object with second-level precision so we don't get // output like "duration: 1.2724395728934s" formatString(out, "Duration", describeBuildDuration(build)) if build.Status.Config != nil { formatString(out, "Build Config", build.Status.Config.Name) } formatString(out, "Build Pod", buildapi.GetBuildPodName(build)) describeCommonSpec(build.Spec.CommonSpec, out) describeBuildTriggerCauses(build.Spec.TriggeredBy, out) if settings.ShowEvents { 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.Status.Config != nil { formatString(out, "Build Config", build.Status.Config.Name) } status := bold(build.Status.Phase) if build.Status.Phase == buildapi.BuildPhaseFailed { status += " (" + build.Status.Message + ")" } formatString(out, "Status", status) if build.Status.StartTimestamp != nil { formatString(out, "Started", build.Status.StartTimestamp.Time) } if build.Status.CompletionTimestamp != nil { formatString(out, "Finished", build.Status.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)) describeBuildSpec(build.Spec, out) kctl.DescribeEvents(events, out) return nil }) }
// Describe returns the description of a DeploymentConfig func (d *DeploymentConfigDescriber) Describe(namespace, name string, settings kctl.DescriberSettings) (string, error) { var deploymentConfig *deployapi.DeploymentConfig if d.config != nil { // If a deployment config is already provided use that. // This is used by `oc rollback --dry-run`. deploymentConfig = d.config } else { var err error deploymentConfig, err = d.osClient.DeploymentConfigs(namespace).Get(name) if err != nil { return "", err } } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, deploymentConfig.ObjectMeta) if deploymentConfig.Status.LatestVersion == 0 { formatString(out, "Latest Version", "Not deployed") } else { formatString(out, "Latest Version", strconv.FormatInt(deploymentConfig.Status.LatestVersion, 10)) } printDeploymentConfigSpec(d.kubeClient, *deploymentConfig, out) fmt.Fprintln(out) if deploymentConfig.Status.Details != nil && len(deploymentConfig.Status.Details.Message) > 0 { fmt.Fprintf(out, "Warning:\t%s\n", deploymentConfig.Status.Details.Message) } deploymentName := deployutil.LatestDeploymentNameForConfig(deploymentConfig) deployment, err := d.kubeClient.ReplicationControllers(namespace).Get(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.kubeClient, out, header, true) } // We don't show the deployment history when running `oc rollback --dry-run`. if d.config == nil { deploymentsHistory, err := d.kubeClient.ReplicationControllers(namespace).List(kapi.ListOptions{LabelSelector: labels.Everything()}) if err == nil { sorted := deploymentsHistory.Items sort.Sort(sort.Reverse(rcutils.OverlappingControllers(sorted))) counter := 1 for _, item := range sorted { if item.Name != deploymentName && deploymentConfig.Name == deployutil.DeploymentConfigNameFor(&item) { header := fmt.Sprintf("Deployment #%d", deployutil.DeploymentVersionFor(&item)) printDeploymentRc(&item, d.kubeClient, out, header, false) counter++ } if counter == maxDisplayDeployments { break } } } } if settings.ShowEvents { // Events if events, err := d.kubeClient.Events(deploymentConfig.Namespace).Search(deploymentConfig); err == nil && events != nil { latestDeploymentEvents := &kapi.EventList{Items: []kapi.Event{}} for i := len(events.Items); i != 0 && i > len(events.Items)-maxDisplayDeploymentsEvents; i-- { latestDeploymentEvents.Items = append(latestDeploymentEvents.Items, events.Items[i-1]) } fmt.Fprintln(out) kctl.DescribeEvents(latestDeploymentEvents, out) } } return nil }) }
// Describe returns the description of a DeploymentConfig func (d *DeploymentConfigDescriber) Describe(namespace, name string, settings kctl.DescriberSettings) (string, error) { var deploymentConfig *deployapi.DeploymentConfig if d.config != nil { // If a deployment config is already provided use that. // This is used by `oc rollback --dry-run`. deploymentConfig = d.config } else { var err error deploymentConfig, err = d.osClient.DeploymentConfigs(namespace).Get(name) if err != nil { return "", err } } return tabbedString(func(out *tabwriter.Writer) error { formatMeta(out, deploymentConfig.ObjectMeta) var ( deploymentsHistory []kapi.ReplicationController activeDeploymentName string ) if d.config == nil { if rcs, err := d.kubeClient.ReplicationControllers(namespace).List(kapi.ListOptions{LabelSelector: deployutil.ConfigSelector(deploymentConfig.Name)}); err == nil { deploymentsHistory = rcs.Items } } if deploymentConfig.Status.LatestVersion == 0 { formatString(out, "Latest Version", "Not deployed") } else { formatString(out, "Latest Version", strconv.FormatInt(deploymentConfig.Status.LatestVersion, 10)) } printDeploymentConfigSpec(d.kubeClient, *deploymentConfig, out) fmt.Fprintln(out) latestDeploymentName := deployutil.LatestDeploymentNameForConfig(deploymentConfig) if activeDeployment := deployutil.ActiveDeployment(deploymentConfig, deploymentsHistory); activeDeployment != nil { activeDeploymentName = activeDeployment.Name } var deployment *kapi.ReplicationController isNotDeployed := len(deploymentsHistory) == 0 for _, item := range deploymentsHistory { if item.Name == latestDeploymentName { deployment = &item } } if isNotDeployed { formatString(out, "Latest Deployment", "<none>") } else { header := fmt.Sprintf("Deployment #%d (latest)", deployutil.DeploymentVersionFor(deployment)) // Show details if the current deployment is the active one or it is the // initial deployment. printDeploymentRc(deployment, d.kubeClient, out, header, (deployment.Name == activeDeploymentName) || len(deploymentsHistory) == 1) } // We don't show the deployment history when running `oc rollback --dry-run`. if d.config == nil && !isNotDeployed { sorted := deploymentsHistory sort.Sort(sort.Reverse(rcutils.OverlappingControllers(sorted))) counter := 1 for _, item := range sorted { if item.Name != latestDeploymentName && deploymentConfig.Name == deployutil.DeploymentConfigNameFor(&item) { header := fmt.Sprintf("Deployment #%d", deployutil.DeploymentVersionFor(&item)) printDeploymentRc(&item, d.kubeClient, out, header, item.Name == activeDeploymentName) counter++ } if counter == maxDisplayDeployments { break } } } if settings.ShowEvents { // Events if events, err := d.kubeClient.Events(deploymentConfig.Namespace).Search(deploymentConfig); err == nil && events != nil { latestDeploymentEvents := &kapi.EventList{Items: []kapi.Event{}} for i := len(events.Items); i != 0 && i > len(events.Items)-maxDisplayDeploymentsEvents; i-- { latestDeploymentEvents.Items = append(latestDeploymentEvents.Items, events.Items[i-1]) } fmt.Fprintln(out) kctl.DescribeEvents(latestDeploymentEvents, out) } } return nil }) }