2021-07-13 13:03:25 +08:00
/ *
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"
2022-01-07 15:49:27 +08:00
"os"
2022-01-11 11:29:10 +08:00
"path/filepath"
2021-08-11 11:49:44 +08:00
"strings"
2021-07-13 13:03:25 +08:00
"time"
2022-01-11 11:29:10 +08:00
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1alpha2"
"github.com/oam-dev/kubevela/pkg/oam"
2021-12-09 20:31:19 +08:00
"k8s.io/client-go/rest"
2021-07-13 13:03:25 +08:00
"github.com/gosuri/uitable"
2022-01-07 15:49:27 +08:00
"github.com/olekukonko/tablewriter"
2021-12-07 15:11:52 +08:00
2021-07-13 13:03:25 +08:00
"github.com/pkg/errors"
"github.com/spf13/cobra"
types2 "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
2021-11-25 14:08:20 +08:00
common2 "github.com/oam-dev/kubevela/apis/core.oam.dev/common"
2021-07-13 13:03:25 +08:00
"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
"github.com/oam-dev/kubevela/apis/types"
2021-12-07 15:11:52 +08:00
pkgaddon "github.com/oam-dev/kubevela/pkg/addon"
2021-07-13 13:03:25 +08:00
"github.com/oam-dev/kubevela/pkg/utils/apply"
"github.com/oam-dev/kubevela/pkg/utils/common"
cmdutil "github.com/oam-dev/kubevela/pkg/utils/util"
)
const (
// DescAnnotation records the description of addon
DescAnnotation = "addons.oam.dev/description"
2021-11-16 13:56:39 +08:00
// DependsOnWorkFlowStepName is workflow step name which is used to check dependsOn app
DependsOnWorkFlowStepName = "depends-on-app"
2021-11-25 10:32:30 +08:00
// AddonTerraformProviderNamespace is the namespace of addon terraform provider
AddonTerraformProviderNamespace = "default"
// AddonTerraformProviderNameArgument is the argument name of addon terraform provider
AddonTerraformProviderNameArgument = "providerName"
2021-07-13 13:03:25 +08:00
)
2021-12-16 11:12:06 +08:00
const (
2021-12-25 11:01:59 +08:00
statusEnabled = "enabled"
statusDisabled = "disabled"
2021-12-16 11:12:06 +08:00
)
2021-07-13 13:03:25 +08:00
// NewAddonCommand create `addon` command
2022-01-06 13:29:02 +08:00
func NewAddonCommand ( c common . Args , order string , ioStreams cmdutil . IOStreams ) * cobra . Command {
2021-07-13 13:03:25 +08:00
cmd := & cobra . Command {
Use : "addon" ,
2022-01-10 17:45:20 +08:00
Short : "Manage addons for extension." ,
Long : "Manage addons for extension." ,
2021-07-13 13:03:25 +08:00
Annotations : map [ string ] string {
2022-01-06 13:29:02 +08:00
types . TagCommandOrder : order ,
types . TagCommandType : types . TypeExtension ,
2021-07-13 13:03:25 +08:00
} ,
}
cmd . AddCommand (
2022-01-07 15:49:27 +08:00
NewAddonListCommand ( c ) ,
2021-11-25 10:32:30 +08:00
NewAddonEnableCommand ( c , ioStreams ) ,
2022-01-07 15:49:27 +08:00
NewAddonDisableCommand ( c , ioStreams ) ,
2021-12-25 11:01:59 +08:00
NewAddonStatusCommand ( c , ioStreams ) ,
2021-12-13 19:47:32 +08:00
NewAddonRegistryCommand ( c , ioStreams ) ,
2021-12-22 19:31:20 +08:00
NewAddonUpgradeCommand ( c , ioStreams ) ,
2021-07-13 13:03:25 +08:00
)
return cmd
}
// NewAddonListCommand create addon list command
2022-01-07 15:49:27 +08:00
func NewAddonListCommand ( c common . Args ) * cobra . Command {
2021-07-13 13:03:25 +08:00
return & cobra . Command {
2021-10-14 18:21:49 +08:00
Use : "list" ,
Aliases : [ ] string { "ls" } ,
Short : "List addons" ,
Long : "List addons in KubeVela" ,
2021-07-13 13:03:25 +08:00
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2022-01-11 11:29:10 +08:00
k8sClient , err := c . GetClient ( )
2022-01-07 15:49:27 +08:00
if err != nil {
return err
}
2022-01-11 11:29:10 +08:00
err = listAddons ( context . Background ( ) , k8sClient , "" )
2021-07-13 13:03:25 +08:00
if err != nil {
return err
}
return nil
} ,
}
}
// NewAddonEnableCommand create addon enable command
2021-11-25 10:32:30 +08:00
func NewAddonEnableCommand ( c common . Args , ioStream cmdutil . IOStreams ) * cobra . Command {
ctx := context . Background ( )
2022-01-11 11:29:10 +08:00
cmd := & cobra . Command {
2021-07-13 13:03:25 +08:00
Use : "enable" ,
Short : "enable an addon" ,
2022-01-12 17:43:08 +08:00
Long : "enable an addon in cluster." ,
2021-07-13 13:03:25 +08:00
Example : "vela addon enable <addon-name>" ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
2021-11-25 10:32:30 +08:00
2021-07-13 13:03:25 +08:00
if len ( args ) < 1 {
2021-08-18 11:37:46 +08:00
return fmt . Errorf ( "must specify addon name" )
2021-07-13 13:03:25 +08:00
}
2021-08-11 11:49:44 +08:00
addonArgs , err := parseToMap ( args [ 1 : ] )
if err != nil {
return err
}
2022-01-07 15:49:27 +08:00
config , err := c . GetConfig ( )
if err != nil {
return err
}
k8sClient , err := c . GetClient ( )
if err != nil {
return err
}
2022-01-11 11:29:10 +08:00
addonOrDir := args [ 0 ]
2022-01-12 17:43:08 +08:00
var name = addonOrDir
2022-01-11 11:29:10 +08:00
if _ , err := os . Stat ( addonOrDir ) ; err == nil {
// args[0] is a local path install with local dir, use base dir name as addonName
2022-01-12 17:43:08 +08:00
name = filepath . Base ( addonOrDir )
2022-01-11 11:29:10 +08:00
err = enableAddonByLocal ( ctx , name , addonOrDir , k8sClient , config , addonArgs )
if err != nil {
return err
}
} else {
2022-01-12 17:43:08 +08:00
err = enableAddon ( ctx , k8sClient , config , name , addonArgs )
2022-01-11 11:29:10 +08:00
if err != nil {
return err
}
2021-07-13 13:03:25 +08:00
}
2022-01-12 17:43:08 +08:00
fmt . Printf ( "Addon: %s enabled Successfully.\n" , name )
AdditionalEndpointPrinter ( ctx , c , k8sClient , name )
2021-12-22 19:31:20 +08:00
return nil
} ,
}
2022-01-11 11:29:10 +08:00
return cmd
2021-12-22 19:31:20 +08:00
}
2022-01-12 17:43:08 +08:00
// AdditionalEndpointPrinter will print endpoints
func AdditionalEndpointPrinter ( ctx context . Context , c common . Args , k8sClient client . Client , name string ) {
endpoints , _ := GetServiceEndpoints ( ctx , k8sClient , pkgaddon . Convert2AppName ( name ) , types . DefaultKubeVelaNS , c )
if len ( endpoints ) > 0 {
table := tablewriter . NewWriter ( os . Stdout )
table . SetColWidth ( 100 )
table . SetHeader ( [ ] string { "Cluster" , "Ref(Kind/Namespace/Name)" , "Endpoint" } )
for _ , endpoint := range endpoints {
table . Append ( [ ] string { endpoint . Cluster , fmt . Sprintf ( "%s/%s/%s" , endpoint . Ref . Kind , endpoint . Ref . Namespace , endpoint . Ref . Name ) , endpoint . String ( ) } )
}
fmt . Printf ( "Please access the %s from the following endpoints:\n" , name )
table . Render ( )
return
}
if name == "velaux" {
fmt . Println ( ` Please use command: "vela port-forward -n vela-system addon-velaux 9082:80" and Select "Cluster: local | Namespace: vela-system | Component: velaux | Kind: Service" to check the dashboard. ` )
}
}
2021-12-22 19:31:20 +08:00
// NewAddonUpgradeCommand create addon upgrade command
func NewAddonUpgradeCommand ( c common . Args , ioStream cmdutil . IOStreams ) * cobra . Command {
ctx := context . Background ( )
2022-01-11 11:29:10 +08:00
cmd := & cobra . Command {
2021-12-22 19:31:20 +08:00
Use : "upgrade" ,
Short : "upgrade an addon" ,
2022-01-12 17:43:08 +08:00
Long : "upgrade an addon in cluster." ,
2021-12-22 19:31:20 +08:00
Example : "vela addon upgrade <addon-name>" ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
if len ( args ) < 1 {
return fmt . Errorf ( "must specify addon name" )
}
2022-01-07 15:49:27 +08:00
config , err := c . GetConfig ( )
if err != nil {
return err
}
k8sClient , err := c . GetClient ( )
if err != nil {
return err
}
2021-12-22 19:31:20 +08:00
addonArgs , err := parseToMap ( args [ 1 : ] )
if err != nil {
return err
}
2022-01-11 11:29:10 +08:00
addonOrDir := args [ 0 ]
var name string
if _ , err := os . Stat ( addonOrDir ) ; err == nil {
// args[0] is a local path install with local dir
name := filepath . Base ( addonOrDir )
_ , err = pkgaddon . FetchAddonRelatedApp ( context . Background ( ) , k8sClient , name )
if err != nil {
return errors . Wrapf ( err , "cannot fetch addon related addon %s" , name )
}
err = enableAddonByLocal ( ctx , name , addonOrDir , k8sClient , config , addonArgs )
if err != nil {
return err
}
} else {
_ , err = pkgaddon . FetchAddonRelatedApp ( context . Background ( ) , k8sClient , addonOrDir )
if err != nil {
return errors . Wrapf ( err , "cannot fetch addon related addon %s" , addonOrDir )
}
err = enableAddon ( ctx , k8sClient , config , addonOrDir , addonArgs )
if err != nil {
return err
}
2021-12-22 19:31:20 +08:00
}
2022-01-11 11:29:10 +08:00
2022-01-12 17:43:08 +08:00
fmt . Printf ( "Addon: %s\n enabled Successfully." , name )
AdditionalEndpointPrinter ( ctx , c , k8sClient , name )
2021-07-13 13:03:25 +08:00
return nil
} ,
}
2022-01-11 11:29:10 +08:00
return cmd
2021-07-13 13:03:25 +08:00
}
2021-12-07 15:11:52 +08:00
func parseToMap ( args [ ] string ) ( map [ string ] interface { } , error ) {
res := map [ string ] interface { } { }
2021-08-11 11:49:44 +08:00
for _ , pair := range args {
line := strings . Split ( pair , "=" )
2022-01-25 13:22:45 +08:00
if len ( line ) < 2 {
2021-08-11 11:49:44 +08:00
return nil , fmt . Errorf ( "parameter format should be foo=bar, %s not match" , pair )
}
k := strings . TrimSpace ( line [ 0 ] )
2022-01-25 13:22:45 +08:00
v := strings . TrimSpace ( strings . Join ( line [ 1 : ] , "=" ) )
2021-08-11 11:49:44 +08:00
if k != "" && v != "" {
res [ k ] = v
}
}
return res , nil
}
2021-07-13 13:03:25 +08:00
// NewAddonDisableCommand create addon disable command
2022-01-07 15:49:27 +08:00
func NewAddonDisableCommand ( c common . Args , ioStream cmdutil . IOStreams ) * cobra . Command {
2021-07-13 13:03:25 +08:00
return & cobra . Command {
Use : "disable" ,
Short : "disable an addon" ,
2022-01-12 17:43:08 +08:00
Long : "disable an addon in cluster." ,
2021-07-13 13:03:25 +08:00
Example : "vela addon disable <addon-name>" ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
if len ( args ) < 1 {
2021-08-18 11:37:46 +08:00
return fmt . Errorf ( "must specify addon name" )
2021-07-13 13:03:25 +08:00
}
name := args [ 0 ]
2022-01-07 15:49:27 +08:00
k8sClient , err := c . GetClient ( )
if err != nil {
return err
}
err = disableAddon ( k8sClient , name )
2021-07-13 13:03:25 +08:00
if err != nil {
return err
}
2021-10-14 18:21:49 +08:00
fmt . Printf ( "Successfully disable addon:%s\n" , name )
2021-07-13 13:03:25 +08:00
return nil
} ,
}
}
2021-12-07 15:11:52 +08:00
// NewAddonStatusCommand create addon status command
2021-12-25 11:01:59 +08:00
func NewAddonStatusCommand ( c common . Args , ioStream cmdutil . IOStreams ) * cobra . Command {
2021-12-07 15:11:52 +08:00
return & cobra . Command {
Use : "status" ,
2022-01-12 17:43:08 +08:00
Short : "get an addon's status." ,
Long : "get an addon's status from cluster." ,
2021-12-07 15:11:52 +08:00
Example : "vela addon status <addon-name>" ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
if len ( args ) < 1 {
return fmt . Errorf ( "must specify addon name" )
}
name := args [ 0 ]
2021-12-25 11:01:59 +08:00
err := statusAddon ( name , ioStream , cmd , c )
2021-12-07 15:11:52 +08:00
if err != nil {
return err
}
return nil
} ,
2021-07-13 13:03:25 +08:00
}
}
2021-12-09 20:31:19 +08:00
func enableAddon ( ctx context . Context , k8sClient client . Client , config * rest . Config , name string , args map [ string ] interface { } ) error {
2021-12-07 15:11:52 +08:00
var err error
registryDS := pkgaddon . NewRegistryDataStore ( k8sClient )
registries , err := registryDS . ListRegistries ( ctx )
2021-07-13 13:03:25 +08:00
if err != nil {
return err
}
2021-11-25 10:32:30 +08:00
2021-12-07 15:11:52 +08:00
for _ , registry := range registries {
2021-12-21 09:31:37 +08:00
err = pkgaddon . EnableAddon ( ctx , name , k8sClient , apply . NewAPIApplicator ( k8sClient ) , config , registry , args , nil )
if errors . Is ( err , pkgaddon . ErrNotExist ) {
2021-12-16 11:12:06 +08:00
continue
2021-12-07 15:11:52 +08:00
}
if err != nil {
return err
}
2022-01-07 15:49:27 +08:00
if err = waitApplicationRunning ( k8sClient , name ) ; err != nil {
2021-12-07 15:11:52 +08:00
return err
}
return nil
2021-11-25 10:32:30 +08:00
}
2022-01-12 17:43:08 +08:00
return fmt . Errorf ( "addon: %s not found in registries" , name )
2021-07-13 13:03:25 +08:00
}
2022-01-11 11:29:10 +08:00
// enableAddonByLocal enable addon in local dir and return the addon name
func enableAddonByLocal ( ctx context . Context , name string , dir string , k8sClient client . Client , config * rest . Config , args map [ string ] interface { } ) error {
if err := pkgaddon . EnableAddonByLocalDir ( ctx , name , dir , k8sClient , apply . NewAPIApplicator ( k8sClient ) , config , args ) ; err != nil {
return err
}
if err := waitApplicationRunning ( k8sClient , name ) ; err != nil {
return err
}
return nil
}
2022-01-07 15:49:27 +08:00
func disableAddon ( client client . Client , name string ) error {
if err := pkgaddon . DisableAddon ( context . Background ( ) , client , name ) ; err != nil {
2021-07-13 13:03:25 +08:00
return err
}
2021-12-07 15:11:52 +08:00
return nil
2021-10-14 18:21:49 +08:00
}
2021-12-25 11:01:59 +08:00
func statusAddon ( name string , ioStreams cmdutil . IOStreams , cmd * cobra . Command , c common . Args ) error {
2022-01-11 11:29:10 +08:00
k8sClient , err := c . GetClient ( )
2022-01-07 15:49:27 +08:00
if err != nil {
return err
}
2022-01-11 11:29:10 +08:00
status , err := pkgaddon . GetAddonStatus ( context . Background ( ) , k8sClient , name )
2021-12-07 15:11:52 +08:00
if err != nil {
return err
2021-07-13 13:03:25 +08:00
}
2021-12-20 14:34:45 +08:00
fmt . Printf ( "addon %s status is %s \n" , name , status . AddonPhase )
2021-12-25 11:01:59 +08:00
if status . AddonPhase != statusEnabled && status . AddonPhase != statusDisabled {
2021-12-25 12:37:23 +08:00
fmt . Printf ( "diagnose addon info from application %s" , pkgaddon . Convert2AppName ( name ) )
2022-01-11 11:29:10 +08:00
err := printAppStatus ( context . Background ( ) , k8sClient , ioStreams , pkgaddon . Convert2AppName ( name ) , types . DefaultKubeVelaNS , cmd , c )
2021-12-25 11:01:59 +08:00
if err != nil {
return err
}
2021-10-14 18:21:49 +08:00
}
2021-12-07 15:11:52 +08:00
return nil
2021-07-13 13:03:25 +08:00
}
2022-01-07 15:49:27 +08:00
func listAddons ( ctx context . Context , clt client . Client , registry string ) error {
2021-12-21 09:31:37 +08:00
var addons [ ] * pkgaddon . UIData
2021-12-07 15:11:52 +08:00
var err error
registryDS := pkgaddon . NewRegistryDataStore ( clt )
registries , err := registryDS . ListRegistries ( ctx )
2021-07-13 13:03:25 +08:00
if err != nil {
2021-12-07 15:11:52 +08:00
return err
2021-07-13 13:03:25 +08:00
}
2022-01-11 11:29:10 +08:00
onlineAddon := map [ string ] bool { }
2021-12-07 15:11:52 +08:00
for _ , r := range registries {
if registry != "" && r . Name != registry {
continue
2021-07-13 13:03:25 +08:00
}
2021-12-21 09:31:37 +08:00
meta , err := r . ListAddonMeta ( )
if err != nil {
continue
2021-12-07 15:11:52 +08:00
}
2021-12-21 09:31:37 +08:00
addList , err := r . ListUIData ( meta , pkgaddon . CLIMetaOptions )
2021-12-07 15:11:52 +08:00
if err != nil {
continue
}
addons = mergeAddons ( addons , addList )
2021-08-11 11:49:44 +08:00
}
2021-07-13 13:03:25 +08:00
2021-12-07 15:11:52 +08:00
table := uitable . New ( )
2021-12-25 12:37:23 +08:00
table . AddRow ( "NAME" , "REGISTRY" , "DESCRIPTION" , "STATUS" )
2021-11-25 10:32:30 +08:00
2021-12-07 15:11:52 +08:00
for _ , addon := range addons {
2021-12-20 14:34:45 +08:00
status , err := pkgaddon . GetAddonStatus ( ctx , clt , addon . Name )
2021-12-07 15:11:52 +08:00
if err != nil {
2021-11-25 10:32:30 +08:00
return err
}
2021-12-25 12:37:23 +08:00
table . AddRow ( addon . Name , addon . RegistryName , addon . Description , status . AddonPhase )
2022-01-11 11:29:10 +08:00
onlineAddon [ addon . Name ] = true
}
appList := v1alpha2 . ApplicationList { }
if err := clt . List ( ctx , & appList , client . MatchingLabels { oam . LabelAddonRegistry : pkgaddon . LocalAddonRegistryName } ) ; err != nil {
return err
}
for _ , app := range appList . Items {
addonName := app . GetLabels ( ) [ oam . LabelAddonName ]
if onlineAddon [ addonName ] {
continue
}
table . AddRow ( addonName , app . GetLabels ( ) [ oam . LabelAddonRegistry ] , "" , statusEnabled )
2021-07-25 10:16:43 +08:00
}
2021-12-07 15:11:52 +08:00
fmt . Println ( table . String ( ) )
2021-07-13 13:03:25 +08:00
return nil
}
2022-01-07 15:49:27 +08:00
func waitApplicationRunning ( k8sClient client . Client , addonName string ) error {
2021-11-25 14:08:20 +08:00
trackInterval := 5 * time . Second
2021-12-06 12:33:52 +08:00
timeout := 600 * time . Second
2021-11-25 14:08:20 +08:00
start := time . Now ( )
ctx := context . Background ( )
2021-10-14 18:21:49 +08:00
var app v1beta1 . Application
2021-11-25 14:08:20 +08:00
spinner := newTrackingSpinnerWithDelay ( "Waiting addon running ..." , 1 * time . Second )
spinner . Start ( )
defer spinner . Stop ( )
for {
2022-01-07 15:49:27 +08:00
err := k8sClient . Get ( ctx , types2 . NamespacedName { Name : pkgaddon . Convert2AppName ( addonName ) , Namespace : types . DefaultKubeVelaNS } , & app )
2021-07-25 10:16:43 +08:00
if err != nil {
2021-11-25 14:08:20 +08:00
return client . IgnoreNotFound ( err )
2021-07-25 10:16:43 +08:00
}
2021-10-14 18:21:49 +08:00
phase := app . Status . Phase
if phase == common2 . ApplicationRunning {
2021-11-25 14:08:20 +08:00
return nil
2021-07-25 10:16:43 +08:00
}
2021-11-25 14:08:20 +08:00
timeConsumed := int ( time . Since ( start ) . Seconds ( ) )
applySpinnerNewSuffix ( spinner , fmt . Sprintf ( "Waiting addon application running. It is now in phase: %s (timeout %d/%d seconds)..." ,
phase , timeConsumed , int ( timeout . Seconds ( ) ) ) )
2021-12-06 12:33:52 +08:00
if timeConsumed > int ( timeout . Seconds ( ) ) {
2022-01-07 15:49:27 +08:00
return errors . Errorf ( "Enabling timeout, please run \"vela status %s -n vela-system\" to check the status of the addon" , pkgaddon . Convert2AppName ( addonName ) )
2021-12-06 12:33:52 +08:00
}
2021-11-25 14:08:20 +08:00
time . Sleep ( trackInterval )
}
2021-08-11 11:49:44 +08:00
2021-11-16 13:56:39 +08:00
}
2021-09-14 19:35:21 +08:00
// TransAddonName will turn addon's name from xxx/yyy to xxx-yyy
func TransAddonName ( name string ) string {
return strings . ReplaceAll ( name , "/" , "-" )
}
2021-11-25 10:32:30 +08:00
2021-12-21 09:31:37 +08:00
func mergeAddons ( a1 , a2 [ ] * pkgaddon . UIData ) [ ] * pkgaddon . UIData {
2021-12-07 15:11:52 +08:00
for _ , item := range a2 {
if hasAddon ( a1 , item . Name ) {
continue
2021-11-25 10:32:30 +08:00
}
2021-12-07 15:11:52 +08:00
a1 = append ( a1 , item )
2021-11-25 10:32:30 +08:00
}
2021-12-07 15:11:52 +08:00
return a1
2021-11-25 10:32:30 +08:00
}
2021-12-21 09:31:37 +08:00
func hasAddon ( addons [ ] * pkgaddon . UIData , name string ) bool {
2021-12-07 15:11:52 +08:00
for _ , addon := range addons {
if addon . Name == name {
return true
2021-11-25 10:32:30 +08:00
}
}
2021-12-07 15:11:52 +08:00
return false
2021-11-25 10:32:30 +08:00
}
2021-12-07 15:11:52 +08:00
// TODO(wangyike) addon can support multi-tenancy, an addon can be enabled multi times and will create many times
// func checkWhetherTerraformProviderExist(ctx context.Context, k8sClient client.Client, addonName string, args map[string]string) (string, bool, error) {
// _, providerName := getTerraformProviderArgumentValue(addonName, args)
//
// providerNames, err := getTerraformProviderNames(ctx, k8sClient)
// if err != nil {
// return "", false, err
// }
// for _, name := range providerNames {
// if providerName == name {
// return providerName, true, nil
// }
// }
// return providerName, false, nil
// }
// func getTerraformProviderNames(ctx context.Context, k8sClient client.Client) ([]string, error) {
// var names []string
// providerList := &terraformv1beta1.ProviderList{}
// err := k8sClient.List(ctx, providerList, client.InNamespace(AddonTerraformProviderNamespace))
// if err != nil {
// if apimeta.IsNoMatchError(err) || kerrors.IsNotFound(err) {
// return nil, nil
// }
// return nil, err
// }
// for _, provider := range providerList.Items {
// names = append(names, provider.Name)
// }
// return names, nil
// }
//
// Get the value of argument AddonTerraformProviderNameArgument
// func getTerraformProviderArgumentValue(addonName string, args map[string]string) (map[string]string, string) {
// providerName, ok := args[AddonTerraformProviderNameArgument]
// if !ok {
// switch addonName {
// case "terraform-alibaba":
// providerName = "default"
// case "terraform-aws":
// providerName = "aws"
// case "terraform-azure":
// providerName = "azure"
// }
// args[AddonTerraformProviderNameArgument] = providerName
// }
// return args, providerName
// }