github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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/juju/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{container.ConfigName: "juju"}) 30 if err != nil { 31 return nil, 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.Proxy, 88 config.AptProxy, 89 ); err != nil { 90 kvmLogger.Errorf("failed to populate machine config: %v", err) 91 return nil, nil, err 92 } 93 94 inst, hardware, err := broker.manager.StartContainer(machineConfig, series, network) 95 if err != nil { 96 kvmLogger.Errorf("failed to start container: %v", err) 97 return nil, nil, err 98 } 99 kvmLogger.Infof("started kvm container for machineId: %s, %s, %s", machineId, inst.Id(), hardware.String()) 100 return inst, hardware, nil 101 } 102 103 // StopInstances shuts down the given instances. 104 func (broker *kvmBroker) StopInstances(instances []instance.Instance) error { 105 // TODO: potentially parallelise. 106 for _, instance := range instances { 107 kvmLogger.Infof("stopping kvm container for instance: %s", instance.Id()) 108 if err := broker.manager.StopContainer(instance); err != nil { 109 kvmLogger.Errorf("container did not stop: %v", err) 110 return err 111 } 112 } 113 return nil 114 } 115 116 // AllInstances only returns running containers. 117 func (broker *kvmBroker) AllInstances() (result []instance.Instance, err error) { 118 return broker.manager.ListContainers() 119 }