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