github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/container/kvm/container.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package kvm 5 6 import ( 7 "fmt" 8 9 "github.com/juju/errors" 10 11 "github.com/juju/juju/container" 12 ) 13 14 type kvmContainer struct { 15 factory *containerFactory 16 name string 17 // started is a three state boolean, true, false, or unknown 18 // this allows for checking when we don't know, but using a 19 // value if we already know it (like in the list situation). 20 started *bool 21 } 22 23 var _ Container = (*kvmContainer)(nil) 24 25 func (c *kvmContainer) Name() string { 26 return c.name 27 } 28 29 func (c *kvmContainer) Start(params StartParams) error { 30 31 logger.Debugf("Synchronise images for %s %s %v", params.Series, params.Arch, params.ImageDownloadUrl) 32 if err := SyncImages(params.Series, params.Arch, params.ImageDownloadUrl); err != nil { 33 return err 34 } 35 var bridge string 36 if params.Network != nil { 37 if params.Network.NetworkType == container.BridgeNetwork { 38 bridge = params.Network.Device 39 } else { 40 err := errors.New("Non-bridge network devices not yet supported") 41 logger.Infof(err.Error()) 42 return err 43 } 44 } 45 logger.Debugf("Create the machine %s", c.name) 46 if err := CreateMachine(CreateMachineParams{ 47 Hostname: c.name, 48 Series: params.Series, 49 Arch: params.Arch, 50 UserDataFile: params.UserDataFile, 51 NetworkBridge: bridge, 52 Memory: params.Memory, 53 CpuCores: params.CpuCores, 54 RootDisk: params.RootDisk, 55 }); err != nil { 56 return err 57 } 58 59 logger.Debugf("Set machine %s to autostart", c.name) 60 return AutostartMachine(c.name) 61 } 62 63 func (c *kvmContainer) Stop() error { 64 if !c.IsRunning() { 65 logger.Debugf("%s is already stopped", c.name) 66 return nil 67 } 68 // Make started state unknown again. 69 c.started = nil 70 logger.Debugf("Stop %s", c.name) 71 return DestroyMachine(c.name) 72 } 73 74 func (c *kvmContainer) IsRunning() bool { 75 if c.started != nil { 76 return *c.started 77 } 78 machines, err := ListMachines() 79 if err != nil { 80 return false 81 } 82 c.started = isRunning(machines[c.name]) 83 return *c.started 84 } 85 86 func (c *kvmContainer) String() string { 87 return fmt.Sprintf("<KVM container %v>", *c) 88 }