func MigrateHost(h *Host, data []byte) (*Host, bool, error) { var ( migrationPerformed = false hostV1 *HostV1 ) migratedHostMetadata, err := getMigratedHostMetadata(data) if err != nil { return &Host{}, false, err } globalStorePath := filepath.Dir(filepath.Dir(migratedHostMetadata.HostOptions.AuthOptions.StorePath)) driver, err := driverfactory.NewDriver(migratedHostMetadata.DriverName, h.Name, globalStorePath) if err != nil { return &Host{}, false, err } if migratedHostMetadata.ConfigVersion == version.ConfigVersion { h.Driver = driver if err := json.Unmarshal(data, &h); err != nil { return &Host{}, migrationPerformed, fmt.Errorf("Error unmarshalling most recent host version: %s", err) } } else { migrationPerformed = true for h.ConfigVersion = migratedHostMetadata.ConfigVersion; h.ConfigVersion < version.ConfigVersion; h.ConfigVersion++ { switch h.ConfigVersion { case 0: hostV0 := &HostV0{ Driver: driver, } if err := json.Unmarshal(data, &hostV0); err != nil { return &Host{}, migrationPerformed, fmt.Errorf("Error unmarshalling host config version 0: %s", err) } hostV1 = MigrateHostV0ToHostV1(hostV0) case 1: if hostV1 == nil { hostV1 = &HostV1{ Driver: driver, } if err := json.Unmarshal(data, &hostV1); err != nil { return &Host{}, migrationPerformed, fmt.Errorf("Error unmarshalling host config version 1: %s", err) } } h = MigrateHostV1ToHostV2(hostV1) } } } return h, migrationPerformed, nil }
func cmdCreate(c *cli.Context) { var ( driver drivers.Driver ) driverName := c.String("driver") name := c.Args().First() certInfo := getCertPathInfoFromContext(c) storePath := c.GlobalString("storage-path") store := &persist.Filestore{ Path: storePath, CaCertPath: certInfo.CaCertPath, CaPrivateKeyPath: certInfo.CaPrivateKeyPath, } // TODO: Not really a fan of "none" as the default driver... if driverName != "none" { var err error c.App.Commands, err = trimDriverFlags(driverName, c.App.Commands) if err != nil { log.Fatal(err) } } if name == "" { cli.ShowCommandHelp(c, "create") log.Fatal("You must specify a machine name") } if len(c.Args()) > 1 { log.Fatalf("Invalid command line. Found extra arguments %v", c.Args()[1:]) } validName := host.ValidateHostName(name) if !validName { log.Fatal("Error creating machine: ", mcnerror.ErrInvalidHostname) } if err := validateSwarmDiscovery(c.String("swarm-discovery")); err != nil { log.Fatalf("Error parsing swarm discovery: %s", err) } hostOptions := &host.HostOptions{ AuthOptions: &auth.AuthOptions{ CertDir: mcndirs.GetMachineCertDir(), CaCertPath: certInfo.CaCertPath, CaPrivateKeyPath: certInfo.CaPrivateKeyPath, ClientCertPath: certInfo.ClientCertPath, ClientKeyPath: certInfo.ClientKeyPath, ServerCertPath: filepath.Join(mcndirs.GetMachineDir(), name, "server.pem"), ServerKeyPath: filepath.Join(mcndirs.GetMachineDir(), name, "server-key.pem"), StorePath: filepath.Join(mcndirs.GetMachineDir(), name), }, EngineOptions: &engine.EngineOptions{ ArbitraryFlags: c.StringSlice("engine-opt"), Env: c.StringSlice("engine-env"), InsecureRegistry: c.StringSlice("engine-insecure-registry"), Labels: c.StringSlice("engine-label"), RegistryMirror: c.StringSlice("engine-registry-mirror"), StorageDriver: c.String("engine-storage-driver"), TlsVerify: true, InstallURL: c.String("engine-install-url"), }, SwarmOptions: &swarm.SwarmOptions{ IsSwarm: c.Bool("swarm"), Image: c.String("swarm-image"), Master: c.Bool("swarm-master"), Discovery: c.String("swarm-discovery"), Address: c.String("swarm-addr"), Host: c.String("swarm-host"), Strategy: c.String("swarm-strategy"), ArbitraryFlags: c.StringSlice("swarm-opt"), }, } driver, err := driverfactory.NewDriver(driverName, name, storePath) if err != nil { log.Fatalf("Error trying to get driver: %s", err) } h, err := store.NewHost(driver) if err != nil { log.Fatalf("Error getting new host: %s", err) } h.HostOptions = hostOptions exists, err := store.Exists(h.Name) if err != nil { log.Fatalf("Error checking if host exists: %s", err) } if exists { log.Fatal(mcnerror.ErrHostAlreadyExists{ Name: h.Name, }) } // TODO: This should be moved out of the driver and done in the // commands module. if err := h.Driver.SetConfigFromFlags(c); err != nil { log.Fatalf("Error setting machine configuration from flags provided: %s", err) } if err := libmachine.Create(store, h); err != nil { log.Fatalf("Error creating machine: %s", err) } info := fmt.Sprintf("%s env %s", os.Args[0], name) log.Infof("To see how to connect Docker to this machine, run: %s", info) }