github.com/nimakaviani/cli@v6.37.1-0.20180619223813-e734901a73fa+incompatible/command/v3/network_policies_command.go (about)

     1  package v3
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"strconv"
     7  
     8  	"code.cloudfoundry.org/cli/actor/cfnetworkingaction"
     9  	"code.cloudfoundry.org/cli/actor/sharedaction"
    10  	"code.cloudfoundry.org/cli/actor/v3action"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    12  	"code.cloudfoundry.org/cli/command"
    13  	"code.cloudfoundry.org/cli/command/translatableerror"
    14  	"code.cloudfoundry.org/cli/command/v3/shared"
    15  	"code.cloudfoundry.org/cli/util/ui"
    16  )
    17  
    18  //go:generate counterfeiter . NetworkPoliciesActor
    19  
    20  type NetworkPoliciesActor interface {
    21  	NetworkPoliciesBySpaceAndAppName(spaceGUID string, srcAppName string) ([]cfnetworkingaction.Policy, cfnetworkingaction.Warnings, error)
    22  	NetworkPoliciesBySpace(spaceGUID string) ([]cfnetworkingaction.Policy, cfnetworkingaction.Warnings, error)
    23  }
    24  
    25  type NetworkPoliciesCommand struct {
    26  	SourceApp string `long:"source" required:"false" description:"Source app to filter results by"`
    27  
    28  	usage           interface{} `usage:"CF_NAME network-policies [--source SOURCE_APP]"`
    29  	relatedCommands interface{} `related_commands:"add-network-policy, apps, remove-network-policy"`
    30  
    31  	UI          command.UI
    32  	Config      command.Config
    33  	SharedActor command.SharedActor
    34  	Actor       NetworkPoliciesActor
    35  }
    36  
    37  func (cmd *NetworkPoliciesCommand) Setup(config command.Config, ui command.UI) error {
    38  	cmd.UI = ui
    39  	cmd.Config = config
    40  	cmd.SharedActor = sharedaction.NewActor(config)
    41  
    42  	client, uaa, err := shared.NewClients(config, ui, true)
    43  	if err != nil {
    44  		if v3Err, ok := err.(ccerror.V3UnexpectedResponseError); ok && v3Err.ResponseCode == http.StatusNotFound {
    45  			return translatableerror.CFNetworkingEndpointNotFoundError{}
    46  		}
    47  
    48  		return err
    49  	}
    50  
    51  	v3Actor := v3action.NewActor(client, config, nil, nil)
    52  	networkingClient, err := shared.NewNetworkingClient(client.NetworkPolicyV1(), config, uaa, ui)
    53  	if err != nil {
    54  		return err
    55  	}
    56  	cmd.Actor = cfnetworkingaction.NewActor(networkingClient, v3Actor)
    57  
    58  	return nil
    59  }
    60  
    61  func (cmd NetworkPoliciesCommand) Execute(args []string) error {
    62  	err := cmd.SharedActor.CheckTarget(true, true)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	user, err := cmd.Config.CurrentUser()
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	var policies []cfnetworkingaction.Policy
    73  	var warnings cfnetworkingaction.Warnings
    74  
    75  	if cmd.SourceApp != "" {
    76  		cmd.UI.DisplayTextWithFlavor("Listing network policies of app {{.SrcAppName}} in org {{.Org}} / space {{.Space}} as {{.User}}...", map[string]interface{}{
    77  			"SrcAppName": cmd.SourceApp,
    78  			"Org":        cmd.Config.TargetedOrganization().Name,
    79  			"Space":      cmd.Config.TargetedSpace().Name,
    80  			"User":       user.Name,
    81  		})
    82  		policies, warnings, err = cmd.Actor.NetworkPoliciesBySpaceAndAppName(cmd.Config.TargetedSpace().GUID, cmd.SourceApp)
    83  	} else {
    84  		cmd.UI.DisplayTextWithFlavor("Listing network policies in org {{.Org}} / space {{.Space}} as {{.User}}...", map[string]interface{}{
    85  			"Org":   cmd.Config.TargetedOrganization().Name,
    86  			"Space": cmd.Config.TargetedSpace().Name,
    87  			"User":  user.Name,
    88  		})
    89  		policies, warnings, err = cmd.Actor.NetworkPoliciesBySpace(cmd.Config.TargetedSpace().GUID)
    90  	}
    91  
    92  	cmd.UI.DisplayWarnings(warnings)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	cmd.UI.DisplayNewline()
    98  
    99  	table := [][]string{
   100  		{
   101  			cmd.UI.TranslateText("source"),
   102  			cmd.UI.TranslateText("destination"),
   103  			cmd.UI.TranslateText("protocol"),
   104  			cmd.UI.TranslateText("ports"),
   105  		},
   106  	}
   107  
   108  	for _, policy := range policies {
   109  		var portEntry string
   110  		if policy.StartPort == policy.EndPort {
   111  			portEntry = strconv.Itoa(policy.StartPort)
   112  		} else {
   113  			portEntry = fmt.Sprintf("%d-%d", policy.StartPort, policy.EndPort)
   114  		}
   115  		table = append(table, []string{
   116  			policy.SourceName,
   117  			policy.DestinationName,
   118  			policy.Protocol,
   119  			portEntry,
   120  		})
   121  	}
   122  
   123  	cmd.UI.DisplayTableWithHeader("", table, ui.DefaultTableSpacePadding)
   124  
   125  	return nil
   126  }