mirror of
https://github.com/kubevela/kubevela.git
synced 2026-05-12 20:37:22 +00:00
* allow vela CLI to specify NS
* vela up support application yaml
* fix
* add default cap center to vela CLI
* add alias for `vela components`(`vela comp`,or `vela component`) and `vela traits`(`vela trait`)
* fix cap ls STATUS fields are always "uninstalled"
* fix vela up process
* Revert "allow vela CLI to specify NS"
This reverts commit 33f27362
will refactor to use Initializer
* add --discover for vela CLI
* * rfc capcenter to reuse registry type
* change default cap center to oss
* judge if application file in advance
* fix CI
* try CI
* fix error check
196 lines
5.5 KiB
Go
196 lines
5.5 KiB
Go
/*
|
|
Copyright 2021 The KubeVela Authors.
|
|
|
|
Licensed 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 cli
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
|
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
"sigs.k8s.io/controller-runtime/pkg/client/config"
|
|
|
|
core "github.com/oam-dev/kubevela/apis/core.oam.dev"
|
|
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
|
|
"github.com/oam-dev/kubevela/apis/types"
|
|
common2 "github.com/oam-dev/kubevela/pkg/utils/common"
|
|
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
|
|
"github.com/oam-dev/kubevela/references/common"
|
|
"github.com/oam-dev/kubevela/references/plugins"
|
|
)
|
|
|
|
// NewTraitsCommand creates `traits` command
|
|
func NewTraitsCommand(c common2.Args, ioStreams cmdutil.IOStreams) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "traits",
|
|
Aliases: []string{"trait"},
|
|
DisableFlagsInUseLine: true,
|
|
Short: "List traits",
|
|
Long: "List traits",
|
|
Example: `vela traits`,
|
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
|
return c.SetConfig()
|
|
},
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
isDiscover, _ := cmd.Flags().GetBool("discover")
|
|
env, err := GetEnv(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !isDiscover {
|
|
return printTraitList(env.Namespace, c, ioStreams)
|
|
}
|
|
option := types.TypeTrait
|
|
err = printCenterCapabilities(env.Namespace, "", c, ioStreams, &option)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
},
|
|
Annotations: map[string]string{
|
|
types.TagCommandType: types.TypeCap,
|
|
},
|
|
}
|
|
cmd.Flags().Bool("discover", false, "discover traits in capability centers")
|
|
cmd.SetOut(ioStreams.Out)
|
|
return cmd
|
|
}
|
|
|
|
func printTraitList(userNamespace string, c common2.Args, ioStreams cmdutil.IOStreams) error {
|
|
table := newUITable()
|
|
table.Wrap = true
|
|
|
|
traitDefinitionList, err := common.ListRawTraitDefinitions(userNamespace, c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
table.AddRow("NAME", "NAMESPACE", "APPLIES-TO", "CONFLICTS-WITH", "POD-DISRUPTIVE", "DESCRIPTION")
|
|
for _, t := range traitDefinitionList {
|
|
table.AddRow(t.Name, t.Namespace, strings.Join(t.Spec.AppliesToWorkloads, ","), strings.Join(t.Spec.ConflictsWith, ","), t.Spec.PodDisruptive, plugins.GetDescription(t.Annotations))
|
|
}
|
|
ioStreams.Info(table.String())
|
|
return nil
|
|
}
|
|
|
|
// PrintTraitListFromRegistry print a table which shows all traits from registry
|
|
func PrintTraitListFromRegistry(isDiscover bool, url string, ioStreams cmdutil.IOStreams) error {
|
|
var scheme = runtime.NewScheme()
|
|
err := core.AddToScheme(scheme)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = clientgoscheme.AddToScheme(scheme)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
k8sClient, err := client.New(config.GetConfigOrDie(), client.Options{Scheme: scheme})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, _ = ioStreams.Out.Write([]byte(fmt.Sprintf("Showing traits from registry: %s\n", url)))
|
|
caps, err := getCapsFromRegistry(url)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
table := newUITable()
|
|
|
|
var installedList v1beta1.TraitDefinitionList
|
|
err = k8sClient.List(context.Background(), &installedList, client.InNamespace(types.DefaultKubeVelaNS))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if isDiscover {
|
|
table.AddRow("NAME", "REGISTRY", "DEFINITION", "APPLIES-TO")
|
|
} else {
|
|
table.AddRow("NAME", "DEFINITION", "APPLIES-TO")
|
|
}
|
|
for _, c := range caps {
|
|
if c.Type != types.TypeTrait {
|
|
continue
|
|
}
|
|
c.Status = uninstalled
|
|
for _, ins := range installedList.Items {
|
|
if ins.Name == c.Name {
|
|
c.Status = installed
|
|
}
|
|
}
|
|
if c.Status == uninstalled && isDiscover {
|
|
table.AddRow(c.Name, "default", c.CrdName, c.AppliesTo)
|
|
}
|
|
if c.Status == installed && !isDiscover {
|
|
table.AddRow(c.Name, c.CrdName, c.AppliesTo)
|
|
}
|
|
}
|
|
ioStreams.Info(table.String())
|
|
|
|
return nil
|
|
}
|
|
|
|
// getCapsFromRegistry will retrieve caps from registry
|
|
func getCapsFromRegistry(regURL string) ([]types.Capability, error) {
|
|
g, err := plugins.NewRegistry(context.Background(), "", "url-registry", regURL)
|
|
if err != nil {
|
|
return []types.Capability{}, err
|
|
}
|
|
caps, err := g.ListCaps()
|
|
if err != nil {
|
|
return []types.Capability{}, err
|
|
}
|
|
return caps, nil
|
|
}
|
|
|
|
// InstallTraitByName will install given traitName trait to cluster
|
|
func InstallTraitByName(args common2.Args, ioStream cmdutil.IOStreams, traitName, regURL string) error {
|
|
|
|
g, err := plugins.NewRegistry(context.Background(), "", "url-registry", regURL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
capObj, data, err := g.GetCap(traitName)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
k8sClient, err := args.GetClient()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mapper, err := args.GetDiscoveryMapper()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = common.InstallTraitDefinition(k8sClient, mapper, data, ioStream, &capObj)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ioStream.Info("Successfully install trait:", traitName)
|
|
return nil
|
|
}
|
|
|
|
// DefaultRegistry is default capability center of kubectl-vela
|
|
var DefaultRegistry = "oss://registry.kubevela.net"
|
|
|
|
const installed = "installed"
|
|
const uninstalled = "uninstalled"
|