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

     1  /*
     2   * Copyright 2020 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  // NsxtTier0Router
    15  type NsxtTier0Router struct {
    16  	NsxtTier0Router *types.NsxtTier0Router
    17  	client          *Client
    18  }
    19  
    20  // GetImportableNsxtTier0RouterByName retrieves NSX-T tier 0 router by given parent NSX-T manager ID and Tier 0 router
    21  // name
    22  //
    23  // Warning. The API returns only unused Tier-0 routers (the ones that are not used in external networks yet)
    24  //
    25  // Note. NSX-T manager ID is mandatory and must be in URN format (e.g.
    26  // urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc)
    27  
    28  func (vcdClient *VCDClient) GetImportableNsxtTier0RouterByName(name, nsxtManagerId string) (*NsxtTier0Router, error) {
    29  	if nsxtManagerId == "" {
    30  		return nil, fmt.Errorf("no NSX-T manager ID specified")
    31  	}
    32  
    33  	if !isUrn(nsxtManagerId) {
    34  		return nil, fmt.Errorf("NSX-T manager ID is not URN (e.g. 'urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc)', got: %s", nsxtManagerId)
    35  	}
    36  
    37  	if name == "" {
    38  		return nil, fmt.Errorf("empty Tier 0 router name specified")
    39  	}
    40  
    41  	// Ideally FIQL filter could be used to filter on server side and get only desired result, but filtering on
    42  	// 'displayName' is not yet supported. The only supported field for filtering is
    43  	// _context==urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc to specify parent NSX-T manager (This
    44  	// automatically happens in GetAllImportableNsxtTier0Routers()). The below filter injection is left as documentation.
    45  	/*
    46  		queryParameters := copyOrNewUrlValues(nil)
    47  		queryParameters.Add("filter", "displayName=="+name)
    48  	*/
    49  
    50  	nsxtTier0Routers, err := vcdClient.GetAllImportableNsxtTier0Routers(nsxtManagerId, nil)
    51  	if err != nil {
    52  		return nil, fmt.Errorf("could not find NSX-T Tier-0 router with name '%s' for NSX-T manager with id '%s': %s",
    53  			name, nsxtManagerId, err)
    54  	}
    55  
    56  	// TODO remove this when FIQL supports filtering on 'displayName'
    57  	nsxtTier0Routers = filterNsxtTier0RoutersInExternalNetworks(name, nsxtTier0Routers)
    58  	// EOF TODO remove this when FIQL supports filtering on 'displayName'
    59  
    60  	if len(nsxtTier0Routers) == 0 {
    61  		// ErrorEntityNotFound is injected here for the ability to validate problem using ContainsNotFound()
    62  		return nil, fmt.Errorf("%s: no NSX-T Tier-0 router with name '%s' for NSX-T manager with id '%s' found",
    63  			ErrorEntityNotFound, name, nsxtManagerId)
    64  	}
    65  
    66  	if len(nsxtTier0Routers) > 1 {
    67  		return nil, fmt.Errorf("more than one (%d) NSX-T Tier-0 router with name '%s' for NSX-T manager with id '%s' found",
    68  			len(nsxtTier0Routers), name, nsxtManagerId)
    69  	}
    70  
    71  	return nsxtTier0Routers[0], nil
    72  }
    73  
    74  // filterNsxtTier0RoutersInExternalNetworks is created as a fix for local filtering instead of using
    75  // FIQL filter (because it does not support it).
    76  func filterNsxtTier0RoutersInExternalNetworks(name string, allNnsxtTier0Routers []*NsxtTier0Router) []*NsxtTier0Router {
    77  	filteredNsxtTier0Routers := make([]*NsxtTier0Router, 0)
    78  	for index, nsxtTier0Router := range allNnsxtTier0Routers {
    79  		if allNnsxtTier0Routers[index].NsxtTier0Router.DisplayName == name {
    80  			filteredNsxtTier0Routers = append(filteredNsxtTier0Routers, nsxtTier0Router)
    81  		}
    82  	}
    83  
    84  	return filteredNsxtTier0Routers
    85  
    86  }
    87  
    88  // GetAllImportableNsxtTier0Routers retrieves all NSX-T Tier-0 routers using OpenAPI endpoint. Query parameters can be
    89  // supplied to perform additional filtering. By default it injects FIQL filter _context==nsxtManagerId (e.g.
    90  // _context==urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc) because it is mandatory to list child Tier-0
    91  // routers.
    92  //
    93  // Warning. The API returns only unused Tier-0 routers (the ones that are not used in external networks yet)
    94  //
    95  // Note. IDs of Tier-0 routers do not have a standard and may look as strings when they are created using UI or as UUIDs
    96  // when they are created using API
    97  func (vcdClient *VCDClient) GetAllImportableNsxtTier0Routers(nsxtManagerId string, queryParameters url.Values) ([]*NsxtTier0Router, error) {
    98  	if !isUrn(nsxtManagerId) {
    99  		return nil, fmt.Errorf("NSX-T manager ID is not URN (e.g. 'urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc)', got: %s", nsxtManagerId)
   100  	}
   101  
   102  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointImportableTier0Routers
   103  	minimumApiVersion, err := vcdClient.Client.checkOpenApiEndpointCompatibility(endpoint)
   104  	if err != nil {
   105  		return nil, err
   106  	}
   107  
   108  	urlRef, err := vcdClient.Client.OpenApiBuildEndpoint(endpoint)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  
   113  	// Get all Tier-0 routers that are accessible to an organization VDC. Routers that are already associated with an
   114  	// External Network are filtered out. The “_context” filter key must be set with the id of the NSX-T manager for which
   115  	// we want to get the Tier-0 routers for.
   116  	//
   117  	// _context==urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc
   118  
   119  	// Create a copy of queryParameters so that original queryParameters are not mutated (because a map is always a
   120  	// reference)
   121  	queryParams := queryParameterFilterAnd("_context=="+nsxtManagerId, queryParameters)
   122  
   123  	typeResponses := []*types.NsxtTier0Router{{}}
   124  	err = vcdClient.Client.OpenApiGetAllItems(minimumApiVersion, urlRef, queryParams, &typeResponses, nil)
   125  	if err != nil {
   126  		return nil, err
   127  	}
   128  
   129  	returnObjects := make([]*NsxtTier0Router, len(typeResponses))
   130  	for sliceIndex := range typeResponses {
   131  		returnObjects[sliceIndex] = &NsxtTier0Router{
   132  			NsxtTier0Router: typeResponses[sliceIndex],
   133  			client:          &vcdClient.Client,
   134  		}
   135  	}
   136  
   137  	return returnObjects, nil
   138  }