diff options
Diffstat (limited to 'create.go')
| -rw-r--r-- | create.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/create.go b/create.go new file mode 100644 index 0000000..033f527 --- /dev/null +++ b/create.go @@ -0,0 +1,92 @@ +// Copyright 2024 WIT.COM Inc Licensed GPL 3.0 + +package main + +import ( + "errors" + "fmt" + "path/filepath" + "strings" + + pb "go.wit.com/lib/protobuf/virtbuf" + "go.wit.com/log" + "google.golang.org/protobuf/proto" +) + +func createFilename(dir string, filename string) error { + log.Info("dir ==", dir) + log.Info("filename ==", filename) + + filetype := filepath.Ext(filename) + if filetype != ".qcow2" { + log.Info("file type", filetype, "not supported") + return errors.New("only supporting qcow2 images for now") + } + hostname := strings.TrimSuffix(filename, filetype) + log.Info("hostname ==", hostname) + + var newDroplet *pb.Droplet + newDroplet = new(pb.Droplet) + newDroplet.Hostname = hostname + newDisk := new(pb.Disk) + newDisk.Filename = filename + newDisk.Filepath = dir + newDroplet.Disks = append(newDroplet.Disks, newDisk) + + url := urlbase + "/create" + + body, err := postDropletJSON(url, newDroplet) + if err != nil { + log.Info("postDropletJSON() failed:", err) + return err + } + + // TODO: try this and use this instead + body, err = postDropletWIRE(url, newDroplet) + if err != nil { + log.Info("postDropletJSON() failed:", err) + return err + } + + test := strings.TrimSpace(string(body)) + // log.Info("virtigo returned body:", test) + for _, line := range strings.Split(test, "\n") { + log.Info("GOT:", line) + } + return nil +} + +// send protobuf as wire data +func postDropletWIRE(url string, d *pb.Droplet) (string, error) { + var bytes []byte + var err error + // Automatically marshal to protobuf binary format + bytes, err = proto.Marshal(d) + if err != nil { + log.Fatalf("Failed to marshal: %v", err) + return "", err + } + // fmt.Printf("Encoded data: %x\n", bytes) + fmt.Printf("Encoded len(data): %d\n", len(bytes)) + return post(url, bytes) +} + +// send protobuf in json format +func postDropletJSON(url string, d *pb.Droplet) (string, error) { + // send protobuf as JSON + bytes, err := d.MarshalJSON() + if err != nil { + log.Info("virtbuf.MarshalJson() failed:", err) + return "", err + } + return post(url, bytes) +} + +func post(url string, bytes []byte) (string, error) { + body, err := httpPost(url, bytes) + if err != nil { + log.Info("httpPost() failed:", err) + return "", err + } + return string(body), nil +} |
