added snippet upload
This commit is contained in:
parent
349afa60e1
commit
861ca4edf7
7 changed files with 281 additions and 81 deletions
116
server.go
116
server.go
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue