github.com/cloudfoundry-community/cloudfoundry-cli@v6.44.1-0.20240130060226-cda5ed8e89a5+incompatible/api/cloudcontroller/ccv2/route_mapping.go (about) 1 package ccv2 2 3 import ( 4 "bytes" 5 "encoding/json" 6 7 "code.cloudfoundry.org/cli/api/cloudcontroller" 8 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 9 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/internal" 10 ) 11 12 // RouteMapping represents a Cloud Controller map between an application and route. 13 type RouteMapping struct { 14 // GUID is the unique route mapping identifier. 15 GUID string 16 17 // AppGUID is the unique application identifier. 18 AppGUID string 19 20 // RouteGUID is the unique route identifier. 21 RouteGUID string 22 23 // Port on which the application should listen, and to which requests for the mapped route will be routed 24 AppPort int 25 } 26 27 // UnmarshalJSON helps unmarshal a Cloud Controller Route Mapping 28 func (routeMapping *RouteMapping) UnmarshalJSON(data []byte) error { 29 var ccRouteMapping struct { 30 Metadata internal.Metadata `json:"metadata"` 31 Entity struct { 32 AppGUID string `json:"app_guid"` 33 RouteGUID string `json:"route_guid"` 34 AppPort int `json:"app_port"` 35 } `json:"entity"` 36 } 37 38 err := cloudcontroller.DecodeJSON(data, &ccRouteMapping) 39 if err != nil { 40 return err 41 } 42 43 routeMapping.GUID = ccRouteMapping.Metadata.GUID 44 routeMapping.AppGUID = ccRouteMapping.Entity.AppGUID 45 routeMapping.RouteGUID = ccRouteMapping.Entity.RouteGUID 46 routeMapping.AppPort = ccRouteMapping.Entity.AppPort 47 return nil 48 } 49 50 // GetRouteMapping returns a route mapping with the provided guid. 51 func (client *Client) GetRouteMapping(guid string) (RouteMapping, Warnings, error) { 52 request, err := client.newHTTPRequest(requestOptions{ 53 RequestName: internal.GetRouteMappingRequest, 54 URIParams: Params{"route_mapping_guid": guid}, 55 }) 56 if err != nil { 57 return RouteMapping{}, nil, err 58 } 59 60 var routeMapping RouteMapping 61 response := cloudcontroller.Response{ 62 DecodeJSONResponseInto: &routeMapping, 63 } 64 65 err = client.connection.Make(request, &response) 66 return routeMapping, response.Warnings, err 67 } 68 69 // DeleteRouteMapping delete a route mapping 70 func (client *Client) DeleteRouteMapping(guid string) (Warnings, error) { 71 request, err := client.newHTTPRequest(requestOptions{ 72 RequestName: internal.DeleteRouteMappingRequest, 73 URIParams: map[string]string{"route_mapping_guid": guid}, 74 }) 75 if err != nil { 76 return nil, err 77 } 78 79 response := cloudcontroller.Response{} 80 81 err = client.connection.Make(request, &response) 82 return response.Warnings, err 83 } 84 85 // GetRouteMappings returns a list of RouteMappings based off of the provided queries. 86 func (client *Client) GetRouteMappings(filters ...Filter) ([]RouteMapping, Warnings, error) { 87 request, err := client.newHTTPRequest(requestOptions{ 88 RequestName: internal.GetRouteMappingsRequest, 89 Query: ConvertFilterParameters(filters), 90 }) 91 if err != nil { 92 return nil, nil, err 93 } 94 95 var fullRouteMappingsList []RouteMapping 96 warnings, err := client.paginate(request, RouteMapping{}, func(item interface{}) error { 97 if routeMapping, ok := item.(RouteMapping); ok { 98 fullRouteMappingsList = append(fullRouteMappingsList, routeMapping) 99 } else { 100 return ccerror.UnknownObjectInListError{ 101 Expected: RouteMapping{}, 102 Unexpected: item, 103 } 104 } 105 return nil 106 }) 107 108 return fullRouteMappingsList, warnings, err 109 } 110 111 type createRouteMappingRequestBody struct { 112 AppGUID string `json:"app_guid"` 113 RouteGUID string `json:"route_guid"` 114 AppPort *int `json:"app_port,omitempty"` 115 } 116 117 // CreateRouteMapping creates a cloud controller route mapping in with the given settings. 118 func (client *Client) CreateRouteMapping(appGuid, routeGuid string, appPort *int) (RouteMapping, Warnings, error) { 119 requestBody := createRouteMappingRequestBody{ 120 AppGUID: appGuid, 121 RouteGUID: routeGuid, 122 AppPort: appPort, 123 } 124 125 bodyBytes, err := json.Marshal(requestBody) 126 if err != nil { 127 return RouteMapping{}, nil, err 128 } 129 130 request, err := client.newHTTPRequest(requestOptions{ 131 RequestName: internal.PostRouteMappingsRequest, 132 Body: bytes.NewReader(bodyBytes), 133 }) 134 if err != nil { 135 return RouteMapping{}, nil, err 136 } 137 138 var updatedObj RouteMapping 139 response := cloudcontroller.Response{ 140 DecodeJSONResponseInto: &updatedObj, 141 } 142 143 err = client.connection.Make(request, &response) 144 return updatedObj, response.Warnings, err 145 }