github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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/errors" 8 "github.com/juju/loggo" 9 10 "github.com/juju/juju/agent" 11 "github.com/juju/juju/container" 12 "github.com/juju/juju/container/kvm" 13 "github.com/juju/juju/environs" 14 "github.com/juju/juju/instance" 15 ) 16 17 var kvmLogger = loggo.GetLogger("juju.provisioner.kvm") 18 19 var _ environs.InstanceBroker = (*kvmBroker)(nil) 20 21 func NewKvmBroker( 22 api APICalls, 23 agentConfig agent.Config, 24 managerConfig container.ManagerConfig, 25 ) (environs.InstanceBroker, error) { 26 manager, err := kvm.NewContainerManager(managerConfig) 27 if err != nil { 28 return nil, err 29 } 30 return &kvmBroker{ 31 manager: manager, 32 api: api, 33 agentConfig: agentConfig, 34 }, nil 35 } 36 37 type kvmBroker struct { 38 manager container.Manager 39 api APICalls 40 agentConfig agent.Config 41 } 42 43 // StartInstance is specified in the Broker interface. 44 func (broker *kvmBroker) StartInstance(args environs.StartInstanceParams) (*environs.StartInstanceResult, error) { 45 if args.MachineConfig.HasNetworks() { 46 return nil, errors.New("starting kvm containers with networks is not supported yet") 47 } 48 // TODO: refactor common code out of the container brokers. 49 machineId := args.MachineConfig.MachineId 50 kvmLogger.Infof("starting kvm container for machineId: %s", machineId) 51 52 // TODO: Default to using the host network until we can configure. Yes, 53 // this is using the LxcBridge value, we should put it in the api call for 54 // container config. 55 bridgeDevice := broker.agentConfig.Value(agent.LxcBridge) 56 if bridgeDevice == "" { 57 bridgeDevice = kvm.DefaultKvmBridge 58 } 59 network := container.BridgeNetworkConfig(bridgeDevice, args.NetworkInfo) 60 61 series := args.Tools.OneSeries() 62 args.MachineConfig.MachineContainerType = instance.KVM 63 args.MachineConfig.Tools = args.Tools[0] 64 65 config, err := broker.api.ContainerConfig() 66 if err != nil { 67 kvmLogger.Errorf("failed to get container config: %v", err) 68 return nil, err 69 } 70 71 if err := environs.PopulateMachineConfig( 72 args.MachineConfig, 73 config.ProviderType, 74 config.AuthorizedKeys, 75 config.SSLHostnameVerification, 76 config.Proxy, 77 config.AptProxy, 78 config.AptMirror, 79 config.PreferIPv6, 80 config.EnableOSRefreshUpdate, 81 config.EnableOSUpgrade, 82 ); err != nil { 83 kvmLogger.Errorf("failed to populate machine config: %v", err) 84 return nil, err 85 } 86 87 inst, hardware, err := broker.manager.CreateContainer(args.MachineConfig, series, network) 88 if err != nil { 89 kvmLogger.Errorf("failed to start container: %v", err) 90 return nil, err 91 } 92 kvmLogger.Infof("started kvm container for machineId: %s, %s, %s", machineId, inst.Id(), hardware.String()) 93 return &environs.StartInstanceResult{ 94 Instance: inst, 95 Hardware: hardware, 96 }, nil 97 } 98 99 // StopInstances shuts down the given instances. 100 func (broker *kvmBroker) StopInstances(ids ...instance.Id) error { 101 // TODO: potentially parallelise. 102 for _, id := range ids { 103 kvmLogger.Infof("stopping kvm container for instance: %s", id) 104 if err := broker.manager.DestroyContainer(id); err != nil { 105 kvmLogger.Errorf("container did not stop: %v", err) 106 return err 107 } 108 } 109 return nil 110 } 111 112 // AllInstances only returns running containers. 113 func (broker *kvmBroker) AllInstances() (result []instance.Instance, err error) { 114 return broker.manager.ListContainers() 115 }