// Copyright (C) 2020 Marius Schellenberger package pve import ( "context" "errors" "fmt" "net/http" ) var ( ErrPoolExists = errors.New("pool already exists") ErrPoolNotExists = errors.New("pool does not exist") ErrEmptyPoolName = errors.New("pool name is empty") ) func MakePoolName(namespace, name string) string { return fmt.Sprintf("%s-%s", namespace, name) } type PoolClient struct { client *Client } func (c *PoolClient) exists(ctx context.Context, name string) (status int, err error) { req, err := c.client.NewRequest(ctx, "GET", fmt.Sprintf("/pools/%s", name), nil) if err != nil { return } resp, err := c.client.Do(req, nil) if err != nil { if !errors.Is(err, HTTPErr) { return } err = nil } status = resp.StatusCode return } func (c *PoolClient) Create(ctx context.Context, name string) (err error) { status, err := c.exists(ctx, name) if err != nil { return } if status == http.StatusOK { return ErrPoolExists } body := httpbody{"poolid": name} req, err := c.client.NewRequest(ctx, "POST", "/pools", body.Reader()) if err != nil { return } _, err = c.client.Do(req, nil) return } func (c *PoolClient) Delete(ctx context.Context, name string) (err error) { status, err := c.exists(ctx, name) if err != nil { return } if status != http.StatusOK { return ErrPoolNotExists } req, err := c.client.NewRequest(ctx, "DELETE", fmt.Sprintf("/pools/%s", name), nil) if err != nil { return } _, err = c.client.Do(req, nil) return } type pool struct { members ServerList `json:"members"` } func (c *PoolClient) List(ctx context.Context, name string) (sl ServerList, err error) { if name == "" { err = ErrEmptyPoolName return } var p pool req, err := c.client.NewRequest(ctx, "GET", fmt.Sprintf("/pools/%s", name), nil) if err != nil { return } _, err = c.client.Do(req, &p) sl = p.members return } func (c *PoolClient) FindServer(ctx context.Context, poolname, servername, id string) (s *Server, err error) { sl, err := c.List(ctx, poolname) if err != nil { return } for _, srv := range sl { if id != "" && srv.ID == id { return srv, nil } if servername != "" && srv.Name == servername { return srv, nil } } return nil, ErrServerNotFound } func (c *PoolClient) FindServerByName(ctx context.Context, poolname, servername string) (s *Server, err error) { return c.FindServer(ctx, poolname, servername, "") } func (c *PoolClient) FindServerByID(ctx context.Context, poolname, id string) (s *Server, err error) { return c.FindServer(ctx, poolname, "", id) } func (c *PoolClient) FindServerByURL(ctx context.Context, url string) (s *Server, err error) { pool, _, id, err := ParseURL(url) if err != nil { return } return c.FindServerByID(ctx, pool, id) }