github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/commands/route/create_route.go (about)

     1  package route
     2  
     3  import (
     4  	"github.com/cloudfoundry/cli/cf/api"
     5  	"github.com/cloudfoundry/cli/cf/command_registry"
     6  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
     7  	. "github.com/cloudfoundry/cli/cf/i18n"
     8  	"github.com/cloudfoundry/cli/cf/models"
     9  	"github.com/cloudfoundry/cli/cf/requirements"
    10  	"github.com/cloudfoundry/cli/cf/terminal"
    11  	"github.com/cloudfoundry/cli/flags"
    12  	"github.com/cloudfoundry/cli/flags/flag"
    13  )
    14  
    15  type RouteCreator interface {
    16  	CreateRoute(hostName string, domain models.DomainFields, space models.SpaceFields) (route models.Route, apiErr error)
    17  }
    18  
    19  type CreateRoute struct {
    20  	ui        terminal.UI
    21  	config    core_config.Reader
    22  	routeRepo api.RouteRepository
    23  	spaceReq  requirements.SpaceRequirement
    24  	domainReq requirements.DomainRequirement
    25  }
    26  
    27  func init() {
    28  	command_registry.Register(&CreateRoute{})
    29  }
    30  
    31  func (cmd *CreateRoute) MetaData() command_registry.CommandMetadata {
    32  	fs := make(map[string]flags.FlagSet)
    33  	fs["n"] = &cliFlags.StringFlag{Name: "n", Usage: T("Hostname")}
    34  
    35  	return command_registry.CommandMetadata{
    36  		Name:        "create-route",
    37  		Description: T("Create a url route in a space for later use"),
    38  		Usage:       T("CF_NAME create-route SPACE DOMAIN [-n HOSTNAME]"),
    39  		Flags:       fs,
    40  	}
    41  }
    42  
    43  func (cmd *CreateRoute) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) (reqs []requirements.Requirement, err error) {
    44  	if len(fc.Args()) != 2 {
    45  		cmd.ui.Failed(T("Incorrect Usage. Requires SPACE and DOMAIN as arguments\n\n") + command_registry.Commands.CommandUsage("create-route"))
    46  	}
    47  
    48  	domainName := fc.Args()[1]
    49  
    50  	cmd.spaceReq = requirementsFactory.NewSpaceRequirement(fc.Args()[0])
    51  	cmd.domainReq = requirementsFactory.NewDomainRequirement(domainName)
    52  
    53  	reqs = []requirements.Requirement{
    54  		requirementsFactory.NewLoginRequirement(),
    55  		requirementsFactory.NewTargetedOrgRequirement(),
    56  		cmd.spaceReq,
    57  		cmd.domainReq,
    58  	}
    59  	return
    60  }
    61  
    62  func (cmd *CreateRoute) SetDependency(deps command_registry.Dependency, pluginCall bool) command_registry.Command {
    63  	cmd.ui = deps.Ui
    64  	cmd.config = deps.Config
    65  	cmd.routeRepo = deps.RepoLocator.GetRouteRepository()
    66  	return cmd
    67  }
    68  
    69  func (cmd *CreateRoute) Execute(c flags.FlagContext) {
    70  	hostName := c.String("n")
    71  	space := cmd.spaceReq.GetSpace()
    72  	domain := cmd.domainReq.GetDomain()
    73  
    74  	_, apiErr := cmd.CreateRoute(hostName, domain, space.SpaceFields)
    75  	if apiErr != nil {
    76  		cmd.ui.Failed(apiErr.Error())
    77  		return
    78  	}
    79  }
    80  
    81  func (cmd *CreateRoute) CreateRoute(hostName string, domain models.DomainFields, space models.SpaceFields) (route models.Route, apiErr error) {
    82  	cmd.ui.Say(T("Creating route {{.Hostname}} for org {{.OrgName}} / space {{.SpaceName}} as {{.Username}}...",
    83  		map[string]interface{}{
    84  			"Hostname":  terminal.EntityNameColor(domain.UrlForHost(hostName)),
    85  			"OrgName":   terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
    86  			"SpaceName": terminal.EntityNameColor(space.Name),
    87  			"Username":  terminal.EntityNameColor(cmd.config.Username())}))
    88  
    89  	route, apiErr = cmd.routeRepo.CreateInSpace(hostName, domain.Guid, space.Guid)
    90  	if apiErr != nil {
    91  		var findApiResponse error
    92  		route, findApiResponse = cmd.routeRepo.FindByHostAndDomain(hostName, domain)
    93  
    94  		if findApiResponse != nil ||
    95  			route.Space.Guid != space.Guid ||
    96  			route.Domain.Guid != domain.Guid {
    97  			return
    98  		}
    99  
   100  		apiErr = nil
   101  		cmd.ui.Ok()
   102  		cmd.ui.Warn(T("Route {{.URL}} already exists",
   103  			map[string]interface{}{"URL": route.URL()}))
   104  		return
   105  	}
   106  
   107  	cmd.ui.Ok()
   108  	return
   109  }