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 }