1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

support flush services API

Signed-off-by: m1093782566 <dujun5@huawei.com>
This commit is contained in:
m1093782566 2017-08-31 19:06:55 +08:00
parent 6b3ec6b965
commit 89aeeb294c
3 changed files with 49 additions and 0 deletions

View file

@ -116,6 +116,13 @@ func (i *Handle) DelService(s *Service) error {
return i.doCmd(s, nil, ipvsCmdDelService) return i.doCmd(s, nil, ipvsCmdDelService)
} }
// Flush deletes all existing services in the passed
// handle.
func (i *Handle) Flush() error {
_, err := i.doCmdWithoutAttr(ipvsCmdFlush)
return err
}
// NewDestination creates a new real server in the passed ipvs // NewDestination creates a new real server in the passed ipvs
// service which should already be existing in the passed handle. // service which should already be existing in the passed handle.
func (i *Handle) NewDestination(s *Service, d *Destination) error { func (i *Handle) NewDestination(s *Service, d *Destination) error {

View file

@ -178,6 +178,41 @@ func TestService(t *testing.T) {
} }
} }
svcs := []Service{
{
AddressFamily: nl.FAMILY_V4,
SchedName: RoundRobin,
Protocol: syscall.IPPROTO_TCP,
Port: 80,
Address: net.ParseIP("10.20.30.40"),
Netmask: 0xFFFFFFFF,
},
{
AddressFamily: nl.FAMILY_V4,
SchedName: LeastConnection,
Protocol: syscall.IPPROTO_UDP,
Port: 8080,
Address: net.ParseIP("10.20.30.41"),
Netmask: 0xFFFFFFFF,
},
}
// Create services for testing flush
for _, svc := range svcs {
if !i.IsServicePresent(&svc) {
err = i.NewService(&svc)
assert.NoError(t, err)
checkService(t, i, &svc, true)
} else {
t.Errorf("svc: %v exists", svc)
}
}
err = i.Flush()
assert.NoError(t, err)
got, err := i.GetServices()
assert.NoError(t, err)
if len(got) != 0 {
t.Errorf("Unexpected services after flush")
}
} }
func createDummyInterface(t *testing.T) { func createDummyInterface(t *testing.T) {

View file

@ -402,6 +402,13 @@ func (i *Handle) doGetServicesCmd(svc *Service) ([]*Service, error) {
return res, nil return res, nil
} }
// doCmdWithoutAttr a simple wrapper of netlink socket execute command
func (i *Handle) doCmdWithoutAttr(cmd uint8) ([][]byte, error) {
req := newIPVSRequest(cmd)
req.Seq = atomic.AddUint32(&i.seq, 1)
return execute(i.sock, req, 0)
}
func assembleDestination(attrs []syscall.NetlinkRouteAttr) (*Destination, error) { func assembleDestination(attrs []syscall.NetlinkRouteAttr) (*Destination, error) {
var d Destination var d Destination