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  }