Tolerate missing hashes
This commit is contained in:
parent
3d9dcb0942
commit
4a493292b1
|
@ -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 {
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue