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

     1  package v6
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/cfnetworkingaction"
     5  	"code.cloudfoundry.org/cli/actor/sharedaction"
     6  	"code.cloudfoundry.org/cli/actor/v3action"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/command/translatableerror"
    10  	"code.cloudfoundry.org/cli/command/v6/shared"
    11  )
    12  
    13  //go:generate counterfeiter . AddNetworkPolicyActor
    14  
    15  type AddNetworkPolicyActor interface {
    16  	AddNetworkPolicy(srcSpaceGUID string, srcAppName string, destSpaceGUID string, destAppName string, protocol string, startPort int, endPort int) (cfnetworkingaction.Warnings, error)
    17  }
    18  
    19  //go:generate counterfeiter . MembershipActor
    20  
    21  type MembershipActor interface {
    22  	GetOrganizationByName(name string) (v3action.Organization, v3action.Warnings, error)
    23  	GetSpaceByNameAndOrganization(spaceName string, orgGUID string) (v3action.Space, v3action.Warnings, error)
    24  }
    25  
    26  type AddNetworkPolicyCommand struct {
    27  	RequiredArgs   flag.AddNetworkPolicyArgs `positional-args:"yes"`
    28  	DestinationApp string                    `long:"destination-app" required:"true" description:"Name of app to connect to"`
    29  	Port           flag.NetworkPort          `long:"port" description:"Port or range of ports for connection to destination app (Default: 8080)"`
    30  	Protocol       flag.NetworkProtocol      `long:"protocol" description:"Protocol to connect apps with (Default: tcp)"`
    31  
    32  	DestinationOrg   string `short:"o" description:"The org of the destination app (Default: targeted org)"`
    33  	DestinationSpace string `short:"s" description:"The space of the destination app (Default: targeted space)"`
    34  
    35  	usage           interface{} `usage:"CF_NAME add-network-policy SOURCE_APP --destination-app DESTINATION_APP [-s DESTINATION_SPACE_NAME [-o DESTINATION_ORG_NAME]] [--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 -s backend-space -o backend-org --protocol tcp --port 8080-8090"`
    36  	relatedCommands interface{} `related_commands:"apps, network-policies, remove-network-policy"`
    37  
    38  	UI                 command.UI
    39  	Config             command.Config
    40  	SharedActor        command.SharedActor
    41  	NetworkPolicyActor AddNetworkPolicyActor
    42  	MembershipActor    MembershipActor
    43  }
    44  
    45  func (cmd *AddNetworkPolicyCommand) Setup(config command.Config, ui command.UI) error {
    46  	cmd.UI = ui
    47  	cmd.Config = config
    48  	cmd.SharedActor = sharedaction.NewActor(config)
    49  
    50  	client, uaa, err := shared.NewV3BasedClients(config, ui, true)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	v3Actor := v3action.NewActor(client, config, nil, nil)
    56  
    57  	networkingClient, err := shared.NewNetworkingClient(client.NetworkPolicyV1(), config, uaa, ui)
    58  	if err != nil {
    59  		return err
    60  	}
    61  	cmd.NetworkPolicyActor = cfnetworkingaction.NewActor(networkingClient, v3Actor)
    62  	cmd.MembershipActor = v3Actor
    63  
    64  	return nil
    65  }
    66  
    67  func (cmd AddNetworkPolicyCommand) Execute(args []string) error {
    68  	switch {
    69  	case cmd.Protocol.Protocol != "" && cmd.Port.StartPort == 0 && cmd.Port.EndPort == 0:
    70  		return translatableerror.NetworkPolicyProtocolOrPortNotProvidedError{}
    71  	case cmd.Protocol.Protocol == "" && (cmd.Port.StartPort != 0 || cmd.Port.EndPort != 0):
    72  		return translatableerror.NetworkPolicyProtocolOrPortNotProvidedError{}
    73  	case cmd.DestinationOrg != "" && cmd.DestinationSpace == "":
    74  		return translatableerror.NetworkPolicyDestinationOrgWithoutSpaceError{}
    75  	case cmd.Protocol.Protocol == "" && cmd.Port.StartPort == 0 && cmd.Port.EndPort == 0:
    76  		cmd.Protocol.Protocol = "tcp"
    77  		cmd.Port.StartPort = 8080
    78  		cmd.Port.EndPort = 8080
    79  	}
    80  
    81  	err := cmd.SharedActor.CheckTarget(true, true)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	destOrgGUID := cmd.Config.TargetedOrganization().GUID
    87  
    88  	displayDestinationOrg := cmd.Config.TargetedOrganization().Name
    89  	if cmd.DestinationOrg != "" {
    90  		var destOrg v3action.Organization
    91  		var warnings v3action.Warnings
    92  		destOrg, warnings, err = cmd.MembershipActor.GetOrganizationByName(cmd.DestinationOrg)
    93  		cmd.UI.DisplayWarnings(warnings)
    94  		if err != nil {
    95  			return err
    96  		}
    97  
    98  		destOrgGUID = destOrg.GUID
    99  		displayDestinationOrg = cmd.DestinationOrg
   100  	}
   101  
   102  	destSpaceGUID := cmd.Config.TargetedSpace().GUID
   103  
   104  	if cmd.DestinationSpace != "" {
   105  		var destSpace v3action.Space
   106  		var warnings v3action.Warnings
   107  		destSpace, warnings, err = cmd.MembershipActor.GetSpaceByNameAndOrganization(cmd.DestinationSpace, destOrgGUID)
   108  		cmd.UI.DisplayWarnings(warnings)
   109  		if err != nil {
   110  			return err
   111  		}
   112  
   113  		destSpaceGUID = destSpace.GUID
   114  	}
   115  
   116  	user, err := cmd.Config.CurrentUser()
   117  	if err != nil {
   118  		return err
   119  	}
   120  
   121  	if cmd.DestinationSpace != "" {
   122  		cmd.UI.DisplayTextWithFlavor("Adding network policy from app {{.SrcAppName}} in org {{.Org}} / space {{.Space}} to app {{.DstAppName}} in org {{.DstOrg}} / space {{.DstSpace}} as {{.User}}...", map[string]interface{}{
   123  			"SrcAppName": cmd.RequiredArgs.SourceApp,
   124  			"Org":        cmd.Config.TargetedOrganization().Name,
   125  			"Space":      cmd.Config.TargetedSpace().Name,
   126  			"DstAppName": cmd.DestinationApp,
   127  			"DstOrg":     displayDestinationOrg,
   128  			"DstSpace":   cmd.DestinationSpace,
   129  			"User":       user.Name,
   130  		})
   131  	} else {
   132  		cmd.UI.DisplayTextWithFlavor("Adding network policy from app {{.SrcAppName}} to app {{.DstAppName}} in org {{.Org}} / space {{.Space}} as {{.User}}...", map[string]interface{}{
   133  			"SrcAppName": cmd.RequiredArgs.SourceApp,
   134  			"Org":        cmd.Config.TargetedOrganization().Name,
   135  			"Space":      cmd.Config.TargetedSpace().Name,
   136  			"DstAppName": cmd.DestinationApp,
   137  			"User":       user.Name,
   138  		})
   139  	}
   140  
   141  	warnings, err := cmd.NetworkPolicyActor.AddNetworkPolicy(cmd.Config.TargetedSpace().GUID, cmd.RequiredArgs.SourceApp, destSpaceGUID, cmd.DestinationApp, cmd.Protocol.Protocol, cmd.Port.StartPort, cmd.Port.EndPort)
   142  	cmd.UI.DisplayWarnings(warnings)
   143  	if err != nil {
   144  		return err
   145  	}
   146  	cmd.UI.DisplayOK()
   147  
   148  	return nil
   149  }