launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/provisioner/lxc-broker.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provisioner 5 6 import ( 7 "github.com/loggo/loggo" 8 "launchpad.net/juju-core/agent" 9 "launchpad.net/juju-core/constraints" 10 "launchpad.net/juju-core/container" 11 "launchpad.net/juju-core/container/lxc" 12 "launchpad.net/juju-core/environs" 13 "launchpad.net/juju-core/environs/cloudinit" 14 "launchpad.net/juju-core/instance" 15 "launchpad.net/juju-core/state/api/params" 16 "launchpad.net/juju-core/tools" 17 ) 18 19 var lxcLogger = loggo.GetLogger("juju.provisioner.lxc") 20 21 var _ environs.InstanceBroker = (*lxcBroker)(nil) 22 var _ tools.HasTools = (*lxcBroker)(nil) 23 24 type APICalls interface { 25 ContainerConfig() (params.ContainerConfig, error) 26 } 27 28 func NewLxcBroker(api APICalls, tools *tools.Tools, agentConfig agent.Config) environs.InstanceBroker { 29 return &lxcBroker{ 30 manager: lxc.NewContainerManager(container.ManagerConfig{Name: "juju"}), 31 api: api, 32 tools: tools, 33 agentConfig: agentConfig, 34 } 35 } 36 37 type lxcBroker struct { 38 manager container.Manager 39 api APICalls 40 tools *tools.Tools 41 agentConfig agent.Config 42 } 43 44 func (broker *lxcBroker) Tools() tools.List { 45 return tools.List{broker.tools} 46 } 47 48 // StartInstance is specified in the Broker interface. 49 func (broker *lxcBroker) StartInstance(cons constraints.Value, possibleTools tools.List, 50 machineConfig *cloudinit.MachineConfig) (instance.Instance, *instance.HardwareCharacteristics, error) { 51 // TODO: refactor common code out of the container brokers. 52 machineId := machineConfig.MachineId 53 lxcLogger.Infof("starting lxc container for machineId: %s", machineId) 54 55 // Default to using the host network until we can configure. 56 bridgeDevice := broker.agentConfig.Value(agent.LxcBridge) 57 if bridgeDevice == "" { 58 bridgeDevice = lxc.DefaultLxcBridge 59 } 60 network := container.BridgeNetworkConfig(bridgeDevice) 61 62 series := possibleTools.OneSeries() 63 machineConfig.MachineContainerType = instance.LXC 64 machineConfig.Tools = possibleTools[0] 65 66 config, err := broker.api.ContainerConfig() 67 if err != nil { 68 lxcLogger.Errorf("failed to get container config: %v", err) 69 return nil, nil, err 70 } 71 if err := environs.PopulateMachineConfig( 72 machineConfig, 73 config.ProviderType, 74 config.AuthorizedKeys, 75 config.SSLHostnameVerification, 76 config.SyslogPort, 77 config.Proxy, 78 config.AptProxy, 79 ); err != nil { 80 lxcLogger.Errorf("failed to populate machine config: %v", err) 81 return nil, nil, err 82 } 83 84 inst, hardware, err := broker.manager.StartContainer(machineConfig, series, network) 85 if err != nil { 86 lxcLogger.Errorf("failed to start container: %v", err) 87 return nil, nil, err 88 } 89 lxcLogger.Infof("started lxc container for machineId: %s, %s, %s", machineId, inst.Id(), hardware.String()) 90 return inst, hardware, nil 91 } 92 93 // StopInstances shuts down the given instances. 94 func (broker *lxcBroker) StopInstances(instances []instance.Instance) error { 95 // TODO: potentially parallelise. 96 for _, instance := range instances { 97 lxcLogger.Infof("stopping lxc container for instance: %s", instance.Id()) 98 if err := broker.manager.StopContainer(instance); err != nil { 99 lxcLogger.Errorf("container did not stop: %v", err) 100 return err 101 } 102 } 103 return nil 104 } 105 106 // AllInstances only returns running containers. 107 func (broker *lxcBroker) AllInstances() (result []instance.Instance, err error) { 108 return broker.manager.ListContainers() 109 }