func runClusterRemove(args *docopt.Args) error { name := args.String["<cluster-name>"] if c := config.Remove(name); c != nil { msg := fmt.Sprintf("Cluster %q removed.", name) // Select next available cluster as default if config.Default == name && len(config.Clusters) > 0 { config.SetDefault(config.Clusters[0].Name) msg = fmt.Sprintf("Cluster %q removed and %q is now the default cluster.", name, config.Default) } if err := config.SaveTo(configPath()); err != nil { return err } cfg.RemoveGlobalGitConfig(c.GitURL) if host, err := c.DockerPushHost(); err == nil { dockerLogout(host) } log.Print(msg) } 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") } } }