func (c *controller) sandboxAdd(key string, create bool, ep *endpoint) (sandbox.Sandbox, error) { c.Lock() sData, ok := c.sandboxes[key] c.Unlock() if !ok { sb, err := sandbox.NewSandbox(key, create) if err != nil { return nil, fmt.Errorf("failed to create new sandbox: %v", err) } sData = &sandboxData{ sbox: sb, endpoints: epHeap{}, } heap.Init(&sData.endpoints) c.Lock() c.sandboxes[key] = sData c.Unlock() } if err := sData.addEndpoint(ep); err != nil { return nil, err } return sData.sandbox(), nil }
func (n *network) initSandbox() error { n.Lock() n.initEpoch++ n.Unlock() sbox, err := sandbox.NewSandbox( sandbox.GenerateKey(fmt.Sprintf("%d-", n.initEpoch)+string(n.id)), true) if err != nil { return fmt.Errorf("could not create network sandbox: %v", err) } // Add a bridge inside the namespace if err := sbox.AddInterface("bridge1", "br", sbox.InterfaceOptions().Address(bridgeIP), sbox.InterfaceOptions().Bridge(true)); err != nil { return fmt.Errorf("could not create bridge inside the network sandbox: %v", err) } vxlanName, err := createVxlan(n.vxlanID()) if err != nil { return err } if err := sbox.AddInterface(vxlanName, "vxlan", sbox.InterfaceOptions().Master("bridge1")); err != nil { return fmt.Errorf("could not add vxlan interface inside the network sandbox: %v", err) } n.vxlanName = vxlanName n.setSandbox(sbox) n.driver.peerDbUpdateSandbox(n.id) var nlSock *nl.NetlinkSocket sbox.InvokeFunc(func() { nlSock, err = nl.Subscribe(syscall.NETLINK_ROUTE, syscall.RTNLGRP_NEIGH) if err != nil { err = fmt.Errorf("failed to subscribe to neighbor group netlink messages") } }) go n.watchMiss(nlSock) return nil }
func (c *controller) sandboxAdd(key string, create bool) (sandbox.Sandbox, error) { c.Lock() defer c.Unlock() sData, ok := c.sandboxes[key] if !ok { sb, err := sandbox.NewSandbox(key, create) if err != nil { return nil, err } sData = &sandboxData{sandbox: sb, refCnt: 1} c.sandboxes[key] = sData return sData.sandbox, nil } sData.refCnt++ return sData.sandbox, nil }