// Deploy allows the creation of deploy.Deployments remotely func (s *SpreadCli) Deploy() *cli.Command { return &cli.Command{ Name: "deploy", Usage: "spread deploy [-s] PATH | COMMIT [kubectl context]", Description: "Deploys objects to a remote Kubernetes cluster.", ArgsUsage: "-s will deploy only if no other deployment found (otherwise fails)", Action: func(c *cli.Context) { ref := c.Args().First() var dep *deploy.Deployment proj, err := s.project() if err == nil { var docs map[string]*pb.Document if len(ref) == 0 { s.printf("Deploying from index...") docs, err = proj.Index() if err != nil { s.fatalf("Error getting index: %v", err) } if err = s.promptForArgs(docs, false); err == nil { dep, err = deploy.DeploymentFromDocMap(docs) } } else { if docs, err = proj.ResolveCommit(ref); err == nil { if err = s.promptForArgs(docs, false); err == nil { dep, err = deploy.DeploymentFromDocMap(docs) } } else { dep, err = s.globalDeploy(ref) } } } else { dep, err = s.globalDeploy(ref) } if err != nil { s.fatalf("Failed to assemble deployment: %v", err) } context := c.Args().Get(1) cluster, err := deploy.NewKubeClusterFromContext(context) if err != nil { s.fatalf("Failed to deploy: %v", err) } s.printf("Deploying %d objects using the %s.", dep.Len(), displayContext(context)) update := !c.Bool("s") err = cluster.Deploy(dep, update, false) if err != nil { //TODO: make better error messages (one to indicate a deployment already existed; another one if a deployment did not exist but some other error was thrown s.fatalf("Did not deploy.: %v", err) } s.printf("Deployment successful!") }, } }