// RunNewApplication contains all the necessary functionality for the OpenShift cli new-app command func RunNewApplication(fullName string, f *clientcmd.Factory, out io.Writer, c *cobra.Command, args []string, config *newcmd.AppConfig) error { output := kcmdutil.GetFlagString(c, "output") shortOutput := output == "name" if err := setupAppConfig(f, out, c, args, config); err != nil { return err } if config.Querying() { result, err := config.RunQuery() if err != nil { return handleRunError(c, err, fullName) } if len(output) != 0 { result.List.Items, err = ocmdutil.ConvertItemsForDisplayFromDefaultCommand(c, result.List.Items) if err != nil { return err } return f.Factory.PrintObject(c, result.List, out) } return printHumanReadableQueryResult(result, out, fullName) } if err := setAppConfigLabels(c, config); err != nil { return err } result, err := config.Run() if err := handleRunError(c, err, fullName); err != nil { return err } if len(config.Labels) == 0 && len(result.Name) > 0 { config.Labels = map[string]string{"app": result.Name} } if err := setLabels(config.Labels, result); err != nil { return err } if err := setAnnotations(map[string]string{newcmd.GeneratedByNamespace: newcmd.GeneratedByNewApp}, result); err != nil { return err } indent := " " switch { case shortOutput: indent = "" case len(output) != 0: result.List.Items, err = ocmdutil.ConvertItemsForDisplayFromDefaultCommand(c, result.List.Items) if err != nil { return err } return f.Factory.PrintObject(c, result.List, out) case !result.GeneratedJobs: if len(config.Labels) > 0 { fmt.Fprintf(out, "--> Creating resources with label %s ...\n", labels.SelectorFromSet(config.Labels).String()) } else { fmt.Fprintf(out, "--> Creating resources ...\n") } } if config.DryRun { fmt.Fprintf(out, "--> Success (DRY RUN)\n") return nil } mapper, _ := f.Object() var afterFn configcmd.AfterFunc switch { // only print success if we don't have installables case !result.GeneratedJobs: afterFn = configcmd.NewPrintNameOrErrorAfterIndent(mapper, shortOutput, "created", out, c.Out(), indent) default: afterFn = configcmd.NewPrintErrorAfter(mapper, c.Out()) afterFn = configcmd.HaltOnError(afterFn) } if err := createObjects(f, afterFn, result); err != nil { return err } if !shortOutput && !result.GeneratedJobs { fmt.Fprintf(out, "--> Success\n") } hasMissingRepo := false installing := []*kapi.Pod{} for _, item := range result.List.Items { switch t := item.(type) { case *kapi.Pod: if t.Annotations[newcmd.GeneratedForJob] == "true" { installing = append(installing, t) } case *buildapi.BuildConfig: triggered := false for _, trigger := range t.Spec.Triggers { switch trigger.Type { case buildapi.ImageChangeBuildTriggerType, buildapi.ConfigChangeBuildTriggerType: triggered = true break } } if triggered { fmt.Fprintf(out, "%sBuild scheduled, use 'oc logs -f bc/%s' to track its progress.\n", indent, t.Name) } else { fmt.Fprintf(out, "%sUse 'oc start-build %s' to start a build.\n", indent, t.Name) } case *imageapi.ImageStream: if len(t.Status.DockerImageRepository) == 0 { if hasMissingRepo { continue } hasMissingRepo = true fmt.Fprintf(out, "%sWARNING: No Docker registry has been configured with the server. Automatic builds and deployments may not function.\n", indent) } } } if shortOutput { return nil } switch { case len(installing) == 1: // TODO: should get this set on the config or up above _, kclient, err := f.Clients() if err != nil { return err } jobInput := installing[0].Annotations[newcmd.GeneratedForJobFor] return followInstallation(f, jobInput, installing[0], kclient, out) case len(installing) > 1: for i := range installing { fmt.Fprintf(out, "%sTrack installation of %s with '%s logs %s'.\n", indent, installing[i].Name, fullName, installing[i].Name) } case len(result.List.Items) > 0: fmt.Fprintf(out, "%sRun '%s %s' to view your app.\n", indent, fullName, StatusRecommendedName) } return nil }
// Run contains all the necessary functionality for the OpenShift cli new-app command func (o *NewAppOptions) Run() error { config := o.Config out := o.Out output := o.Output shortOutput := output == "name" if config.Querying() { result, err := config.RunQuery() if err != nil { return handleRunError(err, o.CommandName, o.CommandPath) } if len(output) != 0 { return o.PrintObject(result.List) } return printHumanReadableQueryResult(result, out, o.CommandName) } result, err := config.Run() if err := handleRunError(err, o.CommandName, o.CommandPath); err != nil { return err } // if the user has set the "app" label explicitly on their objects in the template, // we should not return a failure when we can't set it ourselves. ignoreLabelFailure := false if len(config.Labels) == 0 && len(result.Name) > 0 { config.Labels = map[string]string{"app": result.Name} ignoreLabelFailure = true } if err := setLabels(config.Labels, result, ignoreLabelFailure); err != nil { return err } if err := setAnnotations(map[string]string{newcmd.GeneratedByNamespace: newcmd.GeneratedByNewApp}, result); err != nil { return err } indent := " " switch { case shortOutput: indent = "" case len(output) != 0: return o.PrintObject(result.List) case !result.GeneratedJobs: if len(config.Labels) > 0 { fmt.Fprintf(out, "--> Creating resources with label %s ...\n", labels.SelectorFromSet(config.Labels).String()) } else { fmt.Fprintf(out, "--> Creating resources ...\n") } } if config.DryRun { fmt.Fprintf(out, "--> Success (DRY RUN)\n") return nil } var afterFn configcmd.AfterFunc switch { // only print success if we don't have installables case !result.GeneratedJobs: afterFn = configcmd.NewPrintNameOrErrorAfterIndent(config.Mapper, shortOutput, "created", out, config.ErrOut, indent) default: afterFn = configcmd.NewPrintErrorAfter(config.Mapper, config.ErrOut) afterFn = configcmd.HaltOnError(afterFn) } if err := createObjects(config, afterFn, result); err != nil { return err } if !shortOutput && !result.GeneratedJobs { fmt.Fprintf(out, "--> Success\n") } hasMissingRepo := false installing := []*kapi.Pod{} for _, item := range result.List.Items { switch t := item.(type) { case *kapi.Pod: if t.Annotations[newcmd.GeneratedForJob] == "true" { installing = append(installing, t) } case *buildapi.BuildConfig: triggered := false for _, trigger := range t.Spec.Triggers { switch trigger.Type { case buildapi.ImageChangeBuildTriggerType, buildapi.ConfigChangeBuildTriggerType: triggered = true break } } if triggered { fmt.Fprintf(out, "%sBuild scheduled, use 'oc logs -f bc/%s' to track its progress.\n", indent, t.Name) } else { fmt.Fprintf(out, "%sUse 'oc start-build %s' to start a build.\n", indent, t.Name) } case *imageapi.ImageStream: if len(t.Status.DockerImageRepository) == 0 { if hasMissingRepo { continue } hasMissingRepo = true fmt.Fprintf(out, "%sWARNING: No Docker registry has been configured with the server. Automatic builds and deployments may not function.\n", indent) } } } if shortOutput { return nil } switch { case len(installing) == 1: jobInput := installing[0].Annotations[newcmd.GeneratedForJobFor] return followInstallation(config, jobInput, installing[0], o.LogsForObject) case len(installing) > 1: for i := range installing { fmt.Fprintf(out, "%sTrack installation of %s with '%s logs %s'.\n", indent, installing[i].Name, o.CommandName, installing[i].Name) } case len(result.List.Items) > 0: fmt.Fprintf(out, "%sRun '%s %s' to view your app.\n", indent, o.CommandName, StatusRecommendedName) } return nil }
// RunNewBuild contains all the necessary functionality for the OpenShift cli new-build command func RunNewBuild(fullName string, f *clientcmd.Factory, out io.Writer, in io.Reader, c *cobra.Command, args []string, config *newcmd.AppConfig) error { output := kcmdutil.GetFlagString(c, "output") shortOutput := output == "name" if config.Dockerfile == "-" { data, err := ioutil.ReadAll(in) if err != nil { return err } config.Dockerfile = string(data) } if err := setupAppConfig(f, out, c, args, config); err != nil { return err } if err := setAppConfigLabels(c, config); err != nil { return err } result, err := config.Run() if err != nil { return handleBuildError(c, err, fullName) } if len(config.Labels) == 0 && len(result.Name) > 0 { config.Labels = map[string]string{"build": result.Name} } if err := setLabels(config.Labels, result); err != nil { return err } if err := setAnnotations(map[string]string{newcmd.GeneratedByNamespace: newcmd.GeneratedByNewBuild}, result); err != nil { return err } indent := " " switch { case shortOutput: indent = "" case len(output) != 0: result.List.Items, err = ocmdutil.ConvertItemsForDisplayFromDefaultCommand(c, result.List.Items) if err != nil { return err } return f.Factory.PrintObject(c, result.List, out) default: if len(config.Labels) > 0 { fmt.Fprintf(out, "--> Creating resources with label %s ...\n", labels.SelectorFromSet(config.Labels).String()) } else { fmt.Fprintf(out, "--> Creating resources ...\n") } } if config.DryRun { fmt.Fprintf(out, "--> Success (DRY RUN)\n") return nil } mapper, _ := f.Object() if err := createObjects(f, configcmd.NewPrintNameOrErrorAfterIndent(mapper, shortOutput, "created", out, c.Out(), indent), result); err != nil { return err } if shortOutput { return nil } fmt.Fprintf(out, "--> Success\n") for _, item := range result.List.Items { switch t := item.(type) { case *buildapi.BuildConfig: if len(t.Spec.Triggers) > 0 && t.Spec.Source.Binary == nil { fmt.Fprintf(out, "%sBuild configuration %q created and build triggered.\n", indent, t.Name) fmt.Fprintf(out, "%sRun '%s logs -f bc/%s' to stream the build progress.\n", indent, fullName, t.Name) } } } return nil }
// Run contains all the necessary functionality for the OpenShift cli new-build command func (o *NewBuildOptions) Run() error { config := o.Config out := o.Out output := o.Output shortOutput := output == "name" result, err := config.Run() if err != nil { return handleBuildError(err, o.CommandName, o.CommandPath) } if len(config.Labels) == 0 && len(result.Name) > 0 { config.Labels = map[string]string{"build": result.Name} } if err := setLabels(config.Labels, result, false); err != nil { return err } if err := setAnnotations(map[string]string{newcmd.GeneratedByNamespace: newcmd.GeneratedByNewBuild}, result); err != nil { return err } indent := " " switch { case shortOutput: indent = "" case len(output) != 0: return o.PrintObject(result.List) default: if len(config.Labels) > 0 { fmt.Fprintf(out, "--> Creating resources with label %s ...\n", labels.SelectorFromSet(config.Labels).String()) } else { fmt.Fprintf(out, "--> Creating resources ...\n") } } if config.DryRun { fmt.Fprintf(out, "--> Success (DRY RUN)\n") return nil } afterFn := configcmd.NewPrintNameOrErrorAfterIndent(config.Mapper, shortOutput, "created", out, config.ErrOut, indent) if err := createObjects(config, afterFn, result); err != nil { return err } if shortOutput { return nil } fmt.Fprintf(out, "--> Success\n") for _, item := range result.List.Items { switch t := item.(type) { case *buildapi.BuildConfig: if len(t.Spec.Triggers) > 0 && t.Spec.Source.Binary == nil { fmt.Fprintf(out, "%sBuild configuration %q created and build triggered.\n", indent, t.Name) fmt.Fprintf(out, "%sRun '%s logs -f bc/%s' to stream the build progress.\n", indent, o.CommandName, t.Name) } } } return nil }