Load box metadata

This commit is contained in:
sophia 2021-11-09 09:46:52 -06:00 committed by Paul Hinze
parent 8642882a35
commit 4e9e0dbe75
No known key found for this signature in database
GPG Key ID: B69DEDF2D55501C0
2 changed files with 86 additions and 7 deletions

View File

@ -2,6 +2,8 @@ package core
import (
"errors"
"io/ioutil"
"net/http"
"os"
"time"
@ -9,6 +11,7 @@ import (
"github.com/hashicorp/go-version"
"github.com/hashicorp/vagrant-plugin-sdk/core"
"github.com/hashicorp/vagrant/internal/server/proto/vagrant_server"
"github.com/mitchellh/mapstructure"
"google.golang.org/protobuf/types/known/timestamppb"
)
@ -20,9 +23,18 @@ type Box struct {
logger hclog.Logger
}
func (b *Box) loadMetadata() (metadata core.BoxMetadata) {
// TODO: need box metadata implementation
return
func (b *Box) loadMetadata() (metadata *BoxMetadata, err error) {
resp, err := http.Get(b.box.MetadataUrl)
if err != nil {
return nil, err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return LoadBoxMetadata(data)
}
func (b *Box) matches(box core.Box) (bool, error) {
@ -72,8 +84,27 @@ func (b *Box) Directory() (path string, err error) {
// and provider. If the box doesn't have an update that satisfies the
// constraints, it will return nil.
func (b *Box) HasUpdate(version string) (updateAvailable bool, err error) {
// TODO: need box metadata
return
metadata, err := b.loadMetadata()
if err != nil {
return false, err
}
versionConstraint := ""
if version == "" {
versionConstraint = "> " + b.box.Version
} else {
versionConstraint = version + ", " + "> " + b.box.Version
}
result, err := metadata.Version(
versionConstraint,
&BoxVersionProvider{Name: b.box.Provider},
)
if err != nil {
return false, err
}
if result == nil {
return false, nil
}
return true, nil
}
// Checks if this box is in use according to the given machine
@ -104,8 +135,11 @@ func (b *Box) InUse(index core.TargetIndex) (inUse bool, err error) {
}
func (b *Box) Metadata() (metadata core.BoxMetadataMap, err error) {
// TODO
return
meta, err := b.loadMetadata()
if err != nil {
return nil, err
}
return metadata, mapstructure.Decode(meta, &metadata)
}
func (b *Box) MetadataURL() (url string, err error) {

View File

@ -24,6 +24,21 @@ func newTestBox() *Box {
}
}
func hashicorpBionicTestBox() *Box {
return &Box{
box: &vagrant_server.Box{
Id: "123",
Provider: "virtualbox",
Version: "0.0.282",
Directory: "/tmp/boxes",
Metadata: map[string]string{},
MetadataUrl: "https://app.vagrantup.com/hashicorp/boxes/bionic64.json",
Name: "hashicorp/bionic64",
LastUpdate: timestamppb.Now(),
},
}
}
func TestBoxAutomaticUpdateCheckAllowed(t *testing.T) {
testBox := newTestBox()
// just did automated check
@ -75,3 +90,33 @@ func TestCompare(t *testing.T) {
_, err = testBox.Compare(otherBox)
require.Error(t, err)
}
func TestHasUpdate(t *testing.T) {
box := hashicorpBionicTestBox()
// Older box
box.box.Version = "0.0.282"
result, err := box.HasUpdate("")
if err != nil {
t.Errorf("Failed to check for update")
}
require.True(t, result)
// Newer box
box.box.Version = "99.9.282"
result2, err := box.HasUpdate("")
if err != nil {
t.Errorf("Failed to check for update")
}
require.False(t, result2)
}
func TestMetadata(t *testing.T) {
box := hashicorpBionicTestBox()
result, err := box.Metadata()
if err != nil {
t.Errorf("Failed to get metadata")
}
require.NotNil(t, result)
require.Equal(t, "hashicorp/bionic64", result["Name"])
}