github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_alb_virtual_service.go (about) 1 /* 2 * Copyright 2021 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 // NsxtAlbVirtualService combines Load Balancer Pools with Service Engine Groups and exposes a virtual service on 15 // defined VIP (virtual IP address) while optionally allowing to use encrypted traffic 16 type NsxtAlbVirtualService struct { 17 NsxtAlbVirtualService *types.NsxtAlbVirtualService 18 vcdClient *VCDClient 19 } 20 21 // GetAllAlbVirtualServiceSummaries returns a limited subset of NsxtAlbVirtualService values, but does it in single 22 // query. To fetch complete information for ALB Virtual Services one can use GetAllAlbVirtualServices(), but it is slower 23 // as it has to retrieve Virtual Services one by one. 24 func (vcdClient *VCDClient) GetAllAlbVirtualServiceSummaries(edgeGatewayId string, queryParameters url.Values) ([]*NsxtAlbVirtualService, error) { 25 client := vcdClient.Client 26 27 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbVirtualServiceSummaries 28 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 29 if err != nil { 30 return nil, err 31 } 32 33 urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, edgeGatewayId)) 34 if err != nil { 35 return nil, err 36 } 37 38 typeResponses := []*types.NsxtAlbVirtualService{{}} 39 err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil) 40 if err != nil { 41 return nil, err 42 } 43 44 // Wrap all typeResponses into NsxtAlbPool types with client 45 wrappedResponses := make([]*NsxtAlbVirtualService, len(typeResponses)) 46 for sliceIndex := range typeResponses { 47 wrappedResponses[sliceIndex] = &NsxtAlbVirtualService{ 48 NsxtAlbVirtualService: typeResponses[sliceIndex], 49 vcdClient: vcdClient, 50 } 51 } 52 53 return wrappedResponses, nil 54 } 55 56 // GetAllAlbVirtualServices fetches ALB Virtual Services by at first listing all Virtual Services summaries and then 57 // fetching complete structure one by one 58 func (vcdClient *VCDClient) GetAllAlbVirtualServices(edgeGatewayId string, queryParameters url.Values) ([]*NsxtAlbVirtualService, error) { 59 allAlbVirtualServiceSummaries, err := vcdClient.GetAllAlbVirtualServiceSummaries(edgeGatewayId, queryParameters) 60 if err != nil { 61 return nil, fmt.Errorf("error retrieving all ALB Virtual Service summaries: %s", err) 62 } 63 64 // Loop over all Summaries and retrieve complete information 65 allAlbVirtualServices := make([]*NsxtAlbVirtualService, len(allAlbVirtualServiceSummaries)) 66 for index := range allAlbVirtualServiceSummaries { 67 allAlbVirtualServices[index], err = vcdClient.GetAlbVirtualServiceById(allAlbVirtualServiceSummaries[index].NsxtAlbVirtualService.ID) 68 if err != nil { 69 return nil, fmt.Errorf("error retrieving complete ALB Virtual Service: %s", err) 70 } 71 72 } 73 74 return allAlbVirtualServices, nil 75 } 76 77 // GetAlbVirtualServiceByName fetches ALB Virtual Service By Name 78 func (vcdClient *VCDClient) GetAlbVirtualServiceByName(edgeGatewayId string, name string) (*NsxtAlbVirtualService, error) { 79 queryParameters := copyOrNewUrlValues(nil) 80 queryParameters.Add("filter", "name=="+name) 81 82 allAlbVirtualServices, err := vcdClient.GetAllAlbVirtualServices(edgeGatewayId, queryParameters) 83 if err != nil { 84 return nil, fmt.Errorf("error reading ALB Virtual Service with Name '%s': %s", name, err) 85 } 86 87 if len(allAlbVirtualServices) == 0 { 88 return nil, fmt.Errorf("%s: could not find ALB Virtual Service with Name '%s'", ErrorEntityNotFound, name) 89 } 90 91 if len(allAlbVirtualServices) > 1 { 92 return nil, fmt.Errorf("found more than 1 ALB Virtual Service with Name '%s'", name) 93 } 94 95 return allAlbVirtualServices[0], nil 96 } 97 98 // GetAlbVirtualServiceById fetches ALB Virtual Service By ID 99 func (vcdClient *VCDClient) GetAlbVirtualServiceById(id string) (*NsxtAlbVirtualService, error) { 100 client := vcdClient.Client 101 102 if id == "" { 103 return nil, fmt.Errorf("ID is required to lookup NSX-T ALB Virtual Service by ID") 104 } 105 106 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbVirtualServices 107 apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 108 if err != nil { 109 return nil, err 110 } 111 112 urlRef, err := client.OpenApiBuildEndpoint(endpoint, id) 113 if err != nil { 114 return nil, err 115 } 116 117 typeResponse := &types.NsxtAlbVirtualService{} 118 err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil) 119 if err != nil { 120 return nil, err 121 } 122 123 wrappedResponse := &NsxtAlbVirtualService{ 124 NsxtAlbVirtualService: typeResponse, 125 vcdClient: vcdClient, 126 } 127 128 return wrappedResponse, nil 129 } 130 131 // CreateNsxtAlbVirtualService creates NSX-T ALB Virtual Service based on supplied configuration 132 func (vcdClient *VCDClient) CreateNsxtAlbVirtualService(albVirtualServiceConfig *types.NsxtAlbVirtualService) (*NsxtAlbVirtualService, error) { 133 client := vcdClient.Client 134 135 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbVirtualServices 136 minimumApiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 137 if err != nil { 138 return nil, err 139 } 140 141 urlRef, err := client.OpenApiBuildEndpoint(endpoint) 142 if err != nil { 143 return nil, err 144 } 145 146 returnObject := &NsxtAlbVirtualService{ 147 NsxtAlbVirtualService: &types.NsxtAlbVirtualService{}, 148 vcdClient: vcdClient, 149 } 150 151 err = client.OpenApiPostItem(minimumApiVersion, urlRef, nil, albVirtualServiceConfig, returnObject.NsxtAlbVirtualService, nil) 152 if err != nil { 153 return nil, fmt.Errorf("error creating NSX-T ALB Virtual Service: %s", err) 154 } 155 156 return returnObject, nil 157 } 158 159 // Update updates NSX-T ALB Virtual Service based on supplied configuration 160 func (nsxtAlbVirtualService *NsxtAlbVirtualService) Update(albVirtualServiceConfig *types.NsxtAlbVirtualService) (*NsxtAlbVirtualService, error) { 161 client := nsxtAlbVirtualService.vcdClient.Client 162 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbVirtualServices 163 minimumApiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 164 if err != nil { 165 return nil, err 166 } 167 168 if albVirtualServiceConfig.ID == "" { 169 return nil, fmt.Errorf("cannot update NSX-T ALB Virtual Service without ID") 170 } 171 172 urlRef, err := client.OpenApiBuildEndpoint(endpoint, albVirtualServiceConfig.ID) 173 if err != nil { 174 return nil, err 175 } 176 177 responseAlbController := &NsxtAlbVirtualService{ 178 NsxtAlbVirtualService: &types.NsxtAlbVirtualService{}, 179 vcdClient: nsxtAlbVirtualService.vcdClient, 180 } 181 182 err = client.OpenApiPutItem(minimumApiVersion, urlRef, nil, albVirtualServiceConfig, responseAlbController.NsxtAlbVirtualService, nil) 183 if err != nil { 184 return nil, fmt.Errorf("error updating NSX-T ALB Virtual Service: %s", err) 185 } 186 187 return responseAlbController, nil 188 } 189 190 // Delete deletes NSX-T ALB Virtual Service 191 func (nsxtAlbVirtualService *NsxtAlbVirtualService) Delete() error { 192 client := nsxtAlbVirtualService.vcdClient.Client 193 endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbVirtualServices 194 minimumApiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint) 195 if err != nil { 196 return err 197 } 198 199 if nsxtAlbVirtualService.NsxtAlbVirtualService.ID == "" { 200 return fmt.Errorf("cannot delete NSX-T ALB Virtual Service without ID") 201 } 202 203 urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbVirtualService.NsxtAlbVirtualService.ID) 204 if err != nil { 205 return err 206 } 207 208 err = client.OpenApiDeleteItem(minimumApiVersion, urlRef, nil, nil) 209 if err != nil { 210 return fmt.Errorf("error deleting NSX-T ALB Virtual Service: %s", err) 211 } 212 213 return nil 214 }