added snippet upload

This commit is contained in:
ston1th 2020-10-25 11:58:48 +01:00
commit 861ca4edf7
7 changed files with 281 additions and 81 deletions

116
server.go
View file

@ -15,44 +15,56 @@ var ErrServerNotFound = errors.New("server not found")
type ServerList []*Server
type Server struct {
ID string `json:"vmid"`
Name string `json:"name"`
Node string
Pool string
Status ServerStatus `json:"status"`
Resources Resources
NetDevices NetworkDevices
IPConfig IPConfigs
Nameserver Nameserver
SearchDomain string
UserData *UserData
ID string `json:"vmid"`
Name string `json:"name"`
Node string
Pool string
Status ServerStatus `json:"status"`
Resources Resources
NetDevices NetworkDevices
IPConfig IPConfigs
Nameserver Nameserver
SearchDomain string
UserData *UserData
UserDataStorage string
cicustom bool
}
func (s *Server) body() (httpbody, error) {
body := httpbody{
func (s *Server) UserDataSnippetName() string {
return fmt.Sprintf("%s_userdata", s.ID)
}
func (s *Server) UserDataSnippet(storage string) string {
return fmt.Sprintf("user=%s", SnippetVolume(storage, s.UserDataSnippetName()))
}
func (s *Server) body() (b httpbody) {
b = httpbody{
"memory": strconv.FormatInt(s.Resources.Memory, 10),
"cores": strconv.FormatInt(s.Resources.Cores, 10),
"name": s.Name,
"nameserver": s.Nameserver.String(),
"searchdomain": s.SearchDomain,
}
userdata, err := s.UserData.String()
body["ciuserdata"] = userdata
if s.UserData != nil || s.cicustom {
b["cicustom"] = s.UserDataSnippet(s.UserDataStorage)
}
// TODO userdata, err := s.UserData.String()
for i, n := range s.NetDevices {
if n == nil {
body["net"+strconv.Itoa(i)] = ""
b["net"+strconv.Itoa(i)] = ""
continue
}
body["net"+strconv.Itoa(i)] = n.String()
b["net"+strconv.Itoa(i)] = n.String()
}
for i, ip := range s.IPConfig {
if ip == nil {
body["ipconfig"+strconv.Itoa(i)] = ""
b["ipconfig"+strconv.Itoa(i)] = ""
continue
}
body["ipconfig"+strconv.Itoa(i)] = ip.String()
b["ipconfig"+strconv.Itoa(i)] = ip.String()
}
return body, err
return
}
func (s *Server) InstanceID() string {
@ -94,10 +106,15 @@ func (sc serverConfig) Server(node, id string) (s *Server, err error) {
if v, ok := sc[k].(string); ok {
s.Name = v
}
case "ciuserdata":
if v, ok := sc[k].(string); ok {
s.UserData, err = parseUserData(v)
case "cicustom":
if _, ok := sc[k].(string); ok {
s.cicustom = true
}
// TODO
// case "ciuserdata":
// if v, ok := sc[k].(string); ok {
// s.UserData, err = parseUserData(v)
// }
case "memory":
if v, ok := sc[k].(float64); ok {
s.Resources.Memory = int64(v)
@ -349,15 +366,9 @@ func (c *ServerClient) GetStatus(ctx context.Context, s *Server, lock *string) (
return
}
func diffBody(cur, n *Server) (b httpbody, err error) {
b, err = n.body()
if err != nil {
return
}
curbody, err := cur.body()
if err != nil {
return
}
func diffBody(cur, n *Server) (b httpbody) {
b = n.body()
curbody := cur.body()
for k, v := range b {
if curbody[k] == v {
delete(b, k)
@ -388,31 +399,40 @@ func (c *ServerClient) resizeDisk(ctx context.Context, s *Server) (err error) {
return
}
func (c *ServerClient) Update(ctx context.Context, s *Server) (err error) {
func (c *ServerClient) Update(ctx context.Context, s *Server) (t *Task, err error) {
cur, _, err := c.getServer(ctx, s.Node, s.ID)
if err != nil {
return
}
body, err := diffBody(cur, s)
if err != nil {
return
body := diffBody(cur, s)
var e []string
if s.UserData != nil {
b, userdata := s.UserData.Bytes()
if userdata == nil {
t, userdata = c.client.Snippet.Create(ctx, s.Node, s.UserDataStorage, s.UserDataSnippetName(), b)
}
if userdata != nil {
e = append(e, fmt.Sprintf("userdata: %s", userdata))
}
}
var (
cfg error
resize error
)
if len(body) > 0 {
cfg = c.updateConfig(ctx, s, body)
cfg := c.updateConfig(ctx, s, body)
if cfg != nil {
e = append(e, fmt.Sprintf("config: %s", cfg))
}
}
if cur.Resources.BootDiskSize != s.Resources.BootDiskSize {
resize = c.resizeDisk(ctx, s)
resize := c.resizeDisk(ctx, s)
if resize != nil {
e = append(e, fmt.Sprintf("resize: %s", resize))
}
}
if cfg != nil && resize != nil {
return fmt.Errorf("config: %s resize: %s", cfg, resize)
} else if cfg != nil {
return fmt.Errorf("config: %s", cfg)
} else if resize != nil {
return fmt.Errorf("resize: %s", resize)
if len(e) > 0 {
err = fmt.Errorf("%s", strings.Join(e, ""))
}
if t == nil {
dummy := DummyTask
t = &dummy
}
return
}