func (c *BaseCluster) configureCLI() error { config, err := cfg.ReadFile(cfg.DefaultPath()) if err != nil && !os.IsNotExist(err) { return err } cluster := c.ClusterConfig() if err := config.Add(cluster, true); err != nil { return err } config.SetDefault(c.Name) if err := config.SaveTo(cfg.DefaultPath()); err != nil { return err } caFile, err := cfg.CACertFile(cluster.Name) if err != nil { return err } defer caFile.Close() if _, err := caFile.Write([]byte(c.CACert)); err != nil { return err } if err := cfg.WriteGlobalGitConfig(cluster.GitURL, caFile.Name()); err != nil { return err } c.SendLog("CLI configured locally") return nil }
func runClusterAdd(args *docopt.Args) error { s := &cfg.Cluster{ Name: args.String["<cluster-name>"], Key: args.String["<key>"], GitURL: args.String["--git-url"], TLSPin: args.String["--tls-pin"], } domain := args.String["<domain>"] if strings.HasPrefix(domain, "https://") { s.ControllerURL = domain } else { s.ControllerURL = "https://controller." + domain } if s.GitURL == "" { s.GitURL = "https://git." + domain } if err := config.Add(s, args.Bool["--force"]); err != nil { return err } setDefault := args.Bool["--default"] || len(config.Clusters) == 1 if setDefault && !config.SetDefault(s.Name) { return errors.New(fmt.Sprintf("Cluster %q does not exist and cannot be set as default.", s.Name)) } if !args.Bool["--no-git"] { if _, err := exec.LookPath("git"); err != nil { if serr, ok := err.(*exec.Error); ok && serr.Err == exec.ErrNotFound { return errors.New("Executable 'git' was not found. Use --no-git to skip git configuration") } return err } client, err := s.Client() if err != nil { return err } caPath, err := writeCACert(client, s.Name) if err != nil { return fmt.Errorf("Error writing CA certificate: %s", err) } if err := cfg.WriteGlobalGitConfig(s.GitURL, caPath); err != nil { return err } } if err := config.SaveTo(configPath()); err != nil { return err } if setDefault { log.Printf("Cluster %q added and set as default.", s.Name) } else { log.Printf("Cluster %q added.", s.Name) } return nil }
func runClusterAdd(args *docopt.Args) error { s := &cfg.Cluster{ Name: args.String["<cluster-name>"], Key: args.String["<key>"], GitHost: args.String["--git-host"], GitURL: args.String["--git-url"], TLSPin: args.String["--tls-pin"], } domain := args.String["<domain>"] if strings.HasPrefix(domain, "https://") { s.ControllerURL = domain } else { s.ControllerURL = "https://controller." + domain } if s.GitURL == "" && s.GitHost == "" { s.GitURL = "https://git." + domain } if err := config.Add(s, args.Bool["--force"]); err != nil { return err } setDefault := args.Bool["--default"] || len(config.Clusters) == 1 if setDefault && !config.SetDefault(s.Name) { return errors.New(fmt.Sprintf("Cluster %q does not exist and cannot be set as default.", s.Name)) } if !s.SSHGit() { client, err := s.Client() if err != nil { return err } caPath, err := writeCACert(client, s.Name) if err != nil { return fmt.Errorf("Error writing CA certificate: %s", err) } if err := cfg.WriteGlobalGitConfig(s.GitURL, caPath); err != nil { return err } } if err := config.SaveTo(configPath()); err != nil { return err } if setDefault { log.Printf("Cluster %q added and set as default.", s.Name) } else { log.Printf("Cluster %q added.", s.Name) } return nil }
func runClusterMigrateDomain(args *docopt.Args) error { cluster, err := getCluster() if err != nil { shutdown.Fatal(err) } client, err := cluster.Client() if err != nil { shutdown.Fatal(err) } dm := &ct.DomainMigration{ Domain: args.String["<domain>"], } release, err := client.GetAppRelease("controller") if err != nil { return err } dm.OldDomain = release.Env["DEFAULT_ROUTE_DOMAIN"] if !promptYesNo(fmt.Sprintf("Migrate cluster domain from %q to %q?", dm.OldDomain, dm.Domain)) { fmt.Println("Aborted") return nil } maxDuration := 2 * time.Minute fmt.Printf("Migrating cluster domain (this can take up to %s)...\n", maxDuration) events := make(chan *ct.Event) stream, err := client.StreamEvents(ct.StreamEventsOptions{ ObjectTypes: []ct.EventType{ct.EventTypeDomainMigration}, }, events) if err != nil { return nil } defer stream.Close() if err := client.PutDomain(dm); err != nil { return err } timeout := time.After(maxDuration) for { select { case event, ok := <-events: if !ok { return stream.Err() } var e *ct.DomainMigrationEvent if err := json.Unmarshal(event.Data, &e); err != nil { return err } if e.Error != "" { fmt.Println(e.Error) } if e.DomainMigration.FinishedAt != nil { dm = e.DomainMigration fmt.Printf("Changed cluster domain from %q to %q\n", dm.OldDomain, dm.Domain) // update flynnrc cluster.TLSPin = dm.TLSCert.Pin cluster.ControllerURL = fmt.Sprintf("https://controller.%s", dm.Domain) cluster.GitURL = fmt.Sprintf("https://git.%s", dm.Domain) cluster.DockerPushURL = fmt.Sprintf("https://docker.%s", dm.Domain) if err := config.SaveTo(configPath()); err != nil { return fmt.Errorf("Error saving config: %s", err) } // update git config caFile, err := cfg.CACertFile(cluster.Name) if err != nil { return err } defer caFile.Close() if _, err := caFile.Write([]byte(dm.TLSCert.CACert)); err != nil { return err } if err := cfg.WriteGlobalGitConfig(cluster.GitURL, caFile.Name()); err != nil { return err } cfg.RemoveGlobalGitConfig(fmt.Sprintf("https://git.%s", dm.OldDomain)) // try to run "docker login" for the new domain, but just print a warning // if it fails so the user can fix it later if host, err := cluster.DockerPushHost(); err == nil { if err := dockerLogin(host, cluster.Key); err == ErrDockerTLSError { printDockerTLSWarning(host, caFile.Name()) } } dockerLogout(dm.OldDomain) fmt.Println("Updated local CLI configuration") return nil } case <-timeout: return errors.New("timed out waiting for domain migration to complete") } } }