mirror of https://github.com/docker/docs.git
				
				
				
			Merge pull request #2732 from dgageot/better-logs
Improve Start/Stop/Kill/Restart lifecycle/logs
This commit is contained in:
		
						commit
						e143c68cf9
					
				|  | @ -612,11 +612,7 @@ func (d *Driver) Start() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := d.waitForInstance(); err != nil { | 	return d.waitForInstance() | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
|  | @ -627,20 +623,6 @@ func (d *Driver) Stop() error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { |  | ||||||
| 
 |  | ||||||
| 	if err := d.terminate(); err != nil { |  | ||||||
| 		return fmt.Errorf("unable to terminate instance: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// remove keypair
 |  | ||||||
| 	if err := d.deleteKeyPair(); err != nil { |  | ||||||
| 		return fmt.Errorf("unable to remove key pair: %s", err) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Restart() error { | func (d *Driver) Restart() error { | ||||||
| 	_, err := d.getClient().RebootInstances(&ec2.RebootInstancesInput{ | 	_, err := d.getClient().RebootInstances(&ec2.RebootInstancesInput{ | ||||||
| 		InstanceIds: []*string{&d.InstanceId}, | 		InstanceIds: []*string{&d.InstanceId}, | ||||||
|  | @ -656,6 +638,19 @@ func (d *Driver) Kill() error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (d *Driver) Remove() error { | ||||||
|  | 	if err := d.terminate(); err != nil { | ||||||
|  | 		return fmt.Errorf("unable to terminate instance: %s", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// remove keypair
 | ||||||
|  | 	if err := d.deleteKeyPair(); err != nil { | ||||||
|  | 		return fmt.Errorf("unable to remove key pair: %s", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) getClient() *ec2.EC2 { | func (d *Driver) getClient() *ec2.EC2 { | ||||||
| 	config := aws.NewConfig() | 	config := aws.NewConfig() | ||||||
| 	config = config.WithRegion(d.Region) | 	config = config.WithRegion(d.Region) | ||||||
|  |  | ||||||
|  | @ -13,7 +13,6 @@ import ( | ||||||
| 	"github.com/docker/machine/libmachine/drivers" | 	"github.com/docker/machine/libmachine/drivers" | ||||||
| 	"github.com/docker/machine/libmachine/log" | 	"github.com/docker/machine/libmachine/log" | ||||||
| 	"github.com/docker/machine/libmachine/mcnflag" | 	"github.com/docker/machine/libmachine/mcnflag" | ||||||
| 	"github.com/docker/machine/libmachine/mcnutils" |  | ||||||
| 	"github.com/docker/machine/libmachine/ssh" | 	"github.com/docker/machine/libmachine/ssh" | ||||||
| 	"github.com/docker/machine/libmachine/state" | 	"github.com/docker/machine/libmachine/state" | ||||||
| ) | ) | ||||||
|  | @ -286,8 +285,6 @@ func (d *Driver) Start() error { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	log.Debugf("starting %s", d.MachineName) |  | ||||||
| 
 |  | ||||||
| 	if err := vmClient.StartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { | 	if err := vmClient.StartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -302,15 +299,6 @@ func (d *Driver) Stop() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if vmState, err := d.GetState(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} else if vmState == state.Stopped { |  | ||||||
| 		log.Infof("Host is already stopped") |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	log.Debugf("stopping %s", d.MachineName) |  | ||||||
| 
 |  | ||||||
| 	if err := vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName); err != nil { | 	if err := vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -319,69 +307,38 @@ func (d *Driver) Stop() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	if err := d.setUserSubscription(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if err := vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var err error | ||||||
|  | 	d.IPAddress, err = d.GetIP() | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	return d.Stop() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 	if err := d.setUserSubscription(); err != nil { | 	if err := d.setUserSubscription(); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	if available, _, err := vmClient.CheckHostedServiceNameAvailability(d.MachineName); err != nil { | 	if available, _, err := vmClient.CheckHostedServiceNameAvailability(d.MachineName); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} else if available { | 	} else if available { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	log.Debugf("removing %s", d.MachineName) |  | ||||||
| 
 |  | ||||||
| 	return vmClient.DeleteHostedService(d.MachineName) | 	return vmClient.DeleteHostedService(d.MachineName) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	err := d.setUserSubscription() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if vmState, err := d.GetState(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} else if vmState == state.Stopped { |  | ||||||
| 		return errors.New("Host is already stopped, use start command to run it") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	log.Debugf("restarting %s", d.MachineName) |  | ||||||
| 
 |  | ||||||
| 	if err := vmClient.RestartRole(d.MachineName, d.MachineName, d.MachineName); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	d.IPAddress, err = d.GetIP() |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	if err := d.setUserSubscription(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if vmState, err := d.GetState(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} else if vmState == state.Stopped { |  | ||||||
| 		log.Infof("Host is already stopped") |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	log.Debugf("killing %s", d.MachineName) |  | ||||||
| 
 |  | ||||||
| 	if err := vmClient.ShutdownRole(d.MachineName, d.MachineName, d.MachineName); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	d.IPAddress = "" |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func generateVMName() string { |  | ||||||
| 	randomID := mcnutils.TruncateID(mcnutils.GenerateRandomID()) |  | ||||||
| 	return fmt.Sprintf("docker-host-%s", randomID) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) setUserSubscription() error { | func (d *Driver) setUserSubscription() error { | ||||||
| 	if d.PublishSettingsFilePath != "" { | 	if d.PublishSettingsFilePath != "" { | ||||||
| 		return azure.ImportPublishSettingsFile(d.PublishSettingsFilePath) | 		return azure.ImportPublishSettingsFile(d.PublishSettingsFilePath) | ||||||
|  |  | ||||||
|  | @ -288,6 +288,16 @@ func (d *Driver) Stop() error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	_, _, err := d.getClient().DropletActions.Reboot(d.DropletID) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	_, _, err := d.getClient().DropletActions.PowerOff(d.DropletID) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 	client := d.getClient() | 	client := d.getClient() | ||||||
| 	if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { | 	if resp, err := client.Keys.DeleteByID(d.SSHKeyID); err != nil { | ||||||
|  | @ -307,16 +317,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	_, _, err := d.getClient().DropletActions.Reboot(d.DropletID) |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	_, _, err := d.getClient().DropletActions.PowerOff(d.DropletID) |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) getClient() *godo.Client { | func (d *Driver) getClient() *godo.Client { | ||||||
| 	token := &oauth2.Token{AccessToken: d.AccessToken} | 	token := &oauth2.Token{AccessToken: d.AccessToken} | ||||||
| 	tokenSource := oauth2.StaticTokenSource(token) | 	tokenSource := oauth2.StaticTokenSource(token) | ||||||
|  |  | ||||||
|  | @ -320,45 +320,40 @@ func (d *Driver) Create() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 	vmstate, err := d.GetState() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if vmstate == state.Running || vmstate == state.Starting { |  | ||||||
| 		log.Infof("Host is already running or starting") |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) | 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) | ||||||
|  | 
 | ||||||
| 	svmresp, err := client.StartVirtualMachine(d.ID) | 	svmresp, err := client.StartVirtualMachine(d.ID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err = d.waitForJob(client, svmresp); err != nil { | 
 | ||||||
| 		return err | 	return d.waitForJob(client, svmresp) | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 	vmstate, err := d.GetState() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if vmstate == state.Stopped { |  | ||||||
| 		log.Infof("Host is already stopped") |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) | 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) | ||||||
|  | 
 | ||||||
| 	svmresp, err := client.StopVirtualMachine(d.ID) | 	svmresp, err := client.StopVirtualMachine(d.ID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err = d.waitForJob(client, svmresp); err != nil { | 
 | ||||||
|  | 	return d.waitForJob(client, svmresp) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) | ||||||
|  | 
 | ||||||
|  | 	svmresp, err := client.RebootVirtualMachine(d.ID) | ||||||
|  | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	return nil | 
 | ||||||
|  | 	return d.waitForJob(client, svmresp) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	return d.Stop() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
|  | @ -380,31 +375,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	vmstate, err := d.GetState() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if vmstate == state.Stopped { |  | ||||||
| 		return fmt.Errorf("Host is stopped, use start command to start it") |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	client := egoscale.NewClient(d.URL, d.APIKey, d.APISecretKey) |  | ||||||
| 	svmresp, err := client.RebootVirtualMachine(d.ID) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if err = d.waitForJob(client, svmresp); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	return d.Stop() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) jobIsDone(client *egoscale.Client, jobid string) (bool, error) { | func (d *Driver) jobIsDone(client *egoscale.Client, jobid string) (bool, error) { | ||||||
| 	resp, err := client.PollAsyncJob(jobid) | 	resp, err := client.PollAsyncJob(jobid) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -80,10 +80,6 @@ func (d *Driver) Create() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 	d.MockState = state.Running | 	d.MockState = state.Running | ||||||
| 	return nil | 	return nil | ||||||
|  | @ -104,6 +100,10 @@ func (d *Driver) Kill() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (d *Driver) Remove() error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Upgrade() error { | func (d *Driver) Upgrade() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -159,12 +159,7 @@ func (d *Driver) Stop() error { | ||||||
| 	return errors.New("generic driver does not support stop") | 	return errors.New("generic driver does not support stop") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Restart() error { | func (d *Driver) Restart() error { | ||||||
| 	log.Debug("Restarting...") |  | ||||||
| 	_, err := drivers.RunSSHCommandFromDriver(d, "sudo shutdown -r now") | 	_, err := drivers.RunSSHCommandFromDriver(d, "sudo shutdown -r now") | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  | @ -172,3 +167,7 @@ func (d *Driver) Restart() error { | ||||||
| func (d *Driver) Kill() error { | func (d *Driver) Kill() error { | ||||||
| 	return errors.New("generic driver does not support kill") | 	return errors.New("generic driver does not support kill") | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Remove() error { | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -340,7 +340,6 @@ func (c *ComputeUtil) deleteInstance() error { | ||||||
| 
 | 
 | ||||||
| // stopInstance stops the instance.
 | // stopInstance stops the instance.
 | ||||||
| func (c *ComputeUtil) stopInstance() error { | func (c *ComputeUtil) stopInstance() error { | ||||||
| 	log.Infof("Stopping instance.") |  | ||||||
| 	op, err := c.service.Instances.Stop(c.project, c.zone, c.instanceName).Do() | 	op, err := c.service.Instances.Stop(c.project, c.zone, c.instanceName).Do() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -352,7 +351,6 @@ func (c *ComputeUtil) stopInstance() error { | ||||||
| 
 | 
 | ||||||
| // startInstance starts the instance.
 | // startInstance starts the instance.
 | ||||||
| func (c *ComputeUtil) startInstance() error { | func (c *ComputeUtil) startInstance() error { | ||||||
| 	log.Infof("Starting instance.") |  | ||||||
| 	op, err := c.service.Instances.Start(c.project, c.zone, c.instanceName).Do() | 	op, err := c.service.Instances.Start(c.project, c.zone, c.instanceName).Do() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  |  | ||||||
|  | @ -316,6 +316,15 @@ func (d *Driver) Stop() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Restart restarts a machine which is known to be running.
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	if err := d.Stop(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return d.Start() | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Kill stops an existing GCE instance.
 | // Kill stops an existing GCE instance.
 | ||||||
| func (d *Driver) Kill() error { | func (d *Driver) Kill() error { | ||||||
| 	return d.Stop() | 	return d.Stop() | ||||||
|  | @ -339,12 +348,3 @@ func (d *Driver) Remove() error { | ||||||
| 	} | 	} | ||||||
| 	return c.deleteDisk() | 	return c.deleteDisk() | ||||||
| } | } | ||||||
| 
 |  | ||||||
| // Restart restarts a machine which is known to be running.
 |  | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	if err := d.Stop(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return d.Start() |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -383,26 +383,31 @@ func (d *Driver) Create() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 	log.Debug("Starting OpenStack instance...", map[string]string{"MachineId": d.MachineId}) |  | ||||||
| 	if err := d.initCompute(); err != nil { | 	if err := d.initCompute(); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := d.client.StartInstance(d); err != nil { | 
 | ||||||
| 		return err | 	return d.client.StartInstance(d) | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 	log.Debug("Stopping OpenStack instance...", map[string]string{"MachineId": d.MachineId}) |  | ||||||
| 	if err := d.initCompute(); err != nil { | 	if err := d.initCompute(); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := d.client.StopInstance(d); err != nil { | 
 | ||||||
|  | 	return d.client.StopInstance(d) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	if err := d.initCompute(); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return d.client.RestartInstance(d) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	return d.Stop() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
|  | @ -422,21 +427,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	log.Info("Restarting OpenStack instance...", map[string]string{"MachineId": d.MachineId}) |  | ||||||
| 	if err := d.initCompute(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if err := d.client.RestartInstance(d); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	return d.Stop() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const ( | const ( | ||||||
| 	errorMandatoryEnvOrOption    string = "%s must be specified either using the environment variable %s or the CLI option %s" | 	errorMandatoryEnvOrOption    string = "%s must be specified either using the environment variable %s or the CLI option %s" | ||||||
| 	errorMandatoryOption         string = "%s must be specified using the CLI option %s" | 	errorMandatoryOption         string = "%s must be specified using the CLI option %s" | ||||||
|  |  | ||||||
|  | @ -454,10 +454,6 @@ func (d *Driver) publicSSHKeyPath() string { | ||||||
| 	return d.GetSSHKeyPath() + ".pub" | 	return d.GetSSHKeyPath() + ".pub" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	return d.getClient().VirtualGuest().PowerOff(d.Id) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 	log.Infof("Canceling SoftLayer instance %d...", d.Id) | 	log.Infof("Canceling SoftLayer instance %d...", d.Id) | ||||||
| 	var err error | 	var err error | ||||||
|  | @ -479,12 +475,19 @@ func (d *Driver) Remove() error { | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| func (d *Driver) Restart() error { | 
 | ||||||
| 	return d.getClient().VirtualGuest().Reboot(d.Id) |  | ||||||
| } |  | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 	return d.getClient().VirtualGuest().PowerOn(d.Id) | 	return d.getClient().VirtualGuest().PowerOn(d.Id) | ||||||
| } | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 	return d.getClient().VirtualGuest().PowerOff(d.Id) | 	return d.getClient().VirtualGuest().PowerOff(d.Id) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	return d.getClient().VirtualGuest().Reboot(d.Id) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	return d.Stop() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -479,7 +479,6 @@ func (d *Driver) Start() error { | ||||||
| 		if err := d.vbm("startvm", d.MachineName, "--type", "headless"); err != nil { | 		if err := d.vbm("startvm", d.MachineName, "--type", "headless"); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		log.Infof("Starting VM...") |  | ||||||
| 	case state.Paused: | 	case state.Paused: | ||||||
| 		if err := d.vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { | 		if err := d.vbm("controlvm", d.MachineName, "resume", "--type", "headless"); err != nil { | ||||||
| 			return err | 			return err | ||||||
|  | @ -502,23 +501,6 @@ func (d *Driver) Start() error { | ||||||
| 	return d.waitForIP() | 	return d.waitForIP() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) waitForIP() error { |  | ||||||
| 	// Wait for SSH over NAT to be available before returning to user
 |  | ||||||
| 	if err := drivers.WaitForSSH(d); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	// Bail if we don't get an IP from DHCP after a given number of seconds.
 |  | ||||||
| 	if err := mcnutils.WaitForSpecific(d.hostOnlyIPAvailable, 5, 4*time.Second); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var err error |  | ||||||
| 	d.IPAddress, err = d.GetIP() |  | ||||||
| 
 |  | ||||||
| 	return err |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 	currentState, err := d.GetState() | 	currentState, err := d.GetState() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -546,13 +528,44 @@ func (d *Driver) Stop() error { | ||||||
| 			break | 			break | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	log.Infof("Stopping VM...") |  | ||||||
| 
 | 
 | ||||||
| 	d.IPAddress = "" | 	d.IPAddress = "" | ||||||
| 
 | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Restart restarts a machine which is known to be running.
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	if err := d.vbm("controlvm", d.MachineName, "reset"); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	d.IPAddress = "" | ||||||
|  | 
 | ||||||
|  | 	return d.waitForIP() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	return d.vbm("controlvm", d.MachineName, "poweroff") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) waitForIP() error { | ||||||
|  | 	// Wait for SSH over NAT to be available before returning to user
 | ||||||
|  | 	if err := drivers.WaitForSSH(d); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Bail if we don't get an IP from DHCP after a given number of seconds.
 | ||||||
|  | 	if err := mcnutils.WaitForSpecific(d.hostOnlyIPAvailable, 5, 4*time.Second); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	var err error | ||||||
|  | 	d.IPAddress, err = d.GetIP() | ||||||
|  | 
 | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 	s, err := d.GetState() | 	s, err := d.GetState() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -576,22 +589,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return d.vbm("unregistervm", "--delete", d.MachineName) | 	return d.vbm("unregistervm", "--delete", d.MachineName) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Restart restarts a machine which is known to be running.
 |  | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	log.Infof("Restarting VM...") |  | ||||||
| 	if err := d.vbm("controlvm", d.MachineName, "reset"); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	d.IPAddress = "" |  | ||||||
| 
 |  | ||||||
| 	return d.waitForIP() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	return d.vbm("controlvm", d.MachineName, "poweroff") |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) GetState() (state.State, error) { | func (d *Driver) GetState() (state.State, error) { | ||||||
| 	stdout, stderr, err := d.vbmOutErr("showvminfo", d.MachineName, | 	stdout, stderr, err := d.vbmOutErr("showvminfo", d.MachineName, | ||||||
| 		"--machinereadable") | 		"--machinereadable") | ||||||
|  |  | ||||||
|  | @ -374,7 +374,6 @@ func (d *Driver) Create() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 	log.Infof("Starting %s...", d.MachineName) |  | ||||||
| 	vmrun("start", d.vmxPath(), "nogui") | 	vmrun("start", d.vmxPath(), "nogui") | ||||||
| 
 | 
 | ||||||
| 	// Do not execute the rest of boot2docker specific configuration, exit here
 | 	// Do not execute the rest of boot2docker specific configuration, exit here
 | ||||||
|  | @ -406,13 +405,21 @@ func (d *Driver) Start() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 	log.Infof("Gracefully shutting down %s...", d.MachineName) | 	_, _, err := vmrun("stop", d.vmxPath(), "nogui") | ||||||
| 	vmrun("stop", d.vmxPath(), "nogui") | 	return err | ||||||
| 	return nil | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	_, _, err := vmrun("reset", d.vmxPath(), "nogui") | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	_, _, err := vmrun("stop", d.vmxPath(), "hard nogui") | ||||||
|  | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 
 |  | ||||||
| 	s, _ := d.GetState() | 	s, _ := d.GetState() | ||||||
| 	if s == state.Running { | 	if s == state.Running { | ||||||
| 		if err := d.Kill(); err != nil { | 		if err := d.Kill(); err != nil { | ||||||
|  | @ -424,18 +431,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	log.Infof("Gracefully restarting %s...", d.MachineName) |  | ||||||
| 	vmrun("reset", d.vmxPath(), "nogui") |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	log.Infof("Forcibly halting %s...", d.MachineName) |  | ||||||
| 	vmrun("stop", d.vmxPath(), "hard nogui") |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Upgrade() error { | func (d *Driver) Upgrade() error { | ||||||
| 	return fmt.Errorf("VMware Fusion does not currently support the upgrade operation") | 	return fmt.Errorf("VMware Fusion does not currently support the upgrade operation") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -204,7 +204,6 @@ func (d *Driver) GetIP() (string, error) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) GetState() (state.State, error) { | func (d *Driver) GetState() (state.State, error) { | ||||||
| 
 |  | ||||||
| 	p, err := govcloudair.NewClient() | 	p, err := govcloudair.NewClient() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return state.Error, err | 		return state.Error, err | ||||||
|  | @ -238,11 +237,9 @@ func (d *Driver) GetState() (state.State, error) { | ||||||
| 		return state.Stopped, nil | 		return state.Stopped, nil | ||||||
| 	} | 	} | ||||||
| 	return state.None, nil | 	return state.None, nil | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Create() error { | func (d *Driver) Create() error { | ||||||
| 
 |  | ||||||
| 	key, err := d.createSSHKey() | 	key, err := d.createSSHKey() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -452,7 +449,6 @@ func (d *Driver) Remove() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Start() error { | func (d *Driver) Start() error { | ||||||
| 
 |  | ||||||
| 	p, err := govcloudair.NewClient() | 	p, err := govcloudair.NewClient() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -496,7 +492,6 @@ func (d *Driver) Start() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Stop() error { | func (d *Driver) Stop() error { | ||||||
| 
 |  | ||||||
| 	p, err := govcloudair.NewClient() | 	p, err := govcloudair.NewClient() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -514,21 +509,12 @@ func (d *Driver) Stop() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	status, err := vapp.GetStatus() | 	task, err := vapp.Shutdown() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 	if err = task.WaitTaskCompletion(); err != nil { | ||||||
| 	if status == "POWERED_ON" { | 		return err | ||||||
| 		log.Infof("Shutting down %s...", d.MachineName) |  | ||||||
| 		task, err := vapp.Shutdown() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if err = task.WaitTaskCompletion(); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err = p.Disconnect(); err != nil { | 	if err = p.Disconnect(); err != nil { | ||||||
|  | @ -541,7 +527,6 @@ func (d *Driver) Stop() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { | func (d *Driver) Restart() error { | ||||||
| 
 |  | ||||||
| 	p, err := govcloudair.NewClient() | 	p, err := govcloudair.NewClient() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|  | @ -559,33 +544,12 @@ func (d *Driver) Restart() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	status, err := vapp.GetStatus() | 	task, err := vapp.Reset() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 	if err = task.WaitTaskCompletion(); err != nil { | ||||||
| 	if status == "POWERED_ON" { | 		return err | ||||||
| 		// If it's powered on, restart the machine
 |  | ||||||
| 		log.Infof("Restarting %s...", d.MachineName) |  | ||||||
| 		task, err := vapp.Reset() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if err = task.WaitTaskCompletion(); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} else { |  | ||||||
| 		// If it's not powered on, start it.
 |  | ||||||
| 		log.Infof("Docker host %s is powered off, powering it back on...", d.MachineName) |  | ||||||
| 		task, err := vapp.PowerOn() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if err = task.WaitTaskCompletion(); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err = p.Disconnect(); err != nil { | 	if err = p.Disconnect(); err != nil { | ||||||
|  | @ -614,21 +578,12 @@ func (d *Driver) Kill() error { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	status, err := vapp.GetStatus() | 	task, err := vapp.PowerOff() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 	if err = task.WaitTaskCompletion(); err != nil { | ||||||
| 	if status == "POWERED_ON" { | 		return err | ||||||
| 		log.Infof("Stopping %s...", d.MachineName) |  | ||||||
| 		task, err := vapp.PowerOff() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if err = task.WaitTaskCompletion(); err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err = p.Disconnect(); err != nil { | 	if err = p.Disconnect(); err != nil { | ||||||
|  |  | ||||||
|  | @ -563,7 +563,7 @@ func (d *Driver) Start() error { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		log.Infof("Powering on VM...") | 
 | ||||||
| 		task, err := vm.PowerOn(ctx) | 		task, err := vm.PowerOn(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
|  | @ -595,7 +595,7 @@ func (d *Driver) Stop() error { | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	log.Infof("Powering off VM...") | 
 | ||||||
| 	if err := vm.ShutdownGuest(ctx); err != nil { | 	if err := vm.ShutdownGuest(ctx); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -605,6 +605,67 @@ func (d *Driver) Stop() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (d *Driver) Restart() error { | ||||||
|  | 	if err := d.Stop(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Check for 120 seconds for the machine to stop
 | ||||||
|  | 	for i := 1; i <= 60; i++ { | ||||||
|  | 		machineState, err := d.GetState() | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if machineState == state.Running { | ||||||
|  | 			log.Debugf("Not there yet %d/%d", i, 60) | ||||||
|  | 			time.Sleep(2 * time.Second) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if machineState == state.Stopped { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	machineState, err := d.GetState() | ||||||
|  | 	// If the VM is still running after 120 seconds just kill it.
 | ||||||
|  | 	if machineState == state.Running { | ||||||
|  | 		if err = d.Kill(); err != nil { | ||||||
|  | 			return fmt.Errorf("can't stop VM: %s", err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return d.Start() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (d *Driver) Kill() error { | ||||||
|  | 	ctx, cancel := context.WithCancel(context.Background()) | ||||||
|  | 	defer cancel() | ||||||
|  | 
 | ||||||
|  | 	c, err := d.vsphereLogin(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	vm, err := d.fetchVM(c, ctx, d.MachineName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	task, err := vm.PowerOff(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = task.WaitForResult(ctx, nil) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	d.IPAddress = "" | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (d *Driver) Remove() error { | func (d *Driver) Remove() error { | ||||||
| 	machineState, err := d.GetState() | 	machineState, err := d.GetState() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -670,66 +731,6 @@ func (d *Driver) Remove() error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (d *Driver) Restart() error { |  | ||||||
| 	if err := d.Stop(); err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	// Check for 120 seconds for the machine to stop
 |  | ||||||
| 	for i := 1; i <= 60; i++ { |  | ||||||
| 		machineState, err := d.GetState() |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		if machineState == state.Running { |  | ||||||
| 			log.Debugf("Not there yet %d/%d", i, 60) |  | ||||||
| 			time.Sleep(2 * time.Second) |  | ||||||
| 			continue |  | ||||||
| 		} |  | ||||||
| 		if machineState == state.Stopped { |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	machineState, err := d.GetState() |  | ||||||
| 	// If the VM is still running after 120 seconds just kill it.
 |  | ||||||
| 	if machineState == state.Running { |  | ||||||
| 		if err = d.Kill(); err != nil { |  | ||||||
| 			return fmt.Errorf("can't stop VM: %s", err) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return d.Start() |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Kill() error { |  | ||||||
| 	ctx, cancel := context.WithCancel(context.Background()) |  | ||||||
| 	defer cancel() |  | ||||||
| 
 |  | ||||||
| 	c, err := d.vsphereLogin(ctx) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	vm, err := d.fetchVM(c, ctx, d.MachineName) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	log.Infof("Powering off VM forcibly...") |  | ||||||
| 	task, err := vm.PowerOff(ctx) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	_, err = task.WaitForResult(ctx, nil) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	d.IPAddress = "" |  | ||||||
| 
 |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func (d *Driver) Upgrade() error { | func (d *Driver) Upgrade() error { | ||||||
| 	return fmt.Errorf("upgrade is not supported for vsphere driver at this moment") | 	return fmt.Errorf("upgrade is not supported for vsphere driver at this moment") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -89,6 +89,7 @@ func (h *Host) runActionForState(action func() error, desiredState state.State) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *Host) Start() error { | func (h *Host) Start() error { | ||||||
|  | 	log.Infof("Starting %q...", h.Name) | ||||||
| 	if err := h.runActionForState(h.Driver.Start, state.Running); err != nil { | 	if err := h.runActionForState(h.Driver.Start, state.Running); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -98,6 +99,7 @@ func (h *Host) Start() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *Host) Stop() error { | func (h *Host) Stop() error { | ||||||
|  | 	log.Infof("Stopping %q...", h.Name) | ||||||
| 	if err := h.runActionForState(h.Driver.Stop, state.Stopped); err != nil { | 	if err := h.runActionForState(h.Driver.Stop, state.Stopped); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -107,6 +109,7 @@ func (h *Host) Stop() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *Host) Kill() error { | func (h *Host) Kill() error { | ||||||
|  | 	log.Infof("Killing %q...", h.Name) | ||||||
| 	if err := h.runActionForState(h.Driver.Kill, state.Stopped); err != nil { | 	if err := h.runActionForState(h.Driver.Kill, state.Stopped); err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  | @ -116,15 +119,18 @@ func (h *Host) Kill() error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (h *Host) Restart() error { | func (h *Host) Restart() error { | ||||||
|  | 	log.Infof("Restarting %q...", h.Name) | ||||||
| 	if drivers.MachineInState(h.Driver, state.Stopped)() { | 	if drivers.MachineInState(h.Driver, state.Stopped)() { | ||||||
| 		return h.Start() | 		return h.Start() | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	if drivers.MachineInState(h.Driver, state.Running)() { | 	if drivers.MachineInState(h.Driver, state.Running)() { | ||||||
| 		if err := h.Driver.Restart(); err != nil { | 		if err := h.Driver.Restart(); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		return mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Running)) | 		return mcnutils.WaitFor(drivers.MachineInState(h.Driver, state.Running)) | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue