// MaintainInstance ensures the container's host has the required iptables and // routing rules to make the container visible to both the host and other // machines on the same subnet. This is important mostly when address allocation // feature flag is enabled, as otherwise we don't create additional iptables // rules or routes. func (broker *lxdBroker) MaintainInstance(args environs.StartInstanceParams) error { machineID := args.InstanceConfig.MachineId // Default to using the host network until we can configure. bridgeDevice := broker.agentConfig.Value(agent.LxdBridge) if bridgeDevice == "" { var err error bridgeDevice, err = lxdclient.GetDefaultBridgeName() if err != nil { return err } } // There's no InterfaceInfo we expect to get below. _, err := prepareOrGetContainerInterfaceInfo( broker.api, machineID, bridgeDevice, false, // maintain, do not allocate. broker.enableNAT, args.NetworkInfo, lxdLogger, ) return err }
func (broker *lxdBroker) StartInstance(args environs.StartInstanceParams) (*environs.StartInstanceResult, error) { if args.InstanceConfig.HasNetworks() { return nil, errors.New("starting lxd containers with networks is not supported yet") } machineId := args.InstanceConfig.MachineId bridgeDevice := broker.agentConfig.Value(agent.LxcBridge) if bridgeDevice == "" { var err error bridgeDevice, err = lxdclient.GetDefaultBridgeName() if err != nil { return nil, errors.Trace(err) } } preparedInfo, err := prepareOrGetContainerInterfaceInfo( broker.api, machineId, bridgeDevice, true, // allocate if possible, do not maintain existing. broker.enableNAT, args.NetworkInfo, lxdLogger, ) if err != nil { // It's not fatal (yet) if we couldn't pre-allocate addresses for the // container. logger.Warningf("failed to prepare container %q network config: %v", machineId, err) } else { args.NetworkInfo = preparedInfo } network := container.BridgeNetworkConfig(bridgeDevice, 0, args.NetworkInfo) series := args.Tools.OneSeries() args.InstanceConfig.MachineContainerType = instance.LXD args.InstanceConfig.Tools = args.Tools[0] config, err := broker.api.ContainerConfig() if err != nil { lxdLogger.Errorf("failed to get container config: %v", err) return nil, err } if err := instancecfg.PopulateInstanceConfig( args.InstanceConfig, config.ProviderType, config.AuthorizedKeys, config.SSLHostnameVerification, config.Proxy, config.AptProxy, config.AptMirror, config.PreferIPv6, config.EnableOSRefreshUpdate, config.EnableOSUpgrade, ); err != nil { lxdLogger.Errorf("failed to populate machine config: %v", err) return nil, err } storageConfig := &container.StorageConfig{} inst, hardware, err := broker.manager.CreateContainer(args.InstanceConfig, series, network, storageConfig, args.StatusCallback) if err != nil { return nil, err } return &environs.StartInstanceResult{ Instance: inst, Hardware: hardware, NetworkInfo: network.Interfaces, }, nil }