github.com/wanddynosios/cli/v8@v8.7.9-0.20240221182337-1a92e3a7017f/cf/commands/route/routes.go (about)

     1  package route
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"code.cloudfoundry.org/cli/cf/flags"
     9  	. "code.cloudfoundry.org/cli/cf/i18n"
    10  
    11  	"code.cloudfoundry.org/cli/cf/api"
    12  	"code.cloudfoundry.org/cli/cf/commandregistry"
    13  	"code.cloudfoundry.org/cli/cf/configuration/coreconfig"
    14  	"code.cloudfoundry.org/cli/cf/models"
    15  	"code.cloudfoundry.org/cli/cf/requirements"
    16  	"code.cloudfoundry.org/cli/cf/terminal"
    17  )
    18  
    19  type ListRoutes struct {
    20  	ui         terminal.UI
    21  	routeRepo  api.RouteRepository
    22  	domainRepo api.DomainRepository
    23  	config     coreconfig.Reader
    24  }
    25  
    26  func init() {
    27  	commandregistry.Register(&ListRoutes{})
    28  }
    29  
    30  func (cmd *ListRoutes) MetaData() commandregistry.CommandMetadata {
    31  	fs := make(map[string]flags.FlagSet)
    32  	fs["orglevel"] = &flags.BoolFlag{Name: "orglevel", Usage: T("List all the routes for all spaces of current organization")}
    33  
    34  	return commandregistry.CommandMetadata{
    35  		Name:        "routes",
    36  		ShortName:   "r",
    37  		Description: T("List all routes in the current space or the current organization"),
    38  		Usage: []string{
    39  			"CF_NAME routes [--orglevel]",
    40  		},
    41  		Flags: fs,
    42  	}
    43  }
    44  
    45  func (cmd *ListRoutes) Requirements(requirementsFactory requirements.Factory, fc flags.FlagContext) ([]requirements.Requirement, error) {
    46  	usageReq := requirements.NewUsageRequirement(commandregistry.CLICommandUsagePresenter(cmd),
    47  		T("No argument required"),
    48  		func() bool {
    49  			return len(fc.Args()) != 0
    50  		},
    51  	)
    52  
    53  	reqs := []requirements.Requirement{
    54  		usageReq,
    55  		requirementsFactory.NewLoginRequirement(),
    56  	}
    57  
    58  	orglevel := fc.Bool("orglevel")
    59  	if !orglevel {
    60  		reqs = append(reqs, requirementsFactory.NewTargetedSpaceRequirement())
    61  	}
    62  
    63  	return reqs, nil
    64  }
    65  
    66  func (cmd *ListRoutes) SetDependency(deps commandregistry.Dependency, pluginCall bool) commandregistry.Command {
    67  	cmd.ui = deps.UI
    68  	cmd.config = deps.Config
    69  	cmd.routeRepo = deps.RepoLocator.GetRouteRepository()
    70  	cmd.domainRepo = deps.RepoLocator.GetDomainRepository()
    71  	return cmd
    72  }
    73  
    74  func (cmd *ListRoutes) Execute(c flags.FlagContext) error {
    75  	orglevel := c.Bool("orglevel")
    76  
    77  	if orglevel {
    78  		cmd.ui.Say(T("Getting routes for org {{.OrgName}} as {{.Username}} ...\n",
    79  			map[string]interface{}{
    80  				"Username": terminal.EntityNameColor(cmd.config.Username()),
    81  				"OrgName":  terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
    82  			}))
    83  	} else {
    84  		cmd.ui.Say(T("Getting routes for org {{.OrgName}} / space {{.SpaceName}} as {{.Username}} ...\n",
    85  			map[string]interface{}{
    86  				"Username":  terminal.EntityNameColor(cmd.config.Username()),
    87  				"OrgName":   terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
    88  				"SpaceName": terminal.EntityNameColor(cmd.config.SpaceFields().Name),
    89  			}))
    90  	}
    91  
    92  	table := cmd.ui.Table([]string{T("space"), T("host"), T("domain"), T("port"), T("path"), T("type"), T("apps"), T("service")})
    93  
    94  	d := make(map[string]models.DomainFields)
    95  	err := cmd.domainRepo.ListDomainsForOrg(cmd.config.OrganizationFields().GUID, func(domain models.DomainFields) bool {
    96  		d[domain.GUID] = domain
    97  		return true
    98  	})
    99  	if err != nil {
   100  		return errors.New(T("Failed fetching domains for organization {{.OrgName}}.\n{{.Err}}",
   101  			map[string]interface{}{
   102  				"Err":     err.Error(),
   103  				"OrgName": cmd.config.OrganizationFields().Name,
   104  			},
   105  		))
   106  	}
   107  
   108  	var routesFound bool
   109  	cb := func(route models.Route) bool {
   110  		routesFound = true
   111  		appNames := []string{}
   112  		for _, app := range route.Apps {
   113  			appNames = append(appNames, app.Name)
   114  		}
   115  
   116  		var port string
   117  		if route.Port != 0 {
   118  			port = fmt.Sprintf("%d", route.Port)
   119  		}
   120  
   121  		domain := d[route.Domain.GUID]
   122  
   123  		table.Add(
   124  			route.Space.Name,
   125  			route.Host,
   126  			route.Domain.Name,
   127  			port,
   128  			route.Path,
   129  			domain.RouterGroupType,
   130  			strings.Join(appNames, ","),
   131  			route.ServiceInstance.Name,
   132  		)
   133  		return true
   134  	}
   135  
   136  	if orglevel {
   137  		err = cmd.routeRepo.ListAllRoutes(cb)
   138  	} else {
   139  		err = cmd.routeRepo.ListRoutes(cb)
   140  	}
   141  	if err != nil {
   142  		return errors.New(T("Failed fetching routes.\n{{.Err}}", map[string]interface{}{"Err": err.Error()}))
   143  	}
   144  
   145  	err = table.Print()
   146  	if err != nil {
   147  		return err
   148  	}
   149  
   150  	if !routesFound {
   151  		cmd.ui.Say(T("No routes found"))
   152  	}
   153  	return nil
   154  }