github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/v7/map_route_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/actor/sharedaction"
     6  	"code.cloudfoundry.org/cli/actor/v7action"
     7  	"code.cloudfoundry.org/cli/command"
     8  	"code.cloudfoundry.org/cli/command/flag"
     9  	"code.cloudfoundry.org/cli/command/v7/shared"
    10  	"code.cloudfoundry.org/clock"
    11  )
    12  
    13  //go:generate counterfeiter . MapRouteActor
    14  
    15  type MapRouteActor interface {
    16  	GetApplicationByNameAndSpace(appName string, spaceGUID string) (v7action.Application, v7action.Warnings, error)
    17  	GetRouteByAttributes(domainName string, domainGUID string, hostname string, path string) (v7action.Route, v7action.Warnings, error)
    18  	GetDomainByName(domainName string) (v7action.Domain, v7action.Warnings, error)
    19  	CreateRoute(spaceGUID, domainName, hostname, path string) (v7action.Route, v7action.Warnings, error)
    20  	GetRouteDestinationByAppGUID(routeGUID string, appGUID string) (v7action.RouteDestination, v7action.Warnings, error)
    21  	MapRoute(routeGUID string, appGUID string) (v7action.Warnings, error)
    22  }
    23  
    24  type MapRouteCommand struct {
    25  	RequiredArgs    flag.AppDomain   `positional-args:"yes"`
    26  	usage           interface{}      `usage:"CF_NAME map-route APP_NAME DOMAIN [--hostname HOSTNAME] [--path PATH]\n\nEXAMPLES:\n   CF_NAME map-route my-app example.com                              # example.com\n   CF_NAME map-route my-app example.com --hostname myhost            # myhost.example.com\n   CF_NAME map-route my-app example.com --hostname myhost --path foo # myhost.example.com/foo"`
    27  	Hostname        string           `long:"hostname" short:"n" description:"Hostname for the HTTP route (required for shared domains)"`
    28  	Path            flag.V7RoutePath `long:"path" description:"Path for the HTTP route"`
    29  	relatedCommands interface{}      `related_commands:"create-route, routes, unmap-route"`
    30  
    31  	UI          command.UI
    32  	Config      command.Config
    33  	Actor       MapRouteActor
    34  	SharedActor command.SharedActor
    35  }
    36  
    37  func (cmd *MapRouteCommand) Setup(config command.Config, ui command.UI) error {
    38  	cmd.UI = ui
    39  	cmd.Config = config
    40  	sharedActor := sharedaction.NewActor(config)
    41  	cmd.SharedActor = sharedActor
    42  
    43  	ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    44  	if err != nil {
    45  		return err
    46  	}
    47  	cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient, clock.NewClock())
    48  	return nil
    49  }
    50  
    51  func (cmd MapRouteCommand) Execute(args []string) error {
    52  	err := cmd.SharedActor.CheckTarget(true, true)
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	user, err := cmd.Config.CurrentUser()
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	domain, warnings, err := cmd.Actor.GetDomainByName(cmd.RequiredArgs.Domain)
    63  	cmd.UI.DisplayWarnings(warnings)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	spaceGUID := cmd.Config.TargetedSpace().GUID
    69  	app, warnings, err := cmd.Actor.GetApplicationByNameAndSpace(cmd.RequiredArgs.App, spaceGUID)
    70  	cmd.UI.DisplayWarnings(warnings)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	path := cmd.Path.Path
    76  	route, warnings, err := cmd.Actor.GetRouteByAttributes(domain.Name, domain.GUID, cmd.Hostname, path)
    77  	fqdn := desiredFQDN(domain.Name, cmd.Hostname, path)
    78  	cmd.UI.DisplayWarnings(warnings)
    79  	if err != nil {
    80  		if _, ok := err.(actionerror.RouteNotFoundError); !ok {
    81  			return err
    82  		}
    83  		cmd.UI.DisplayTextWithFlavor("Creating route {{.FQDN}} for org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...",
    84  			map[string]interface{}{
    85  				"FQDN":      fqdn,
    86  				"User":      user.Name,
    87  				"SpaceName": cmd.Config.TargetedSpace().Name,
    88  				"OrgName":   cmd.Config.TargetedOrganization().Name,
    89  			})
    90  		route, warnings, err = cmd.Actor.CreateRoute(
    91  			cmd.Config.TargetedSpace().GUID,
    92  			domain.Name,
    93  			cmd.Hostname,
    94  			path,
    95  		)
    96  		cmd.UI.DisplayWarnings(warnings)
    97  		if err != nil {
    98  			return err
    99  		}
   100  		cmd.UI.DisplayOK()
   101  	}
   102  
   103  	cmd.UI.DisplayTextWithFlavor("Mapping route {{.FQDN}} to app {{.AppName}} in org {{.OrgName}} / space {{.SpaceName}} as {{.User}}...", map[string]interface{}{
   104  		"FQDN":      fqdn,
   105  		"AppName":   cmd.RequiredArgs.App,
   106  		"User":      user.Name,
   107  		"SpaceName": cmd.Config.TargetedSpace().Name,
   108  		"OrgName":   cmd.Config.TargetedOrganization().Name,
   109  	})
   110  	dest, warnings, err := cmd.Actor.GetRouteDestinationByAppGUID(route.GUID, app.GUID)
   111  	cmd.UI.DisplayWarnings(warnings)
   112  	if err != nil {
   113  		if _, ok := err.(actionerror.RouteDestinationNotFoundError); !ok {
   114  			return err
   115  		}
   116  	}
   117  	if dest.GUID != "" {
   118  		cmd.UI.DisplayText("App '{{ .AppName }}' is already mapped to route '{{ .FQDN }}'.", map[string]interface{}{
   119  			"AppName": cmd.RequiredArgs.App,
   120  			"FQDN":    fqdn,
   121  		})
   122  		cmd.UI.DisplayOK()
   123  		return nil
   124  	}
   125  	warnings, err = cmd.Actor.MapRoute(route.GUID, app.GUID)
   126  	cmd.UI.DisplayWarnings(warnings)
   127  	if err != nil {
   128  		return err
   129  	}
   130  	cmd.UI.DisplayOK()
   131  
   132  	return nil
   133  }