launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/worker/provisioner/kvm-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 9 "launchpad.net/juju-core/agent" 10 "launchpad.net/juju-core/constraints" 11 "launchpad.net/juju-core/container" 12 "launchpad.net/juju-core/container/kvm" 13 "launchpad.net/juju-core/environs" 14 "launchpad.net/juju-core/environs/cloudinit" 15 "launchpad.net/juju-core/instance" 16 "launchpad.net/juju-core/tools" 17 ) 18 19 var kvmLogger = loggo.GetLogger("juju.provisioner.kvm") 20 21 var _ environs.InstanceBroker = (*kvmBroker)(nil) 22 var _ tools.HasTools = (*kvmBroker)(nil) 23 24 func NewKvmBroker( 25 api APICalls, 26 tools *tools.Tools, 27 agentConfig agent.Config, 28 ) (environs.InstanceBroker, error) { 29 manager, err := kvm.NewContainerManager(container.ManagerConfig{Name: "juju"}) 30 if err != nil { 31 return nil, mask(err) 32 } 33 return &kvmBroker{ 34 manager: manager, 35 api: api, 36 tools: tools, 37 agentConfig: agentConfig, 38 }, nil 39 } 40 41 type kvmBroker struct { 42 manager container.Manager 43 api APICalls 44 tools *tools.Tools 45 agentConfig agent.Config 46 } 47 48 func (broker *kvmBroker) Tools() tools.List { 49 return tools.List{broker.tools} 50 } 51 52 // StartInstance is specified in the Broker interface. 53 func (broker *kvmBroker) StartInstance( 54 cons constraints.Value, 55 possibleTools tools.List, 56 machineConfig *cloudinit.MachineConfig, 57 ) (instance.Instance, *instance.HardwareCharacteristics, error) { 58 59 // TODO: refactor common code out of the container brokers. 60 machineId := machineConfig.MachineId 61 kvmLogger.Infof("starting kvm container for machineId: %s", machineId) 62 63 // TODO: Default to using the host network until we can configure. Yes, 64 // this is using the LxcBridge value, we should put it in the api call for 65 // container config. 66 bridgeDevice := broker.agentConfig.Value(agent.LxcBridge) 67 if bridgeDevice == "" { 68 bridgeDevice = kvm.DefaultKvmBridge 69 } 70 network := container.BridgeNetworkConfig(bridgeDevice) 71 72 // TODO: series doesn't necessarily need to be the same as the host. 73 series := possibleTools.OneSeries() 74 machineConfig.MachineContainerType = instance.KVM 75 machineConfig.Tools = possibleTools[0] 76 77 config, err := broker.api.ContainerConfig() 78 if err != nil { 79 kvmLogger.Errorf("failed to get container config: %v", err) 80 return nil, nil, err 81 } 82 if err := environs.PopulateMachineConfig( 83 machineConfig, 84 config.ProviderType, 85 config.AuthorizedKeys, 86 config.SSLHostnameVerification, 87 config.SyslogPort, 88 config.Proxy, 89 config.AptProxy, 90 ); err != nil { 91 kvmLogger.Errorf("failed to populate machine config: %v", err) 92 return nil, nil, err 93 } 94 95 inst, hardware, err := broker.manager.StartContainer(machineConfig, series, network) 96 if err != nil { 97 kvmLogger.Errorf("failed to start container: %v", err) 98 return nil, nil, err 99 } 100 kvmLogger.Infof("started kvm container for machineId: %s, %s, %s", machineId, inst.Id(), hardware.String()) 101 return inst, hardware, nil 102 } 103 104 // StopInstances shuts down the given instances. 105 func (broker *kvmBroker) StopInstances(instances []instance.Instance) error { 106 // TODO: potentially parallelise. 107 for _, instance := range instances { 108 kvmLogger.Infof("stopping kvm container for instance: %s", instance.Id()) 109 if err := broker.manager.StopContainer(instance); err != nil { 110 kvmLogger.Errorf("container did not stop: %v", err) 111 return err 112 } 113 } 114 return nil 115 } 116 117 // AllInstances only returns running containers. 118 func (broker *kvmBroker) AllInstances() (result []instance.Instance, err error) { 119 return broker.manager.ListContainers() 120 }