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  }