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 }