From f811e995da12e6556eccab79f4985ad7a000bf27 Mon Sep 17 00:00:00 2001 From: sophia Date: Mon, 26 Sep 2022 13:10:17 -0400 Subject: [PATCH] Return errors when box metadata is unavailable or invalid --- internal/core/box.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/internal/core/box.go b/internal/core/box.go index 18c6fac36..cdad64b91 100644 --- a/internal/core/box.go +++ b/internal/core/box.go @@ -10,6 +10,7 @@ import ( "net/http" "os" "path/filepath" + "strings" "sync" "time" @@ -18,6 +19,7 @@ import ( "github.com/hashicorp/go-version" "github.com/hashicorp/vagrant-plugin-sdk/core" "github.com/hashicorp/vagrant-plugin-sdk/helper/path" + "github.com/hashicorp/vagrant-plugin-sdk/localizer" "github.com/hashicorp/vagrant-plugin-sdk/proto/vagrant_plugin_sdk" "github.com/hashicorp/vagrant/internal/server/proto/vagrant_server" "github.com/mitchellh/mapstructure" @@ -28,6 +30,8 @@ import ( // Number of seconds to wait between checks for box updates const BoxUpdateCheckInterval = 3600 +var RequiredMetadataFields = []string{"provider"} + type Box struct { basis *Basis box *vagrant_server.Box @@ -58,7 +62,10 @@ func NewBox(opts ...BoxOption) (b *Box, err error) { metadataFile := filepath.Join(b.box.Directory, "metadata.json") if _, err := os.Stat(metadataFile); err != nil { - return nil, err + return nil, localizer.LocalizeErr( + "box_does_not_have_metadata_json_file", + map[string]string{"BoxName": b.box.Name}, + ) } data, err := os.ReadFile(metadataFile) @@ -69,6 +76,19 @@ func NewBox(opts ...BoxOption) (b *Box, err error) { if err := json.Unmarshal(data, &metadata); err != nil { return nil, err } + for _, field := range RequiredMetadataFields { + // If the metadata does not have a required field + if _, ok := metadata[field]; !ok { + return nil, localizer.LocalizeErr( + "box_metadata_missing_required_fields", + map[string]string{ + "BoxName": b.box.Name, + "RequiredField": field, + "RequiredFields": strings.Join(RequiredMetadataFields, " ,"), + }, + ) + } + } b.box.Metadata, err = structpb.NewStruct(metadata) if err != nil { return nil, err