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  }