pve-go/snippet.go
2020-11-01 20:09:16 +01:00

85 lines
1.9 KiB
Go

// Copyright (C) 2020 Marius Schellenberger
package pve
import (
"context"
"errors"
"fmt"
"mime/multipart"
"net/http"
"time"
)
var (
ErrNoSnippetNode = errors.New("missing snippet target node")
ErrNoSnippetStorage = errors.New("missing snippet target storage")
ErrNoSnippetName = errors.New("missing snippet name")
)
type SnippetClient struct {
client *Client
}
func (c *SnippetClient) Create(ctx context.Context, node, storage, name string, data []byte) (t *Task, err error) {
if node == "" {
err = ErrNoSnippetNode
return
}
if storage == "" {
err = ErrNoSnippetStorage
return
}
if name == "" {
err = ErrNoSnippetName
return
}
ub, b := newUnreadBuffer()
m := multipart.NewWriter(b)
err = m.WriteField("content", "snippets")
if err != nil {
return
}
fw, err := m.CreateFormFile("filename", name)
if err != nil {
return
}
if _, err = fw.Write(data); err != nil {
return
}
m.Close()
ub.Save()
ct := m.FormDataContentType()
var taskid string
var req *http.Request
var resp *http.Response
for i := 0; i < 3; i++ {
req, err = c.client.NewRequest(ctx, "POST", fmt.Sprintf("/nodes/%s/storage/%s/upload", node, storage), b)
req.Header.Set("Content-Type", ct)
resp, err = c.client.Do(req, &taskid)
if err != nil || resp.StatusCode != http.StatusOK {
ub.Reset(&b)
time.Sleep(time.Millisecond * 500)
continue
}
break
}
t = c.client.Task.MustGet(ctx, taskid)
return
}
func SnippetVolume(storage, name string) string {
return fmt.Sprintf("%s:snippets/%s", storage, name)
}
func (c *SnippetClient) Delete(ctx context.Context, node, storage, name string) (t *Task, err error) {
volume := SnippetVolume(storage, name)
req, err := c.client.NewRequest(ctx, "DELETE", fmt.Sprintf("/nodes/%s/storage/%s/content/%s", node, storage, volume), nil)
if err != nil {
return
}
var taskid string
_, err = c.client.Do(req, &taskid)
t = c.client.Task.MustGet(ctx, taskid)
return
}