You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by zh...@apache.org on 2025/01/30 08:57:32 UTC

(dubbo-kubernetes) branch master updated: [dubboctl] read profile info logic (#569)

This is an automated email from the ASF dual-hosted git repository.

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new aa933507 [dubboctl] read profile info logic (#569)
aa933507 is described below

commit aa933507711070569ea792a432ebe5f9bc185d22
Author: Jian Zhong <11...@qq.com>
AuthorDate: Thu Jan 30 16:57:27 2025 +0800

    [dubboctl] read profile info logic (#569)
---
 operator/cmd/cluster/profile.go |  2 +-
 operator/cmd/cluster/shared.go  | 37 +++++++++++++++++------
 operator/pkg/apis/types.go      | 12 +++++---
 operator/pkg/helm/helm.go       | 66 +++++++++++++++++++++++++++++++++++++++--
 operator/pkg/util/common.go     |  7 +++++
 operator/pkg/util/yaml.go       | 37 +++++++++++++++++++++++
 6 files changed, 144 insertions(+), 17 deletions(-)

diff --git a/operator/cmd/cluster/profile.go b/operator/cmd/cluster/profile.go
index 524e77cc..3b6f175a 100644
--- a/operator/cmd/cluster/profile.go
+++ b/operator/cmd/cluster/profile.go
@@ -139,7 +139,7 @@ func profileShow(args []string, rootArgs *RootArgs, pdArgs *profileShowArgs, l c
 		setFlags = append(setFlags, "profile="+args[0])
 	}
 
-	y, _, err := GenerateConfig(pdArgs.filenames, setFlags, nil, l)
+	y, _, err := GenerateConfig(pdArgs.filenames, setFlags, l)
 	if err != nil {
 		return err
 	}
diff --git a/operator/cmd/cluster/shared.go b/operator/cmd/cluster/shared.go
index 299e90c1..83d5d768 100644
--- a/operator/cmd/cluster/shared.go
+++ b/operator/cmd/cluster/shared.go
@@ -3,10 +3,11 @@ package cluster
 import (
 	"fmt"
 	dopv1alpha1 "github.com/apache/dubbo-kubernetes/operator/pkg/apis"
+	"github.com/apache/dubbo-kubernetes/operator/pkg/helm"
+	"github.com/apache/dubbo-kubernetes/operator/pkg/util"
 	"github.com/apache/dubbo-kubernetes/operator/pkg/util/clog"
 	"io"
 	"io/ioutil"
-	"k8s.io/client-go/rest"
 	"os"
 	"strings"
 )
@@ -53,8 +54,7 @@ func NewPrinterForWriter(w io.Writer) Printer {
 	return &writerPrinter{writer: w}
 }
 
-func GenerateConfig(filenames []string, setFlags []string,
-	kubeConfig *rest.Config, l clog.Logger) (string, *dopv1alpha1.DubboOperator, error) {
+func GenerateConfig(filenames []string, setFlags []string, l clog.Logger) (string, *dopv1alpha1.DubboOperator, error) {
 	if err := validateSetFlags(setFlags); err != nil {
 		return "", nil, err
 	}
@@ -63,7 +63,7 @@ func GenerateConfig(filenames []string, setFlags []string,
 	if err != nil {
 		return "", nil, err
 	}
-	return overlayYAMLStrings(profile, fy, setFlags, kubeConfig, l)
+	return overlayYAMLStrings(profile, fy, setFlags, l)
 }
 
 func validateSetFlags(setFlags []string) error {
@@ -78,18 +78,37 @@ func validateSetFlags(setFlags []string) error {
 
 func overlayYAMLStrings(
 	profile string, fy string,
-	setFlags []string, kubeConfig *rest.Config, l clog.Logger,
+	setFlags []string, l clog.Logger,
 ) (string, *dopv1alpha1.DubboOperator, error) {
-	dopsString, dops, err := GenDOPFromProfile(profile, fy, setFlags, kubeConfig, l)
+	dopsString, dops, err := GenDOPFromProfile(profile, fy, setFlags, l)
 	if err != nil {
 		return "", nil, err
 	}
-
 	return dopsString, dops, nil
 }
 
-func GenDOPFromProfile(profileOrPath, fileOverlayYAML string, setFlags []string, kubeConfig *rest.Config, l clog.Logger) (string, *dopv1alpha1.DubboOperator, error) {
-	return "", nil, nil
+func GenDOPFromProfile(profileOrPath, fileOverlayYAML string, setFlags []string, l clog.Logger) (string, *dopv1alpha1.DubboOperator, error) {
+	outYAML, err := helm.GetProfileYAML("", profileOrPath)
+	if err != nil {
+		return "", nil, err
+	}
+	finalIOP, err := unmarshalDOP(outYAML, false, l)
+	if err != nil {
+		return "", nil, err
+	}
+
+	if finalIOP.Spec.Profile == "" {
+		finalIOP.Spec.Profile = DefaultProfileName
+	}
+	return util.ToYAMLWithJSONPB(finalIOP), finalIOP, nil
+}
+
+func unmarshalDOP(dopsYAML string, allowUnknownField bool, l clog.Logger) (*dopv1alpha1.DubboOperator, error) {
+	dop := &dopv1alpha1.DubboOperator{}
+	if err := util.UnmarshalWithJSONPB(dopsYAML, dop, allowUnknownField); err != nil {
+		return nil, fmt.Errorf("could not unmarshal merged YAML: %s\n\nYAML:\n%s", err, dopsYAML)
+	}
+	return dop, nil
 }
 
 func readYamlProfile(filenames []string, setFlags []string, l clog.Logger) (string, string, error) {
diff --git a/operator/pkg/apis/types.go b/operator/pkg/apis/types.go
index 14424451..2eda62a3 100644
--- a/operator/pkg/apis/types.go
+++ b/operator/pkg/apis/types.go
@@ -2,7 +2,7 @@ package apis
 
 import (
 	"encoding/json"
-
+	proto "github.com/gogo/protobuf/proto"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
@@ -47,9 +47,13 @@ type BoolValue struct {
 	bool
 }
 
-func (b *BoolValue) MarshalJSON() ([]byte, error) {
-	return json.Marshal(b.GetValueOrFalse())
-}
+func (d *DubboOperator) Reset() { *d = DubboOperator{} }
+
+func (d *DubboOperator) String() string { return proto.CompactTextString(d) }
+
+func (*DubboOperator) ProtoMessage() {}
+
+func (b *BoolValue) MarshalJSON() ([]byte, error) { return json.Marshal(b.GetValueOrFalse()) }
 
 func (b *BoolValue) UnmarshalJSON(bytes []byte) error {
 	bb := false
diff --git a/operator/pkg/helm/helm.go b/operator/pkg/helm/helm.go
index 8cd4cfb2..146a2d43 100644
--- a/operator/pkg/helm/helm.go
+++ b/operator/pkg/helm/helm.go
@@ -13,6 +13,7 @@ import (
 	"helm.sh/helm/v3/pkg/chartutil"
 	"helm.sh/helm/v3/pkg/engine"
 	"io/fs"
+	"io/ioutil"
 	"os"
 	"path/filepath"
 	"sort"
@@ -22,9 +23,10 @@ import (
 const (
 	// NotesFileNameSuffix is the file name suffix for helm notes.
 	// see https://helm.sh/docs/chart_template_guide/notes_files/
-	NotesFileNameSuffix = ".txt"
-	BaseChartName       = "base"
-	profilesDirName     = "profiles"
+	NotesFileNameSuffix    = ".txt"
+	BaseChartName          = "base"
+	profilesDirName        = "profiles"
+	DefaultProfileFilename = "default.yaml"
 )
 
 type Warnings = util.Errors
@@ -164,3 +166,61 @@ func stringBoolMapToSlice(m map[string]bool) []string {
 	}
 	return s
 }
+
+func GetProfileYAML(installPackagePath, profileOrPath string) (string, error) {
+	if profileOrPath == "" {
+		profileOrPath = "default"
+	}
+	profiles, err := readProfiles(installPackagePath)
+	if err != nil {
+		return "", fmt.Errorf("failed to read profiles: %v", err)
+	}
+	if profiles[profileOrPath] && installPackagePath != "" {
+		profileOrPath = filepath.Join(installPackagePath, "profiles", profileOrPath+".yaml")
+	}
+	baseCRYAML, err := ReadProfileYAML(profileOrPath, installPackagePath)
+	if err != nil {
+		return "", err
+	}
+
+	return baseCRYAML, nil
+}
+
+func readFile(path string) (string, error) {
+	b, err := ioutil.ReadFile(path)
+	return string(b), err
+}
+
+func ReadProfileYAML(profile, manifestsPath string) (string, error) {
+	var err error
+	var globalValues string
+
+	switch {
+	case util.IsFilePath(profile):
+		if globalValues, err = readFile(profile); err != nil {
+			return "", err
+		}
+	default:
+		if globalValues, err = LoadValues(profile, manifestsPath); err != nil {
+			return "", fmt.Errorf("failed to read profile %v from %v: %v", profile, manifestsPath, err)
+		}
+	}
+
+	return globalValues, nil
+}
+
+func LoadValues(profileName string, chartsDir string) (string, error) {
+	path := strings.Join([]string{profilesDirName, builtinProfileToFilename(profileName)}, "/")
+	by, err := fs.ReadFile(manifests.BuiltinDir(chartsDir), path)
+	if err != nil {
+		return "", err
+	}
+	return string(by), nil
+}
+
+func builtinProfileToFilename(name string) string {
+	if name == "" {
+		return DefaultProfileFilename
+	}
+	return name + ".yaml"
+}
diff --git a/operator/pkg/util/common.go b/operator/pkg/util/common.go
new file mode 100644
index 00000000..e9a38104
--- /dev/null
+++ b/operator/pkg/util/common.go
@@ -0,0 +1,7 @@
+package util
+
+import "strings"
+
+func IsFilePath(path string) bool {
+	return strings.Contains(path, "/") || strings.Contains(path, ".")
+}
diff --git a/operator/pkg/util/yaml.go b/operator/pkg/util/yaml.go
new file mode 100644
index 00000000..63b43217
--- /dev/null
+++ b/operator/pkg/util/yaml.go
@@ -0,0 +1,37 @@
+package util
+
+import (
+	"bytes"
+	"github.com/gogo/protobuf/jsonpb"
+	"github.com/gogo/protobuf/proto"
+	"sigs.k8s.io/yaml"
+)
+
+func UnmarshalWithJSONPB(y string, out proto.Message, allowUnknownField bool) error {
+	if y == "" {
+		return nil
+	}
+	jb, err := yaml.YAMLToJSON([]byte(y))
+	if err != nil {
+		return err
+	}
+	u := jsonpb.Unmarshaler{AllowUnknownFields: allowUnknownField}
+	err = u.Unmarshal(bytes.NewReader(jb), out)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func ToYAMLWithJSONPB(val proto.Message) string {
+	m := jsonpb.Marshaler{EnumsAsInts: true}
+	js, err := m.MarshalToString(val)
+	if err != nil {
+		return err.Error()
+	}
+	yb, err := yaml.JSONToYAML([]byte(js))
+	if err != nil {
+		return err.Error()
+	}
+	return string(yb)
+}