func setupAppConfig(f *clientcmd.Factory, out io.Writer, c *cobra.Command, args []string, config *newcmd.AppConfig) error { namespace, _, err := f.DefaultNamespace() if err != nil { return err } dockerClient, _, err := dockerutil.NewHelper().GetClient() if err == nil { if err = dockerClient.Ping(); err == nil { config.SetDockerClient(dockerClient) } else { glog.V(4).Infof("Docker client did not respond to a ping: %v", err) } } if err != nil { glog.V(2).Infof("No local Docker daemon detected: %v", err) } osclient, kclient, err := f.Clients() if err != nil { return err } config.KubeClient = kclient config.SetOpenShiftClient(osclient, namespace) // Only output="" should print descriptions of intermediate steps. Everything // else should print only some specific output (json, yaml, go-template, ...) output := cmdutil.GetFlagString(c, "output") if len(output) == 0 { config.Out = out } else { config.Out = ioutil.Discard } config.ErrOut = c.Out() if config.AllowSecretUse { cfg, err := f.OpenShiftClientConfig.ClientConfig() if err != nil { return err } config.SecretAccessor = newConfigSecretRetriever(cfg) } unknown := config.AddArguments(args) if len(unknown) != 0 { return cmdutil.UsageError(c, "Did not recognize the following arguments: %v", unknown) } if config.AllowMissingImages && config.AsSearch { return cmdutil.UsageError(c, "--allow-missing-images and --search are mutually exclusive.") } if len(config.SourceImage) != 0 && len(config.SourceImagePath) == 0 { return cmdutil.UsageError(c, "--source-image-path must be specified when --source-image is specified.") } if len(config.SourceImage) == 0 && len(config.SourceImagePath) != 0 { return cmdutil.UsageError(c, "--source-image must be specified when --source-image-path is specified.") } return nil }
func setupAppConfig(f *clientcmd.Factory, out io.Writer, c *cobra.Command, args []string, config *newcmd.AppConfig) error { namespace, _, err := f.DefaultNamespace() if err != nil { return err } dockerClient, _, err := dockerutil.NewHelper().GetClient() if err == nil { if err = dockerClient.Ping(); err == nil { config.SetDockerClient(dockerClient) } } if err != nil { glog.V(2).Infof("No local Docker daemon detected: %v", err) } osclient, _, err := f.Clients() if err != nil { return err } config.SetOpenShiftClient(osclient, namespace) config.Out = out config.ErrOut = c.Out() unknown := config.AddArguments(args) if len(unknown) != 0 { return cmdutil.UsageError(c, "Did not recognize the following arguments: %v", unknown) } if config.AllowMissingImages && config.AsSearch { return cmdutil.UsageError(c, "--allow-missing-images and --search are mutually exclusive.") } return nil }
// 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 := cmdutil.GetFlagString(c, "output") shortOutput := output == "name" if err := setupAppConfig(f, out, c, args, config); err != nil { return err } if shortOutput || len(output) != 0 { config.Out = ioutil.Discard } if config.Querying() { result, err := config.RunQuery() if err != nil { return handleRunError(c, err, fullName) } if len(output) != 0 { 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: 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 { 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: if len(t.Spec.Triggers) > 0 { fmt.Fprintf(out, "%sBuild scheduled for %q - use the logs command to track its progress.\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 }