github.com/jghiloni/cli@v6.28.1-0.20170628223758-0ce05fe032a2+incompatible/api/cloudcontroller/ccv2/route.go (about)

     1  package ccv2
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  
    10  	"code.cloudfoundry.org/cli/api/cloudcontroller"
    11  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
    12  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal"
    13  )
    14  
    15  // Route represents a Cloud Controller Route.
    16  type Route struct {
    17  	GUID       string `json:"-"`
    18  	Host       string `json:"host,omitempty"`
    19  	Path       string `json:"path,omitempty"`
    20  	Port       int    `json:"port,omitempty"`
    21  	DomainGUID string `json:"domain_guid"`
    22  	SpaceGUID  string `json:"space_guid"`
    23  }
    24  
    25  // UnmarshalJSON helps unmarshal a Cloud Controller Route response.
    26  func (route *Route) UnmarshalJSON(data []byte) error {
    27  	var ccRoute struct {
    28  		Metadata internal.Metadata `json:"metadata"`
    29  		Entity   struct {
    30  			Host       string `json:"host"`
    31  			Path       string `json:"path"`
    32  			Port       int    `json:"port"`
    33  			DomainGUID string `json:"domain_guid"`
    34  			SpaceGUID  string `json:"space_guid"`
    35  		} `json:"entity"`
    36  	}
    37  	if err := json.Unmarshal(data, &ccRoute); err != nil {
    38  		return err
    39  	}
    40  
    41  	route.GUID = ccRoute.Metadata.GUID
    42  	route.Host = ccRoute.Entity.Host
    43  	route.Path = ccRoute.Entity.Path
    44  	route.Port = ccRoute.Entity.Port
    45  	route.DomainGUID = ccRoute.Entity.DomainGUID
    46  	route.SpaceGUID = ccRoute.Entity.SpaceGUID
    47  	return nil
    48  }
    49  
    50  // BindRouteToApplication binds the given route to the given application.
    51  func (client *Client) BindRouteToApplication(routeGUID string, appGUID string) (Route, Warnings, error) {
    52  	request, err := client.newHTTPRequest(requestOptions{
    53  		RequestName: internal.PutBindRouteAppRequest,
    54  		URIParams: map[string]string{
    55  			"app_guid":   appGUID,
    56  			"route_guid": routeGUID,
    57  		},
    58  	})
    59  	if err != nil {
    60  		return Route{}, nil, err
    61  	}
    62  
    63  	var route Route
    64  	response := cloudcontroller.Response{
    65  		Result: &route,
    66  	}
    67  	err = client.connection.Make(request, &response)
    68  
    69  	return route, response.Warnings, err
    70  }
    71  
    72  // CreateRoute creates the route with the given properties; SpaceGUID and
    73  // DomainGUID are required. Set generatePort true to generate a random port on
    74  // the cloud controller. generatePort takes precedence over manually specified
    75  // port. Setting the port and generatePort only works with CC API 2.53.0 or
    76  // higher and when TCP router groups are enabled.
    77  func (client *Client) CreateRoute(route Route, generatePort bool) (Route, Warnings, error) {
    78  	body, err := json.Marshal(route)
    79  	if err != nil {
    80  		return Route{}, nil, err
    81  	}
    82  
    83  	request, err := client.newHTTPRequest(requestOptions{
    84  		RequestName: internal.PostRouteRequest,
    85  		Body:        bytes.NewReader(body),
    86  	})
    87  	if err != nil {
    88  		return Route{}, nil, err
    89  	}
    90  
    91  	if generatePort {
    92  		query := url.Values{}
    93  		query.Add("generate_port", "true")
    94  		request.URL.RawQuery = query.Encode()
    95  	}
    96  
    97  	var updatedRoute Route
    98  	response := cloudcontroller.Response{
    99  		Result: &updatedRoute,
   100  	}
   101  
   102  	err = client.connection.Make(request, &response)
   103  	return updatedRoute, response.Warnings, err
   104  }
   105  
   106  // GetApplicationRoutes returns a list of Routes associated with the provided
   107  // Application GUID, and filtered by the provided queries.
   108  func (client *Client) GetApplicationRoutes(appGUID string, queryParams []Query) ([]Route, Warnings, error) {
   109  	request, err := client.newHTTPRequest(requestOptions{
   110  		RequestName: internal.GetAppRoutesRequest,
   111  		URIParams:   map[string]string{"app_guid": appGUID},
   112  		Query:       FormatQueryParameters(queryParams),
   113  	})
   114  	if err != nil {
   115  		return nil, nil, err
   116  	}
   117  
   118  	var fullRoutesList []Route
   119  	warnings, err := client.paginate(request, Route{}, func(item interface{}) error {
   120  		if route, ok := item.(Route); ok {
   121  			fullRoutesList = append(fullRoutesList, route)
   122  		} else {
   123  			return ccerror.UnknownObjectInListError{
   124  				Expected:   Route{},
   125  				Unexpected: item,
   126  			}
   127  		}
   128  		return nil
   129  	})
   130  
   131  	return fullRoutesList, warnings, err
   132  }
   133  
   134  // GetSpaceRoutes returns a list of Routes associated with the provided Space
   135  // GUID, and filtered by the provided queries.
   136  func (client *Client) GetSpaceRoutes(spaceGUID string, queryParams []Query) ([]Route, Warnings, error) {
   137  	request, err := client.newHTTPRequest(requestOptions{
   138  		RequestName: internal.GetSpaceRoutesRequest,
   139  		URIParams:   map[string]string{"space_guid": spaceGUID},
   140  		Query:       FormatQueryParameters(queryParams),
   141  	})
   142  	if err != nil {
   143  		return nil, nil, err
   144  	}
   145  
   146  	var fullRoutesList []Route
   147  	warnings, err := client.paginate(request, Route{}, func(item interface{}) error {
   148  		if route, ok := item.(Route); ok {
   149  			fullRoutesList = append(fullRoutesList, route)
   150  		} else {
   151  			return ccerror.UnknownObjectInListError{
   152  				Expected:   Route{},
   153  				Unexpected: item,
   154  			}
   155  		}
   156  		return nil
   157  	})
   158  
   159  	return fullRoutesList, warnings, err
   160  }
   161  
   162  // GetRoutes returns a list of Routes based off of the provided queries.
   163  func (client *Client) GetRoutes(queryParams []Query) ([]Route, Warnings, error) {
   164  	request, err := client.newHTTPRequest(requestOptions{
   165  		RequestName: internal.GetRoutesRequest,
   166  		Query:       FormatQueryParameters(queryParams),
   167  	})
   168  	if err != nil {
   169  		return nil, nil, err
   170  	}
   171  
   172  	var fullRoutesList []Route
   173  	warnings, err := client.paginate(request, Route{}, func(item interface{}) error {
   174  		if route, ok := item.(Route); ok {
   175  			fullRoutesList = append(fullRoutesList, route)
   176  		} else {
   177  			return ccerror.UnknownObjectInListError{
   178  				Expected:   Route{},
   179  				Unexpected: item,
   180  			}
   181  		}
   182  		return nil
   183  	})
   184  
   185  	return fullRoutesList, warnings, err
   186  }
   187  
   188  // DeleteRoute deletes the Route associated with the provided Route GUID.
   189  func (client *Client) DeleteRoute(routeGUID string) (Warnings, error) {
   190  	request, err := client.newHTTPRequest(requestOptions{
   191  		RequestName: internal.DeleteRouteRequest,
   192  		URIParams:   map[string]string{"route_guid": routeGUID},
   193  	})
   194  	if err != nil {
   195  		return nil, err
   196  	}
   197  
   198  	var response cloudcontroller.Response
   199  	err = client.connection.Make(request, &response)
   200  	return response.Warnings, err
   201  }
   202  
   203  // CheckRoute returns true if the route exists in the CF instance. DomainGUID
   204  // is required for check. This call will only work for CC API 2.55 or higher.
   205  func (client *Client) CheckRoute(route Route) (bool, Warnings, error) {
   206  	request, err := client.newHTTPRequest(requestOptions{
   207  		RequestName: internal.GetRouteReservedRequest,
   208  		URIParams:   map[string]string{"domain_guid": route.DomainGUID},
   209  	})
   210  	if err != nil {
   211  		return false, nil, err
   212  	}
   213  
   214  	queryParams := url.Values{}
   215  	if route.Host != "" {
   216  		queryParams.Add("host", route.Host)
   217  	}
   218  	if route.Path != "" {
   219  		queryParams.Add("path", route.Path)
   220  	}
   221  	if route.Port != 0 {
   222  		queryParams.Add("port", fmt.Sprint(route.Port))
   223  	}
   224  	request.URL.RawQuery = queryParams.Encode()
   225  
   226  	var response cloudcontroller.Response
   227  	err = client.connection.Make(request, &response)
   228  	if _, ok := err.(ccerror.ResourceNotFoundError); ok {
   229  		return false, response.Warnings, nil
   230  	}
   231  
   232  	return response.HTTPResponse.StatusCode == http.StatusNoContent, response.Warnings, err
   233  }