linter fixes
This commit is contained in:
parent
4bf887e75f
commit
df5babf6c8
15 changed files with 49 additions and 55 deletions
|
|
@ -7,19 +7,16 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Client struct {
|
type Client struct {
|
||||||
sync.Mutex
|
|
||||||
endpoint string
|
endpoint string
|
||||||
username string
|
username string
|
||||||
password string
|
password string
|
||||||
|
|
@ -193,13 +190,13 @@ func (c *Client) Do(r *http.Request, v interface{}) (resp *http.Response, err er
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
body, err := ioutil.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
resp.Body.Close()
|
resp.Body.Close()
|
||||||
resp.Body = ioutil.NopCloser(bytes.NewReader(body))
|
resp.Body = io.NopCloser(bytes.NewReader(body))
|
||||||
|
|
||||||
if c.debugWriter != nil {
|
if c.debugWriter != nil {
|
||||||
dumpResp, err := httputil.DumpResponse(resp, true)
|
dumpResp, err := httputil.DumpResponse(resp, true)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,10 @@ func (e Error) Error() string {
|
||||||
return e.Err
|
return e.Err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e Error) Is(target error) bool {
|
||||||
|
return e.Err == target.Error()
|
||||||
|
}
|
||||||
|
|
||||||
func decodeResp(resp *http.Response, v interface{}) error {
|
func decodeResp(resp *http.Response, v interface{}) error {
|
||||||
if resp.Body == nil {
|
if resp.Body == nil {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
||||||
|
|
@ -112,19 +112,19 @@ func NewServer(c *config.Config, log logr.Logger) (*Server, error) {
|
||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) UpdateDB(db *db.DB, leader bool) error {
|
func (s *Server) UpdateDB(kvdb *db.DB, leader bool) error {
|
||||||
s.Data.DB = db
|
s.Data.DB = kvdb
|
||||||
s.Data.Leader = leader
|
s.Data.Leader = leader
|
||||||
if s.store.Local != nil {
|
if s.store.Local != nil {
|
||||||
if s.Data.Net == nil {
|
if s.Data.Net == nil {
|
||||||
na, err := netalloc.NewGenericAlloc(db, s.prefix)
|
na, err := netalloc.NewGenericAlloc(kvdb, s.prefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
s.Data.Net = na
|
s.Data.Net = na
|
||||||
close(s.init)
|
close(s.init)
|
||||||
} else {
|
} else {
|
||||||
s.Data.Net.SetStore(db)
|
s.Data.Net.SetStore(kvdb)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if s.Data.Net == nil {
|
if s.Data.Net == nil {
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/hex"
|
||||||
"git.giftfish.de/ston1th/haproxy-lb/pkg/config"
|
"git.giftfish.de/ston1th/haproxy-lb/pkg/config"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
weakrand "math/rand"
|
weakrand "math/rand"
|
||||||
//"net/http"
|
|
||||||
"encoding/hex"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -28,11 +27,11 @@ func newCache() *cache {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cache) get(key string) (bool, bool) {
|
func (c *cache) get(key string) (v, ok bool) {
|
||||||
c.mtx.Lock()
|
c.mtx.Lock()
|
||||||
defer c.mtx.Unlock()
|
defer c.mtx.Unlock()
|
||||||
v, ok := c.cache[key]
|
v, ok = c.cache[key]
|
||||||
return v, ok
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *cache) set(key string, value bool) {
|
func (c *cache) set(key string, value bool) {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import (
|
||||||
// Error interface is a custom api error
|
// Error interface is a custom api error
|
||||||
type Error interface {
|
type Error interface {
|
||||||
Error() string
|
Error() string
|
||||||
|
JSON() string
|
||||||
Status() int
|
Status() int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -19,6 +20,11 @@ type Err struct {
|
||||||
|
|
||||||
// Error returns the error string
|
// Error returns the error string
|
||||||
func (a Err) Error() string {
|
func (a Err) Error() string {
|
||||||
|
return a.err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error returns the error string as JSON format
|
||||||
|
func (a Err) JSON() string {
|
||||||
return `{"error":"` + a.err + `","status":` + strconv.Itoa(a.status) + `}`
|
return `{"error":"` + a.err + `","status":` + strconv.Itoa(a.status) + `}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,11 +27,11 @@ func NewClient(c *apiclient.Client) (*Client, error) {
|
||||||
return &Client{c}, nil
|
return &Client{c}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) GetLoadBalancers(ctx context.Context) (lbs map[string]schema.LoadBalancer, err error) {
|
func (c *Client) GetLoadBalancers(ctx context.Context) (lbs map[string]*schema.LoadBalancer, err error) {
|
||||||
return c.GetLoadBalancersWithCluster(ctx, "")
|
return c.GetLoadBalancersWithCluster(ctx, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) GetLoadBalancersWithCluster(ctx context.Context, cluster string) (lbs map[string]schema.LoadBalancer, err error) {
|
func (c *Client) GetLoadBalancersWithCluster(ctx context.Context, cluster string) (lbs map[string]*schema.LoadBalancer, err error) {
|
||||||
path := base
|
path := base
|
||||||
if cluster != "" {
|
if cluster != "" {
|
||||||
path += "/" + cluster
|
path += "/" + cluster
|
||||||
|
|
@ -40,12 +40,12 @@ func (c *Client) GetLoadBalancersWithCluster(ctx context.Context, cluster string
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
lbs = make(map[string]schema.LoadBalancer)
|
lbs = make(map[string]*schema.LoadBalancer)
|
||||||
_, err = c.c.Do(req, &lbs)
|
_, err = c.c.Do(req, &lbs)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) GetLoadBalancer(ctx context.Context, cluster, name string) (lb schema.LoadBalancer, err error) {
|
func (c *Client) GetLoadBalancer(ctx context.Context, cluster, name string) (lb *schema.LoadBalancer, err error) {
|
||||||
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
||||||
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -55,7 +55,7 @@ func (c *Client) GetLoadBalancer(ctx context.Context, cluster, name string) (lb
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) CreateLoadBalancer(ctx context.Context, cluster, name string, lb schema.LoadBalancer) (err error) {
|
func (c *Client) CreateLoadBalancer(ctx context.Context, cluster, name string, lb *schema.LoadBalancer) (err error) {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
||||||
err = lb.ValidateClient()
|
err = lb.ValidateClient()
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@ func (o Servers) RemoveByName(name string) Servers {
|
||||||
return append(o[:index], o[index+1:]...)
|
return append(o[:index], o[index+1:]...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lb LoadBalancer) ValidateClient() error {
|
func (lb *LoadBalancer) ValidateClient() error {
|
||||||
for i, p := range lb.Ports {
|
for i, p := range lb.Ports {
|
||||||
if p.Port < 0 || p.Port > 65535 {
|
if p.Port < 0 || p.Port > 65535 {
|
||||||
return fmt.Errorf("LoadBalancer.Ports[%d].Port is invalid (range 0-65535", i)
|
return fmt.Errorf("LoadBalancer.Ports[%d].Port is invalid (range 0-65535", i)
|
||||||
|
|
@ -157,7 +157,7 @@ func (lb LoadBalancer) ValidateClient() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lb LoadBalancer) ValidateServer() error {
|
func (lb *LoadBalancer) ValidateServer() error {
|
||||||
if lb.Name == "" {
|
if lb.Name == "" {
|
||||||
return errors.New("LoadBalancer.Name can not be empty")
|
return errors.New("LoadBalancer.Name can not be empty")
|
||||||
}
|
}
|
||||||
|
|
@ -183,6 +183,6 @@ func (lb LoadBalancer) ValidateServer() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lb LoadBalancer) JSON() ([]byte, error) {
|
func (lb *LoadBalancer) JSON() ([]byte, error) {
|
||||||
return json.Marshal(lb)
|
return json.Marshal(lb)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
//"golang.org/x/crypto/bcrypt"
|
|
||||||
//"net/http"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"net"
|
"net"
|
||||||
|
|
|
||||||
|
|
@ -2,14 +2,14 @@ package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"io/ioutil"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func LoadCertPool(file string) (p *x509.CertPool, err error) {
|
func LoadCertPool(file string) (p *x509.CertPool, err error) {
|
||||||
if file == "" {
|
if file == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
buf, err := ioutil.ReadFile(file)
|
buf, err := os.ReadFile(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -140,12 +140,10 @@ func Validate(c *Config) error {
|
||||||
}
|
}
|
||||||
if etcd.ClusterName == "" {
|
if etcd.ClusterName == "" {
|
||||||
return errors.New("missing etcd.clusterName config")
|
return errors.New("missing etcd.clusterName config")
|
||||||
} else {
|
} else if strings.HasSuffix(etcd.ClusterName, "/") {
|
||||||
if strings.HasSuffix(etcd.ClusterName, "/") {
|
|
||||||
etcd.ClusterName = strings.TrimSuffix(etcd.ClusterName, "/")
|
etcd.ClusterName = strings.TrimSuffix(etcd.ClusterName, "/")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if raft == nil && etcd == nil {
|
if raft == nil && etcd == nil {
|
||||||
return errors.New("missing cluster config: raft or etcd")
|
return errors.New("missing cluster config: raft or etcd")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ func (db *DB) GetCIDR(name string) (cidr string, err error) {
|
||||||
func (db *DB) GetLBs(cl string) (lbs map[string][]byte, err error) {
|
func (db *DB) GetLBs(cl string) (lbs map[string][]byte, err error) {
|
||||||
lbs = make(map[string][]byte)
|
lbs = make(map[string][]byte)
|
||||||
if cl != "" {
|
if cl != "" {
|
||||||
cl = cl + "/"
|
cl += "/"
|
||||||
}
|
}
|
||||||
m, err := db.kv.GetPrefix(lbPrefix + cl)
|
m, err := db.kv.GetPrefix(lbPrefix + cl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -217,15 +217,11 @@ func (c *Cluster) Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) leader(ctx context.Context) {
|
func (c *Cluster) leader(ctx context.Context) {
|
||||||
defer func() {
|
defer util.HandleCrash()
|
||||||
util.HandleCrash()
|
|
||||||
}()
|
|
||||||
c.callbacks.Leader(ctx, c)
|
c.callbacks.Leader(ctx, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) follower(ctx context.Context) {
|
func (c *Cluster) follower(ctx context.Context) {
|
||||||
defer func() {
|
defer util.HandleCrash()
|
||||||
util.HandleCrash()
|
|
||||||
}()
|
|
||||||
c.callbacks.Follower(ctx, c)
|
c.callbacks.Follower(ctx, c)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ type ServiceManager interface {
|
||||||
|
|
||||||
type HAProxyManager struct {
|
type HAProxyManager struct {
|
||||||
// protects config update
|
// protects config update
|
||||||
sync.Mutex
|
mu sync.Mutex
|
||||||
|
|
||||||
configFile string
|
configFile string
|
||||||
svc ServiceManager
|
svc ServiceManager
|
||||||
|
|
@ -61,7 +61,7 @@ func (ha *HAProxyManager) checkConfig(ctx context.Context, lbs Config) (hash []b
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
hash = h.Sum(nil)
|
hash = h.Sum(nil)
|
||||||
err = os.Chmod(tmp.Name(), 0640)
|
err = os.Chmod(tmp.Name(), 0o640)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +95,7 @@ func (ha *HAProxyManager) updateConfig(ctx context.Context, lbs Config) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
ha.reload = true
|
ha.reload = true
|
||||||
file, err := os.OpenFile(ha.configFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
|
file, err := os.OpenFile(ha.configFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
@ -110,8 +110,8 @@ func (ha *HAProxyManager) updateConfig(ctx context.Context, lbs Config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ha *HAProxyManager) UpdateConfig(ctx context.Context, lbs Config) error {
|
func (ha *HAProxyManager) UpdateConfig(ctx context.Context, lbs Config) error {
|
||||||
ha.Lock()
|
ha.mu.Lock()
|
||||||
defer ha.Unlock()
|
defer ha.mu.Unlock()
|
||||||
err := ha.updateConfig(ctx, lbs)
|
err := ha.updateConfig(ctx, lbs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
||||||
|
|
@ -168,16 +168,12 @@ func (c *Cluster) Start(raftcfg *config.Config) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) leader(ctx context.Context) {
|
func (c *Cluster) leader(ctx context.Context) {
|
||||||
defer func() {
|
defer util.HandleCrash()
|
||||||
util.HandleCrash()
|
|
||||||
}()
|
|
||||||
c.callbacks.Leader(ctx, c)
|
c.callbacks.Leader(ctx, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) follower(ctx context.Context) {
|
func (c *Cluster) follower(ctx context.Context) {
|
||||||
defer func() {
|
defer util.HandleCrash()
|
||||||
util.HandleCrash()
|
|
||||||
}()
|
|
||||||
c.callbacks.Follower(ctx, c)
|
c.callbacks.Follower(ctx, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ func DefaultInterface() (iface string, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
sync.Mutex
|
mu sync.Mutex
|
||||||
m map[string]struct{}
|
m map[string]struct{}
|
||||||
iface string
|
iface string
|
||||||
label string
|
label string
|
||||||
|
|
@ -76,8 +76,8 @@ func (n *Network) HasIP(a *netlink.Addr) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Network) AddIP(cidr string) error {
|
func (n *Network) AddIP(cidr string) error {
|
||||||
n.Lock()
|
n.mu.Lock()
|
||||||
defer n.Unlock()
|
defer n.mu.Unlock()
|
||||||
addr, err := netlink.ParseAddr(cidr)
|
addr, err := netlink.ParseAddr(cidr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -97,8 +97,8 @@ func (n *Network) AddIP(cidr string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Network) DeleteIP(cidr string) error {
|
func (n *Network) DeleteIP(cidr string) error {
|
||||||
n.Lock()
|
n.mu.Lock()
|
||||||
defer n.Unlock()
|
defer n.mu.Unlock()
|
||||||
addr, err := netlink.ParseAddr(cidr)
|
addr, err := netlink.ParseAddr(cidr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
@ -115,8 +115,8 @@ func (n *Network) DeleteIP(cidr string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *Network) GetIPs() (cidrs []string) {
|
func (n *Network) GetIPs() (cidrs []string) {
|
||||||
n.Lock()
|
n.mu.Lock()
|
||||||
defer n.Unlock()
|
defer n.mu.Unlock()
|
||||||
cidrs = make([]string, len(n.m))
|
cidrs = make([]string, len(n.m))
|
||||||
c := 0
|
c := 0
|
||||||
for k := range n.m {
|
for k := range n.m {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue