/
validate.go
55 lines (49 loc) · 1.21 KB
/
validate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package parser
import (
"archive/tar"
"bytes"
"compress/gzip"
"errors"
"fmt"
"io"
"path"
"sigs.k8s.io/yaml"
"github.com/kubesphere/ksbuilder/pkg/extension"
)
func ValidateExtension(name string, zipFile []byte) error {
gr, err := gzip.NewReader(bytes.NewReader(zipFile))
if err != nil {
return fmt.Errorf("gzip read file failed: %s", err.Error())
}
defer gr.Close() // nolint
metadataFilename := path.Join(name, extension.MetadataFilename)
tr := tar.NewReader(gr)
for {
h, err := tr.Next()
if err == io.EOF {
break
}
if err != nil {
return err
}
if h.FileInfo().IsDir() {
continue
}
if h.Name != metadataFilename {
continue
}
buffer := make([]byte, h.Size)
if _, err = io.ReadFull(tr, buffer); err != nil && err != io.EOF {
return fmt.Errorf("read tar file failed: %s", err.Error())
}
metadata := new(extension.Metadata)
if err = yaml.Unmarshal(buffer, metadata); err != nil {
return fmt.Errorf("unmarshal the extension metadata failed: %s", err.Error())
}
if err = metadata.Validate(); err != nil {
return fmt.Errorf("validate the extension metadata failed: %s", err.Error())
}
return nil
}
return errors.New("unable to find the extension metadata file")
}