Tolerate missing hashes

This commit is contained in:
Joe Duffy 2017-10-22 15:54:44 -07:00 committed by GitHub
parent 3d9dcb0942
commit 4a493292b1
4 changed files with 24 additions and 25 deletions

View file

@ -134,7 +134,7 @@ func (a *Asset) Serialize() map[string]interface{} {
}
// DeserializeAsset checks to see if the map contains an asset, using its signature, and if so deserializes it.
func DeserializeAsset(obj map[string]interface{}, requireHash bool) (*Asset, bool, error) {
func DeserializeAsset(obj map[string]interface{}) (*Asset, bool, error) {
// If not an asset, return false immediately.
if obj[string(SigKey)] != AssetSig {
return &Asset{}, false, nil
@ -144,10 +144,7 @@ func DeserializeAsset(obj map[string]interface{}, requireHash bool) (*Asset, boo
var hash string
if v, has := obj[AssetHashProperty]; has {
hash = v.(string)
} else if requireHash {
return &Asset{}, false, errors.New("asset is missing a hash")
}
var text string
if v, has := obj[AssetTextProperty]; has {
text = v.(string)
@ -481,7 +478,7 @@ func (a *Archive) Serialize() map[string]interface{} {
}
// DeserializeArchive checks to see if the map contains an archive, using its signature, and if so deserializes it.
func DeserializeArchive(obj map[string]interface{}, requireHash bool) (*Archive, bool, error) {
func DeserializeArchive(obj map[string]interface{}) (*Archive, bool, error) {
// If not an archive, return false immediately.
if obj[string(SigKey)] != ArchiveSig {
return &Archive{}, false, nil
@ -490,8 +487,6 @@ func DeserializeArchive(obj map[string]interface{}, requireHash bool) (*Archive,
var hash string
if v, has := obj[ArchiveHashProperty]; has {
hash = v.(string)
} else if requireHash {
return &Archive{}, false, errors.New("archive is missing a hash")
}
var assets map[string]interface{}
@ -505,13 +500,13 @@ func DeserializeArchive(obj map[string]interface{}, requireHash bool) (*Archive,
case *Archive:
assets[k] = t
case map[string]interface{}:
a, isa, err := DeserializeAsset(t, requireHash)
a, isa, err := DeserializeAsset(t)
if err != nil {
return &Archive{}, false, err
} else if isa {
assets[k] = a
} else {
arch, isarch, err := DeserializeArchive(t, requireHash)
arch, isarch, err := DeserializeArchive(t)
if err != nil {
return &Archive{}, false, err
} else if !isarch {

View file

@ -24,7 +24,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Equal(t, text, asset.Text)
assert.Equal(t, "e34c74529110661faae4e121e57165ff4cb4dbdde1ef9770098aa3695e6b6704", asset.Hash)
assetSer := asset.Serialize()
assetDes, isasset, err := DeserializeAsset(assetSer, true)
assetDes, isasset, err := DeserializeAsset(assetSer)
assert.Nil(t, err)
assert.True(t, isasset)
assert.True(t, assetDes.IsText())
@ -49,7 +49,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "d8ce0142b3b10300c7c76487fad770f794c1e84e1b0c73a4b2e1503d4fbac093", arch.Hash)
archSer := arch.Serialize()
archDes, isarch, err := DeserializeArchive(archSer, true)
archDes, isarch, err := DeserializeArchive(archSer)
assert.Nil(t, err)
assert.True(t, isarch)
assert.True(t, archDes.IsAssets())
@ -64,7 +64,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", asset.Hash)
assetSer := asset.Serialize()
assetDes, isasset, err := DeserializeAsset(assetSer, true)
assetDes, isasset, err := DeserializeAsset(assetSer)
assert.Nil(t, err)
assert.True(t, isasset)
assert.True(t, assetDes.IsPath())
@ -75,7 +75,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "23f6c195eb154be262216cd97209f2dcc8a40038ac8ec18ca6218d3e3dfacd4e", arch.Hash)
archSer := arch.Serialize()
archDes, isarch, err := DeserializeArchive(archSer, true)
archDes, isarch, err := DeserializeArchive(archSer)
assert.Nil(t, err)
assert.True(t, isarch)
assert.True(t, archDes.IsAssets())
@ -90,7 +90,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", asset.Hash)
assetSer := asset.Serialize()
assetDes, isasset, err := DeserializeAsset(assetSer, true)
assetDes, isasset, err := DeserializeAsset(assetSer)
assert.Nil(t, err)
assert.True(t, isasset)
assert.True(t, assetDes.IsURI())
@ -101,7 +101,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "23f6c195eb154be262216cd97209f2dcc8a40038ac8ec18ca6218d3e3dfacd4e", arch.Hash)
archSer := arch.Serialize()
archDes, isarch, err := DeserializeArchive(archSer, true)
archDes, isarch, err := DeserializeArchive(archSer)
assert.Nil(t, err)
assert.True(t, isarch)
assert.True(t, archDes.IsAssets())
@ -118,7 +118,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", arch.Hash)
archSer := arch.Serialize()
archDes, isarch, err := DeserializeArchive(archSer, true)
archDes, isarch, err := DeserializeArchive(archSer)
assert.Nil(t, err)
assert.True(t, isarch)
assert.True(t, archDes.IsPath())
@ -134,7 +134,7 @@ func TestAssetSerialize(t *testing.T) {
assert.Nil(t, err)
assert.Equal(t, "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", arch.Hash)
archSer := arch.Serialize()
archDes, isarch, err := DeserializeArchive(archSer, true)
archDes, isarch, err := DeserializeArchive(archSer)
assert.Nil(t, err)
assert.True(t, isarch)
assert.True(t, archDes.IsURI())
@ -143,6 +143,14 @@ func TestAssetSerialize(t *testing.T) {
}
}
func TestDeserializeMissingHash(t *testing.T) {
assetSer := (&Asset{Text: "asset"}).Serialize()
assetDes, isasset, err := DeserializeAsset(assetSer)
assert.Nil(t, err)
assert.True(t, isasset)
assert.Equal(t, "asset", assetDes.Text)
}
func tempArchive(prefix string) (string, error) {
for {
path := filepath.Join(os.TempDir(), fmt.Sprintf("%s-%x.tar", prefix, rand.Uint32()))

View file

@ -243,7 +243,7 @@ func UnmarshalPropertyValue(v *structpb.Value, opts MarshalOptions) (resource.Pr
// Before returning it as an object, check to see if it's a known recoverable type.
objmap := obj.Mappable()
asset, isasset, err := resource.DeserializeAsset(objmap, false)
asset, isasset, err := resource.DeserializeAsset(objmap)
if err != nil {
return resource.PropertyValue{}, err
} else if isasset {
@ -251,12 +251,10 @@ func UnmarshalPropertyValue(v *structpb.Value, opts MarshalOptions) (resource.Pr
if err = asset.EnsureHash(); err != nil {
return resource.PropertyValue{}, errors.Wrapf(err, "failed to compute asset hash")
}
} else if asset.Hash == "" {
return resource.PropertyValue{}, errors.New("asset missing hash, and no compute requested")
}
return resource.NewAssetProperty(asset), nil
}
archive, isarchive, err := resource.DeserializeArchive(objmap, false)
archive, isarchive, err := resource.DeserializeArchive(objmap)
if err != nil {
return resource.PropertyValue{}, err
} else if isarchive {
@ -264,8 +262,6 @@ func UnmarshalPropertyValue(v *structpb.Value, opts MarshalOptions) (resource.Pr
if err = archive.EnsureHash(); err != nil {
return resource.PropertyValue{}, errors.Wrapf(err, "failed to compute archive hash")
}
} else if archive.Hash == "" {
return resource.PropertyValue{}, errors.New("archive missing hash, and no compute requested")
}
return resource.NewArchiveProperty(archive), nil
}

View file

@ -201,13 +201,13 @@ func DeserializePropertyValue(v interface{}) (resource.PropertyValue, error) {
}
// This could be an asset or archive; if so, recover its type.
objmap := obj.Mappable()
asset, isasset, err := resource.DeserializeAsset(objmap, true)
asset, isasset, err := resource.DeserializeAsset(objmap)
if err != nil {
return resource.PropertyValue{}, err
} else if isasset {
return resource.NewAssetProperty(asset), nil
}
archive, isarchive, err := resource.DeserializeArchive(objmap, true)
archive, isarchive, err := resource.DeserializeArchive(objmap)
if err != nil {
return resource.PropertyValue{}, err
} else if isarchive {