100 lines
2.3 KiB
Go
100 lines
2.3 KiB
Go
// Copyright (C) 2023 Marius Schellenberger
|
|
|
|
package client
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
|
|
apiclient "git.giftfish.de/ston1th/keyctl/pkg/api/client"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/api/v1/schema"
|
|
)
|
|
|
|
var (
|
|
ErrClientIsNil = errors.New("client is nil")
|
|
base = schema.LBPath
|
|
)
|
|
|
|
type Client struct {
|
|
c *apiclient.Client
|
|
}
|
|
|
|
func NewClient(c *apiclient.Client) (*Client, error) {
|
|
if c == nil {
|
|
return nil, ErrClientIsNil
|
|
}
|
|
return &Client{c}, nil
|
|
}
|
|
|
|
func (c *Client) GetLoadBalancers(ctx context.Context) (lbs map[string]*schema.LoadBalancer, err error) {
|
|
return c.GetLoadBalancersWithCluster(ctx, "")
|
|
}
|
|
|
|
func (c *Client) GetLoadBalancersWithCluster(ctx context.Context, cluster string) (lbs map[string]*schema.LoadBalancer, err error) {
|
|
path := base
|
|
if cluster != "" {
|
|
path += "/" + cluster
|
|
}
|
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
lbs = make(map[string]*schema.LoadBalancer)
|
|
_, err = c.c.Do(req, &lbs)
|
|
return
|
|
}
|
|
|
|
func (c *Client) GetLoadBalancer(ctx context.Context, cluster, name string) (lb *schema.LoadBalancer, err error) {
|
|
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
|
req, err := c.c.NewRequest(ctx, "GET", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, &lb)
|
|
return
|
|
}
|
|
|
|
func (c *Client) CreateLoadBalancer(ctx context.Context, cluster, name string, lb *schema.LoadBalancer) (err error) {
|
|
buf := new(bytes.Buffer)
|
|
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
|
err = lb.ValidateClient()
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = json.NewEncoder(buf).Encode(lb)
|
|
if err != nil {
|
|
return
|
|
}
|
|
req, err := c.c.NewRequest(ctx, "POST", path, buf)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, nil)
|
|
return
|
|
}
|
|
|
|
func (c *Client) DeleteLoadBalancer(ctx context.Context, cluster, name string) (err error) {
|
|
path := fmt.Sprintf("%s/%s/%s", base, cluster, name)
|
|
req, err := c.c.NewRequest(ctx, "DELETE", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, nil)
|
|
return
|
|
}
|
|
|
|
func (c *Client) DeleteLoadBalancersWithCluster(ctx context.Context, cluster string) (err error) {
|
|
if cluster == "" {
|
|
return errors.New("cluster value can not be empty")
|
|
}
|
|
path := base + "/" + cluster
|
|
req, err := c.c.NewRequest(ctx, "DELETE", path, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_, err = c.c.Do(req, nil)
|
|
return
|
|
}
|