1- package vmware
1+ package fusion
22
33import (
4+ "bufio"
45 "fmt"
56 "os"
67 "path/filepath"
8+ "strconv"
9+ "strings"
710 "text/template"
811
912 "github.com/boot2docker/boot2docker-cli/driver"
@@ -55,22 +58,17 @@ func ConfigFlags(mc *driver.MachineConfig, flags *pflag.FlagSet) error {
5558
5659// Machine information.
5760type Machine struct {
58- Name string
59- State driver.MachineState
60- CPUs uint
61- Memory uint // main memory (in MB)
62- VRAM uint // video memory (in MB)
63- VMX string
64- OSType string
65- BootOrder []string // max 4 slots, each in {none|floppy|dvd|disk|net}
66- DockerPort uint
67- SSHPort uint
61+ Name string
62+ State driver.MachineState
63+ CPUs uint64
64+ Memory uint64 // main memory (in MB)
65+ VMX string
66+ OSType string
6867}
6968
7069// Refresh reloads the machine information.
7170func (m * Machine ) Refresh () error {
7271 mm , err := GetMachine (m .VMX )
73- mm .State = driver .Running
7472 if err != nil {
7573 return err
7674 }
@@ -80,50 +78,43 @@ func (m *Machine) Refresh() error {
8078
8179// Start starts the machine.
8280func (m * Machine ) Start () error {
83- m .State = driver .Running
8481 vmrun ("start" , m .VMX , "nogui" )
8582 return nil
8683}
8784
8885// Suspend suspends the machine and saves its state to disk.
8986func (m * Machine ) Save () error {
90- m .State = driver .Saved
91- fmt .Printf ("Save %s: %s\n " , m .Name , m .State )
87+ vmrun ("suspend" , m .VMX , "nogui" )
9288 return nil
9389}
9490
9591// Pause pauses the execution of the machine.
9692func (m * Machine ) Pause () error {
97- m .State = driver .Paused
98- fmt .Printf ("Pause %s: %s\n " , m .Name , m .State )
93+ vmrun ("pause" , m .VMX , "nogui" )
9994 return nil
10095}
10196
10297// Stop gracefully stops the machine.
10398func (m * Machine ) Stop () error {
104- m .State = driver .Poweroff
10599 vmrun ("stop" , m .VMX , "nogui" )
106100 return nil
107101}
108102
109103// Poweroff forcefully stops the machine. State is lost and might corrupt the disk image.
110104func (m * Machine ) Poweroff () error {
111- m .State = driver .Poweroff
112- fmt .Printf ("Poweroff %s: %s\n " , m .Name , m .State )
105+ vmrun ("stop" , m .VMX , "nogui" )
113106 return nil
114107}
115108
116109// Restart gracefully restarts the machine.
117110func (m * Machine ) Restart () error {
118- m .State = driver .Running
119- fmt .Printf ("Restart %s: %s\n " , m .Name , m .State )
111+ vmrun ("reset" , m .VMX , "nogui" )
120112 return nil
121113}
122114
123115// Reset forcefully restarts the machine. State is lost and might corrupt the disk image.
124116func (m * Machine ) Reset () error {
125- m .State = driver .Running
126- fmt .Printf ("Reset %s: %s\n " , m .Name , m .State )
117+ vmrun ("reset" , m .VMX , "nogui" )
127118 return nil
128119}
129120
@@ -132,6 +123,12 @@ func (m *Machine) GetName() string {
132123 return m .Name
133124}
134125
126+ // Get vm hostname
127+ func (m * Machine ) GetHostname () string {
128+ stdout , _ , _ := vmrun ("getGuestIPAddress" , m .VMX )
129+ return strings .TrimSpace (stdout )
130+ }
131+
135132// Get current state
136133func (m * Machine ) GetState () driver.MachineState {
137134 return m .State
@@ -144,23 +141,23 @@ func (m *Machine) GetSerialFile() string {
144141
145142// Get Docker port
146143func (m * Machine ) GetDockerPort () uint {
147- return m . DockerPort
144+ return 2375
148145}
149146
150147// Get SSH port
151148func (m * Machine ) GetSSHPort () uint {
152- return m . SSHPort
149+ return 22
153150}
154151
155152// Delete deletes the machine and associated disk images.
156153func (m * Machine ) Delete () error {
157- fmt . Printf ( "Delete %s: %s \n " , m .Name , m . State )
154+ vmrun ( "deleteVM " , m .VMX , "nogui" )
158155 return nil
159156}
160157
161158// Modify changes the settings of the machine.
162159func (m * Machine ) Modify () error {
163- fmt .Printf ("Modify %s: %s \n " , m . Name , m . State )
160+ fmt .Printf ("Hot modify not supported" )
164161 return m .Refresh ()
165162}
166163
@@ -205,7 +202,38 @@ func GetMachine(vmx string) (*Machine, error) {
205202 if _ , err := os .Stat (vmx ); os .IsNotExist (err ) {
206203 return nil , ErrMachineNotExist
207204 }
208- m := & Machine {VMX : vmx }
205+
206+ m := & Machine {VMX : vmx , State : driver .Poweroff }
207+
208+ // VMRUN only tells use if the vm is running or not
209+ if stdout , _ , _ := vmrun ("list" ); strings .Contains (stdout , m .VMX ) {
210+ m .State = driver .Running
211+ }
212+
213+ // Parse the vmx file
214+ vmxfile , err := os .Open (vmx )
215+ if err != nil {
216+ return m , err
217+ }
218+ defer vmxfile .Close ()
219+
220+ vmxscan := bufio .NewScanner (vmxfile )
221+ for vmxscan .Scan () {
222+ if vmxtokens := strings .Split (vmxscan .Text (), " = " ); len (vmxtokens ) > 1 {
223+ vmxkey := strings .TrimSpace (vmxtokens [0 ])
224+ vmxvalue , _ := strconv .Unquote (vmxtokens [1 ])
225+ switch vmxkey {
226+ case "displayName" :
227+ m .Name = vmxvalue
228+ case "guestOS" :
229+ m .OSType = vmxvalue
230+ case "memsize" :
231+ m .Memory , _ = strconv .ParseUint (vmxvalue , 10 , 0 )
232+ case "numvcpus" :
233+ m .CPUs , _ = strconv .ParseUint (vmxvalue , 10 , 0 )
234+ }
235+ }
236+ }
209237 return m , nil
210238}
211239
0 commit comments