From fb8c33af8d1a2e2cfc002b0ee8801bcee595b826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E5=85=83?= Date: Tue, 17 Nov 2020 17:46:56 +0800 Subject: [PATCH] add description for export const variable and function, fix golint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 天元 --- api/core.oam.dev/v1alpha2/appdeploy_types.go | 4 +- api/types/args.go | 1 + api/types/capability.go | 23 ++++++-- api/types/types.go | 39 ++++++++----- api/v1alpha1/autoscaler_types.go | 6 +- api/v1alpha1/metricstrait_types.go | 6 +- api/v1alpha1/podspecworkload_types.go | 2 + api/v1alpha1/route_types.go | 17 ++++-- pkg/commands/capability.go | 1 - pkg/commands/dashboard.go | 2 +- pkg/commands/refresh.go | 4 +- pkg/commands/system.go | 24 ++++---- pkg/commands/util/cmd.go | 26 ++------- pkg/commands/util/factory.go | 2 + pkg/commands/util/helpers.go | 57 +------------------ pkg/commands/util/init.go | 4 +- pkg/controller/common/error.go | 1 + pkg/controller/common/types.go | 2 + .../applicationdeployment_controller.go | 2 + pkg/controller/dependency/install.go | 5 +- pkg/controller/utils/utils.go | 5 +- .../autoscaler/autoscaler_controller.go | 1 + pkg/controller/v1alpha1/autoscaler/types.go | 1 + .../metrics/metricstrait_controller.go | 3 +- pkg/controller/v1alpha1/routes/ingress/api.go | 7 ++- .../v1alpha1/routes/ingress/nginx_ingress.go | 3 + .../v1alpha1/routes/route_controller.go | 4 +- pkg/controller/v1alpha1/routes/util.go | 2 + pkg/cue/base_template.go | 1 + pkg/cue/convert.go | 5 ++ pkg/oam/capability.go | 14 ++--- pkg/plugins/capcenter.go | 17 +++++- pkg/plugins/cluster.go | 11 +++- pkg/plugins/cluster_test.go | 6 +- pkg/plugins/local.go | 7 +++ pkg/server/api-server.go | 4 ++ pkg/server/apis/types.go | 20 ++++--- pkg/server/util/api.go | 1 + pkg/server/util/errors.go | 3 +- pkg/server/util/middleware.go | 1 + pkg/server/workloadHandler.go | 1 + pkg/utils/common/common.go | 2 + pkg/utils/config/config.go | 5 ++ pkg/utils/env/env.go | 21 ++++--- pkg/utils/helm/helm.go | 17 +++++- pkg/utils/system/system.go | 15 +++++ .../podspecworkload/mutating_handler.go | 2 +- 47 files changed, 242 insertions(+), 165 deletions(-) diff --git a/api/core.oam.dev/v1alpha2/appdeploy_types.go b/api/core.oam.dev/v1alpha2/appdeploy_types.go index 6ad34e99c..8b7ec3598 100644 --- a/api/core.oam.dev/v1alpha2/appdeploy_types.go +++ b/api/core.oam.dev/v1alpha2/appdeploy_types.go @@ -34,10 +34,10 @@ type ApplicationDeploymentStatus struct { runtimev1alpha1.ConditionedStatus `json:",inline"` } +// ApplicationDeployment is the Schema for the ApplicationDeployment API // +kubebuilder:object:root=true // +kubebuilder:resource:categories={oam} // +kubebuilder:subresource:status -// ApplicationDeployment is the Schema for the ApplicationDeployment API type ApplicationDeployment struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -46,8 +46,8 @@ type ApplicationDeployment struct { Status ApplicationDeploymentStatus `json:"status,omitempty"` } -// +kubebuilder:object:root=true // ApplicationDeploymentList contains a list of ApplicationDeployment +// +kubebuilder:object:root=true type ApplicationDeploymentList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` diff --git a/api/types/args.go b/api/types/args.go index fdd74a4bb..50badcc1b 100644 --- a/api/types/args.go +++ b/api/types/args.go @@ -5,6 +5,7 @@ import ( "k8s.io/client-go/rest" ) +// Args is args for controller-runtime client type Args struct { Config *rest.Config Schema *runtime.Scheme diff --git a/api/types/capability.go b/api/types/capability.go index ee0bbf802..476c6b875 100644 --- a/api/types/capability.go +++ b/api/types/capability.go @@ -26,12 +26,14 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +// Source record the source of Capability type Source struct { RepoName string `json:"repoName"` ChartName string `json:"chartName,omitempty"` } -type CrdInfo struct { +// CRDInfo record the CRD info of the Capability +type CRDInfo struct { APIVersion string `json:"apiVersion"` Kind string `json:"kind"` } @@ -55,9 +57,10 @@ type Capability struct { // Plugin Source Source *Source `json:"source,omitempty"` Install *Installation `json:"install,omitempty"` - CrdInfo *CrdInfo `json:"crdInfo,omitempty"` + CrdInfo *CRDInfo `json:"crdInfo,omitempty"` } +// Chart defines all necessary information to install a whole chart type Chart struct { Repo string `json:"repo"` URL string `json:"url"` @@ -67,18 +70,25 @@ type Chart struct { Values map[string]interface{} `json:"values"` } +// Installation defines the installation method for this Capability, currently only helm is supported type Installation struct { Helm Chart `json:"helm"` + //TODO(wonderflow) add raw yaml file support for install capability } +// CapType defines the type of capability type CapType string const ( + // TypeWorkload represents OAM Workload TypeWorkload CapType = "workload" - TypeTrait CapType = "trait" - TypeScope CapType = "scope" + // TypeTrait represents OAM Trait + TypeTrait CapType = "trait" + // TypeScope represent OAM Scope + TypeScope CapType = "scope" ) +// Parameter defines a parameter for cli from capability template type Parameter struct { Name string `json:"name"` Short string `json:"short,omitempty"` @@ -103,6 +113,7 @@ func ConvertTemplateJSON2Object(in *runtime.RawExtension) (Capability, error) { return t, err } +// SetFlagBy set cli flag from Parameter func SetFlagBy(flags *pflag.FlagSet, v Parameter) { name := v.Name if v.Alias != "" { @@ -142,6 +153,7 @@ func SetFlagBy(flags *pflag.FlagSet, v Parameter) { } } +// CapabilityCmpOptions will set compare option var CapabilityCmpOptions = []cmp.Option{ cmp.Comparer(func(a, b Parameter) bool { if a.Name != b.Name || a.Short != b.Short || a.Required != b.Required || @@ -186,7 +198,7 @@ var CapabilityCmpOptions = []cmp.Option{ case int: va = float64(vala) case float64: - va = float64(vala) + va = vala } switch valb := b.Default.(type) { case int64: @@ -203,6 +215,7 @@ var CapabilityCmpOptions = []cmp.Option{ return true })} +// EqualCapability will check whether two capabilities is equal func EqualCapability(a, b Capability) bool { return cmp.Equal(a, b, CapabilityCmpOptions...) } diff --git a/api/types/types.go b/api/types/types.go index 25bca9cb5..00003b3e1 100644 --- a/api/types/types.go +++ b/api/types/types.go @@ -1,26 +1,33 @@ package types const ( - DefaultOAMNS = "vela-system" - DefaultOAMReleaseName = "kubevela" - DefaultOAMRuntimeChartName = "vela-core" - DefaultOAMVersion = ">0.0.0-0" - - DefaultEnvName = "default" + // DefaultKubeVelaNS defines the default KubeVela namespace in Kubernetes + DefaultKubeVelaNS = "vela-system" + // DefaultKubeVelaReleaseName defines the default name of KubeVela Release + DefaultKubeVelaReleaseName = "kubevela" + // DefaultKubeVelaChartName defines the default chart name of KubeVela, this variable MUST align to the chart name of this repo + DefaultKubeVelaChartName = "vela-core" + // DefaultKubeVelaVersion defines the default version needed for KubeVela chart + DefaultKubeVelaVersion = ">0.0.0-0" + // DefaultEnvName defines the default environment name for Apps created by KubeVela + DefaultEnvName = "default" + // DefaultAppNamespace defines the default K8s namespace for Apps created by KubeVela DefaultAppNamespace = "default" ) const ( + // AnnDescription is the annotation which describe what is the capability used for in a WorkloadDefinition/TraitDefinition Object AnnDescription = "definition.oam.dev/description" - - LabelPodSpecable = "workload.oam.dev/podspecable" ) const ( + // StatusDeployed represents the App was deployed StatusDeployed = "Deployed" - StatusStaging = "Staging" + // StatusStaging represents the App was changed locally and it's spec is diff from the deployed one, or not deployed at all + StatusStaging = "Staging" ) +// EnvMeta stores the info for app environment type EnvMeta struct { Name string `json:"name"` Namespace string `json:"namespace"` @@ -33,12 +40,14 @@ type EnvMeta struct { } const ( + // TagCommandType used for tag cli category TagCommandType = "commandType" - - TypeStart = "Getting Started" - TypeApp = "Managing Applications" - TypeCap = "Managing Capabilities" + // TypeStart defines one category + TypeStart = "Getting Started" + // TypeApp defines one category + TypeApp = "Managing Applications" + // TypeCap defines one category + TypeCap = "Managing Capabilities" + // TypeSystem defines one category TypeSystem = "System" - - TypeTraits = "Traits" ) diff --git a/api/v1alpha1/autoscaler_types.go b/api/v1alpha1/autoscaler_types.go index 3777c843b..5bce6a9d2 100644 --- a/api/v1alpha1/autoscaler_types.go +++ b/api/v1alpha1/autoscaler_types.go @@ -30,9 +30,9 @@ type Protocol string // TriggerType defines the type of trigger type TriggerType string +// Autoscaler is the Schema for the autoscalers API // +kubebuilder:object:root=true // +kubebuilder:resource:categories={oam} -// Autoscaler is the Schema for the autoscalers API type Autoscaler struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -41,18 +41,22 @@ type Autoscaler struct { Status AutoscalerStatus `json:"status,omitempty"` } +// SetConditions set condition for CR status func (as *Autoscaler) SetConditions(c ...v1alpha1.Condition) { as.Status.SetConditions(c...) } +// GetCondition get condition from CR status func (as *Autoscaler) GetCondition(conditionType v1alpha1.ConditionType) v1alpha1.Condition { return as.Status.GetCondition(conditionType) } +// GetWorkloadReference get workload reference func (as *Autoscaler) GetWorkloadReference() v1alpha1.TypedReference { return as.Spec.WorkloadReference } +// SetWorkloadReference set workload reference func (as *Autoscaler) SetWorkloadReference(reference v1alpha1.TypedReference) { as.Spec.WorkloadReference = reference } diff --git a/api/v1alpha1/metricstrait_types.go b/api/v1alpha1/metricstrait_types.go index fd3b0f5e8..ba70269f2 100644 --- a/api/v1alpha1/metricstrait_types.go +++ b/api/v1alpha1/metricstrait_types.go @@ -99,20 +99,22 @@ func init() { var _ oam.Trait = &MetricsTrait{} +// SetConditions for set CR condition func (tr *MetricsTrait) SetConditions(c ...runtimev1alpha1.Condition) { tr.Status.SetConditions(c...) } +// GetCondition for get CR condition func (tr *MetricsTrait) GetCondition(c runtimev1alpha1.ConditionType) runtimev1alpha1.Condition { return tr.Status.GetCondition(c) } -// GetWorkloadReference of this ManualScalerTrait. +// GetWorkloadReference of this MetricsTrait. func (tr *MetricsTrait) GetWorkloadReference() runtimev1alpha1.TypedReference { return tr.Spec.WorkloadReference } -// SetWorkloadReference of this ManualScalerTrait. +// SetWorkloadReference of this MetricsTrait. func (tr *MetricsTrait) SetWorkloadReference(r runtimev1alpha1.TypedReference) { tr.Spec.WorkloadReference = r } diff --git a/api/v1alpha1/podspecworkload_types.go b/api/v1alpha1/podspecworkload_types.go index ad64bf3da..2112e8986 100644 --- a/api/v1alpha1/podspecworkload_types.go +++ b/api/v1alpha1/podspecworkload_types.go @@ -73,10 +73,12 @@ func init() { var _ oam.Workload = &PodSpecWorkload{} +// SetConditions set condition for this CR func (in *PodSpecWorkload) SetConditions(c ...cpv1alpha1.Condition) { in.Status.SetConditions(c...) } +// GetCondition set condition for this CR func (in *PodSpecWorkload) GetCondition(c cpv1alpha1.ConditionType) cpv1alpha1.Condition { return in.Status.GetCondition(c) } diff --git a/api/v1alpha1/route_types.go b/api/v1alpha1/route_types.go index 49bb54cbe..4a9e81a01 100644 --- a/api/v1alpha1/route_types.go +++ b/api/v1alpha1/route_types.go @@ -66,6 +66,7 @@ type Rule struct { Backend *Backend `json:"backend,omitempty"` } +// TLS defines certificate issuer and type for mTLS configuration type TLS struct { IssuerName string `json:"issuerName,omitempty"` @@ -74,13 +75,17 @@ type TLS struct { Type IssuerType `json:"type,omitempty"` } +// IssuerType defines the type of issuer type IssuerType string const ( - ClusterIssuer IssuerType = "ClusterIssuer" + // ClusterIssuer is a cluster level type of issuer + ClusterIssuer IssuerType = "ClusterIssuer" + // NamespaceIssuer is the default one NamespaceIssuer IssuerType = "Issuer" ) +// Backend defines backend configure for route trait. // Route will automatically discover podSpec and label for BackendService. // If BackendService is already set, discovery won't work. // If BackendService is not set, the discovery mechanism will work. @@ -109,10 +114,10 @@ type RouteStatus struct { runtimev1alpha1.ConditionedStatus `json:",inline"` } +// Route is the Schema for the routes API // +kubebuilder:object:root=true // +kubebuilder:resource:categories={oam} // +kubebuilder:subresource:status -// Route is the Schema for the routes API type Route struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -121,8 +126,8 @@ type Route struct { Status RouteStatus `json:"status,omitempty"` } -// +kubebuilder:object:root=true // RouteList contains a list of Route +// +kubebuilder:object:root=true type RouteList struct { metav1.TypeMeta `json:",inline"` metav1.ListMeta `json:"metadata,omitempty"` @@ -135,20 +140,22 @@ func init() { var _ oam.Trait = &Route{} +// SetConditions set condition for CR status func (r *Route) SetConditions(c ...runtimev1alpha1.Condition) { r.Status.SetConditions(c...) } +// GetCondition get condition from CR status func (r *Route) GetCondition(c runtimev1alpha1.ConditionType) runtimev1alpha1.Condition { return r.Status.GetCondition(c) } -// GetWorkloadReference of this ManualScalerTrait. +// GetWorkloadReference of this Route Trait. func (r *Route) GetWorkloadReference() runtimev1alpha1.TypedReference { return r.Spec.WorkloadReference } -// SetWorkloadReference of this ManualScalerTrait. +// SetWorkloadReference of this Route Trait. func (r *Route) SetWorkloadReference(rt runtimev1alpha1.TypedReference) { r.Spec.WorkloadReference = rt } diff --git a/pkg/commands/capability.go b/pkg/commands/capability.go index 257884fbe..0b0370145 100644 --- a/pkg/commands/capability.go +++ b/pkg/commands/capability.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/crossplane/oam-kubernetes-runtime/pkg/oam/discoverymapper" - "github.com/gosuri/uitable" "github.com/spf13/cobra" "sigs.k8s.io/controller-runtime/pkg/client" diff --git a/pkg/commands/dashboard.go b/pkg/commands/dashboard.go index 85bfa26c3..da28e4309 100644 --- a/pkg/commands/dashboard.go +++ b/pkg/commands/dashboard.go @@ -199,7 +199,7 @@ func OpenBrowser(url string) error { } func CheckVelaRuntimeInstalledAndReady(ioStreams cmdutil.IOStreams, c client.Client) (bool, error) { - if !helm.IsHelmReleaseRunning(types.DefaultOAMReleaseName, types.DefaultOAMRuntimeChartName, types.DefaultOAMNS, ioStreams) { + if !helm.IsHelmReleaseRunning(types.DefaultKubeVelaReleaseName, types.DefaultKubeVelaChartName, types.DefaultKubeVelaNS, ioStreams) { ioStreams.Info(fmt.Sprintf("\n%s %s", emojiFail, "KubeVela runtime is not installed yet.")) ioStreams.Info(fmt.Sprintf("\n%s %s%s or %s", emojiLightBulb, diff --git a/pkg/commands/refresh.go b/pkg/commands/refresh.go index 6b97f93a8..22314a132 100644 --- a/pkg/commands/refresh.go +++ b/pkg/commands/refresh.go @@ -29,7 +29,7 @@ func RefreshDefinitions(ctx context.Context, c types.Args, ioStreams cmdutil.IOS } var syncedTemplates []types.Capability - templates, templateErrors, err := plugins.GetWorkloadsFromCluster(ctx, types.DefaultOAMNS, c, dir, nil) + templates, templateErrors, err := plugins.GetWorkloadsFromCluster(ctx, types.DefaultKubeVelaNS, c, dir, nil) if err != nil { return err } @@ -41,7 +41,7 @@ func RefreshDefinitions(ctx context.Context, c types.Args, ioStreams cmdutil.IOS syncedTemplates = append(syncedTemplates, templates...) plugins.SinkTemp2Local(templates, dir) - templates, templateErrors, err = plugins.GetTraitsFromCluster(ctx, types.DefaultOAMNS, c, dir, nil) + templates, templateErrors, err = plugins.GetTraitsFromCluster(ctx, types.DefaultKubeVelaNS, c, dir, nil) if err != nil { return err } diff --git a/pkg/commands/system.go b/pkg/commands/system.go index f664d785d..dd22665fa 100644 --- a/pkg/commands/system.go +++ b/pkg/commands/system.go @@ -83,7 +83,7 @@ func NewAdminInfoCommand(ioStreams cmdutil.IOStreams) *cobra.Command { } func (i *infoCmd) run(ioStreams cmdutil.IOStreams) error { - clusterVersion, err := GetOAMReleaseVersion(types.DefaultOAMNS) + clusterVersion, err := GetOAMReleaseVersion(types.DefaultKubeVelaNS) if err != nil { return fmt.Errorf("fail to get cluster chartPath: %v", err) } @@ -106,7 +106,7 @@ func NewInstallCommand(c types.Args, chartContent string, ioStreams cmdutil.IOSt return err } i.client = newClient - i.namespace = types.DefaultOAMNS + i.namespace = types.DefaultKubeVelaNS i.c = c return i.run(ioStreams, chartContent) }, @@ -132,18 +132,18 @@ func (i *initCmd) run(ioStreams cmdutil.IOStreams, chartSource string) error { } ioStreams.Info("- Installing Vela Core Chart:") - exist, err := cmdutil.DoesNamespaceExist(i.client, types.DefaultOAMNS) + exist, err := cmdutil.DoesNamespaceExist(i.client, types.DefaultKubeVelaNS) if err != nil { return err } if !exist { - if err := cmdutil.NewNamespace(i.client, types.DefaultOAMNS); err != nil { + if err := cmdutil.NewNamespace(i.client, types.DefaultKubeVelaNS); err != nil { return err } - ioStreams.Info("created namespace", types.DefaultOAMNS) + ioStreams.Info("created namespace", types.DefaultKubeVelaNS) } - if helm.IsHelmReleaseRunning(types.DefaultOAMReleaseName, types.DefaultOAMRuntimeChartName, types.DefaultOAMNS, i.ioStreams) { + if helm.IsHelmReleaseRunning(types.DefaultKubeVelaReleaseName, types.DefaultKubeVelaChartName, types.DefaultKubeVelaNS, i.ioStreams) { i.ioStreams.Info("Vela system along with OAM runtime already exist.") } else { vals, err := i.resolveValues() @@ -189,7 +189,7 @@ func CheckCapabilityReady(ctx context.Context, c types.Args, timeout time.Durati defer spiner.Stop() for { - _, err = plugins.GetCapabilitiesFromCluster(ctx, types.DefaultOAMNS, c, tmpdir, nil) + _, err = plugins.GetCapabilitiesFromCluster(ctx, types.DefaultKubeVelaNS, c, tmpdir, nil) if err == nil { return nil } @@ -233,7 +233,7 @@ func InstallOamRuntime(chartPath, chartSource string, vals map[string]interface{ if err != nil { return fmt.Errorf("error loading chart for installation: %s", err) } - installClient, err := helm.NewHelmInstall("", types.DefaultOAMNS, types.DefaultOAMReleaseName) + installClient, err := helm.NewHelmInstall("", types.DefaultKubeVelaNS, types.DefaultKubeVelaReleaseName) if err != nil { return fmt.Errorf("error create helm install client: %s", err) } @@ -255,7 +255,7 @@ func GetOAMReleaseVersion(ns string) (string, error) { } for _, result := range results { - if result.Chart.ChartFullPath() == types.DefaultOAMRuntimeChartName { + if result.Chart.ChartFullPath() == types.DefaultKubeVelaChartName { return result.Chart.AppVersion(), nil } } @@ -301,10 +301,10 @@ func PrintTrackVelaRuntimeStatus(ctx context.Context, c client.Client, ioStreams func getVelaRuntimeStatus(ctx context.Context, c client.Client) (VelaRuntimeStatus, string, error) { podList := &corev1.PodList{} opts := []client.ListOption{ - client.InNamespace(types.DefaultOAMNS), + client.InNamespace(types.DefaultKubeVelaNS), client.MatchingLabels{ - "app.kubernetes.io/name": types.DefaultOAMRuntimeChartName, - "app.kubernetes.io/instance": types.DefaultOAMReleaseName, + "app.kubernetes.io/name": types.DefaultKubeVelaChartName, + "app.kubernetes.io/instance": types.DefaultKubeVelaReleaseName, }, } if err := c.List(ctx, podList, opts...); err != nil { diff --git a/pkg/commands/util/cmd.go b/pkg/commands/util/cmd.go index e42c56f4f..4e3fbddc6 100644 --- a/pkg/commands/util/cmd.go +++ b/pkg/commands/util/cmd.go @@ -1,10 +1,8 @@ package util import ( - "bytes" "fmt" "io" - "os" ) // IOStreams provides the standard names for iostreams. This is useful for embedding and for unit testing. @@ -18,41 +16,27 @@ type IOStreams struct { ErrOut io.Writer } -func PrintErrorMessage(errorMessage string, exitCode int) { - fmt.Println(errorMessage) - os.Exit(exitCode) -} - -// NewTestIOStreams returns a valid IOStreams and in, out, errout buffers for unit tests -func NewTestIOStreams() (IOStreams, *bytes.Buffer, *bytes.Buffer, *bytes.Buffer) { - in := &bytes.Buffer{} - out := &bytes.Buffer{} - errOut := &bytes.Buffer{} - - return IOStreams{ - In: in, - Out: out, - ErrOut: errOut, - }, in, out, errOut -} - -//Infonln compared to Info(), won't print new line +// Infonln compared to Info(), won't print new line func (i *IOStreams) Infonln(a ...interface{}) { _, _ = i.Out.Write([]byte(fmt.Sprint(a...))) } +// Info print info with new line func (i *IOStreams) Info(a ...interface{}) { _, _ = i.Out.Write([]byte(fmt.Sprintln(a...))) } +// Infof print info in a specified format func (i *IOStreams) Infof(format string, a ...interface{}) { _, _ = i.Out.Write([]byte(fmt.Sprintf(format, a...))) } +// Errorf print error info in a specified format func (i *IOStreams) Errorf(format string, a ...interface{}) { _, _ = i.ErrOut.Write([]byte(fmt.Sprintf(format, a...))) } +// Error print error info func (i *IOStreams) Error(a ...interface{}) { _, _ = i.ErrOut.Write([]byte(fmt.Sprintln(a...))) } diff --git a/pkg/commands/util/factory.go b/pkg/commands/util/factory.go index 8ce8bf874..2a66851a1 100644 --- a/pkg/commands/util/factory.go +++ b/pkg/commands/util/factory.go @@ -22,6 +22,8 @@ var defaultCacheDir = filepath.Join(homedir.HomeDir(), ".kube", "http-cache") var _ genericclioptions.RESTClientGetter = &restConfigGetter{} +// NewRestConfigGetter create config for helm client. +// TODO(wonderflow): we should fix this hardcode client build,with restConfig as parameter. // The helm client never thought it could be used inside a cluster so it // took a dependency on the kube cli, we have to create a cli client getter from the rest.Config func NewRestConfigGetter(namespace string) genericclioptions.RESTClientGetter { diff --git a/pkg/commands/util/helpers.go b/pkg/commands/util/helpers.go index 63cff2749..a40d787d5 100644 --- a/pkg/commands/util/helpers.go +++ b/pkg/commands/util/helpers.go @@ -3,74 +3,19 @@ package util import ( "context" "fmt" - "os" - "strings" "github.com/AlecAivazis/survey/v2" corev1alpha2 "github.com/crossplane/oam-kubernetes-runtime/apis/core/v1alpha2" - "github.com/spf13/cobra" - "k8s.io/klog" "sigs.k8s.io/controller-runtime/pkg/client" ) -const ( - DefaultErrorExitCode = 1 -) - -func Print(msg string) { - if klog.V(2) { - klog.FatalDepth(2, msg) - } - if len(msg) > 0 { - // add newline if needed - if !strings.HasSuffix(msg, "\n") { - msg += "\n" - } - fmt.Fprint(os.Stderr, msg) - } -} - -func fatal(msg string, code int) { - if klog.V(2) { - klog.FatalDepth(2, msg) - } - if len(msg) > 0 { - // add newline if needed - if !strings.HasSuffix(msg, "\n") { - msg += "\n" - } - fmt.Fprint(os.Stderr, msg) - } - os.Exit(code) -} - -func CheckErr(err error) { - if err == nil { - return - } - msg := err.Error() - if !strings.HasPrefix(msg, "error: ") { - msg = fmt.Sprintf("error: %s", msg) - } - fatal(msg, DefaultErrorExitCode) -} - +// GetComponent get OAM component func GetComponent(ctx context.Context, c client.Client, componentName string, namespace string) (corev1alpha2.Component, error) { var component corev1alpha2.Component err := c.Get(ctx, client.ObjectKey{Name: componentName, Namespace: namespace}, &component) return component, err } -func PrintFlags(cmd *cobra.Command, subcmds []*cobra.Command) { - cmd.Println("Flags:") - for _, sub := range subcmds { - if sub.HasLocalFlags() { - cmd.Println(sub.LocalFlags().FlagUsages()) - } - } - cmd.Println() -} - // AskToChooseOneService will ask users to select one service of the application if more than one exidi func AskToChooseOneService(svcNames []string) (string, error) { if len(svcNames) == 0 { diff --git a/pkg/commands/util/init.go b/pkg/commands/util/init.go index e08685d64..a339660ec 100644 --- a/pkg/commands/util/init.go +++ b/pkg/commands/util/init.go @@ -12,6 +12,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +// OAMLabel defines the label of namespace automatically created by kubevela var OAMLabel = map[string]string{"app.kubernetes.io/part-of": "kubevela"} // DoesNamespaceExist check namespace exist @@ -24,6 +25,7 @@ func DoesNamespaceExist(c client.Client, namespace string) (bool, error) { return true, nil } +// NewNamespace create namespace func NewNamespace(c client.Client, namespace string) error { ns := &v1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespace, // marking a special label for promethus monitoring. @@ -35,7 +37,7 @@ func NewNamespace(c client.Client, namespace string) error { return nil } -// DoesCoreCRDExist check CRD exist +// DoesCRDExist check CRD exist func DoesCRDExist(cxt context.Context, c client.Client, crdName string) (bool, error) { err := c.Get(cxt, types.NamespacedName{Name: crdName}, &apiextensions.CustomResourceDefinition{}) if err != nil { diff --git a/pkg/controller/common/error.go b/pkg/controller/common/error.go index d1f020915..1e5ccf6ed 100644 --- a/pkg/controller/common/error.go +++ b/pkg/controller/common/error.go @@ -1,3 +1,4 @@ +//nolint package common const ( diff --git a/pkg/controller/common/types.go b/pkg/controller/common/types.go index dfc1cd526..158823ffe 100644 --- a/pkg/controller/common/types.go +++ b/pkg/controller/common/types.go @@ -6,6 +6,8 @@ import ( v1 "k8s.io/api/core/v1" ) +// ServiceKind is string "Service" var ServiceKind = reflect.TypeOf(v1.Service{}).Name() +// ServiceAPIVersion is string "v1" var ServiceAPIVersion = v1.SchemeGroupVersion.String() diff --git a/pkg/controller/core.oam.dev/applicationdeployment/applicationdeployment_controller.go b/pkg/controller/core.oam.dev/applicationdeployment/applicationdeployment_controller.go index e7578deb6..3cb59d5f0 100644 --- a/pkg/controller/core.oam.dev/applicationdeployment/applicationdeployment_controller.go +++ b/pkg/controller/core.oam.dev/applicationdeployment/applicationdeployment_controller.go @@ -22,6 +22,7 @@ type Reconciler struct { Scheme *runtime.Scheme } +// Reconcile is the main logci of applicationdeployment controller // +kubebuilder:rbac:groups=core.oam.dev,resources=applicationdeployments,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=core.oam.dev,resources=applicationdeployments/status,verbs=get;update;patch // +kubebuilder:rbac:groups=core.oam.dev,resources=applicationconfigurations,verbs=get;list;watch;create;update;patch;delete @@ -44,6 +45,7 @@ func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { return ctrl.Result{}, nil } +// SetupWithManager setup the controller with manager func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { r.record = event.NewAPIRecorder(mgr.GetEventRecorderFor("ApplicationDeployment")). WithAnnotations("controller", "ApplicationDeployment") diff --git a/pkg/controller/dependency/install.go b/pkg/controller/dependency/install.go index a49b7d8e4..49a6123b1 100644 --- a/pkg/controller/dependency/install.go +++ b/pkg/controller/dependency/install.go @@ -50,7 +50,7 @@ func init() { helmInstallFunc = helm.InstallHelmChart } -// Setup vela dependency. +// Install will setup vela dependency. // Failing to install vela dependency should not block server from starting up. // Some users might fail to get charts due to network blockage. We should fix this in other ways. // Note: reconsider delegating the work to helm operator. @@ -77,6 +77,7 @@ func Install(kubecli client.Client) { } } +// nolint func Uninstall(kubecli client.Client) { velaConfig, err := fetchVelaConfig(kubecli) if err != nil { @@ -94,7 +95,7 @@ func Uninstall(kubecli client.Client) { } func fetchVelaConfig(kubecli client.Client) (*v1.ConfigMap, error) { - velaConfigNN := k8stypes.NamespacedName{Name: VelaConfigName, Namespace: types.DefaultOAMNS} + velaConfigNN := k8stypes.NamespacedName{Name: VelaConfigName, Namespace: types.DefaultKubeVelaNS} velaConfig := &v1.ConfigMap{} if err := kubecli.Get(context.TODO(), velaConfigNN, velaConfig); err != nil { return nil, err diff --git a/pkg/controller/utils/utils.go b/pkg/controller/utils/utils.go index 3e7499406..a660b6bbf 100644 --- a/pkg/controller/utils/utils.go +++ b/pkg/controller/utils/utils.go @@ -8,12 +8,13 @@ import ( "github.com/crossplane/crossplane-runtime/pkg/fieldpath" "github.com/crossplane/oam-kubernetes-runtime/apis/core/v1alpha2" "github.com/crossplane/oam-kubernetes-runtime/pkg/oam" - "github.com/oam-dev/kubevela/api/types" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/intstr" ) +const LabelPodSpecable = "workload.oam.dev/podspecable" + func GetPodSpecPath(workloadDef *v1alpha2.WorkloadDefinition) (string, bool) { if workloadDef.Spec.PodSpecPath != "" { return workloadDef.Spec.PodSpecPath, true @@ -21,7 +22,7 @@ func GetPodSpecPath(workloadDef *v1alpha2.WorkloadDefinition) (string, bool) { if workloadDef.Labels == nil { return "", false } - podSpecable, ok := workloadDef.Labels[types.LabelPodSpecable] + podSpecable, ok := workloadDef.Labels[LabelPodSpecable] if !ok { return "", false } diff --git a/pkg/controller/v1alpha1/autoscaler/autoscaler_controller.go b/pkg/controller/v1alpha1/autoscaler/autoscaler_controller.go index 30fb28149..0064af88e 100644 --- a/pkg/controller/v1alpha1/autoscaler/autoscaler_controller.go +++ b/pkg/controller/v1alpha1/autoscaler/autoscaler_controller.go @@ -36,6 +36,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" ) +// nolint:golint const ( SpecWarningTargetWorkloadNotSet = "Spec.targetWorkload is not set" SpecWarningStartAtTimeFormat = "startAt is not in the right format, which should be like `12:01`" diff --git a/pkg/controller/v1alpha1/autoscaler/types.go b/pkg/controller/v1alpha1/autoscaler/types.go index 526e1a0d4..2b2ce822f 100644 --- a/pkg/controller/v1alpha1/autoscaler/types.go +++ b/pkg/controller/v1alpha1/autoscaler/types.go @@ -1,3 +1,4 @@ +//nolint:golint package autoscalers import ( diff --git a/pkg/controller/v1alpha1/metrics/metricstrait_controller.go b/pkg/controller/v1alpha1/metrics/metricstrait_controller.go index e356907a0..21ef0c486 100644 --- a/pkg/controller/v1alpha1/metrics/metricstrait_controller.go +++ b/pkg/controller/v1alpha1/metrics/metricstrait_controller.go @@ -78,6 +78,7 @@ type Reconciler struct { record event.Recorder } +// Reconcile is the main logic for metric trait controller // +kubebuilder:rbac:groups=standard.oam.dev,resources=metricstraits,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=standard.oam.dev,resources=metricstraits/status,verbs=get;update;patch // +kubebuilder:rbac:groups=monitoring.coreos.com,resources=*,verbs=get;list;watch;create;update;patch;delete @@ -85,7 +86,6 @@ type Reconciler struct { // +kubebuilder:rbac:groups=core.oam.dev,resources=*,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=core.oam.dev,resources=*/status,verbs=get; // +kubebuilder:rbac:groups="",resources=events,verbs=get;list;create;update;patch - func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { ctx := context.Background() mLog := r.Log.WithValues("metricstrait", req.NamespacedName) @@ -325,6 +325,7 @@ func constructServiceMonitor(metricsTrait *v1alpha1.MetricsTrait, targetPort int } } +// SetupWithManager setup Reconciler with ctrl.Manager func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { r.record = event.NewAPIRecorder(mgr.GetEventRecorderFor("MetricsTrait")). WithAnnotations("controller", "metricsTrait") diff --git a/pkg/controller/v1alpha1/routes/ingress/api.go b/pkg/controller/v1alpha1/routes/ingress/api.go index 931db6840..cf539b376 100644 --- a/pkg/controller/v1alpha1/routes/ingress/api.go +++ b/pkg/controller/v1alpha1/routes/ingress/api.go @@ -10,18 +10,23 @@ import ( standardv1alpha1 "github.com/oam-dev/kubevela/api/v1alpha1" ) +// TypeNginx is a type of route implementation const TypeNginx = "nginx" const ( - StatusReady = "Ready" + // StatusReady represents status is ready + StatusReady = "Ready" + // StatusSynced represents status is synced, this mean the controller has reconciled but not ready StatusSynced = "Synced" ) +// RouteIngress is an interface of route ingress implementation type RouteIngress interface { Construct(routeTrait *standardv1alpha1.Route) []*v1beta1.Ingress CheckStatus(routeTrait *standardv1alpha1.Route) (string, []runtimev1alpha1.Condition) } +// GetRouteIngress will get real implementation from type, we could support more in the future. func GetRouteIngress(provider string, client client.Client) (RouteIngress, error) { var routeIngress RouteIngress switch provider { diff --git a/pkg/controller/v1alpha1/routes/ingress/nginx_ingress.go b/pkg/controller/v1alpha1/routes/ingress/nginx_ingress.go index 9b0effd81..92813ca27 100644 --- a/pkg/controller/v1alpha1/routes/ingress/nginx_ingress.go +++ b/pkg/controller/v1alpha1/routes/ingress/nginx_ingress.go @@ -20,12 +20,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +// Nginx is nginx ingress implementation type Nginx struct { Client client.Client } var _ RouteIngress = &Nginx{} +// CheckStatus will check status of the ingress func (n *Nginx) CheckStatus(routeTrait *standardv1alpha1.Route) (string, []runtimev1alpha1.Condition) { ctx := context.Background() // check issuer @@ -99,6 +101,7 @@ func (n *Nginx) CheckStatus(routeTrait *standardv1alpha1.Route) (string, []runti Reason: runtimev1alpha1.ReasonAvailable, LastTransitionTime: metav1.Now()}} } +// Construct will construct ingress from route func (*Nginx) Construct(routeTrait *standardv1alpha1.Route) []*v1beta1.Ingress { // Don't create ingress if no host set, this is used for local K8s cluster demo and the route trait will create K8s service only. diff --git a/pkg/controller/v1alpha1/routes/route_controller.go b/pkg/controller/v1alpha1/routes/route_controller.go index 798b8e509..0b6f0cef2 100644 --- a/pkg/controller/v1alpha1/routes/route_controller.go +++ b/pkg/controller/v1alpha1/routes/route_controller.go @@ -64,6 +64,7 @@ type Reconciler struct { Scheme *runtime.Scheme } +// Reconcile is the main logic of controller // +kubebuilder:rbac:groups=standard.oam.dev,resources=routes,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=standard.oam.dev,resources=routes/status,verbs=get;update;patch func (r *Reconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) { @@ -248,7 +249,7 @@ func (r *Reconciler) fillBackendByCreatedService(ctx context.Context, mLog logr. }, nil } -// Assume the workload or it's childResource will always having spec.template as PodTemplate if discoverable +// DiscoverPortsLabel assume the workload or it's childResource will always having spec.template as PodTemplate if discoverable func DiscoverPortsLabel(ctx context.Context, workload *unstructured.Unstructured, r client.Reader, dm discoverymapper.DiscoveryMapper, childResources []*unstructured.Unstructured) ([]intstr.IntOrString, map[string]string, error) { // here is the logic follows the design https://github.com/crossplane/oam-kubernetes-runtime/blob/master/design/one-pager-podspecable-workload.md#proposal @@ -309,6 +310,7 @@ func (r *Reconciler) fillBackendByCheckChildResource(mLog logr.Logger, return nil } +// SetupWithManager setup with manager func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error { r.record = event.NewAPIRecorder(mgr.GetEventRecorderFor("Route")). WithAnnotations("controller", "route") diff --git a/pkg/controller/v1alpha1/routes/util.go b/pkg/controller/v1alpha1/routes/util.go index 4f50cc630..19e0610de 100644 --- a/pkg/controller/v1alpha1/routes/util.go +++ b/pkg/controller/v1alpha1/routes/util.go @@ -7,6 +7,7 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" ) +// NeedDiscovery checks the routeTrait Spec if it's needed to automatically discover func NeedDiscovery(routeTrait *v1alpha1.Route) bool { if len(routeTrait.Spec.Rules) == 0 { return true @@ -42,6 +43,7 @@ func MatchService(targetPort intstr.IntOrString, rule v1alpha1.Rule) bool { return false } +// FillRouteTraitWithService will use existing Service or created Service to fill the spec func FillRouteTraitWithService(service *corev1.Service, routeTrait *v1alpha1.Route) { if len(routeTrait.Spec.Rules) == 0 { routeTrait.Spec.Rules = []v1alpha1.Rule{{Name: "auto-created"}} diff --git a/pkg/cue/base_template.go b/pkg/cue/base_template.go index 0cb20feb8..be02e6993 100644 --- a/pkg/cue/base_template.go +++ b/pkg/cue/base_template.go @@ -1,5 +1,6 @@ package cue +// BaseTemplate include base info provided by KubeVela for CUE template const BaseTemplate = ` context: { diff --git a/pkg/cue/convert.go b/pkg/cue/convert.go index 7a0661ce7..31cd9a70d 100644 --- a/pkg/cue/convert.go +++ b/pkg/cue/convert.go @@ -56,6 +56,7 @@ func Eval(templatePath string, value map[string]interface{}) (*unstructured.Unst return &unstructured.Unstructured{Object: obj}, nil } +// GetParameters get parameter from cue template func GetParameters(templatePath string) ([]types.Parameter, error) { r := cue.Runtime{} b, err := ioutil.ReadFile(templatePath) @@ -135,6 +136,7 @@ func getDefaultByKind(k cue.Kind) interface{} { return nil } +// GetDefault evaluate default Go value from CUE func GetDefault(val cue.Value) interface{} { switch val.Kind() { case cue.IntKind: @@ -158,12 +160,15 @@ func GetDefault(val cue.Value) interface{} { } const ( + // UsagePrefix defines the usage display for KubeVela CLI UsagePrefix = "+usage=" + // ShortPrefix defines the short argument for KubeVela CLI ShortPrefix = "+short=" // AliasPrefix is an alias of the name of a parameter element, in order to making it more friendly to Cli users AliasPrefix = "+alias=" ) +// RetrieveComments will retrieve Usage, Short and Alias from CUE Value func RetrieveComments(value cue.Value) (string, string, string) { var short, usage, alias string docs := value.Doc() diff --git a/pkg/oam/capability.go b/pkg/oam/capability.go index 1819731ef..1f65dfb97 100644 --- a/pkg/oam/capability.go +++ b/pkg/oam/capability.go @@ -94,7 +94,7 @@ func InstallCapability(client client.Client, mapper discoverymapper.DiscoveryMap if err = yaml.Unmarshal(workloadData, &wd); err != nil { return err } - wd.Namespace = types.DefaultOAMNS + wd.Namespace = types.DefaultKubeVelaNS ioStreams.Info("Installing workload capability " + wd.Name) if tp.Install != nil { tp.Source.ChartName = tp.Install.Helm.Name @@ -106,7 +106,7 @@ func InstallCapability(client client.Client, mapper discoverymapper.DiscoveryMap if err != nil { return err } - tp.CrdInfo = &types.CrdInfo{ + tp.CrdInfo = &types.CRDInfo{ APIVersion: gvk.GroupVersion().String(), Kind: gvk.Kind, } @@ -122,7 +122,7 @@ func InstallCapability(client client.Client, mapper discoverymapper.DiscoveryMap if err = yaml.Unmarshal(traitdata, &td); err != nil { return err } - td.Namespace = types.DefaultOAMNS + td.Namespace = types.DefaultKubeVelaNS ioStreams.Info("Installing trait capability " + td.Name) if tp.Install != nil { tp.Source.ChartName = tp.Install.Helm.Name @@ -134,7 +134,7 @@ func InstallCapability(client client.Client, mapper discoverymapper.DiscoveryMap if err != nil { return err } - tp.CrdInfo = &types.CrdInfo{ + tp.CrdInfo = &types.CRDInfo{ APIVersion: gvk.GroupVersion().String(), Kind: gvk.Kind, } @@ -246,9 +246,9 @@ func UninstallCap(client client.Client, cap types.Capability, ioStreams cmdutil. var obj runtime.Object switch cap.Type { case types.TypeTrait: - obj = &v1alpha2.TraitDefinition{ObjectMeta: v1.ObjectMeta{Name: cap.Name, Namespace: types.DefaultOAMNS}} + obj = &v1alpha2.TraitDefinition{ObjectMeta: v1.ObjectMeta{Name: cap.Name, Namespace: types.DefaultKubeVelaNS}} case types.TypeWorkload: - obj = &v1alpha2.WorkloadDefinition{ObjectMeta: v1.ObjectMeta{Name: cap.Name, Namespace: types.DefaultOAMNS}} + obj = &v1alpha2.WorkloadDefinition{ObjectMeta: v1.ObjectMeta{Name: cap.Name, Namespace: types.DefaultKubeVelaNS}} } if err := client.Delete(ctx, obj); err != nil { return err @@ -256,7 +256,7 @@ func UninstallCap(client client.Client, cap types.Capability, ioStreams cmdutil. if cap.Install != nil && cap.Install.Helm.Name != "" { // 2. Remove Helm chart if there is - if err := helm.Uninstall(ioStreams, cap.Install.Helm.Name, types.DefaultOAMNS, cap.Name); err != nil { + if err := helm.Uninstall(ioStreams, cap.Install.Helm.Name, types.DefaultKubeVelaNS, cap.Name); err != nil { return err } } diff --git a/pkg/plugins/capcenter.go b/pkg/plugins/capcenter.go index debefd209..721c687da 100644 --- a/pkg/plugins/capcenter.go +++ b/pkg/plugins/capcenter.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" ) +// GithubContent for cap center type GithubContent struct { Owner string `json:"owner"` Repo string `json:"repo"` @@ -29,17 +30,19 @@ type GithubContent struct { Ref string `json:"ref"` } -//CapCenterConfig is used to store cap center config in file +// CapCenterConfig is used to store cap center config in file type CapCenterConfig struct { Name string `json:"name"` Address string `json:"address"` Token string `json:"token"` } +// CenterClient defines an interface for cap center client type CenterClient interface { SyncCapabilityFromCenter() error } +// NewCenterClient create a client from type func NewCenterClient(ctx context.Context, name, address, token string) (CenterClient, error) { Type, cfg, err := Parse(address) if err != nil { @@ -52,9 +55,13 @@ func NewCenterClient(ctx context.Context, name, address, token string) (CenterCl return nil, errors.New("we only support github as repository now") } +// TypeGithub represents github const TypeGithub = "github" + +// TypeUnknown represents parse failed const TypeUnknown = "unknown" +// Parse will parse config from address func Parse(addr string) (string, *GithubContent, error) { url, err := url.Parse(addr) if err != nil { @@ -105,6 +112,7 @@ func Parse(addr string) (string, *GithubContent, error) { return TypeUnknown, nil, nil } +// RemoteCapability defines the capability discovered from remote cap center type RemoteCapability struct { // Name MUST be xxx.yaml Name string `json:"name"` @@ -114,8 +122,10 @@ type RemoteCapability struct { Type string `json:"type"` } +// RemoteCapabilities is slice of cap center type RemoteCapabilities []RemoteCapability +// LoadRepos will load all cap center repos //TODO(wonderflow): we can make default(built-in) repo configurable, then we should make default inside the answer func LoadRepos() ([]CapCenterConfig, error) { config, err := system.GetRepoConfig() @@ -136,6 +146,7 @@ func LoadRepos() ([]CapCenterConfig, error) { return repos, nil } +// StoreRepos will store cap center repo locally func StoreRepos(repos []CapCenterConfig) error { config, err := system.GetRepoConfig() if err != nil { @@ -148,6 +159,7 @@ func StoreRepos(repos []CapCenterConfig) error { return ioutil.WriteFile(config, data, 0644) } +// ParseAndSyncCapability will convert config from remote center to capability func ParseAndSyncCapability(data []byte, syncDir string) (types.Capability, error) { var obj = unstructured.Unstructured{Object: make(map[string]interface{})} err := yaml.Unmarshal(data, &obj.Object) @@ -175,6 +187,7 @@ func ParseAndSyncCapability(data []byte, syncDir string) (types.Capability, erro return types.Capability{}, fmt.Errorf("unknown definition Type %s", obj.GetKind()) } +// GithubCenter implementation of cap center type GithubCenter struct { client *github.Client cfg *GithubContent @@ -184,6 +197,7 @@ type GithubCenter struct { var _ CenterClient = &GithubCenter{} +// NewGithubCenter will create client by github center implementation func NewGithubCenter(ctx context.Context, token, centerName string, r *GithubContent) (*GithubCenter, error) { var tc *http.Client if token != "" { @@ -195,6 +209,7 @@ func NewGithubCenter(ctx context.Context, token, centerName string, r *GithubCon return &GithubCenter{client: github.NewClient(tc), cfg: r, centerName: centerName, ctx: ctx}, nil } +// SyncCapabilityFromCenter will sync capability from github cap center //TODO(wonderflow): currently we only sync by create, we also need to delete which not exist remotely. func (g *GithubCenter) SyncCapabilityFromCenter() error { _, dirs, _, err := g.client.Repositories.GetContents(g.ctx, g.cfg.Owner, g.cfg.Repo, g.cfg.Path, &github.RepositoryContentGetOptions{Ref: g.cfg.Ref}) diff --git a/pkg/plugins/cluster.go b/pkg/plugins/cluster.go index 714343187..987f647d4 100644 --- a/pkg/plugins/cluster.go +++ b/pkg/plugins/cluster.go @@ -27,8 +27,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +// nolint const DescriptionUndefined = "description not defined" +// GetCapabilitiesFromCluster will get capability from K8s cluster func GetCapabilitiesFromCluster(ctx context.Context, namespace string, c types.Args, syncDir string, selector labels.Selector) ([]types.Capability, error) { workloads, _, err := GetWorkloadsFromCluster(ctx, namespace, c, syncDir, selector) if err != nil { @@ -42,6 +44,7 @@ func GetCapabilitiesFromCluster(ctx context.Context, namespace string, c types.A return workloads, nil } +// GetWorkloadsFromCluster will get capability from K8s cluster func GetWorkloadsFromCluster(ctx context.Context, namespace string, c types.Args, syncDir string, selector labels.Selector) ([]types.Capability, []error, error) { newClient, err := client.New(c.Config, client.Options{Scheme: c.Schema}) if err != nil { @@ -77,7 +80,7 @@ func GetWorkloadsFromCluster(ctx context.Context, namespace string, c types.Args if err != nil { return nil, nil, fmt.Errorf("make sure you have installed CRD(controller) for this capability '%s': %v ", wd.Name, err) } - tmp.CrdInfo = &types.CrdInfo{ + tmp.CrdInfo = &types.CRDInfo{ APIVersion: gvk.GroupVersion().String(), Kind: gvk.Kind, } @@ -86,6 +89,7 @@ func GetWorkloadsFromCluster(ctx context.Context, namespace string, c types.Args return templates, templateErrors, nil } +// GetTraitsFromCluster will get capability from K8s cluster func GetTraitsFromCluster(ctx context.Context, namespace string, c types.Args, syncDir string, selector labels.Selector) ([]types.Capability, []error, error) { newClient, err := client.New(c.Config, client.Options{Scheme: c.Schema}) if err != nil { @@ -120,7 +124,7 @@ func GetTraitsFromCluster(ctx context.Context, namespace string, c types.Args, s if err != nil { return nil, nil, fmt.Errorf("make sure you have installed CRD(controller) for this capability '%s': %v ", td.Name, err) } - tmp.CrdInfo = &types.CrdInfo{ + tmp.CrdInfo = &types.CRDInfo{ APIVersion: gvk.GroupVersion().String(), Kind: gvk.Kind, } @@ -129,6 +133,7 @@ func GetTraitsFromCluster(ctx context.Context, namespace string, c types.Args, s return templates, templateErrors, nil } +// HandleDefinition will handle definition to capability func HandleDefinition(name, syncDir, crdName string, annotation map[string]string, extension *runtime.RawExtension, tp types.CapType, applyTo []string) (types.Capability, error) { var tmp types.Capability tmp, err := HandleTemplate(extension, name, syncDir) @@ -144,6 +149,7 @@ func HandleDefinition(name, syncDir, crdName string, annotation map[string]strin return tmp, nil } +// GetDescription get description from annotation func GetDescription(annotation map[string]string) string { if annotation == nil { return DescriptionUndefined @@ -155,6 +161,7 @@ func GetDescription(annotation map[string]string) string { return desc } +// HandleTemplate will handle definition template to capability func HandleTemplate(in *runtime.RawExtension, name, syncDir string) (types.Capability, error) { tmp, err := types.ConvertTemplateJSON2Object(in) if err != nil { diff --git a/pkg/plugins/cluster_test.go b/pkg/plugins/cluster_test.go index 360e3f22b..795fc3b0e 100644 --- a/pkg/plugins/cluster_test.go +++ b/pkg/plugins/cluster_test.go @@ -29,7 +29,7 @@ var _ = Describe("DefinitionFiles", func() { }, Description: "description not defined", CrdName: "routes.standard.oam.dev", - CrdInfo: &types.CrdInfo{ + CrdInfo: &types.CRDInfo{ APIVersion: "standard.oam.dev/v1alpha1", Kind: "Route", }, @@ -61,7 +61,7 @@ var _ = Describe("DefinitionFiles", func() { Usage: "Which port do you want customer traffic sent to", }, }, - CrdInfo: &types.CrdInfo{ + CrdInfo: &types.CRDInfo{ APIVersion: "apps/v1", Kind: "Deployment", }, @@ -88,7 +88,7 @@ var _ = Describe("DefinitionFiles", func() { Usage: "Which port do you want customer traffic sent to", }}, CrdName: "deployments.apps", - CrdInfo: &types.CrdInfo{ + CrdInfo: &types.CRDInfo{ APIVersion: "apps/v1", Kind: "Deployment", }, diff --git a/pkg/plugins/local.go b/pkg/plugins/local.go index bd59e3b0e..5869f4e42 100644 --- a/pkg/plugins/local.go +++ b/pkg/plugins/local.go @@ -13,6 +13,7 @@ import ( "github.com/oam-dev/kubevela/pkg/utils/system" ) +// LoadCapabilityByName will load capability from local by name func LoadCapabilityByName(name string) (types.Capability, error) { caps, err := LoadAllInstalledCapability() if err != nil { @@ -26,6 +27,7 @@ func LoadCapabilityByName(name string) (types.Capability, error) { return types.Capability{}, fmt.Errorf("%s not found", name) } +// LoadAllInstalledCapability will list all capability func LoadAllInstalledCapability() ([]types.Capability, error) { workloads, err := LoadInstalledCapabilityWithType(types.TypeWorkload) if err != nil { @@ -39,11 +41,13 @@ func LoadAllInstalledCapability() ([]types.Capability, error) { return workloads, nil } +// LoadInstalledCapabilityWithType will load cap list by type func LoadInstalledCapabilityWithType(capT types.CapType) ([]types.Capability, error) { dir, _ := system.GetCapabilityDir() return loadInstalledCapabilityWithType(dir, capT) } +// GetInstalledCapabilityWithCapAlias will get cap by alias func GetInstalledCapabilityWithCapAlias(capT types.CapType, capAlias string) (types.Capability, error) { dir, _ := system.GetCapabilityDir() return loadInstalledCapabilityWithCapAlias(dir, capT, capAlias) @@ -109,6 +113,7 @@ func loadInstalledCapability(dir string, capAlias string) ([]types.Capability, e return tmps, nil } +// GetSubDir will get dir for capability func GetSubDir(dir string, capT types.CapType) string { switch capT { case types.TypeWorkload: @@ -119,6 +124,7 @@ func GetSubDir(dir string, capT types.CapType) string { return dir } +// SinkTemp2Local will sink template to local file func SinkTemp2Local(templates []types.Capability, dir string) int { success := 0 for _, tmp := range templates { @@ -174,6 +180,7 @@ func RemoveLegacyTemps(retainedTemps []types.Capability, dir string) int { return success } +// LoadCapabilityFromSyncedCenter will load capability from dir func LoadCapabilityFromSyncedCenter(dir string) ([]types.Capability, error) { var tmps []types.Capability files, err := ioutil.ReadDir(dir) diff --git a/pkg/server/api-server.go b/pkg/server/api-server.go index 0677b5682..e43f0af71 100644 --- a/pkg/server/api-server.go +++ b/pkg/server/api-server.go @@ -12,12 +12,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" ) +// APIServer run a restful API server for dashboard type APIServer struct { server *http.Server KubeClient client.Client dm discoverymapper.DiscoveryMapper } +// New will create APIServer func New(c types.Args, port, staticPath string) (*APIServer, error) { newClient, err := client.New(c.Config, client.Options{Scheme: c.Schema}) if err != nil { @@ -42,6 +44,7 @@ func New(c types.Args, port, staticPath string) (*APIServer, error) { return s, nil } +// Launch will start the apiserver func (s *APIServer) Launch(errChan chan<- error) { go func() { err := s.server.ListenAndServe() @@ -51,6 +54,7 @@ func (s *APIServer) Launch(errChan chan<- error) { }() } +// Shutdown will close the apiserver func (s *APIServer) Shutdown(ctx context.Context) error { ctrl.Log.Info("sever shutting down") return s.server.Shutdown(ctx) diff --git a/pkg/server/apis/types.go b/pkg/server/apis/types.go index c7c6dae6f..9004bff36 100644 --- a/pkg/server/apis/types.go +++ b/pkg/server/apis/types.go @@ -7,6 +7,7 @@ import ( "github.com/oam-dev/kubevela/api/types" ) +// Environment contains all info needed in `vela env` command type Environment struct { EnvName string `json:"envName" binding:"required,min=1,max=32"` Namespace string `json:"namespace" binding:"required,min=1,max=32"` @@ -15,27 +16,24 @@ type Environment struct { Current string `json:"current,omitempty"` } +// EnvironmentBody used for restful API in dashboard server type EnvironmentBody struct { Namespace string `json:"namespace" binding:"required,min=1,max=32"` } -type AppConfig struct { - AppConfigName string `json:"appName" binding:"required,max=64"` - Definition runtime.RawExtension `json:"definition" binding:"required"` - DefinitionType string `json:"definitionType" binding:"required,max=32"` - DefinitionName string `json:"definitionName" binding:"required,max=64"` -} - +// Response used for restful API response in dashboard server type Response struct { Code int `json:"code"` Data interface{} `json:"data"` } +// CommonFlag used for restful API flags in dashboard server type CommonFlag struct { Name string `json:"name"` Value string `json:"value"` } +// WorkloadRunBody used for restful API arguments for run workload for dashboard restful API server type WorkloadRunBody struct { EnvName string `json:"envName"` WorkloadType string `json:"workloadType"` @@ -46,19 +44,21 @@ type WorkloadRunBody struct { Traits []TraitBody `json:"traits,omitempty"` } +// WorkloadMeta store workload metadata for dashboard restful API server type WorkloadMeta struct { Name string `json:"name"` Parameters []types.Parameter `json:"parameters,omitempty"` AppliesTo []string `json:"appliesTo,omitempty"` } +// TraitMeta store trait metadata for dashboard restful API server type TraitMeta struct { Name string `json:"name"` Description string `json:"description,omitempty"` AppliesTo []string `json:"appliesTo,omitempty"` } -//used to present trait which is to be attached and, of which parameters are set +// TraitBody used to present trait which is to be attached and, of which parameters are set type TraitBody struct { EnvName string `json:"envName"` Name string `json:"name"` @@ -68,6 +68,7 @@ type TraitBody struct { Staging string `json:"staging,omitempty"` } +// ComponentMeta store component info for dashboard restful API server type ComponentMeta struct { Name string `json:"name"` Status string `json:"status,omitempty"` @@ -83,6 +84,7 @@ type ComponentMeta struct { Component corev1alpha2.Component `json:"-"` } +// ApplicationMeta used for dashboard restful API server type ApplicationMeta struct { Name string `json:"name"` Status string `json:"status,omitempty"` @@ -90,11 +92,13 @@ type ApplicationMeta struct { CreatedTime string `json:"createdTime,omitempty"` } +// CapabilityMeta used for dashboard restful API server type CapabilityMeta struct { CapabilityName string `json:"capabilityName"` CapabilityCenterName string `json:"capabilityCenterName,omitempty"` } +// CapabilityCenterMeta used for dashboard restful API server type CapabilityCenterMeta struct { Name string `json:"name"` URL string `json:"url"` diff --git a/pkg/server/util/api.go b/pkg/server/util/api.go index bbed3051a..b7f0d8527 100644 --- a/pkg/server/util/api.go +++ b/pkg/server/util/api.go @@ -1,3 +1,4 @@ +//nolint:golint package util import ( diff --git a/pkg/server/util/errors.go b/pkg/server/util/errors.go index e94d37ce6..b2645ef41 100644 --- a/pkg/server/util/errors.go +++ b/pkg/server/util/errors.go @@ -67,13 +67,14 @@ func ConstructError(ec Code, a ...interface{}) error { return errors.New(msg) } -// - use setErrorAndAbort to abort the rest of the handlers, mostly called in middleware +// SetErrorAndAbort is used to abort the rest of the handlers, mostly called in middleware func SetErrorAndAbort(c *gin.Context, code Code, msg ...interface{}) { // Calling abort so no handlers and middlewares will be executed. c.AbortWithStatusJSON(code.StatusCode(), gin.H{"error": ConstructError(code, msg...).Error()}) } +// HandleError will handle error func HandleError(c *gin.Context, code Code, msg ...interface{}) { err := ConstructError(code, msg...) AssembleResponse(c, nil, err) diff --git a/pkg/server/util/middleware.go b/pkg/server/util/middleware.go index 08da80658..3b90dd3b0 100644 --- a/pkg/server/util/middleware.go +++ b/pkg/server/util/middleware.go @@ -1,3 +1,4 @@ +//nolint:golint package util import ( diff --git a/pkg/server/workloadHandler.go b/pkg/server/workloadHandler.go index 71815d20f..c04dfd880 100644 --- a/pkg/server/workloadHandler.go +++ b/pkg/server/workloadHandler.go @@ -1,3 +1,4 @@ +//nolint: golint package server import ( diff --git a/pkg/utils/common/common.go b/pkg/utils/common/common.go index 291b53c7d..ec8128410 100644 --- a/pkg/utils/common/common.go +++ b/pkg/utils/common/common.go @@ -15,6 +15,7 @@ import ( ) var ( + // Scheme defines the default KubeVela schema Scheme = k8sruntime.NewScheme() ) @@ -26,6 +27,7 @@ func init() { // +kubebuilder:scaffold:scheme } +// InitBaseRestConfig will return reset config for create controller runtime client func InitBaseRestConfig() (types.Args, error) { restConf, err := config.GetConfig() if err != nil { diff --git a/pkg/utils/config/config.go b/pkg/utils/config/config.go index cc2b6879f..adbc39dd3 100644 --- a/pkg/utils/config/config.go +++ b/pkg/utils/config/config.go @@ -11,6 +11,7 @@ import ( "github.com/oam-dev/kubevela/pkg/utils/env" ) +// ReadConfigLine will read config from line func ReadConfigLine(line string) (string, string, error) { ss := strings.SplitN(line, ":", 2) if len(ss) != 2 { @@ -26,12 +27,14 @@ func ReadConfigLine(line string) (string, string, error) { return ss[0], string(vDec), nil } +// GetConfigsDir will get config from dir func GetConfigsDir(envName string) (string, error) { cfgDir := filepath.Join(env.GetEnvDirByName(envName), "configs") err := os.MkdirAll(cfgDir, 0700) return cfgDir, err } +// DeleteConfig will delete local config file func DeleteConfig(envName, configName string) error { d, err := GetConfigsDir(envName) if err != nil { @@ -41,6 +44,7 @@ func DeleteConfig(envName, configName string) error { return os.RemoveAll(cfgFile) } +// ReadConfig will read the config data from local func ReadConfig(envName, configName string) ([]byte, error) { d, err := GetConfigsDir(envName) if err != nil { @@ -54,6 +58,7 @@ func ReadConfig(envName, configName string) ([]byte, error) { return b, err } +// WriteConfig will write data into local config func WriteConfig(envName, configName string, data []byte) error { d, err := GetConfigsDir(envName) if err != nil { diff --git a/pkg/utils/env/env.go b/pkg/utils/env/env.go index 7fd5d1ced..7cc22fdf8 100644 --- a/pkg/utils/env/env.go +++ b/pkg/utils/env/env.go @@ -15,6 +15,7 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/oam-dev/kubevela/api/types" @@ -24,11 +25,13 @@ import ( // ProductionACMEServer is the production ACME Server from let's encrypt const ProductionACMEServer = "https://acme-v02.api.letsencrypt.org/directory" +// GetEnvDirByName will get env dir from name func GetEnvDirByName(name string) string { envdir, _ := system.GetEnvDir() return filepath.Join(envdir, name) } +// GetEnvByName will get env info by name func GetEnvByName(name string) (*types.EnvMeta, error) { data, err := ioutil.ReadFile(filepath.Join(GetEnvDirByName(name), system.EnvConfigName)) if err != nil { @@ -44,9 +47,9 @@ func GetEnvByName(name string) (*types.EnvMeta, error) { return &meta, nil } -//Create or update env. -//If it does not exist, create it and set to the new env. -//If it exists, update it and set to the new env. +// CreateOrUpdateEnv will create or update env. +// If it does not exist, create it and set to the new env. +// If it exists, update it and set to the new env. func CreateOrUpdateEnv(ctx context.Context, c client.Client, envName string, envArgs *types.EnvMeta) (string, error) { createOrUpdated := "created" @@ -92,7 +95,7 @@ func CreateOrUpdateEnv(ctx context.Context, c client.Client, envName string, env }, Solvers: []acmev1.ACMEChallengeSolver{{ HTTP01: &acmev1.ACMEChallengeSolverHTTP01{ - Ingress: &acmev1.ACMEChallengeSolverHTTP01Ingress{Class: GetStringPointer("nginx")}, + Ingress: &acmev1.ACMEChallengeSolverHTTP01Ingress{Class: pointer.StringPtr("nginx")}, }, }}, }, @@ -134,10 +137,6 @@ func CreateOrUpdateEnv(ctx context.Context, c client.Client, envName string, env return message, nil } -func GetStringPointer(v string) *string { - return &v -} - // CreateEnv will only create. If env already exists, return error func CreateEnv(ctx context.Context, c client.Client, envName string, envArgs *types.EnvMeta) (string, error) { _, err := GetEnvByName(envName) @@ -148,7 +147,7 @@ func CreateEnv(ctx context.Context, c client.Client, envName string, envArgs *ty return CreateOrUpdateEnv(ctx, c, envName, envArgs) } -//Update Env, if env does not exist, return error +// UpdateEnv will update Env, if env does not exist, return error func UpdateEnv(ctx context.Context, c client.Client, envName string, namespace string) (string, error) { var message = "" envMeta, err := GetEnvByName(envName) @@ -175,6 +174,7 @@ func UpdateEnv(ctx context.Context, c client.Client, envName string, namespace s return message, err } +// ListEnvs will list all envs func ListEnvs(envName string) ([]*types.EnvMeta, error) { var envList []*types.EnvMeta if envName != "" { @@ -220,6 +220,7 @@ func ListEnvs(envName string) ([]*types.EnvMeta, error) { return envList, nil } +// GetCurrentEnvName will get current env name func GetCurrentEnvName() (string, error) { currentEnvPath, err := system.GetCurrentEnvPath() if err != nil { @@ -232,6 +233,7 @@ func GetCurrentEnvName() (string, error) { return string(data), nil } +// DeleteEnv will delete env locally func DeleteEnv(envName string) (string, error) { var message string var err error @@ -261,6 +263,7 @@ func DeleteEnv(envName string) (string, error) { return message, err } +// SetEnv will set the current env to the specified one func SetEnv(envName string) (string, error) { var msg string currentEnvPath, err := system.GetCurrentEnvPath() diff --git a/pkg/utils/helm/helm.go b/pkg/utils/helm/helm.go index 79bb986f6..691bc60e6 100644 --- a/pkg/utils/helm/helm.go +++ b/pkg/utils/helm/helm.go @@ -23,12 +23,14 @@ import ( cmdutil "github.com/oam-dev/kubevela/pkg/commands/util" ) +// VelaDebugLog defines an ENV to set vela helm install log to be debug const VelaDebugLog = "VELA_DEBUG" var ( settings = cli.New() ) +// Install will install helm chart func Install(ioStreams cmdutil.IOStreams, repoName, repoURL, chartName, version, namespace, releaseName string, vals map[string]interface{}) error { @@ -79,6 +81,7 @@ func Install(ioStreams cmdutil.IOStreams, repoName, repoURL, chartName, version, return nil } +// Uninstall will uninstall helm chart func Uninstall(ioStreams cmdutil.IOStreams, chartName, namespace, releaseName string) error { if !IsHelmReleaseRunning(releaseName, chartName, namespace, ioStreams) { return nil @@ -95,10 +98,11 @@ func Uninstall(ioStreams cmdutil.IOStreams, chartName, namespace, releaseName st return nil } +// NewHelmInstall will create a install client for helm install func NewHelmInstall(version, namespace, releaseName string) (*action.Install, error) { actionConfig := new(action.Configuration) if len(namespace) == 0 { - namespace = types.DefaultOAMNS + namespace = types.DefaultKubeVelaNS } if err := actionConfig.Init( cmdutil.NewRestConfigGetter(namespace), @@ -117,11 +121,12 @@ func NewHelmInstall(version, namespace, releaseName string) (*action.Install, er if len(version) > 0 { client.Version = version } else { - client.Version = types.DefaultOAMVersion + client.Version = types.DefaultKubeVelaVersion } return client, nil } +// NewHelmUninstall will create a helm uninstall client func NewHelmUninstall(namespace string) (*action.Uninstall, error) { actionConfig := new(action.Configuration) @@ -136,6 +141,7 @@ func NewHelmUninstall(namespace string) (*action.Uninstall, error) { return action.NewUninstall(actionConfig), nil } +// IsHelmRepositoryExist will check help repo exists func IsHelmRepositoryExist(name, url string) bool { repos := GetHelmRepositoryList() for _, repo := range repos { @@ -146,6 +152,7 @@ func IsHelmRepositoryExist(name, url string) bool { return false } +// GetHelmRepositoryList get the helm repo list from default setting func GetHelmRepositoryList() []*repo.Entry { f, err := repo.LoadFile(settings.RepositoryConfig) if err == nil && len(f.Repositories) > 0 { @@ -153,6 +160,7 @@ func GetHelmRepositoryList() []*repo.Entry { } return nil } + func debug(format string, v ...interface{}) { if settings.Debug { format = fmt.Sprintf("[debug] %s\n", format) @@ -160,6 +168,7 @@ func debug(format string, v ...interface{}) { } } +// AddHelmRepository add helm repo func AddHelmRepository(name, url, username, password, certFile, keyFile, caFile string, insecureSkipTLSverify bool, out io.Writer) error { var f repo.File c := repo.Entry{ @@ -191,6 +200,7 @@ func AddHelmRepository(name, url, username, password, certFile, keyFile, caFile return nil } +// IsHelmReleaseRunning check helm release running func IsHelmReleaseRunning(releaseName, chartName, ns string, streams cmdutil.IOStreams) bool { releases, err := GetHelmRelease(ns) if err != nil { @@ -205,6 +215,7 @@ func IsHelmReleaseRunning(releaseName, chartName, ns string, streams cmdutil.IOS return false } +// GetHelmRelease will get helm release func GetHelmRelease(ns string) ([]*release.Release, error) { actionConfig := new(action.Configuration) client := action.NewList(actionConfig) @@ -220,6 +231,7 @@ func GetHelmRelease(ns string) ([]*release.Release, error) { return results, nil } +// GetChart will locate chart func GetChart(client *action.Install, name string) (*chart.Chart, error) { if os.Getenv(VelaDebugLog) != "" { settings.Debug = true @@ -237,6 +249,7 @@ func GetChart(client *action.Install, name string) (*chart.Chart, error) { return chartRequested, nil } +// InstallHelmChart will install helm chart from types.Chart func InstallHelmChart(ioStreams cmdutil.IOStreams, c types.Chart) error { return Install(ioStreams, c.Repo, c.URL, c.Name, c.Version, c.Namespace, c.Name, c.Values) } diff --git a/pkg/utils/system/system.go b/pkg/utils/system/system.go index 49ffa8908..8b774604d 100644 --- a/pkg/utils/system/system.go +++ b/pkg/utils/system/system.go @@ -10,8 +10,11 @@ import ( ) const defaultVelaHome = ".vela" + +// VelaHomeEnv defines vela home system env const VelaHomeEnv = "VELA_HOME" +// GetVelaHomeDir return vela home dir func GetVelaHomeDir() (string, error) { if custom := os.Getenv(VelaHomeEnv); custom != "" { return custom, nil @@ -23,6 +26,7 @@ func GetVelaHomeDir() (string, error) { return filepath.Join(home, defaultVelaHome), nil } +// GetDefaultFrontendDir return default vela frontend dir func GetDefaultFrontendDir() (string, error) { home, err := GetVelaHomeDir() if err != nil { @@ -31,6 +35,7 @@ func GetDefaultFrontendDir() (string, error) { return filepath.Join(home, "frontend"), nil } +// GetCapCenterDir return cap center dir func GetCapCenterDir() (string, error) { home, err := GetVelaHomeDir() if err != nil { @@ -39,6 +44,7 @@ func GetCapCenterDir() (string, error) { return filepath.Join(home, "centers"), nil } +// GetRepoConfig return repo config func GetRepoConfig() (string, error) { home, err := GetCapCenterDir() if err != nil { @@ -47,6 +53,7 @@ func GetRepoConfig() (string, error) { return filepath.Join(home, "config.yaml"), nil } +// GetCapabilityDir return capability dirs including workloads and traits func GetCapabilityDir() (string, error) { home, err := GetVelaHomeDir() if err != nil { @@ -55,6 +62,7 @@ func GetCapabilityDir() (string, error) { return filepath.Join(home, "capabilities"), nil } +// GetEnvDir return KubeVela environments dir func GetEnvDir() (string, error) { homedir, err := GetVelaHomeDir() if err != nil { @@ -63,6 +71,7 @@ func GetEnvDir() (string, error) { return filepath.Join(homedir, "envs"), nil } +// GetCurrentEnvPath return current env config func GetCurrentEnvPath() (string, error) { homedir, err := GetVelaHomeDir() if err != nil { @@ -71,6 +80,7 @@ func GetCurrentEnvPath() (string, error) { return filepath.Join(homedir, "curenv"), nil } +// InitDirs create dir if not exits func InitDirs() error { if err := InitCapabilityDir(); err != nil { return err @@ -84,6 +94,7 @@ func InitDirs() error { return nil } +// InitCapCenterDir create dir if not exits func InitCapCenterDir() error { home, err := GetCapCenterDir() if err != nil { @@ -93,6 +104,7 @@ func InitCapCenterDir() error { return err } +// InitCapabilityDir create dir if not exits func InitCapabilityDir() error { dir, err := GetCapabilityDir() if err != nil { @@ -102,8 +114,10 @@ func InitCapabilityDir() error { return err } +// EnvConfigName defines config const EnvConfigName = "config.json" +// InitDefaultEnv create dir if not exits func InitDefaultEnv() error { envDir, err := GetEnvDir() if err != nil { @@ -131,6 +145,7 @@ func InitDefaultEnv() error { return nil } +// CreateIfNotExist create dir if not exist func CreateIfNotExist(dir string) (bool, error) { _, err := os.Stat(dir) if err != nil { diff --git a/pkg/webhook/podspecworkload/mutating_handler.go b/pkg/webhook/podspecworkload/mutating_handler.go index d3f3f62fe..93db4a519 100644 --- a/pkg/webhook/podspecworkload/mutating_handler.go +++ b/pkg/webhook/podspecworkload/mutating_handler.go @@ -66,7 +66,7 @@ func (h *MutatingHandler) Handle(ctx context.Context, req admission.Request) adm return resp } -// Default sets all the default value for the PodSpecWorkload +// DefaultPodSpecWorkload will set the default value for the PodSpecWorkload func DefaultPodSpecWorkload(obj *v1alpha1.PodSpecWorkload) { mutatelog.Info("default", "name", obj.Name) if obj.Spec.Replicas == nil {