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  }