github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/controller/pkg/ipsetmanager/ipsetprovider_windows.go (about) 1 // +build windows 2 3 package ipsetmanager 4 5 import ( 6 "fmt" 7 8 "go.uber.org/zap" 9 10 "github.com/aporeto-inc/go-ipset/ipset" 11 "go.aporeto.io/enforcerd/trireme-lib/utils/frontman" 12 ) 13 14 // IpsetProvider returns a fabric for Ipset. 15 type IpsetProvider interface { 16 NewIpset(name string, ipsetType string, p *ipset.Params) (Ipset, error) 17 GetIpset(name string) Ipset 18 DestroyAll(prefix string) error 19 ListIPSets() ([]string, error) 20 } 21 22 // Ipset is an abstraction of all the methods an implementation of userspace 23 // ipsets need to provide. 24 type Ipset interface { 25 Add(entry string, timeout int) error 26 AddOption(entry string, option string, timeout int) error 27 Del(entry string) error 28 Destroy() error 29 Flush() error 30 Test(entry string) (bool, error) 31 } 32 33 type ipsetProvider struct{} 34 35 var instance IpsetProvider = &ipsetProvider{} 36 37 type winIPSet struct { 38 handle uintptr 39 name string 40 } 41 42 // NewIpset returns an IpsetProvider interface based on the go-ipset 43 // external package. 44 func (i *ipsetProvider) NewIpset(name string, ipsetType string, p *ipset.Params) (Ipset, error) { 45 ipsetHandle, err := frontman.Wrapper.NewIpset(name, ipsetType) 46 if err != nil { 47 return nil, err 48 } 49 return &winIPSet{ipsetHandle, name}, nil 50 } 51 52 // GetIpset gets the ipset object from the name. 53 // Note that the interface can't return error here, but since it's possible to fail in Windows, 54 // we log error and return incomplete object, and expect a failure from Frontman on a later call. 55 func (i *ipsetProvider) GetIpset(name string) Ipset { 56 ipsetHandle, err := frontman.Wrapper.GetIpset(name) 57 if err != nil { 58 zap.L().Error(fmt.Sprintf("failed to get ipset %s", name), zap.Error(err)) 59 return &winIPSet{0, name} 60 } 61 return &winIPSet{ipsetHandle, name} 62 } 63 64 // DestroyAll destroys all the ipsets - it will fail if there are existing references 65 func (i *ipsetProvider) DestroyAll(prefix string) error { 66 return frontman.Wrapper.DestroyAllIpsets(prefix) 67 } 68 69 func (i *ipsetProvider) ListIPSets() ([]string, error) { 70 return frontman.Wrapper.ListIpsets() 71 } 72 73 // IPsetProvider Returns a Go IPSet Provider 74 func IPsetProvider() IpsetProvider { 75 return instance 76 } 77 78 func (w *winIPSet) Add(entry string, timeout int) error { 79 return frontman.Wrapper.IpsetAdd(w.handle, entry, timeout) 80 } 81 82 func (w *winIPSet) AddOption(entry string, option string, timeout int) error { 83 return frontman.Wrapper.IpsetAddOption(w.handle, entry, option, timeout) 84 } 85 86 func (w *winIPSet) Del(entry string) error { 87 return frontman.Wrapper.IpsetDelete(w.handle, entry) 88 } 89 90 func (w *winIPSet) Destroy() error { 91 return frontman.Wrapper.IpsetDestroy(w.handle, w.name) 92 } 93 94 func (w *winIPSet) Flush() error { 95 return frontman.Wrapper.IpsetFlush(w.handle) 96 } 97 98 func (w *winIPSet) Test(entry string) (bool, error) { 99 return frontman.Wrapper.IpsetTest(w.handle, entry) 100 } 101 102 func newIpset(name string, ipsetType string, p *ipset.Params) (Ipset, error) { 103 return IPsetProvider().NewIpset(name, ipsetType, p) 104 } 105 106 func getIpset(name string) Ipset { 107 return IPsetProvider().GetIpset(name) 108 } 109 110 func destroyAll(prefix string) error { 111 return IPsetProvider().DestroyAll(prefix) 112 } 113 114 func listIPSets() ([]string, error) { 115 return IPsetProvider().ListIPSets() 116 } 117 118 //SetIpsetTestInstance sets the test instance for ipsets 119 func SetIpsetTestInstance(ipsetprovider IpsetProvider) { 120 instance = ipsetprovider 121 } 122 123 //SetIPsetPath is a no-op for windows 124 func SetIPsetPath() { 125 }