github.com/swisscom/cloudfoundry-cli@v7.1.0+incompatible/cf/commands/servicekey/service_key.go (about)

     1  package servicekey
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	"code.cloudfoundry.org/cli/cf/api"
     8  	"code.cloudfoundry.org/cli/cf/commandregistry"
     9  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    10  	"code.cloudfoundry.org/cli/cf/errors"
    11  	"code.cloudfoundry.org/cli/cf/flags"
    12  	"code.cloudfoundry.org/cli/cf/requirements"
    13  	"code.cloudfoundry.org/cli/cf/terminal"
    14  
    15  	. "code.cloudfoundry.org/cli/cf/i18n"
    16  )
    17  
    18  type ServiceKey struct {
    19  	ui                         terminal.UI
    20  	config                     coreconfig.Reader
    21  	serviceRepo                api.ServiceRepository
    22  	serviceKeyRepo             api.ServiceKeyRepository
    23  	serviceInstanceRequirement requirements.ServiceInstanceRequirement
    24  }
    25  
    26  func init() {
    27  	commandregistry.Register(&ServiceKey{})
    28  }
    29  
    30  func (cmd *ServiceKey) MetaData() commandregistry.CommandMetadata {
    31  	fs := make(map[string]flags.FlagSet)
    32  	fs["guid"] = &flags.BoolFlag{Name: "guid", Usage: T("Retrieve and display the given service-key's guid.  All other output for the service is suppressed.")}
    33  
    34  	return commandregistry.CommandMetadata{
    35  		Name:        "service-key",
    36  		Description: T("Show service key info"),
    37  		Usage: []string{
    38  			T("CF_NAME service-key SERVICE_INSTANCE SERVICE_KEY"),
    39  		},
    40  		Examples: []string{
    41  			"CF_NAME service-key mydb mykey",
    42  		},
    43  		Flags: fs,
    44  	}
    45  }
    46  
    47  func (cmd *ServiceKey) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) ([]requirements.Requirement, error) {
    48  	if len(fc.Args()) != 2 {
    49  		cmd.ui.Failed(T("Incorrect Usage. Requires SERVICE_INSTANCE SERVICE_KEY as arguments\n\n") + commandregistry.Commands.CommandUsage("service-key"))
    50  		return nil, fmt.Errorf("Incorrect usage: %d arguments of %d required", len(fc.Args()), 2)
    51  	}
    52  
    53  	loginRequirement := requirementsFactory.NewLoginRequirement()
    54  	cmd.serviceInstanceRequirement = requirementsFactory.NewServiceInstanceRequirement(fc.Args()[0])
    55  	targetSpaceRequirement := requirementsFactory.NewTargetedSpaceRequirement()
    56  
    57  	reqs := []requirements.Requirement{loginRequirement, cmd.serviceInstanceRequirement, targetSpaceRequirement}
    58  	return reqs, nil
    59  }
    60  
    61  func (cmd *ServiceKey) SetDependency(deps commandregistry.Dependency, pluginCall bool) commandregistry.Command {
    62  	cmd.ui = deps.UI
    63  	cmd.config = deps.Config
    64  	cmd.serviceRepo = deps.RepoLocator.GetServiceRepository()
    65  	cmd.serviceKeyRepo = deps.RepoLocator.GetServiceKeyRepository()
    66  	return cmd
    67  }
    68  
    69  func (cmd *ServiceKey) Execute(c flags.FlagContext) error {
    70  	serviceInstance := cmd.serviceInstanceRequirement.GetServiceInstance()
    71  	serviceKeyName := c.Args()[1]
    72  
    73  	if !c.Bool("guid") {
    74  		cmd.ui.Say(T("Getting key {{.ServiceKeyName}} for service instance {{.ServiceInstanceName}} as {{.CurrentUser}}...",
    75  			map[string]interface{}{
    76  				"ServiceKeyName":      terminal.EntityNameColor(serviceKeyName),
    77  				"ServiceInstanceName": terminal.EntityNameColor(serviceInstance.Name),
    78  				"CurrentUser":         terminal.EntityNameColor(cmd.config.Username()),
    79  			}))
    80  	}
    81  
    82  	serviceKey, err := cmd.serviceKeyRepo.GetServiceKey(serviceInstance.GUID, serviceKeyName)
    83  	if err != nil {
    84  		switch err.(type) {
    85  		case *errors.NotAuthorizedError:
    86  			cmd.ui.Say(T("No service key {{.ServiceKeyName}} found for service instance {{.ServiceInstanceName}}",
    87  				map[string]interface{}{
    88  					"ServiceKeyName":      terminal.EntityNameColor(serviceKeyName),
    89  					"ServiceInstanceName": terminal.EntityNameColor(serviceInstance.Name)}))
    90  			return nil
    91  		default:
    92  			return err
    93  		}
    94  	}
    95  
    96  	if c.Bool("guid") {
    97  		cmd.ui.Say(serviceKey.Fields.GUID)
    98  	} else {
    99  		if serviceKey.Fields.Name == "" {
   100  			return errors.New(
   101  				T("No service key {{.ServiceKeyName}} found for service instance {{.ServiceInstanceName}}",
   102  					map[string]interface{}{
   103  						"ServiceKeyName":      terminal.EntityNameColor(serviceKeyName),
   104  						"ServiceInstanceName": terminal.EntityNameColor(serviceInstance.Name)}))
   105  		}
   106  
   107  		jsonBytes, err := json.MarshalIndent(serviceKey.Credentials, "", " ")
   108  		if err != nil {
   109  			return err
   110  		}
   111  
   112  		cmd.ui.Say("")
   113  		cmd.ui.Say(string(jsonBytes))
   114  	}
   115  	return nil
   116  }