github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_alb_controllers.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  	"errors"
     9  	"fmt"
    10  	"net/url"
    11  
    12  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    13  )
    14  
    15  // NsxtAlbController helps to integrate VMware Cloud Director with NSX-T Advanced Load Balancer deployment.
    16  // Controller instances are registered with VMware Cloud Director instance. Controller instances serve as a central
    17  // control plane for the load-balancing services provided by NSX-T Advanced Load Balancer.
    18  // To configure an NSX-T ALB one needs to supply AVI Controller endpoint, credentials and license to be used.
    19  type NsxtAlbController struct {
    20  	NsxtAlbController *types.NsxtAlbController
    21  	vcdClient         *VCDClient
    22  }
    23  
    24  // GetAllAlbControllers returns all configured NSX-T ALB Controllers
    25  func (vcdClient *VCDClient) GetAllAlbControllers(queryParameters url.Values) ([]*NsxtAlbController, error) {
    26  	client := vcdClient.Client
    27  	if !client.IsSysAdmin {
    28  		return nil, errors.New("reading NSX-T ALB Controllers require System user")
    29  	}
    30  
    31  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController
    32  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	typeResponses := []*types.NsxtAlbController{{}}
    43  	err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParameters, &typeResponses, nil)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	// Wrap all typeResponses into NsxtAlbController types with client
    49  	wrappedResponses := make([]*NsxtAlbController, len(typeResponses))
    50  	for sliceIndex := range typeResponses {
    51  		wrappedResponses[sliceIndex] = &NsxtAlbController{
    52  			NsxtAlbController: typeResponses[sliceIndex],
    53  			vcdClient:         vcdClient,
    54  		}
    55  	}
    56  
    57  	return wrappedResponses, nil
    58  }
    59  
    60  // GetAlbControllerByName returns NSX-T ALB Controller by Name
    61  func (vcdClient *VCDClient) GetAlbControllerByName(name string) (*NsxtAlbController, error) {
    62  	queryParameters := copyOrNewUrlValues(nil)
    63  	queryParameters.Add("filter", "name=="+name)
    64  
    65  	controllers, err := vcdClient.GetAllAlbControllers(queryParameters)
    66  	if err != nil {
    67  		return nil, fmt.Errorf("error reading ALB Controller with Name '%s': %s", name, err)
    68  	}
    69  
    70  	if len(controllers) == 0 {
    71  		return nil, fmt.Errorf("%s: could not find ALB Controller with Name '%s'", ErrorEntityNotFound, name)
    72  	}
    73  
    74  	if len(controllers) > 1 {
    75  		return nil, fmt.Errorf("found more than 1 ALB Controller with Name '%s'", name)
    76  	}
    77  
    78  	return controllers[0], nil
    79  }
    80  
    81  // GetAlbControllerById returns NSX-T ALB Controller by ID
    82  func (vcdClient *VCDClient) GetAlbControllerById(id string) (*NsxtAlbController, error) {
    83  	client := vcdClient.Client
    84  	if !client.IsSysAdmin {
    85  		return nil, errors.New("reading NSX-T ALB Controllers require System user")
    86  	}
    87  
    88  	if id == "" {
    89  		return nil, fmt.Errorf("ID is required to lookup NSX-T ALB Controller by ID")
    90  	}
    91  
    92  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController
    93  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    94  	if err != nil {
    95  		return nil, err
    96  	}
    97  
    98  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, id)
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  
   103  	typeResponse := &types.NsxtAlbController{}
   104  	err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil)
   105  	if err != nil {
   106  		return nil, err
   107  	}
   108  
   109  	wrappedResponse := &NsxtAlbController{
   110  		NsxtAlbController: typeResponse,
   111  		vcdClient:         vcdClient,
   112  	}
   113  
   114  	return wrappedResponse, nil
   115  }
   116  
   117  // GetAlbControllerByUrl returns configured ALB Controller by URL
   118  //
   119  // Note. Filtering is performed on client side.
   120  func (vcdClient *VCDClient) GetAlbControllerByUrl(url string) (*NsxtAlbController, error) {
   121  	// Ideally this function could filter on VCD side, but API does not support filtering on URL
   122  	controllers, err := vcdClient.GetAllAlbControllers(nil)
   123  	if err != nil {
   124  		return nil, fmt.Errorf("error reading ALB Controller with Url '%s': %s", url, err)
   125  	}
   126  
   127  	// Search for controllers
   128  	filteredControllers := make([]*NsxtAlbController, 0)
   129  	for _, controller := range controllers {
   130  		if controller.NsxtAlbController.Url == url {
   131  			filteredControllers = append(filteredControllers, controller)
   132  		}
   133  	}
   134  
   135  	return oneOrError("url", url, filteredControllers)
   136  }
   137  
   138  // CreateNsxtAlbController creates controller with supplied albControllerConfig configuration
   139  func (vcdClient *VCDClient) CreateNsxtAlbController(albControllerConfig *types.NsxtAlbController) (*NsxtAlbController, error) {
   140  	client := vcdClient.Client
   141  	if !client.IsSysAdmin {
   142  		return nil, errors.New("handling NSX-T ALB Controllers require System user")
   143  	}
   144  
   145  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController
   146  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   147  	if err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
   152  	if err != nil {
   153  		return nil, err
   154  	}
   155  
   156  	returnObject := &NsxtAlbController{
   157  		NsxtAlbController: &types.NsxtAlbController{},
   158  		vcdClient:         vcdClient,
   159  	}
   160  
   161  	err = client.OpenApiPostItem(apiVersion, urlRef, nil, albControllerConfig, returnObject.NsxtAlbController, nil)
   162  	if err != nil {
   163  		return nil, fmt.Errorf("error creating NSX-T ALB Controller: %s", err)
   164  	}
   165  
   166  	return returnObject, nil
   167  }
   168  
   169  // Update updates existing NSX-T ALB Controller with new supplied albControllerConfig configuration
   170  func (nsxtAlbController *NsxtAlbController) Update(albControllerConfig *types.NsxtAlbController) (*NsxtAlbController, error) {
   171  	client := nsxtAlbController.vcdClient.Client
   172  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController
   173  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   174  	if err != nil {
   175  		return nil, err
   176  	}
   177  
   178  	if albControllerConfig.ID == "" {
   179  		return nil, fmt.Errorf("cannot update NSX-T ALB Controller without ID")
   180  	}
   181  
   182  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, albControllerConfig.ID)
   183  	if err != nil {
   184  		return nil, err
   185  	}
   186  
   187  	responseAlbController := &NsxtAlbController{
   188  		NsxtAlbController: &types.NsxtAlbController{},
   189  		vcdClient:         nsxtAlbController.vcdClient,
   190  	}
   191  
   192  	err = client.OpenApiPutItem(apiVersion, urlRef, nil, albControllerConfig, responseAlbController.NsxtAlbController, nil)
   193  	if err != nil {
   194  		return nil, fmt.Errorf("error updating NSX-T ALB Controller: %s", err)
   195  	}
   196  
   197  	return responseAlbController, nil
   198  }
   199  
   200  // Delete deletes existing NSX-T ALB Controller
   201  func (nsxtAlbController *NsxtAlbController) Delete() error {
   202  	client := nsxtAlbController.vcdClient.Client
   203  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbController
   204  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   205  	if err != nil {
   206  		return err
   207  	}
   208  
   209  	if nsxtAlbController.NsxtAlbController.ID == "" {
   210  		return fmt.Errorf("cannot delete NSX-T ALB Controller without ID")
   211  	}
   212  
   213  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbController.NsxtAlbController.ID)
   214  	if err != nil {
   215  		return err
   216  	}
   217  
   218  	err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil)
   219  	if err != nil {
   220  		return fmt.Errorf("error deleting NSX-T ALB Controller: %s", err)
   221  	}
   222  
   223  	return nil
   224  }