Skip to content

Commit edce88b

Browse files
authored
Merge pull request #101 from iawia002/icon
Unify the parsing process of extension metadata
2 parents 7d3a772 + 382d7f4 commit edce88b

5 files changed

Lines changed: 63 additions & 84 deletions

File tree

cmd/push.go

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"os"
66
"path/filepath"
7-
"strings"
87

98
"github.com/spf13/cobra"
109
"helm.sh/helm/v3/pkg/chart/loader"
@@ -48,12 +47,12 @@ func (o *pushOptions) push(_ *cobra.Command, args []string) error {
4847
return err
4948
}
5049

51-
metadata, err := extension.LoadMetadata(tempDir)
50+
metadata, err := extension.LoadMetadata(tempDir, extension.WithEncodeIcon(false))
5251
if err != nil {
5352
return err
5453
}
5554
// upload images to cloud
56-
if needUpload(metadata.Icon) {
55+
if extension.IsLocalFile(metadata.Icon) {
5756
resp, err := client.UploadFiles(metadata.Name, metadata.Version, tempDir, metadata.Icon)
5857
if err != nil {
5958
return err
@@ -63,7 +62,7 @@ func (o *pushOptions) push(_ *cobra.Command, args []string) error {
6362
screenshots := make([]string, 0)
6463
localScreenshots := make([]string, 0)
6564
for _, p := range metadata.Screenshots {
66-
if needUpload(p) {
65+
if extension.IsLocalFile(p) {
6766
localScreenshots = append(localScreenshots, p)
6867
} else {
6968
screenshots = append(screenshots, p)
@@ -125,12 +124,3 @@ func (o *pushOptions) push(_ *cobra.Command, args []string) error {
125124
fmt.Println("Extension pushed and submitted to KubeSphere Cloud, waiting for review")
126125
return nil
127126
}
128-
129-
func needUpload(path string) bool {
130-
if strings.HasPrefix(path, "http://") ||
131-
strings.HasPrefix(path, "https://") ||
132-
strings.HasPrefix(path, "data:image") {
133-
return false
134-
}
135-
return true
136-
}

pkg/extension/publish.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,42 @@ import (
2424

2525
const MetadataFilename = "extension.yaml"
2626

27-
func LoadMetadata(path string) (*Metadata, error) {
28-
content, err := os.ReadFile(path + "/" + MetadataFilename)
27+
type Options struct {
28+
encodeIcon bool
29+
}
30+
31+
func WithEncodeIcon(encodeIcon bool) func(opts *Options) {
32+
return func(opts *Options) {
33+
opts.encodeIcon = encodeIcon
34+
}
35+
}
36+
37+
func LoadMetadata(path string, options ...func(*Options)) (*Metadata, error) {
38+
opts := &Options{
39+
encodeIcon: true,
40+
}
41+
for _, f := range options {
42+
f(opts)
43+
}
44+
45+
content, err := os.ReadFile(ospath.Join(path, MetadataFilename))
2946
if err != nil {
3047
return nil, err
3148
}
32-
metadata := new(Metadata)
33-
if err = yaml.Unmarshal(content, metadata); err != nil {
49+
metadata, err := ParseMetadata(content)
50+
if err != nil {
3451
return nil, err
3552
}
36-
if err = metadata.Validate(); err != nil {
37-
return nil, err
53+
54+
if IsLocalFile(metadata.Icon) && opts.encodeIcon {
55+
base64EncodedIcon, err := encodeIcon(ospath.Join(path, metadata.Icon))
56+
if err != nil {
57+
return nil, err
58+
}
59+
metadata.Icon = base64EncodedIcon
3860
}
39-
if err = metadata.Init(path); err != nil {
61+
62+
if err = metadata.Validate(); err != nil {
4063
return nil, err
4164
}
4265
return metadata, nil

pkg/extension/type.go

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1616
corev1alpha1 "kubesphere.io/api/core/v1alpha1"
1717
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
18+
"sigs.k8s.io/yaml"
1819

1920
"github.com/kubesphere/ksbuilder/pkg/iso639"
2021
)
@@ -57,8 +58,19 @@ type Metadata struct {
5758
Namespace string `json:"namespace,omitempty"`
5859
Images []string `json:"images,omitempty"`
5960
ExternalDependencies []corev1alpha1.ExternalDependency `json:"externalDependencies,omitempty"`
61+
}
62+
63+
func ParseMetadata(data []byte) (*Metadata, error) {
64+
metadata := new(Metadata)
65+
if err := yaml.Unmarshal(data, metadata); err != nil {
66+
return nil, err
67+
}
6068

61-
base64EncodedIcon string
69+
// set default value for necessary fields
70+
if metadata.InstallationMode == "" {
71+
metadata.InstallationMode = corev1alpha1.InstallationModeHostOnly
72+
}
73+
return metadata, nil
6274
}
6375

6476
func validateLanguageCode(code corev1alpha1.LanguageCode) error {
@@ -94,19 +106,6 @@ func (md *Metadata) Validate() error {
94106
return md.validateLanguageCode()
95107
}
96108

97-
func (md *Metadata) Init(root string) error {
98-
if md.InstallationMode == "" {
99-
md.InstallationMode = corev1alpha1.InstallationModeHostOnly
100-
}
101-
102-
icon, err := encodeIcon(root, md.Icon)
103-
if err != nil {
104-
return err
105-
}
106-
md.base64EncodedIcon = icon
107-
return nil
108-
}
109-
110109
func (md *Metadata) ToChartYaml() (*chart.Metadata, error) {
111110
var c = chart.Metadata{
112111
APIVersion: chart.APIVersionV2,
@@ -118,21 +117,23 @@ func (md *Metadata) ToChartYaml() (*chart.Metadata, error) {
118117
Home: md.Home,
119118
Dependencies: md.Dependencies,
120119
Description: string(md.Description[corev1alpha1.DefaultLanguageCode]),
121-
Icon: md.base64EncodedIcon,
120+
Icon: md.Icon,
122121
Maintainers: md.Maintainers,
123122
}
124123
return &c, nil
125124
}
126125

127-
func encodeIcon(root, iconPath string) (string, error) {
128-
// If the icon is url or base64, you can use it directly.
129-
// Otherwise, load the file encoding as base64
130-
if strings.HasPrefix(iconPath, "http://") ||
131-
strings.HasPrefix(iconPath, "https://") ||
132-
strings.HasPrefix(iconPath, "data:image") {
133-
return iconPath, nil
126+
func IsLocalFile(path string) bool {
127+
if strings.HasPrefix(path, "http://") ||
128+
strings.HasPrefix(path, "https://") ||
129+
strings.HasPrefix(path, "data:image") {
130+
return false
134131
}
135-
content, err := os.ReadFile(path.Join(root, iconPath))
132+
return true
133+
}
134+
135+
func encodeIcon(iconPath string) (string, error) {
136+
content, err := os.ReadFile(iconPath)
136137
if err != nil {
137138
return "", err
138139
}
@@ -192,7 +193,7 @@ func (ext *Extension) ToKubernetesResources() []runtimeclient.Object {
192193
ExtensionInfo: corev1alpha1.ExtensionInfo{
193194
Description: ext.Metadata.Description,
194195
DisplayName: ext.Metadata.DisplayName,
195-
Icon: ext.Metadata.base64EncodedIcon,
196+
Icon: ext.Metadata.Icon,
196197
Provider: ext.Metadata.Provider,
197198
Created: metav1.Now(),
198199
},
@@ -218,7 +219,7 @@ func (ext *Extension) ToKubernetesResources() []runtimeclient.Object {
218219
ExtensionInfo: corev1alpha1.ExtensionInfo{
219220
Description: ext.Metadata.Description,
220221
DisplayName: ext.Metadata.DisplayName,
221-
Icon: ext.Metadata.base64EncodedIcon,
222+
Icon: ext.Metadata.Icon,
222223
Provider: ext.Metadata.Provider,
223224
Created: metav1.Now(),
224225
},

pkg/parser/extension.go

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
11
package parser
22

33
import (
4-
"encoding/base64"
54
"fmt"
6-
"mime"
7-
"net/http"
85
"path"
9-
"strings"
106

117
"helm.sh/helm/v3/pkg/chart"
128
"k8s.io/apimachinery/pkg/util/sets"
139
corev1alpha1 "kubesphere.io/api/core/v1alpha1"
14-
"sigs.k8s.io/yaml"
1510

1611
"github.com/kubesphere/ksbuilder/pkg/extension"
1712
"github.com/kubesphere/ksbuilder/pkg/utils"
@@ -37,7 +32,7 @@ func ParseExtension(name string, zipFile []byte) (*Extension, error) {
3732
return nil, err
3833
}
3934

40-
metadata, err := parseMetadata(name, data)
35+
metadata, err := extension.ParseMetadata(data[path.Join(name, extension.MetadataFilename)])
4136
if err != nil {
4237
return nil, err
4338
}
@@ -81,31 +76,3 @@ func ParseExtension(name string, zipFile []byte) (*Extension, error) {
8176
Docs: metadata.Docs,
8277
}, nil
8378
}
84-
85-
func parseMetadata(name string, data map[string][]byte) (*extension.Metadata, error) {
86-
metadata := new(extension.Metadata)
87-
if err := yaml.Unmarshal(data[path.Join(name, extension.MetadataFilename)], metadata); err != nil {
88-
return nil, err
89-
}
90-
if err := metadata.Validate(); err != nil {
91-
return nil, fmt.Errorf("validate the extension metadata failed: %s", err.Error())
92-
}
93-
if strings.HasPrefix(metadata.Icon, "http://") ||
94-
strings.HasPrefix(metadata.Icon, "https://") ||
95-
strings.HasPrefix(metadata.Icon, "data:image") {
96-
return metadata, nil
97-
}
98-
99-
iconData := data[path.Join(name, metadata.Icon)]
100-
101-
var base64Encoding string
102-
mimeType := mime.TypeByExtension(path.Ext(metadata.Icon))
103-
if mimeType == "" {
104-
mimeType = http.DetectContentType(iconData)
105-
}
106-
107-
base64Encoding += "data:" + mimeType + ";base64,"
108-
base64Encoding += base64.StdEncoding.EncodeToString(iconData)
109-
metadata.Icon = base64Encoding
110-
return metadata, nil
111-
}

pkg/parser/validate.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import (
99
"io"
1010
"path"
1111

12-
"sigs.k8s.io/yaml"
13-
1412
"github.com/kubesphere/ksbuilder/pkg/extension"
1513
)
1614

@@ -42,9 +40,9 @@ func ValidateExtension(name string, zipFile []byte) error {
4240
if _, err = io.ReadFull(tr, buffer); err != nil && err != io.EOF {
4341
return fmt.Errorf("read tar file failed: %s", err.Error())
4442
}
45-
metadata := new(extension.Metadata)
46-
if err = yaml.Unmarshal(buffer, metadata); err != nil {
47-
return fmt.Errorf("unmarshal the extension metadata failed: %s", err.Error())
43+
metadata, err := extension.ParseMetadata(buffer)
44+
if err != nil {
45+
return fmt.Errorf("parse the extension metadata failed: %s", err.Error())
4846
}
4947
if err = metadata.Validate(); err != nil {
5048
return fmt.Errorf("validate the extension metadata failed: %s", err.Error())

0 commit comments

Comments
 (0)