github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_edgegateway_static_route.go (about)

     1  /*
     2   * Copyright 2022 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     3   */
     4  
     5  package govcd
     6  
     7  import (
     8  	"fmt"
     9  	"net/url"
    10  
    11  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    12  )
    13  
    14  // NsxtEdgeGatewayStaticRoute represents NSX-T Edge Gateway Static Route
    15  type NsxtEdgeGatewayStaticRoute struct {
    16  	NsxtEdgeGatewayStaticRoute *types.NsxtEdgeGatewayStaticRoute
    17  	client                     *Client
    18  	// edgeGatewayId is stored for usage in NsxtEdgeGatewayStaticRoute receiver functions
    19  	edgeGatewayId string
    20  }
    21  
    22  // CreateStaticRoute based on type definition
    23  func (egw *NsxtEdgeGateway) CreateStaticRoute(staticRouteConfig *types.NsxtEdgeGatewayStaticRoute) (*NsxtEdgeGatewayStaticRoute, error) {
    24  	client := egw.client
    25  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes
    26  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  
    31  	// Insert Edge Gateway ID into endpoint path
    32  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	returnObject := &NsxtEdgeGatewayStaticRoute{
    38  		client:                     egw.client,
    39  		edgeGatewayId:              egw.EdgeGateway.ID,
    40  		NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{},
    41  	}
    42  
    43  	// Non standard behavior of entity - `Details` field in task contains ID of newly created object while the Owner is Edge Gateway
    44  	task, err := client.OpenApiPostItemAsync(apiVersion, urlRef, nil, staticRouteConfig)
    45  	if err != nil {
    46  		return nil, fmt.Errorf("error creating NSX-T Edge Gateway Static Route: %s", err)
    47  	}
    48  
    49  	err = task.WaitTaskCompletion()
    50  	if err != nil {
    51  		return nil, fmt.Errorf("error creating NSX-T Edge Gateway Static Route: %s", err)
    52  	}
    53  
    54  	// API does not return an ID for created object - we know that it is expected to be in
    55  	// task.Task.Details therefore attempt to find it, but if it is empty - look for an entity by a
    56  	// set of requested parameters
    57  	staticRouteId := task.Task.Details
    58  	if staticRouteId != "" {
    59  		getUrlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID), staticRouteId)
    60  		if err != nil {
    61  			return nil, err
    62  		}
    63  		err = client.OpenApiGetItem(apiVersion, getUrlRef, nil, returnObject.NsxtEdgeGatewayStaticRoute, nil)
    64  		if err != nil {
    65  			return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route after creation: %s", err)
    66  		}
    67  	} else {
    68  		// ID was not present in response, therefore Static Route needs to be found manually. Using
    69  		// 'Name', 'Description' and 'NetworkCidr' for finding the entity. Duplicate entries can
    70  		// exist, but but it should be a good enough combination for finding unique entry until VCD API is fixed
    71  		allStaticRoutes, err := egw.GetAllStaticRoutes(nil)
    72  		if err != nil {
    73  			return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route after creation: %s", err)
    74  		}
    75  
    76  		var foundStaticRoute bool
    77  		for _, singleStaticRoute := range allStaticRoutes {
    78  			if singleStaticRoute.NsxtEdgeGatewayStaticRoute.Name == staticRouteConfig.Name &&
    79  				singleStaticRoute.NsxtEdgeGatewayStaticRoute.NetworkCidr == staticRouteConfig.NetworkCidr &&
    80  				singleStaticRoute.NsxtEdgeGatewayStaticRoute.Description == staticRouteConfig.Description {
    81  				foundStaticRoute = true
    82  				returnObject = singleStaticRoute
    83  				break
    84  			}
    85  		}
    86  
    87  		if !foundStaticRoute {
    88  			return nil, fmt.Errorf("error finding Static Route after creation by Name '%s', NetworkCidr '%s', Description '%s'",
    89  				staticRouteConfig.Name, staticRouteConfig.NetworkCidr, staticRouteConfig.Description)
    90  		}
    91  
    92  	}
    93  
    94  	return returnObject, nil
    95  }
    96  
    97  // GetAllStaticRoutes retrieves all Static Routes for a particular NSX-T Edge Gateway
    98  func (egw *NsxtEdgeGateway) GetAllStaticRoutes(queryParameters url.Values) ([]*NsxtEdgeGatewayStaticRoute, error) {
    99  	client := egw.client
   100  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes
   101  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   102  	if err != nil {
   103  		return nil, err
   104  	}
   105  
   106  	// Insert Edge Gateway ID into endpoint path
   107  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID))
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	typeResponses := []*types.NsxtEdgeGatewayStaticRoute{{}}
   113  	err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil)
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	wrappedResponses := make([]*NsxtEdgeGatewayStaticRoute, len(typeResponses))
   119  	for sliceIndex := range typeResponses {
   120  		wrappedResponses[sliceIndex] = &NsxtEdgeGatewayStaticRoute{
   121  			NsxtEdgeGatewayStaticRoute: typeResponses[sliceIndex],
   122  			client:                     client,
   123  			edgeGatewayId:              egw.EdgeGateway.ID,
   124  		}
   125  	}
   126  
   127  	return wrappedResponses, nil
   128  }
   129  
   130  // GetStaticRouteByNetworkCidr retrieves Static Route by network CIDR
   131  //
   132  // Note. It will return an error if more than one items is found
   133  func (egw *NsxtEdgeGateway) GetStaticRouteByNetworkCidr(networkCidr string) (*NsxtEdgeGatewayStaticRoute, error) {
   134  	if networkCidr == "" {
   135  		return nil, fmt.Errorf("cidr cannot be empty")
   136  	}
   137  
   138  	allStaticRoutes, err := egw.GetAllStaticRoutes(nil)
   139  	if err != nil {
   140  		return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err)
   141  	}
   142  
   143  	filteredByNetworkCidr := make([]*NsxtEdgeGatewayStaticRoute, 0)
   144  	for _, sr := range allStaticRoutes {
   145  		if sr.NsxtEdgeGatewayStaticRoute.NetworkCidr == networkCidr {
   146  			filteredByNetworkCidr = append(filteredByNetworkCidr, sr)
   147  		}
   148  	}
   149  
   150  	singleResult, err := oneOrError("networkCidr", networkCidr, filteredByNetworkCidr)
   151  	if err != nil {
   152  		return nil, err
   153  	}
   154  
   155  	return singleResult, nil
   156  }
   157  
   158  // GetStaticRouteByName retrieves Static Route by name
   159  //
   160  // Note. It will return an error if more than one items is found
   161  func (egw *NsxtEdgeGateway) GetStaticRouteByName(name string) (*NsxtEdgeGatewayStaticRoute, error) {
   162  	if name == "" {
   163  		return nil, fmt.Errorf("cidr cannot be empty")
   164  	}
   165  
   166  	allStaticRoutes, err := egw.GetAllStaticRoutes(nil)
   167  	if err != nil {
   168  		return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err)
   169  	}
   170  
   171  	filteredByNetworkName := make([]*NsxtEdgeGatewayStaticRoute, 0)
   172  	// First - filter by name
   173  	for _, sr := range allStaticRoutes {
   174  		if sr.NsxtEdgeGatewayStaticRoute.Name == name {
   175  			filteredByNetworkName = append(filteredByNetworkName, sr)
   176  		}
   177  	}
   178  
   179  	singleResult, err := oneOrError("name", name, filteredByNetworkName)
   180  	if err != nil {
   181  		return nil, err
   182  	}
   183  
   184  	return singleResult, nil
   185  }
   186  
   187  // GetStaticRouteById retrieves Static Route by given ID
   188  func (egw *NsxtEdgeGateway) GetStaticRouteById(id string) (*NsxtEdgeGatewayStaticRoute, error) {
   189  	if id == "" {
   190  		return nil, fmt.Errorf("ID is required")
   191  	}
   192  
   193  	client := egw.client
   194  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes
   195  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   196  	if err != nil {
   197  		return nil, err
   198  	}
   199  
   200  	// Insert Edge Gateway ID into endpoint path
   201  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, egw.EdgeGateway.ID), id)
   202  	if err != nil {
   203  		return nil, err
   204  	}
   205  
   206  	returnObject := &NsxtEdgeGatewayStaticRoute{
   207  		client:                     egw.client,
   208  		edgeGatewayId:              egw.EdgeGateway.ID,
   209  		NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{},
   210  	}
   211  
   212  	err = client.OpenApiGetItem(apiVersion, urlRef, nil, returnObject.NsxtEdgeGatewayStaticRoute, nil)
   213  	if err != nil {
   214  		return nil, fmt.Errorf("error retrieving NSX-T Edge Gateway Static Route: %s", err)
   215  	}
   216  
   217  	return returnObject, nil
   218  }
   219  
   220  // Update Static Route
   221  func (staticRoute *NsxtEdgeGatewayStaticRoute) Update(StaticRouteConfig *types.NsxtEdgeGatewayStaticRoute) (*NsxtEdgeGatewayStaticRoute, error) {
   222  	client := staticRoute.client
   223  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes
   224  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   225  	if err != nil {
   226  		return nil, err
   227  	}
   228  
   229  	// Insert Edge Gateway ID into endpoint path
   230  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, staticRoute.edgeGatewayId), StaticRouteConfig.ID)
   231  	if err != nil {
   232  		return nil, err
   233  	}
   234  
   235  	returnObject := &NsxtEdgeGatewayStaticRoute{
   236  		client:                     staticRoute.client,
   237  		edgeGatewayId:              staticRoute.edgeGatewayId,
   238  		NsxtEdgeGatewayStaticRoute: &types.NsxtEdgeGatewayStaticRoute{},
   239  	}
   240  
   241  	err = client.OpenApiPutItem(apiVersion, urlRef, nil, StaticRouteConfig, returnObject.NsxtEdgeGatewayStaticRoute, nil)
   242  	if err != nil {
   243  		return nil, fmt.Errorf("error setting NSX-T Edge Gateway Static Route: %s", err)
   244  	}
   245  
   246  	return returnObject, nil
   247  }
   248  
   249  // Delete Static Route
   250  func (staticRoute *NsxtEdgeGatewayStaticRoute) Delete() error {
   251  	client := staticRoute.client
   252  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeGatewayStaticRoutes
   253  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   254  	if err != nil {
   255  		return err
   256  	}
   257  
   258  	// Insert Edge Gateway ID into endpoint path
   259  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, staticRoute.edgeGatewayId), staticRoute.NsxtEdgeGatewayStaticRoute.ID)
   260  	if err != nil {
   261  		return err
   262  	}
   263  
   264  	err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil)
   265  	if err != nil {
   266  		return fmt.Errorf("error deleting NSX-T Edge Gateway Static Route: %s", err)
   267  	}
   268  
   269  	return nil
   270  }