blob: e5b24b12928cd5c302300baf8fe417e4c2ca03eb [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package cmd
import (
"errors"
"fmt"
)
import (
"github.com/spf13/cobra"
"go.uber.org/zap/zapcore"
)
import (
"github.com/apache/dubbo-kubernetes/app/dubboctl/identifier"
"github.com/apache/dubbo-kubernetes/app/dubboctl/internal/kube"
"github.com/apache/dubbo-kubernetes/app/dubboctl/internal/manifest"
"github.com/apache/dubbo-kubernetes/pkg/core/logger"
)
type ProfileDiffArgs struct {
ProfilesPath string
}
func (pda *ProfileDiffArgs) setDefault() {
if pda == nil {
return
}
if pda.ProfilesPath == "" {
pda.ProfilesPath = identifier.Profiles
}
}
func ConfigProfileDiffCmd(baseCmd *cobra.Command) {
pdArgs := &ProfileDiffArgs{}
pdCmd := &cobra.Command{
Use: "diff",
Short: "Show the difference between two profiles",
Example: ` # show the difference between two profiles provided by dubbo-admin
dubboctl profile diff default demo
# show the difference between two profiles specified by user
dubboctl profile diff profile_name0 profile_name1 --profiles /path/to/profiles
`,
Args: func(cmd *cobra.Command, args []string) error {
if len(args) != 2 {
return errors.New("profile diff needs two profiles")
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
logger.InitCmdSugar(zapcore.AddSync(cmd.OutOrStdout()))
pdArgs.setDefault()
if err := profileDiffCmd(pdArgs, args); err != nil {
return err
}
return nil
},
}
pdCmd.PersistentFlags().StringVarP(&pdArgs.ProfilesPath, "profiles", "", "",
"Path to profiles directory, this directory contains preset profiles")
baseCmd.AddCommand(pdCmd)
}
func profileDiffCmd(pdArgs *ProfileDiffArgs, args []string) error {
profileA, err := manifest.ReadProfileYaml(pdArgs.ProfilesPath, args[0])
if err != nil {
return fmt.Errorf("parse %s profile failed, err: %s", args[0], err)
}
profileB, err := manifest.ReadProfileYaml(pdArgs.ProfilesPath, args[1])
if err != nil {
return fmt.Errorf("parse %s profile failed, err: %s", args[1], err)
}
objA, err := kube.ParseObjectFromManifest(profileA)
if err != nil {
return fmt.Errorf("parse %s profile to k8s object failed, err: %s", args[0], err)
}
objB, err := kube.ParseObjectFromManifest(profileB)
if err != nil {
return fmt.Errorf("parse %s profile to k8s object failed, err: %s", args[1], err)
}
diff, err := kube.CompareObject(objA, objB)
if err != nil {
return fmt.Errorf("compare failed, err: %s", err)
}
if diff != "" {
logger.CmdSugar().Print(diff)
} else {
logger.CmdSugar().Print("two profiles are identical\n")
}
return nil
}