github.com/arunkumar7540/cli@v6.45.0+incompatible/actor/v7action/route.go (about)

     1  package v7action
     2  
     3  import (
     4  	"code.cloudfoundry.org/cli/actor/actionerror"
     5  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
     6  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
     7  )
     8  
     9  type Route struct {
    10  	GUID       string
    11  	SpaceGUID  string
    12  	DomainGUID string
    13  	Host       string
    14  	Path       string
    15  	DomainName string
    16  	SpaceName  string
    17  }
    18  
    19  func (actor Actor) CreateRoute(orgName, spaceName, domainName, hostname, path string) (Warnings, error) {
    20  	allWarnings := Warnings{}
    21  	domain, warnings, err := actor.GetDomainByName(domainName)
    22  	allWarnings = append(allWarnings, warnings...)
    23  
    24  	if err != nil {
    25  		return allWarnings, err
    26  	}
    27  
    28  	org, warnings, err := actor.GetOrganizationByName(orgName)
    29  	allWarnings = append(allWarnings, warnings...)
    30  	if err != nil {
    31  		return allWarnings, err
    32  	}
    33  
    34  	space, warnings, err := actor.GetSpaceByNameAndOrganization(spaceName, org.GUID)
    35  	allWarnings = append(allWarnings, warnings...)
    36  	if err != nil {
    37  		return allWarnings, err
    38  	}
    39  
    40  	if path != "" && string(path[0]) != "/" {
    41  		path = "/" + path
    42  	}
    43  	_, apiWarnings, err := actor.CloudControllerClient.CreateRoute(ccv3.Route{
    44  		SpaceGUID:  space.GUID,
    45  		DomainGUID: domain.GUID,
    46  		Host:       hostname,
    47  		Path:       path,
    48  	})
    49  
    50  	actorWarnings := Warnings(apiWarnings)
    51  	allWarnings = append(allWarnings, actorWarnings...)
    52  
    53  	if _, ok := err.(ccerror.RouteNotUniqueError); ok {
    54  		return allWarnings, actionerror.RouteAlreadyExistsError{Err: err}
    55  	}
    56  
    57  	return allWarnings, err
    58  }
    59  
    60  func (actor Actor) GetRoutesBySpace(spaceGUID string) ([]Route, Warnings, error) {
    61  	allWarnings := Warnings{}
    62  
    63  	routes, warnings, err := actor.CloudControllerClient.GetRoutes(ccv3.Query{
    64  		Key:    ccv3.SpaceGUIDFilter,
    65  		Values: []string{spaceGUID},
    66  	})
    67  	allWarnings = append(allWarnings, warnings...)
    68  	if err != nil {
    69  		return nil, allWarnings, err
    70  	}
    71  
    72  	spaces, warnings, err := actor.CloudControllerClient.GetSpaces(ccv3.Query{
    73  		Key:    ccv3.GUIDFilter,
    74  		Values: []string{spaceGUID},
    75  	})
    76  	allWarnings = append(allWarnings, warnings...)
    77  	if err != nil {
    78  		return nil, allWarnings, err
    79  	}
    80  
    81  	domainGUIDsSet := map[string]struct{}{}
    82  	for _, route := range routes {
    83  		domainGUIDsSet[route.DomainGUID] = struct{}{}
    84  	}
    85  	domainGUIDs := []string{}
    86  	for elem := range domainGUIDsSet {
    87  		domainGUIDs = append(domainGUIDs, elem)
    88  	}
    89  
    90  	domains, warnings, err := actor.CloudControllerClient.GetDomains(ccv3.Query{
    91  		Key:    ccv3.GUIDFilter,
    92  		Values: domainGUIDs,
    93  	})
    94  	allWarnings = append(allWarnings, warnings...)
    95  	if err != nil {
    96  		return nil, allWarnings, err
    97  	}
    98  
    99  	spacesByGUID := map[string]ccv3.Space{}
   100  	for _, space := range spaces {
   101  		spacesByGUID[space.GUID] = space
   102  	}
   103  
   104  	domainsByGUID := map[string]ccv3.Domain{}
   105  	for _, domain := range domains {
   106  		domainsByGUID[domain.GUID] = domain
   107  	}
   108  
   109  	actorRoutes := []Route{}
   110  	for _, route := range routes {
   111  		actorRoutes = append(actorRoutes, Route{
   112  			GUID:       route.GUID,
   113  			Host:       route.Host,
   114  			Path:       route.Path,
   115  			SpaceGUID:  route.SpaceGUID,
   116  			DomainGUID: route.DomainGUID,
   117  			SpaceName:  spacesByGUID[route.SpaceGUID].Name,
   118  			DomainName: domainsByGUID[route.DomainGUID].Name,
   119  		})
   120  	}
   121  
   122  	return actorRoutes, allWarnings, nil
   123  }
   124  
   125  func (actor Actor) GetRoutesByOrg(orgGUID string) ([]Route, Warnings, error) {
   126  	allWarnings := Warnings{}
   127  
   128  	routes, warnings, err := actor.CloudControllerClient.GetRoutes(ccv3.Query{
   129  		Key:    ccv3.OrganizationGUIDFilter,
   130  		Values: []string{orgGUID},
   131  	})
   132  	allWarnings = append(allWarnings, warnings...)
   133  	if err != nil {
   134  		return nil, allWarnings, err
   135  	}
   136  
   137  	spaceGUIDsSet := map[string]struct{}{}
   138  	domainGUIDsSet := map[string]struct{}{}
   139  	spacesQuery := ccv3.Query{Key: ccv3.GUIDFilter, Values: []string{}}
   140  	domainsQuery := ccv3.Query{Key: ccv3.GUIDFilter, Values: []string{}}
   141  
   142  	for _, route := range routes {
   143  		if _, ok := spaceGUIDsSet[route.SpaceGUID]; !ok {
   144  			spacesQuery.Values = append(spacesQuery.Values, route.SpaceGUID)
   145  			spaceGUIDsSet[route.SpaceGUID] = struct{}{}
   146  		}
   147  
   148  		if _, ok := domainGUIDsSet[route.DomainGUID]; !ok {
   149  			domainsQuery.Values = append(domainsQuery.Values, route.DomainGUID)
   150  			domainGUIDsSet[route.DomainGUID] = struct{}{}
   151  		}
   152  	}
   153  
   154  	spaces, warnings, err := actor.CloudControllerClient.GetSpaces(spacesQuery)
   155  	allWarnings = append(allWarnings, warnings...)
   156  	if err != nil {
   157  		return nil, allWarnings, err
   158  	}
   159  
   160  	domains, warnings, err := actor.CloudControllerClient.GetDomains(domainsQuery)
   161  	allWarnings = append(allWarnings, warnings...)
   162  	if err != nil {
   163  		return nil, allWarnings, err
   164  	}
   165  
   166  	spacesByGUID := map[string]ccv3.Space{}
   167  	for _, space := range spaces {
   168  		spacesByGUID[space.GUID] = space
   169  	}
   170  
   171  	domainsByGUID := map[string]ccv3.Domain{}
   172  	for _, domain := range domains {
   173  		domainsByGUID[domain.GUID] = domain
   174  	}
   175  
   176  	actorRoutes := []Route{}
   177  	for _, route := range routes {
   178  		actorRoutes = append(actorRoutes, Route{
   179  			GUID:       route.GUID,
   180  			Host:       route.Host,
   181  			Path:       route.Path,
   182  			SpaceGUID:  route.SpaceGUID,
   183  			DomainGUID: route.DomainGUID,
   184  			SpaceName:  spacesByGUID[route.SpaceGUID].Name,
   185  			DomainName: domainsByGUID[route.DomainGUID].Name,
   186  		})
   187  	}
   188  
   189  	return actorRoutes, allWarnings, nil
   190  }
   191  
   192  func (actor Actor) DeleteRoute(domainName, hostname, path string) (Warnings, error) {
   193  	allWarnings := Warnings{}
   194  	domain, warnings, err := actor.GetDomainByName(domainName)
   195  	allWarnings = append(allWarnings, warnings...)
   196  
   197  	if err != nil {
   198  		return allWarnings, err
   199  	}
   200  
   201  	if path != "" && string(path[0]) != "/" {
   202  		path = "/" + path
   203  	}
   204  
   205  	routes, apiWarnings, err := actor.CloudControllerClient.GetRoutes([]ccv3.Query{
   206  		{Key: "domain_guids", Values: []string{domain.GUID}},
   207  		{Key: "hosts", Values: []string{hostname}},
   208  		{Key: "paths", Values: []string{path}},
   209  	}...)
   210  
   211  	actorWarnings := Warnings(apiWarnings)
   212  	allWarnings = append(allWarnings, actorWarnings...)
   213  
   214  	if err != nil {
   215  		return allWarnings, err
   216  	}
   217  
   218  	if len(routes) == 0 {
   219  		return allWarnings, actionerror.RouteNotFoundError{
   220  			DomainName: domainName,
   221  			Host:       hostname,
   222  			Path:       path,
   223  		}
   224  	}
   225  	_, apiWarnings, err = actor.CloudControllerClient.DeleteRoute(routes[0].GUID)
   226  
   227  	actorWarnings = Warnings(apiWarnings)
   228  	allWarnings = append(allWarnings, actorWarnings...)
   229  
   230  	return allWarnings, err
   231  }