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  }