github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_edge_cluster.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 // NsxtEdgeCluster is a logical grouping of NSX-T Edge virtual machines. 15 type NsxtEdgeCluster struct { 16 NsxtEdgeCluster *types.NsxtEdgeCluster 17 client *Client 18 } 19 20 // GetNsxtEdgeClusterByName retrieves a particular NSX-T Edge Cluster by name available for that VDC 21 // Note: Multiple NSX-T Edge Clusters with the same name may exist. 22 func (vdc *Vdc) GetNsxtEdgeClusterByName(name string) (*NsxtEdgeCluster, error) { 23 if name == "" { 24 return nil, fmt.Errorf("empty NSX-T Edge Cluster name specified") 25 } 26 27 // Ideally FIQL filter could be used to filter on server side and get only desired result, but filtering on 28 // 'name' is not yet supported. The only supported field for filtering is 29 // _context==urn:vcloud:vdc:09722307-aee0-4623-af95-7f8e577c9ebc to specify parent Org VDC (This 30 // automatically happens in GetAllNsxtEdgeClusters()). The below filter injection is left as documentation. 31 /* 32 queryParameters := copyOrNewUrlValues(nil) 33 queryParameters.Add("filter", "name=="+name) 34 */ 35 36 nsxtEdgeClusters, err := vdc.GetAllNsxtEdgeClusters(nil) 37 if err != nil { 38 return nil, fmt.Errorf("could not find NSX-T Edge Cluster with name '%s' for Org VDC with id '%s': %s", 39 name, vdc.Vdc.ID, err) 40 } 41 42 // TODO remove this when FIQL supports filtering on 'name' 43 nsxtEdgeClusters = filterNsxtEdgeClusters(name, nsxtEdgeClusters) 44 // EOF TODO remove this when FIQL supports filtering on 'name' 45 46 if len(nsxtEdgeClusters) == 0 { 47 // ErrorEntityNotFound is injected here for the ability to validate problem using ContainsNotFound() 48 return nil, fmt.Errorf("%s: no NSX-T Tier-0 Edge Cluster with name '%s' for Org VDC with id '%s' found", 49 ErrorEntityNotFound, name, vdc.Vdc.ID) 50 } 51 52 if len(nsxtEdgeClusters) > 1 { 53 return nil, fmt.Errorf("more than one (%d) NSX-T Edge Cluster with name '%s' for Org VDC with id '%s' found", 54 len(nsxtEdgeClusters), name, vdc.Vdc.ID) 55 } 56 57 return nsxtEdgeClusters[0], nil 58 } 59 60 // filterNsxtEdgeClusters is a helper to filter NSX-T Edge Clusters by name because the FIQL filter does not support 61 // filtering by name. 62 func filterNsxtEdgeClusters(name string, allNnsxtEdgeCluster []*NsxtEdgeCluster) []*NsxtEdgeCluster { 63 filteredNsxtEdgeClusters := make([]*NsxtEdgeCluster, 0) 64 for index, nsxtEdgeCluster := range allNnsxtEdgeCluster { 65 if allNnsxtEdgeCluster[index].NsxtEdgeCluster.Name == name { 66 filteredNsxtEdgeClusters = append(filteredNsxtEdgeClusters, nsxtEdgeCluster) 67 } 68 } 69 70 return filteredNsxtEdgeClusters 71 } 72 73 // GetAllNsxtEdgeClusters retrieves all available Edge Clusters for a particular VDC 74 func (vdc *Vdc) GetAllNsxtEdgeClusters(queryParameters url.Values) ([]*NsxtEdgeCluster, error) { 75 if vdc.Vdc.ID == "" { 76 return nil, fmt.Errorf("VDC must have ID populated to retrieve NSX-T edge clusters") 77 } 78 79 // Get all NSX-T Edge clusters that are accessible to an organization VDC. The 'orgVdcId'filter 80 // key must be set with the ID of the VDC for which we want to get available Edge Clusters for. 81 // 82 // orgVdcId==urn:vcloud:vdc:09722307-aee0-4623-af95-7f8e577c9ebc 83 84 // Create a copy of queryParameters so that original queryParameters are not mutated (because a map is always a 85 // reference) 86 queryParams := queryParameterFilterAnd("orgVdcId=="+vdc.Vdc.ID, queryParameters) 87 88 return getAllNsxtEdgeClusters(vdc.client, queryParams) 89 } 90 91 // GetAllNsxtEdgeClusters retrieves all NSX-T Edge Clusters in the system 92 // 93 // A filter is mandatory as otherwise request will fail 94 // orgVdcId - | The filter orgVdcId must be set equal to the id of the NSX-T backed Org vDC for 95 // which we want to get the edge clusters. Example: 96 // (orgVdcId==urn:vcloud:vdc:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 97 // vdcGroupId - | The filter vdcGroupId must be set equal to the id of the NSX-T VDC Group for which 98 // we want to get the edge clusters. Example: 99 // (vdcGroupId==urn:vcloud:vdcGroup:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 100 // pvdcId - | The filter pvdcId must be set equal to the id of the NSX-T backed Provider VDC for 101 // which we want to get the edge clusters. pvdcId filter is supported from version 35.2 Example: 102 // (pvdcId==urn:vcloud:providervdc:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) 103 func (vcdClient *VCDClient) GetAllNsxtEdgeClusters(queryParameters url.Values) ([]*NsxtEdgeCluster, error) { 104 return getAllNsxtEdgeClusters(&vcdClient.Client, queryParameters) 105 } 106 107 func getAllNsxtEdgeClusters(client *Client, queryParams url.Values) ([]*NsxtEdgeCluster, error) { 108 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointEdgeClusters 109 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 110 if err != nil { 111 return nil, err 112 } 113 114 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 115 if err != nil { 116 return nil, err 117 } 118 119 typeResponses := []*types.NsxtEdgeCluster{{}} 120 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil) 121 if err != nil { 122 return nil, err 123 } 124 125 returnObjects := make([]*NsxtEdgeCluster, len(typeResponses)) 126 for sliceIndex := range typeResponses { 127 returnObjects[sliceIndex] = &NsxtEdgeCluster{ 128 NsxtEdgeCluster: typeResponses[sliceIndex], 129 client: client, 130 } 131 } 132 133 return returnObjects, nil 134 }