From a233cbefbbaa0bf88685404267ab6399e062a612 Mon Sep 17 00:00:00 2001 From: sophia Date: Tue, 16 Nov 2021 11:54:26 -0600 Subject: [PATCH] Add ability to add box This only works for boxes being added as username/boxname from vagrant cloud. --- internal/core/actions.go | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 internal/core/actions.go diff --git a/internal/core/actions.go b/internal/core/actions.go new file mode 100644 index 000000000..ea0619ef5 --- /dev/null +++ b/internal/core/actions.go @@ -0,0 +1,82 @@ +package core + +import ( + "io" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "strconv" + "strings" + "time" +) + +const VagrantCloudUrl = "http://app.vagrantup.com" + +func downloadBox(url string, destination string) (err error) { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + out, err := os.Create(destination) + if err != nil { + return err + } + defer out.Close() + + _, err = io.Copy(out, resp.Body) + return +} + +func constructMetadataUrl(username, boxname string) string { + url := VagrantCloudUrl + "/" + username + "/boxes/" + boxname + ".json" + return url +} + +func addBox(name, provider string, basis *Basis) (box *Box, err error) { + // Assume the name is of for / + s := strings.Split(name, "/") + metadataUrl := constructMetadataUrl(s[0], s[1]) + + // Download the metadata + resp, err := http.Get(metadataUrl) + if err != nil { + return nil, err + } + defer resp.Body.Close() + raw, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + metadata, err := LoadBoxMetadata(raw) + if err != nil { + return nil, err + } + versions, _ := metadata.ListVersions(&BoxVersionProvider{Name: provider}) + // latest version is first + version, _ := metadata.Version(versions[0], &BoxVersionProvider{Name: provider}) + providerMeta, err := version.Provider(provider) + downloadUrl := providerMeta.Url + + boxTempName := s[0] + "-" + s[1] + "-" + strconv.FormatInt(time.Now().Unix(), 10) + ".box" + boxDownloadPath := filepath.Join(basis.dir.TempDir().String(), boxTempName) + + // Download the box + err = downloadBox(downloadUrl, boxDownloadPath) + if err != nil { + return nil, err + } + // Delete the downloaded file when done + defer os.RemoveAll(boxDownloadPath) + + // Add the box to the box collection + boxes, _ := basis.Boxes() + returnBox, err := boxes.Add(boxDownloadPath, name, version.Version, metadataUrl, false, provider) + if err != nil { + return nil, err + } + returnBox.(*Box).Save() + return returnBox.(*Box), nil +}