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