github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/kube/vault/vault_selector.go (about) 1 package vault 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/olli-ai/jx/v2/pkg/vault" 8 9 "github.com/banzaicloud/bank-vaults/operator/pkg/client/clientset/versioned" 10 "github.com/olli-ai/jx/v2/pkg/util" 11 "k8s.io/client-go/kubernetes" 12 ) 13 14 // Selector is an interface for selecting a vault from the installed ones on the platform 15 // It should pick the most logical one, or give the user a way of picking a vault if there are multiple installed 16 type Selector interface { 17 GetVault(name string, namespace string, useIngressURL bool) (*vault.Vault, error) 18 } 19 20 type vaultSelector struct { 21 vaultOperatorClient versioned.Interface 22 kubeClient kubernetes.Interface 23 Handles util.IOFileHandles 24 } 25 26 // NewVaultSelector creates a new vault selector 27 func NewVaultSelector(o OptionsInterface) (Selector, error) { 28 operator, err := o.VaultOperatorClient() 29 if err != nil { 30 return nil, err 31 } 32 kubeClient, _, err := o.KubeClientAndNamespace() 33 if err != nil { 34 return nil, err 35 } 36 37 v := &vaultSelector{ 38 vaultOperatorClient: operator, 39 kubeClient: kubeClient, 40 Handles: o.GetIOFileHandles(), 41 } 42 return v, nil 43 } 44 45 // GetVault retrieve the given vault by name 46 func (v *vaultSelector) GetVault(name string, namespace string, useIngressURL bool) (*vault.Vault, error) { 47 vaults, err := GetVaults(v.kubeClient, v.vaultOperatorClient, namespace, useIngressURL) 48 if err != nil { 49 return nil, err 50 } 51 52 if name != "" { 53 // Return the vault that the user wanted (or an error if it doesn't exist) 54 for _, v := range vaults { 55 if v.Name == name { 56 return v, nil 57 } 58 } 59 return nil, errors.New(fmt.Sprintf("vault '%s' not found in namespace '%s'", name, namespace)) 60 } 61 62 if len(vaults) == 0 { 63 return nil, errors.New(fmt.Sprintf("no vaults found in namespace '%s'", namespace)) 64 } 65 if len(vaults) > 1 { // Get the user to select the vault from the list 66 return v.selectVault(vaults) 67 } 68 // If there is only one vault, return that one 69 return vaults[0], nil 70 } 71 72 func (v *vaultSelector) selectVault(vaults []*vault.Vault) (*vault.Vault, error) { 73 vaultMap, vaultNames := make(map[string]*vault.Vault, len(vaults)), make([]string, len(vaults)) 74 for i, vault := range vaults { 75 vaultMap[vault.Name] = vault 76 vaultNames[i] = vault.Name 77 } 78 79 vaultName, err := util.PickName(vaultNames, "Select Vault:", "", v.Handles) 80 if err != nil { 81 return nil, err 82 } 83 return vaultMap[vaultName], nil 84 }