github.com/randomtask1155/cli@v6.41.1-0.20181227003417-a98eed78cbde+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 "code.cloudfoundry.org/cli/types" 14 ) 15 16 // Route represents a Cloud Controller Route. 17 type Route struct { 18 19 // GUID is the unique Route identifier. 20 GUID string `json:"-"` 21 22 // Host is the hostname of the route. 23 Host string `json:"host,omitempty"` 24 25 // Path is the path of the route. 26 Path string `json:"path,omitempty"` 27 28 // Port is the port number of the route. 29 Port types.NullInt `json:"port,omitempty"` 30 31 // DomainGUID is the unique Domain identifier. 32 DomainGUID string `json:"domain_guid"` 33 34 // SpaceGUID is the unique Space identifier. 35 SpaceGUID string `json:"space_guid"` 36 } 37 38 // UnmarshalJSON helps unmarshal a Cloud Controller Route response. 39 func (route *Route) UnmarshalJSON(data []byte) error { 40 var ccRoute struct { 41 Metadata internal.Metadata `json:"metadata"` 42 Entity struct { 43 Host string `json:"host"` 44 Path string `json:"path"` 45 Port types.NullInt `json:"port"` 46 DomainGUID string `json:"domain_guid"` 47 SpaceGUID string `json:"space_guid"` 48 } `json:"entity"` 49 } 50 err := cloudcontroller.DecodeJSON(data, &ccRoute) 51 if err != nil { 52 return err 53 } 54 55 route.GUID = ccRoute.Metadata.GUID 56 route.Host = ccRoute.Entity.Host 57 route.Path = ccRoute.Entity.Path 58 route.Port = ccRoute.Entity.Port 59 route.DomainGUID = ccRoute.Entity.DomainGUID 60 route.SpaceGUID = ccRoute.Entity.SpaceGUID 61 return nil 62 } 63 64 // CheckRoute returns true if the route exists in the CF instance. 65 func (client *Client) CheckRoute(route Route) (bool, Warnings, error) { 66 request, err := client.newHTTPRequest(requestOptions{ 67 RequestName: internal.GetRouteReservedRequest, 68 URIParams: map[string]string{"domain_guid": route.DomainGUID}, 69 }) 70 if err != nil { 71 return false, nil, err 72 } 73 74 queryParams := url.Values{} 75 if route.Host != "" { 76 queryParams.Add("host", route.Host) 77 } 78 if route.Path != "" { 79 queryParams.Add("path", route.Path) 80 } 81 if route.Port.IsSet { 82 queryParams.Add("port", fmt.Sprint(route.Port.Value)) 83 } 84 request.URL.RawQuery = queryParams.Encode() 85 86 var response cloudcontroller.Response 87 err = client.connection.Make(request, &response) 88 if _, ok := err.(ccerror.ResourceNotFoundError); ok { 89 return false, response.Warnings, nil 90 } 91 92 return response.HTTPResponse.StatusCode == http.StatusNoContent, response.Warnings, err 93 } 94 95 // CreateRoute creates the route with the given properties; SpaceGUID and 96 // DomainGUID are required Route properties. Additional configuration rules: 97 // - generatePort = true to generate a random port on the cloud controller. 98 // - generatePort takes precedence over the provided port. Setting the port and 99 // generatePort only works with CC API 2.53.0 or higher and when TCP router 100 // groups are enabled. 101 func (client *Client) CreateRoute(route Route, generatePort bool) (Route, Warnings, error) { 102 body, err := json.Marshal(route) 103 if err != nil { 104 return Route{}, nil, err 105 } 106 107 request, err := client.newHTTPRequest(requestOptions{ 108 RequestName: internal.PostRouteRequest, 109 Body: bytes.NewReader(body), 110 }) 111 if err != nil { 112 return Route{}, nil, err 113 } 114 115 if generatePort { 116 query := url.Values{} 117 query.Add("generate_port", "true") 118 request.URL.RawQuery = query.Encode() 119 } 120 121 var updatedRoute Route 122 response := cloudcontroller.Response{ 123 DecodeJSONResponseInto: &updatedRoute, 124 } 125 126 err = client.connection.Make(request, &response) 127 return updatedRoute, response.Warnings, err 128 } 129 130 // DeleteRoute deletes the Route associated with the provided Route GUID. 131 func (client *Client) DeleteRoute(routeGUID string) (Warnings, error) { 132 request, err := client.newHTTPRequest(requestOptions{ 133 RequestName: internal.DeleteRouteRequest, 134 URIParams: map[string]string{"route_guid": routeGUID}, 135 }) 136 if err != nil { 137 return nil, err 138 } 139 140 var response cloudcontroller.Response 141 err = client.connection.Make(request, &response) 142 return response.Warnings, err 143 } 144 145 // DeleteRouteApplication removes the link between the route and application. 146 func (client *Client) DeleteRouteApplication(routeGUID string, appGUID string) (Warnings, error) { 147 request, err := client.newHTTPRequest(requestOptions{ 148 RequestName: internal.DeleteRouteAppRequest, 149 URIParams: map[string]string{ 150 "app_guid": appGUID, 151 "route_guid": routeGUID, 152 }, 153 }) 154 if err != nil { 155 return nil, err 156 } 157 158 var response cloudcontroller.Response 159 err = client.connection.Make(request, &response) 160 return response.Warnings, err 161 } 162 163 // GetApplicationRoutes returns a list of Routes associated with the provided 164 // Application GUID, and filtered by the provided filters. 165 func (client *Client) GetApplicationRoutes(appGUID string, filters ...Filter) ([]Route, Warnings, error) { 166 request, err := client.newHTTPRequest(requestOptions{ 167 RequestName: internal.GetAppRoutesRequest, 168 URIParams: map[string]string{"app_guid": appGUID}, 169 Query: ConvertFilterParameters(filters), 170 }) 171 if err != nil { 172 return nil, nil, err 173 } 174 175 var fullRoutesList []Route 176 warnings, err := client.paginate(request, Route{}, func(item interface{}) error { 177 if route, ok := item.(Route); ok { 178 fullRoutesList = append(fullRoutesList, route) 179 } else { 180 return ccerror.UnknownObjectInListError{ 181 Expected: Route{}, 182 Unexpected: item, 183 } 184 } 185 return nil 186 }) 187 188 return fullRoutesList, warnings, err 189 } 190 191 // GetRoute returns a route with the provided guid. 192 func (client *Client) GetRoute(guid string) (Route, Warnings, error) { 193 request, err := client.newHTTPRequest(requestOptions{ 194 RequestName: internal.GetRouteRequest, 195 URIParams: Params{"route_guid": guid}, 196 }) 197 if err != nil { 198 return Route{}, nil, err 199 } 200 201 var route Route 202 response := cloudcontroller.Response{ 203 DecodeJSONResponseInto: &route, 204 } 205 206 err = client.connection.Make(request, &response) 207 return route, response.Warnings, err 208 } 209 210 // GetRoutes returns a list of Routes based off of the provided filters. 211 func (client *Client) GetRoutes(filters ...Filter) ([]Route, Warnings, error) { 212 request, err := client.newHTTPRequest(requestOptions{ 213 RequestName: internal.GetRoutesRequest, 214 Query: ConvertFilterParameters(filters), 215 }) 216 if err != nil { 217 return nil, nil, err 218 } 219 220 var fullRoutesList []Route 221 warnings, err := client.paginate(request, Route{}, func(item interface{}) error { 222 if route, ok := item.(Route); ok { 223 fullRoutesList = append(fullRoutesList, route) 224 } else { 225 return ccerror.UnknownObjectInListError{ 226 Expected: Route{}, 227 Unexpected: item, 228 } 229 } 230 return nil 231 }) 232 233 return fullRoutesList, warnings, err 234 } 235 236 // GetSpaceRoutes returns a list of Routes associated with the provided Space 237 // GUID, and filtered by the provided filters. 238 func (client *Client) GetSpaceRoutes(spaceGUID string, filters ...Filter) ([]Route, Warnings, error) { 239 request, err := client.newHTTPRequest(requestOptions{ 240 RequestName: internal.GetSpaceRoutesRequest, 241 URIParams: map[string]string{"space_guid": spaceGUID}, 242 Query: ConvertFilterParameters(filters), 243 }) 244 if err != nil { 245 return nil, nil, err 246 } 247 248 var fullRoutesList []Route 249 warnings, err := client.paginate(request, Route{}, func(item interface{}) error { 250 if route, ok := item.(Route); ok { 251 fullRoutesList = append(fullRoutesList, route) 252 } else { 253 return ccerror.UnknownObjectInListError{ 254 Expected: Route{}, 255 Unexpected: item, 256 } 257 } 258 return nil 259 }) 260 261 return fullRoutesList, warnings, err 262 } 263 264 // UpdateRouteApplication creates a link between the route and application. 265 func (client *Client) UpdateRouteApplication(routeGUID string, appGUID string) (Route, Warnings, error) { 266 request, err := client.newHTTPRequest(requestOptions{ 267 RequestName: internal.PutRouteAppRequest, 268 URIParams: map[string]string{ 269 "app_guid": appGUID, 270 "route_guid": routeGUID, 271 }, 272 }) 273 if err != nil { 274 return Route{}, nil, err 275 } 276 277 var route Route 278 response := cloudcontroller.Response{ 279 DecodeJSONResponseInto: &route, 280 } 281 err = client.connection.Make(request, &response) 282 283 return route, response.Warnings, err 284 } 285 286 func (client *Client) checkRouteDeprecated(domainGUID string, host string, path string) (bool, Warnings, error) { 287 request, err := client.newHTTPRequest(requestOptions{ 288 RequestName: internal.GetRouteReservedDeprecatedRequest, 289 URIParams: map[string]string{"domain_guid": domainGUID, "host": host}, 290 }) 291 if err != nil { 292 return false, nil, err 293 } 294 295 queryParams := url.Values{} 296 if path != "" { 297 queryParams.Add("path", path) 298 } 299 request.URL.RawQuery = queryParams.Encode() 300 301 var response cloudcontroller.Response 302 err = client.connection.Make(request, &response) 303 if _, ok := err.(ccerror.ResourceNotFoundError); ok { 304 return false, response.Warnings, nil 305 } 306 307 return response.HTTPResponse.StatusCode == http.StatusNoContent, response.Warnings, err 308 }