github.com/cloudfoundry-attic/cli-with-i18n@v6.32.1-0.20171002233121-7401370d3b85+incompatible/command/v3/add_network_policy_command.go (about)

     1  package v3
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"code.cloudfoundry.org/cli/actor/cfnetworkingaction"
     7  	"code.cloudfoundry.org/cli/actor/sharedaction"
     8  	"code.cloudfoundry.org/cli/actor/v3action"
     9  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/flag"
    12  	"code.cloudfoundry.org/cli/command/translatableerror"
    13  	"code.cloudfoundry.org/cli/command/v3/shared"
    14  )
    15  
    16  //go:generate counterfeiter . AddNetworkPolicyActor
    17  
    18  type AddNetworkPolicyActor interface {
    19  	AddNetworkPolicy(spaceGUID string, srcAppName string, destAppName string, protocol string, startPort int, endPort int) (cfnetworkingaction.Warnings, error)
    20  }
    21  
    22  type AddNetworkPolicyCommand struct {
    23  	RequiredArgs   flag.AddNetworkPolicyArgs `positional-args:"yes"`
    24  	DestinationApp string                    `long:"destination-app" required:"true" description:"Name of app to connect to"`
    25  	Port           flag.NetworkPort          `long:"port" description:"Port or range of ports for connection to destination app (Default: 8080)"`
    26  	Protocol       flag.NetworkProtocol      `long:"protocol" description:"Protocol to connect apps with (Default: tcp)"`
    27  
    28  	usage           interface{} `usage:"CF_NAME add-network-policy SOURCE_APP --destination-app DESTINATION_APP [(--protocol (tcp | udp) --port RANGE)]\n\nEXAMPLES:\n   CF_NAME add-network-policy frontend --destination-app backend --protocol tcp --port 8081\n   CF_NAME add-network-policy frontend --destination-app backend --protocol tcp --port 8080-8090"`
    29  	relatedCommands interface{} `related_commands:"apps, network-policies"`
    30  
    31  	UI          command.UI
    32  	Config      command.Config
    33  	SharedActor command.SharedActor
    34  	Actor       AddNetworkPolicyActor
    35  }
    36  
    37  func (cmd *AddNetworkPolicyCommand) 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(nil, client, config)
    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 AddNetworkPolicyCommand) Execute(args []string) error {
    62  	switch {
    63  	case cmd.Protocol.Protocol != "" && cmd.Port.StartPort == 0 && cmd.Port.EndPort == 0:
    64  		return translatableerror.NetworkPolicyProtocolOrPortNotProvidedError{}
    65  	case cmd.Protocol.Protocol == "" && (cmd.Port.StartPort != 0 || cmd.Port.EndPort != 0):
    66  		return translatableerror.NetworkPolicyProtocolOrPortNotProvidedError{}
    67  	case cmd.Protocol.Protocol == "" && cmd.Port.StartPort == 0 && cmd.Port.EndPort == 0:
    68  		cmd.Protocol.Protocol = "tcp"
    69  		cmd.Port.StartPort = 8080
    70  		cmd.Port.EndPort = 8080
    71  	}
    72  
    73  	err := cmd.SharedActor.CheckTarget(cmd.Config, true, true)
    74  	if err != nil {
    75  		return shared.HandleError(err)
    76  	}
    77  
    78  	user, err := cmd.Config.CurrentUser()
    79  	if err != nil {
    80  		return err
    81  	}
    82  	cmd.UI.DisplayTextWithFlavor("Adding network policy to app {{.SrcAppName}} in org {{.Org}} / space {{.Space}} as {{.User}}...", map[string]interface{}{
    83  		"SrcAppName": cmd.RequiredArgs.SourceApp,
    84  		"Org":        cmd.Config.TargetedOrganization().Name,
    85  		"Space":      cmd.Config.TargetedSpace().Name,
    86  		"User":       user.Name,
    87  	})
    88  
    89  	warnings, err := cmd.Actor.AddNetworkPolicy(cmd.Config.TargetedSpace().GUID, cmd.RequiredArgs.SourceApp, cmd.DestinationApp, cmd.Protocol.Protocol, cmd.Port.StartPort, cmd.Port.EndPort)
    90  	cmd.UI.DisplayWarnings(warnings)
    91  	if err != nil {
    92  		return shared.HandleError(err)
    93  	}
    94  	cmd.UI.DisplayOK()
    95  
    96  	return nil
    97  }