diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e57785140b61eaeac6e1c0f1ac3a6f0c7a21f173..4746c6f5c55edda7376fca9ff654600d56512830 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,6 +7,14 @@ before_script: - apt-get update -yqqq - apt-get install -yqqq make +test: + stage: test + script: + - make fmt lint vet test-long + tags: + - docker + - privileged + build: stage: build script: diff --git a/libmachine/host/host.go b/libmachine/host/host.go index c43800502c4fd36d544c51c4f83d31d7840d3c82..ca76802236b2765ad976b4e5cb824bc633a042a3 100644 --- a/libmachine/host/host.go +++ b/libmachine/host/host.go @@ -38,6 +38,7 @@ func SetSSHClientCreator(creator SSHClientCreator) { type Host struct { ConfigVersion int + LastState state.State `json:"-"` Driver drivers.Driver DriverName string HostOptions *Options @@ -103,7 +104,12 @@ func (h *Host) runActionForState(action func() error, desiredState state.State) return err } - return mcnutils.WaitFor(drivers.MachineInState(h.Driver, desiredState)) + if err := mcnutils.WaitFor(drivers.MachineInState(h.Driver, desiredState)); err != nil { + return err + } + + h.LastState = desiredState + return nil } func (h *Host) WaitForDocker() error { @@ -161,6 +167,8 @@ func (h *Host) Restart() error { } } + h.LastState = state.Running + return h.WaitForDocker() } @@ -221,3 +229,10 @@ func (h *Host) Provision() error { return provisioner.Provision(*h.HostOptions.SwarmOptions, *h.HostOptions.AuthOptions, *h.HostOptions.EngineOptions) } + +func (h *Host) UpdateLastState() { + lastState, err := h.Driver.GetState() + if err == nil { + h.LastState = lastState + } +} diff --git a/libmachine/libmachine.go b/libmachine/libmachine.go index de1779920ff4fd105a25a0976b119c82a72ba343..56084a42db782ef2a0bd03c7a84630abcdbb23b5 100644 --- a/libmachine/libmachine.go +++ b/libmachine/libmachine.go @@ -61,6 +61,7 @@ func (api *Client) NewHost(driverName string, rawDriver []byte) (*host.Host, err return &host.Host{ ConfigVersion: version.ConfigVersion, + LastState: state.None, Name: driver.GetMachineName(), Driver: driver, DriverName: driver.DriverName(), @@ -135,7 +136,10 @@ func (api *Client) Create(h *host.Host) error { log.Info("Creating machine...") if err := api.performCreate(h); err != nil { + h.UpdateLastState() + // Try to save machine when Create fails, it can store some critical information like DropletID + // (which in some/most DO failures cases is equal 0 :P) api.Save(h) return fmt.Errorf("Error creating machine: %s", err) @@ -143,6 +147,7 @@ func (api *Client) Create(h *host.Host) error { log.Debug("Reticulating splines...") + h.UpdateLastState() return nil } diff --git a/libmachine/persist/filestore.go b/libmachine/persist/filestore.go index 3978a9ce49405d26297df4c25e798112c4c88b75..3eb5576e44a0277b95ea2285a0290d01d467a7bb 100644 --- a/libmachine/persist/filestore.go +++ b/libmachine/persist/filestore.go @@ -72,6 +72,8 @@ func (s Filestore) Save(host *host.Host) error { return err } + s.saveToFile([]byte(host.LastState.String()), filepath.Join(hostPath, "last_state")) + return s.saveToFile(data, filepath.Join(hostPath, "config.json")) }