github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 logger.Debugf("Synchronise images for %s %s", params.Series, params.Arch) 31 if err := SyncImages(params.Series, params.Arch); err != nil { 32 return err 33 } 34 var bridge string 35 if params.Network != nil { 36 if params.Network.NetworkType == container.BridgeNetwork { 37 bridge = params.Network.Device 38 } else { 39 return errors.LoggedErrorf(logger, "Non-bridge network devices not yet supported") 40 } 41 } 42 logger.Debugf("Create the machine %s", c.name) 43 if err := CreateMachine(CreateMachineParams{ 44 Hostname: c.name, 45 Series: params.Series, 46 Arch: params.Arch, 47 UserDataFile: params.UserDataFile, 48 NetworkBridge: bridge, 49 Memory: params.Memory, 50 CpuCores: params.CpuCores, 51 RootDisk: params.RootDisk, 52 }); err != nil { 53 return err 54 } 55 56 logger.Debugf("Set machine %s to autostart", c.name) 57 return AutostartMachine(c.name) 58 } 59 60 func (c *kvmContainer) Stop() error { 61 if !c.IsRunning() { 62 logger.Debugf("%s is already stopped", c.name) 63 return nil 64 } 65 // Make started state unknown again. 66 c.started = nil 67 logger.Debugf("Stop %s", c.name) 68 return DestroyMachine(c.name) 69 } 70 71 func (c *kvmContainer) IsRunning() bool { 72 if c.started != nil { 73 return *c.started 74 } 75 machines, err := ListMachines() 76 if err != nil { 77 return false 78 } 79 c.started = isRunning(machines[c.name]) 80 return *c.started 81 } 82 83 func (c *kvmContainer) String() string { 84 return fmt.Sprintf("<KVM container %v>", *c) 85 }