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  }