func NewLibvirtLXCBackend(state *State, portAlloc map[string]*ports.Allocator, volPath, logPath, initPath string) (Backend, error) { libvirtc, err := libvirt.NewVirConnection("lxc:///") if err != nil { return nil, err } iptables.RemoveExistingChain("FLYNN", "virbr0") chain, err := iptables.NewChain("FLYNN", "virbr0") if err != nil { return nil, err } if err := ioutil.WriteFile("/proc/sys/net/ipv4/conf/virbr0/route_localnet", []byte("1"), 0666); err != nil { return nil, err } if err := ioutil.WriteFile("/sys/class/net/virbr0/bridge/stp_state", []byte("0"), 0666); err != nil { return nil, err } return &LibvirtLXCBackend{ LogPath: logPath, VolPath: volPath, InitPath: initPath, libvirt: libvirtc, state: state, ports: portAlloc, forwarder: ports.NewForwarder(net.ParseIP("0.0.0.0"), chain), logs: make(map[string]*logbuf.Log), containers: make(map[string]*libvirtContainer), }, nil }
func NewLibvirtLXCBackend(state *State, portAlloc map[string]*ports.Allocator, volPath, logPath, initPath string) (Backend, error) { libvirtc, err := libvirt.NewVirConnection("lxc:///") if err != nil { return nil, err } pinkertonCtx, err := pinkerton.BuildContext("aufs", "/var/lib/docker") if err != nil { return nil, err } if err := writeResolvConf("/etc/flynn/resolv.conf"); err != nil { return nil, fmt.Errorf("Could not create resolv.conf: %s", err) } b := random.Bytes(5) bridgeMAC := fmt.Sprintf("fe:%02x:%02x:%02x:%02x:%02x", b[0], b[1], b[2], b[3], b[4]) network, err := libvirtc.LookupNetworkByName(libvirtNetName) if err != nil { n := <.Network{ Name: libvirtNetName, Bridge: lt.Bridge{Name: bridgeName, STP: "off"}, IP: lt.IP{Address: bridgeAddr.String(), Netmask: bridgeMask}, MAC: lt.MAC{Address: bridgeMAC}, } network, err = libvirtc.NetworkDefineXML(string(n.XML())) if err != nil { return nil, err } } active, err := network.IsActive() if err != nil { return nil, err } if !active { if err := network.Create(); err != nil { return nil, err } } // We need to explicitly assign the MAC address to avoid it changing to a lower value // See: https://github.com/flynn/flynn/issues/223 if err := netlink.NetworkSetMacAddress(bridgeName, bridgeMAC); err != nil { return nil, err } iptables.RemoveExistingChain("FLYNN", bridgeName) chain, err := iptables.NewChain("FLYNN", bridgeName) if err != nil { return nil, err } if err := ioutil.WriteFile("/proc/sys/net/ipv4/conf/"+bridgeName+"/route_localnet", []byte("1"), 0666); err != nil { return nil, err } return &LibvirtLXCBackend{ LogPath: logPath, VolPath: volPath, InitPath: initPath, libvirt: libvirtc, state: state, ports: portAlloc, pinkerton: pinkertonCtx, forwarder: ports.NewForwarder(net.ParseIP("0.0.0.0"), chain), logs: make(map[string]*logbuf.Log), containers: make(map[string]*libvirtContainer), }, nil }