github.com/geofffranks/garden-linux@v0.0.0-20160715111146-26c893169cfa/linux_container/iptables_manager/iptables_manager.go (about) 1 package iptables_manager 2 3 import "net" 4 5 //go:generate counterfeiter -o fake_chain/fake_chain.go . Chain 6 type Chain interface { 7 Setup(containerID, bridgeName string, ip net.IP, network *net.IPNet) error 8 Teardown(containerID string) error 9 } 10 11 type IPTablesManager struct { 12 chains []Chain 13 } 14 15 func New() *IPTablesManager { 16 return &IPTablesManager{} 17 } 18 19 func (mgr *IPTablesManager) AddChain(chain Chain) *IPTablesManager { 20 mgr.chains = append(mgr.chains, chain) 21 22 return mgr 23 } 24 25 func (mgr *IPTablesManager) ContainerSetup(containerID, bridgeName string, ip net.IP, network *net.IPNet) error { 26 if err := mgr.ContainerTeardown(containerID); err != nil { 27 return err 28 } 29 30 for index, chain := range mgr.chains { 31 if err := chain.Setup(containerID, bridgeName, ip, network); err != nil { 32 for i := 0; i < index; i++ { 33 mgr.chains[i].Teardown(containerID) 34 } 35 return err 36 } 37 38 } 39 40 return nil 41 } 42 43 func (mgr *IPTablesManager) ContainerTeardown(containerID string) error { 44 var lastErr error 45 for _, chain := range mgr.chains { 46 if err := chain.Teardown(containerID); err != nil { 47 lastErr = err 48 } 49 } 50 51 return lastErr 52 }