github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v7/env_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"sort"
     7  
     8  	"code.cloudfoundry.org/cli/actor/sharedaction"
     9  	"code.cloudfoundry.org/cli/actor/v7action"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/flag"
    12  	"code.cloudfoundry.org/cli/command/v7/shared"
    13  	"code.cloudfoundry.org/clock"
    14  	log "github.com/sirupsen/logrus"
    15  )
    16  
    17  //go:generate counterfeiter . EnvActor
    18  
    19  type EnvActor interface {
    20  	GetEnvironmentVariablesByApplicationNameAndSpace(appName string, spaceGUID string) (v7action.EnvironmentVariableGroups, v7action.Warnings, error)
    21  }
    22  
    23  type EnvCommand struct {
    24  	RequiredArgs    flag.EnvironmentArgs `positional-args:"yes"`
    25  	usage           interface{}          `usage:"CF_NAME env APP_NAME"`
    26  	relatedCommands interface{}          `related_commands:"app, apps, set-env, unset-env, running-environment-variable-group, staging-environment-variable-group"`
    27  
    28  	UI          command.UI
    29  	Config      command.Config
    30  	SharedActor command.SharedActor
    31  	Actor       EnvActor
    32  }
    33  
    34  func (cmd *EnvCommand) Setup(config command.Config, ui command.UI) error {
    35  	cmd.UI = ui
    36  	cmd.Config = config
    37  	cmd.SharedActor = sharedaction.NewActor(config)
    38  
    39  	ccClient, _, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    40  	if err != nil {
    41  		return err
    42  	}
    43  	cmd.Actor = v7action.NewActor(ccClient, config, nil, nil, clock.NewClock())
    44  
    45  	return nil
    46  }
    47  
    48  func (cmd EnvCommand) Execute(_ []string) error {
    49  	err := cmd.SharedActor.CheckTarget(true, true)
    50  	if err != nil {
    51  		return err
    52  	}
    53  
    54  	user, err := cmd.Config.CurrentUser()
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	appName := cmd.RequiredArgs.AppName
    60  	cmd.UI.DisplayTextWithFlavor("Getting env variables for app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...", map[string]interface{}{
    61  		"AppName":   appName,
    62  		"OrgName":   cmd.Config.TargetedOrganization().Name,
    63  		"SpaceName": cmd.Config.TargetedSpace().Name,
    64  		"Username":  user.Name,
    65  	})
    66  	cmd.UI.DisplayOK()
    67  
    68  	envGroups, warnings, err := cmd.Actor.GetEnvironmentVariablesByApplicationNameAndSpace(
    69  		appName,
    70  		cmd.Config.TargetedSpace().GUID,
    71  	)
    72  	cmd.UI.DisplayWarnings(warnings)
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	if len(envGroups.System) > 0 || len(envGroups.Application) > 0 {
    78  		cmd.UI.DisplayHeader("System-Provided:")
    79  		err = cmd.displaySystem(envGroups.System)
    80  		if err != nil {
    81  			log.Errorln("error formatting system provided:", err)
    82  		}
    83  		if len(envGroups.Application) > 0 {
    84  			cmd.UI.DisplayNewline()
    85  			err = cmd.displaySystem(envGroups.Application)
    86  			if err != nil {
    87  				log.Errorln("error formatting application:", err)
    88  			}
    89  		}
    90  	} else {
    91  		cmd.UI.DisplayText("No system-provided env variables have been set")
    92  	}
    93  	cmd.UI.DisplayNewline()
    94  
    95  	if len(envGroups.EnvironmentVariables) > 0 {
    96  		cmd.UI.DisplayHeader("User-Provided:")
    97  		cmd.displayEnvGroup(envGroups.EnvironmentVariables)
    98  	} else {
    99  		cmd.UI.DisplayText("No user-provided env variables have been set")
   100  	}
   101  	cmd.UI.DisplayNewline()
   102  
   103  	if len(envGroups.Running) > 0 {
   104  		cmd.UI.DisplayHeader("Running Environment Variable Groups:")
   105  		cmd.displayEnvGroup(envGroups.Running)
   106  	} else {
   107  		cmd.UI.DisplayText("No running env variables have been set")
   108  	}
   109  	cmd.UI.DisplayNewline()
   110  
   111  	if len(envGroups.Staging) > 0 {
   112  		cmd.UI.DisplayHeader("Staging Environment Variable Groups:")
   113  		cmd.displayEnvGroup(envGroups.Staging)
   114  	} else {
   115  		cmd.UI.DisplayText("No staging env variables have been set")
   116  	}
   117  	cmd.UI.DisplayNewline()
   118  
   119  	return nil
   120  }
   121  
   122  func (cmd EnvCommand) displayEnvGroup(group map[string]interface{}) {
   123  	keys := sortKeys(group)
   124  
   125  	for _, key := range keys {
   126  		cmd.UI.DisplayText(fmt.Sprintf("%s: %v", key, group[key]))
   127  	}
   128  }
   129  
   130  func sortKeys(group map[string]interface{}) []string {
   131  	keys := make([]string, 0, len(group))
   132  	for key := range group {
   133  		keys = append(keys, key)
   134  	}
   135  	sort.Strings(keys)
   136  	return keys
   137  }
   138  
   139  func (cmd EnvCommand) displaySystem(group map[string]interface{}) error {
   140  	for key, val := range group {
   141  		jsonVal, err := json.MarshalIndent(val, "", " ")
   142  		if err != nil {
   143  			return err
   144  		}
   145  		cmd.UI.DisplayText(fmt.Sprintf("%s: %s", key, jsonVal))
   146  	}
   147  	return nil
   148  }