2017-07-16 05:35:55 +00:00
/ *
Copyright 2017 The Kubernetes Authors .
Licensed under the Apache License , Version 2.0 ( the "License" ) ;
you may not use this file except in compliance with the License .
You may obtain a copy of the License at
http : //www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing , software
distributed under the License is distributed on an "AS IS" BASIS ,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
See the License for the specific language governing permissions and
limitations under the License .
* /
package ipvs
import (
"net"
"strconv"
)
// Interface is an injectable interface for running ipvs commands. Implementations must be goroutine-safe.
type Interface interface {
// Flush clears all virtual servers in system. return occurred error immediately.
Flush ( ) error
// EnsureVirtualServerAddressBind checks if virtual server's address is bound to dummy interface and, if not, binds it. If the address is already bound, return true.
EnsureVirtualServerAddressBind ( serv * VirtualServer , dev string ) ( exist bool , err error )
// UnbindVirtualServerAddress checks if virtual server's address is bound to dummy interface and, if so, unbinds it.
UnbindVirtualServerAddress ( serv * VirtualServer , dev string ) error
// AddVirtualServer creates the specified virtual server.
AddVirtualServer ( * VirtualServer ) error
// UpdateVirtualServer updates an already existing virtual server. If the virtual server does not exist, return error.
UpdateVirtualServer ( * VirtualServer ) error
// DeleteVirtualServer deletes the specified virtual server. If the virtual server does not exist, return error.
DeleteVirtualServer ( * VirtualServer ) error
// Given a partial virtual server, GetVirtualServer will return the specified virtual server information in the system.
GetVirtualServer ( * VirtualServer ) ( * VirtualServer , error )
// GetVirtualServers lists all virtual servers in the system.
GetVirtualServers ( ) ( [ ] * VirtualServer , error )
// AddRealServer creates the specified real server for the specified virtual server.
AddRealServer ( * VirtualServer , * RealServer ) error
// GetRealServers returns all real servers for the specified virtual server.
GetRealServers ( * VirtualServer ) ( [ ] * RealServer , error )
// DeleteRealServer deletes the specified real server from the specified virtual server.
DeleteRealServer ( * VirtualServer , * RealServer ) error
}
// VirtualServer is an user-oriented definition of an IPVS virtual server in its entirety.
type VirtualServer struct {
Address net . IP
Protocol string
Port uint16
Scheduler string
Flags ServiceFlags
Timeout uint32
}
// ServiceFlags is used to specify session affinity, ip hash etc.
type ServiceFlags uint32
const (
// FlagPersistent specify IPVS service session affinity
FlagPersistent = 0x1
2017-09-12 09:25:30 +00:00
// FlagHashed specify IPVS service hash flag
FlagHashed = 0x2
2017-07-16 05:35:55 +00:00
)
// Equal check the equality of virtual server.
// We don't use struct == since it doesn't work because of slice.
func ( svc * VirtualServer ) Equal ( other * VirtualServer ) bool {
return svc . Address . Equal ( other . Address ) &&
svc . Protocol == other . Protocol &&
svc . Port == other . Port &&
svc . Scheduler == other . Scheduler &&
svc . Flags == other . Flags &&
svc . Timeout == other . Timeout
}
func ( svc * VirtualServer ) String ( ) string {
return net . JoinHostPort ( svc . Address . String ( ) , strconv . Itoa ( int ( svc . Port ) ) ) + "/" + svc . Protocol
}
// RealServer is an user-oriented definition of an IPVS real server in its entirety.
type RealServer struct {
Address net . IP
Port uint16
Weight int
}
func ( dest * RealServer ) String ( ) string {
return net . JoinHostPort ( dest . Address . String ( ) , strconv . Itoa ( int ( dest . Port ) ) )
}