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

     1  /*
     2   * Copyright 2023 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  // NsxtEdgeGatewayQosProfiles uses OpenAPI endpoint to fetch NSX-T Edge Gateway QoS Profiles defined
    15  // in NSX-T Manager. They can be used to configure QoS on NSX-T Edge Gateway.
    16  type NsxtEdgeGatewayQosProfile struct {
    17  	NsxtEdgeGatewayQosProfile *types.NsxtEdgeGatewayQosProfile
    18  	client                    *Client
    19  }
    20  
    21  // GetAllNsxtEdgeGatewayQosProfiles retrieves all NSX-T Edge Gateway QoS Profiles defined in NSX-T Manager
    22  func (vcdClient *VCDClient) GetAllNsxtEdgeGatewayQosProfiles(nsxtManagerId string, queryParameters url.Values) ([]*NsxtEdgeGatewayQosProfile, error) {
    23  	if nsxtManagerId == "" {
    24  		return nil, fmt.Errorf("empty NSX-T manager ID")
    25  	}
    26  
    27  	if !isUrn(nsxtManagerId) {
    28  		return nil, fmt.Errorf("NSX-T manager ID is not URN (e.g. 'urn:vcloud:nsxtmanager:09722307-aee0-4623-af95-7f8e577c9ebc)', got: %s", nsxtManagerId)
    29  	}
    30  
    31  	client := vcdClient.Client
    32  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointQosProfiles
    33  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	queryParams := copyOrNewUrlValues(queryParameters)
    44  	queryParams = queryParameterFilterAnd("nsxTManagerRef.id=="+nsxtManagerId, queryParams)
    45  
    46  	typeResponses := []*types.NsxtEdgeGatewayQosProfile{{}}
    47  	err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	returnObjects := make([]*NsxtEdgeGatewayQosProfile, len(typeResponses))
    53  	for sliceIndex := range typeResponses {
    54  		returnObjects[sliceIndex] = &NsxtEdgeGatewayQosProfile{
    55  			NsxtEdgeGatewayQosProfile: typeResponses[sliceIndex],
    56  			client:                    &client,
    57  		}
    58  	}
    59  
    60  	return returnObjects, nil
    61  }
    62  
    63  // GetNsxtEdgeGatewayQosProfileById retrieves NSX-T Edge Gateway QoS Profile by Display Name
    64  func (vcdClient *VCDClient) GetNsxtEdgeGatewayQosProfileByDisplayName(nsxtManagerId, displayName string) (*NsxtEdgeGatewayQosProfile, error) {
    65  	if displayName == "" {
    66  		return nil, fmt.Errorf("empty QoS profile Display Name")
    67  	}
    68  
    69  	// Ideally FIQL filter could be used to filter on server side and get only desired result, but filtering on
    70  	// 'displayName' is not yet supported.
    71  	/*
    72  		queryParameters := copyOrNewUrlValues(nil)
    73  		queryParameters.Add("filter", "displayName=="+displayName)
    74  	*/
    75  	nsxtEdgeClusters, err := vcdClient.GetAllNsxtEdgeGatewayQosProfiles(nsxtManagerId, nil)
    76  	if err != nil {
    77  		return nil, fmt.Errorf("could not find QoS profile with DisplayName '%s' for NSX-T Manager with ID '%s': %s",
    78  			displayName, nsxtManagerId, err)
    79  	}
    80  
    81  	// TODO remove this when FIQL supports filtering on 'displayName'
    82  	nsxtEdgeClusters = filterQosProfiles(displayName, nsxtEdgeClusters)
    83  	// EOF TODO remove this when FIQL supports filtering on 'displayName'
    84  
    85  	if len(nsxtEdgeClusters) == 0 {
    86  		// ErrorEntityNotFound is injected here for the ability to validate problem using ContainsNotFound()
    87  		return nil, fmt.Errorf("%s: no NSX-T QoS profiles with DisplayName '%s' for NSX-T Manager with ID '%s' found",
    88  			ErrorEntityNotFound, displayName, nsxtManagerId)
    89  	}
    90  
    91  	if len(nsxtEdgeClusters) > 1 {
    92  		return nil, fmt.Errorf("more than one (%d) QoS profile with DisplayName '%s' for NSX-T Manager with ID '%s' found",
    93  			len(nsxtEdgeClusters), displayName, nsxtManagerId)
    94  	}
    95  
    96  	return nsxtEdgeClusters[0], nil
    97  }
    98  
    99  func filterQosProfiles(displayName string, allQosProfiles []*NsxtEdgeGatewayQosProfile) []*NsxtEdgeGatewayQosProfile {
   100  	filteredQosProfiles := make([]*NsxtEdgeGatewayQosProfile, 0)
   101  	for index, nsxtEdgeCluster := range allQosProfiles {
   102  		if allQosProfiles[index].NsxtEdgeGatewayQosProfile.DisplayName == displayName {
   103  			filteredQosProfiles = append(filteredQosProfiles, nsxtEdgeCluster)
   104  		}
   105  	}
   106  
   107  	return filteredQosProfiles
   108  }