Add ability to add box

This only works for boxes being added as username/boxname from
vagrant cloud.
This commit is contained in:
sophia 2021-11-16 11:54:26 -06:00 committed by Paul Hinze
parent a63184ef5f
commit a233cbefbb
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0

82
internal/core/actions.go Normal file
View File

@ -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 <user>/<box>
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
}