This commit is contained in:
Yann Hamon 2020-11-01 13:00:02 +01:00
parent 939b44e3ca
commit 1bc9283240
15 changed files with 241 additions and 458 deletions

View file

@ -4,12 +4,21 @@ import (
"sigs.k8s.io/yaml"
)
type Resource struct {
Path string
Bytes []byte
sig *Signature
}
type Signature struct {
Kind, Version, Namespace, Name string
}
// SignatureFromBytes returns key identifying elements from a []byte representing the resource
func SignatureFromBytes(res []byte) (Signature, error) {
func (res *Resource) Signature() (*Signature, error) {
if res.sig != nil {
return res.sig, nil
}
resource := struct {
APIVersion string `yaml:"apiVersion"`
Kind string `yaml:"kind"`
@ -19,12 +28,14 @@ func SignatureFromBytes(res []byte) (Signature, error) {
GenerateName string `yaml:"generateName"`
} `yaml:"Metadata"`
}{}
err := yaml.Unmarshal(res, &resource)
err := yaml.Unmarshal(res.Bytes, &resource)
name := resource.Metadata.Name
if resource.Metadata.GenerateName != "" {
name = resource.Metadata.GenerateName + "{{ generateName }}"
}
return Signature{Kind: resource.Kind, Version: resource.APIVersion, Namespace: resource.Metadata.Namespace, Name: name}, err
// We cache the result to not unmarshall every time we want to access the signature
res.sig = &Signature{Kind: resource.Kind, Version: resource.APIVersion, Namespace: resource.Metadata.Namespace, Name: name}
return res.sig, err
}

View file

@ -35,7 +35,8 @@ spec:
}
for _, testCase := range testCases {
sig, err := resource.SignatureFromBytes(testCase.have)
res := resource.Resource{Bytes: testCase.have}
sig, err := res.Signature()
if err != nil && err.Error() != testCase.err.Error() {
t.Errorf("test \"%s\" - received error: %s", testCase.name, err)
}
@ -44,6 +45,5 @@ spec:
sig.Namespace != testCase.want.Namespace {
t.Errorf("test \"%s\": received %+v, expected %+v", testCase.name, sig, testCase.want)
}
}
}

22
pkg/resource/stream.go Normal file
View file

@ -0,0 +1,22 @@
package resource
import (
"bytes"
"io"
"io/ioutil"
)
func FromStream(path string, r io.Reader) ([]Resource, error) {
data, err := ioutil.ReadAll(r)
if err != nil {
return []Resource{}, err
}
resources := []Resource{}
rawResources := bytes.Split(data, []byte("---\n"))
for _, rawResource := range rawResources {
resources = append(resources, Resource{Path: path, Bytes: rawResource})
}
return resources, nil
}