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 }