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

     1  package application
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"sort"
     7  
     8  	"code.cloudfoundry.org/cli/cf/commandregistry"
     9  	"code.cloudfoundry.org/cli/cf/flags"
    10  	. "code.cloudfoundry.org/cli/cf/i18n"
    11  
    12  	"code.cloudfoundry.org/cli/cf/api/applications"
    13  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    14  	"code.cloudfoundry.org/cli/cf/errors"
    15  	"code.cloudfoundry.org/cli/cf/requirements"
    16  	"code.cloudfoundry.org/cli/cf/terminal"
    17  )
    18  
    19  type Env struct {
    20  	ui      terminal.UI
    21  	config  coreconfig.Reader
    22  	appRepo applications.Repository
    23  }
    24  
    25  func init() {
    26  	commandregistry.Register(&Env{})
    27  }
    28  
    29  func (cmd *Env) MetaData() commandregistry.CommandMetadata {
    30  	return commandregistry.CommandMetadata{
    31  		Name:        "env",
    32  		ShortName:   "e",
    33  		Description: T("Show all env variables for an app"),
    34  		Usage: []string{
    35  			T("CF_NAME env APP_NAME"),
    36  		},
    37  	}
    38  }
    39  
    40  func (cmd *Env) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) ([]requirements.Requirement, error) {
    41  	if len(fc.Args()) != 1 {
    42  		cmd.ui.Failed(T("Incorrect Usage. Requires an argument\n\n") + commandregistry.Commands.CommandUsage("env"))
    43  		return nil, fmt.Errorf("Incorrect usage: %d arguments of %d required", len(fc.Args()), 1)
    44  	}
    45  
    46  	reqs := []requirements.Requirement{
    47  		requirementsFactory.NewLoginRequirement(),
    48  		requirementsFactory.NewTargetedSpaceRequirement(),
    49  	}
    50  
    51  	return reqs, nil
    52  }
    53  
    54  func (cmd *Env) SetDependency(deps commandregistry.Dependency, pluginCall bool) commandregistry.Command {
    55  	cmd.ui = deps.UI
    56  	cmd.config = deps.Config
    57  	cmd.appRepo = deps.RepoLocator.GetApplicationRepository()
    58  	return cmd
    59  }
    60  
    61  func (cmd *Env) Execute(c flags.FlagContext) error {
    62  	app, err := cmd.appRepo.Read(c.Args()[0])
    63  	if notFound, ok := err.(*errors.ModelNotFoundError); ok {
    64  		return notFound
    65  	}
    66  
    67  	cmd.ui.Say(T("Getting env variables for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...",
    68  		map[string]interface{}{
    69  			"AppName":   terminal.EntityNameColor(app.Name),
    70  			"OrgName":   terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
    71  			"SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name),
    72  			"Username":  terminal.EntityNameColor(cmd.config.Username())}))
    73  
    74  	env, err := cmd.appRepo.ReadEnv(app.GUID)
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	cmd.ui.Ok()
    80  	cmd.ui.Say("")
    81  
    82  	err = cmd.displaySystemiAndAppProvidedEnvironment(env.System, env.Application)
    83  	if err != nil {
    84  		return err
    85  	}
    86  	cmd.ui.Say("")
    87  	cmd.displayUserProvidedEnvironment(env.Environment)
    88  	cmd.ui.Say("")
    89  	cmd.displayRunningEnvironment(env.Running)
    90  	cmd.ui.Say("")
    91  	cmd.displayStagingEnvironment(env.Staging)
    92  	cmd.ui.Say("")
    93  	return nil
    94  }
    95  
    96  func (cmd *Env) displaySystemiAndAppProvidedEnvironment(env map[string]interface{}, app map[string]interface{}) error {
    97  	var vcapServices string
    98  	var vcapApplication string
    99  
   100  	servicesAsMap, ok := env["VCAP_SERVICES"].(map[string]interface{})
   101  	if ok && len(servicesAsMap) > 0 {
   102  		jsonBytes, err := json.MarshalIndent(env, "", " ")
   103  		if err != nil {
   104  			return err
   105  		}
   106  		vcapServices = string(jsonBytes)
   107  	}
   108  
   109  	applicationAsMap, ok := app["VCAP_APPLICATION"].(map[string]interface{})
   110  	if ok && len(applicationAsMap) > 0 {
   111  		jsonBytes, err := json.MarshalIndent(app, "", " ")
   112  		if err != nil {
   113  			return err
   114  		}
   115  		vcapApplication = string(jsonBytes)
   116  	}
   117  
   118  	if len(vcapServices) == 0 && len(vcapApplication) == 0 {
   119  		cmd.ui.Say(T("No system-provided env variables have been set"))
   120  		return nil
   121  	}
   122  
   123  	cmd.ui.Say(terminal.EntityNameColor(T("System-Provided:")))
   124  
   125  	cmd.ui.Say(vcapServices)
   126  	cmd.ui.Say("")
   127  	cmd.ui.Say(vcapApplication)
   128  	return nil
   129  }
   130  
   131  func (cmd *Env) displayUserProvidedEnvironment(envVars map[string]interface{}) {
   132  	if len(envVars) == 0 {
   133  		cmd.ui.Say(T("No user-defined env variables have been set"))
   134  		return
   135  	}
   136  
   137  	keys := make([]string, 0, len(envVars))
   138  	for key := range envVars {
   139  		keys = append(keys, key)
   140  	}
   141  	sort.Strings(keys)
   142  
   143  	cmd.ui.Say(terminal.EntityNameColor(T("User-Provided:")))
   144  	for _, key := range keys {
   145  		cmd.ui.Say("%s: %v", key, envVars[key])
   146  	}
   147  }
   148  
   149  func (cmd *Env) displayRunningEnvironment(envVars map[string]interface{}) {
   150  	if len(envVars) == 0 {
   151  		cmd.ui.Say(T("No running env variables have been set"))
   152  		return
   153  	}
   154  
   155  	keys := make([]string, 0, len(envVars))
   156  	for key := range envVars {
   157  		keys = append(keys, key)
   158  	}
   159  	sort.Strings(keys)
   160  
   161  	cmd.ui.Say(terminal.EntityNameColor(T("Running Environment Variable Groups:")))
   162  	for _, key := range keys {
   163  		cmd.ui.Say("%s: %v", key, envVars[key])
   164  	}
   165  }
   166  
   167  func (cmd *Env) displayStagingEnvironment(envVars map[string]interface{}) {
   168  	if len(envVars) == 0 {
   169  		cmd.ui.Say(T("No staging env variables have been set"))
   170  		return
   171  	}
   172  
   173  	keys := make([]string, 0, len(envVars))
   174  	for key := range envVars {
   175  		keys = append(keys, key)
   176  	}
   177  	sort.Strings(keys)
   178  
   179  	cmd.ui.Say(terminal.EntityNameColor(T("Staging Environment Variable Groups:")))
   180  	for _, key := range keys {
   181  		cmd.ui.Say("%s: %v", key, envVars[key])
   182  	}
   183  }