github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxt_alb_service_engine_groups.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  // NsxtAlbServiceEngineGroup provides virtual service management capabilities for tenants. This entity can be created
    16  // by referencing a backing importable service engine group - NsxtAlbImportableServiceEngineGroups.
    17  //
    18  // A service engine group is an isolation domain that also defines shared service engine properties, such as size,
    19  // network access, and failover. Resources in a service engine group can be used for different virtual services,
    20  // depending on your tenant needs. These resources cannot be shared between different service engine groups.
    21  type NsxtAlbServiceEngineGroup struct {
    22  	NsxtAlbServiceEngineGroup *types.NsxtAlbServiceEngineGroup
    23  	vcdClient                 *VCDClient
    24  }
    25  
    26  // GetAllAlbServiceEngineGroups retrieves NSX-T ALB Service Engines with possible filters
    27  //
    28  // Context is not mandatory for this resource. Supported contexts are:
    29  // * Gateway ID (_context==gatewayId) - returns all Load Balancer Service Engine Groups that are accessible to the
    30  // gateway.
    31  // * Assignable Gateway ID (_context=gatewayId;_context==assignable) returns all Load Balancer Service Engine Groups
    32  // that are assignable to the gateway. This filters out any Load Balancer Service Engine groups that are already
    33  // assigned to the gateway or assigned to another gateway if the reservation type is 'DEDICATED’.
    34  func (vcdClient *VCDClient) GetAllAlbServiceEngineGroups(context string, queryParameters url.Values) ([]*NsxtAlbServiceEngineGroup, error) {
    35  	client := vcdClient.Client
    36  
    37  	if !client.IsSysAdmin {
    38  		return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user")
    39  	}
    40  
    41  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
    42  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	queryParams := copyOrNewUrlValues(queryParameters)
    53  	if context != "" {
    54  		queryParams = queryParameterFilterAnd(fmt.Sprintf("_context==%s", context), queryParams)
    55  	}
    56  	typeResponses := []*types.NsxtAlbServiceEngineGroup{{}}
    57  
    58  	err = client.OpenApiGetAllItems(apiVersion, urlRef, queryParams, &typeResponses, nil)
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	wrappedResponses := make([]*NsxtAlbServiceEngineGroup, len(typeResponses))
    64  	for sliceIndex := range typeResponses {
    65  		wrappedResponses[sliceIndex] = &NsxtAlbServiceEngineGroup{
    66  			NsxtAlbServiceEngineGroup: typeResponses[sliceIndex],
    67  			vcdClient:                 vcdClient,
    68  		}
    69  	}
    70  
    71  	return wrappedResponses, nil
    72  }
    73  
    74  // GetAlbServiceEngineGroupByName returns NSX-T ALB Service Engine by Name
    75  // Context is not mandatory for this resource. Supported contexts are:
    76  // * Gateway ID (_context==gatewayId) - returns all Load Balancer Service Engine Groups that are accessible to the
    77  // gateway.
    78  // * Assignable Gateway ID (_context=gatewayId;_context==assignable) returns all Load Balancer Service Engine Groups
    79  // that are assignable to the gateway. This filters out any Load Balancer Service Engine groups that are already
    80  // assigned to the gateway or assigned to another gateway if the reservation type is 'DEDICATED’.
    81  func (vcdClient *VCDClient) GetAlbServiceEngineGroupByName(optionalContext, name string) (*NsxtAlbServiceEngineGroup, error) {
    82  	queryParams := copyOrNewUrlValues(nil)
    83  	if optionalContext != "" {
    84  		queryParams = queryParameterFilterAnd(fmt.Sprintf("_context==%s", optionalContext), queryParams)
    85  	}
    86  	queryParams.Add("filter", fmt.Sprintf("name==%s", name))
    87  
    88  	albSeGroups, err := vcdClient.GetAllAlbServiceEngineGroups("", queryParams)
    89  	if err != nil {
    90  		return nil, fmt.Errorf("error retrieving NSX-T ALB Service Engine Group By Name '%s': %s", name, err)
    91  	}
    92  
    93  	if len(albSeGroups) == 0 {
    94  		return nil, fmt.Errorf("%s", ErrorEntityNotFound)
    95  	}
    96  
    97  	if len(albSeGroups) > 1 {
    98  		return nil, fmt.Errorf("more than 1 NSX-T ALB Service Engine Group with Name '%s' found", name)
    99  	}
   100  
   101  	return albSeGroups[0], nil
   102  }
   103  
   104  // GetAlbServiceEngineGroupById returns importable NSX-T ALB Cloud by ID
   105  func (vcdClient *VCDClient) GetAlbServiceEngineGroupById(id string) (*NsxtAlbServiceEngineGroup, error) {
   106  	client := vcdClient.Client
   107  
   108  	if !client.IsSysAdmin {
   109  		return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user")
   110  	}
   111  
   112  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
   113  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   114  	if err != nil {
   115  		return nil, err
   116  	}
   117  
   118  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, id)
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	typeResponse := &types.NsxtAlbServiceEngineGroup{}
   124  
   125  	err = client.OpenApiGetItem(apiVersion, urlRef, nil, &typeResponse, nil)
   126  	if err != nil {
   127  		return nil, err
   128  	}
   129  
   130  	wrappedResponse := &NsxtAlbServiceEngineGroup{
   131  		NsxtAlbServiceEngineGroup: typeResponse,
   132  		vcdClient:                 vcdClient,
   133  	}
   134  
   135  	return wrappedResponse, nil
   136  }
   137  
   138  func (vcdClient *VCDClient) CreateNsxtAlbServiceEngineGroup(albServiceEngineGroup *types.NsxtAlbServiceEngineGroup) (*NsxtAlbServiceEngineGroup, error) {
   139  	client := vcdClient.Client
   140  	if !client.IsSysAdmin {
   141  		return nil, errors.New("handling NSX-T ALB Service Engine Groups require System user")
   142  	}
   143  
   144  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
   145  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   146  	if err != nil {
   147  		return nil, err
   148  	}
   149  
   150  	urlRef, err := client.OpenApiBuildEndpoint(endpoint)
   151  	if err != nil {
   152  		return nil, err
   153  	}
   154  
   155  	returnObject := &NsxtAlbServiceEngineGroup{
   156  		NsxtAlbServiceEngineGroup: &types.NsxtAlbServiceEngineGroup{},
   157  		vcdClient:                 vcdClient,
   158  	}
   159  
   160  	err = client.OpenApiPostItem(apiVersion, urlRef, nil, albServiceEngineGroup, returnObject.NsxtAlbServiceEngineGroup, nil)
   161  	if err != nil {
   162  		return nil, fmt.Errorf("error creating NSX-T ALB Service Engine Group: %s", err)
   163  	}
   164  
   165  	return returnObject, nil
   166  }
   167  
   168  // Update updates existing ALB Controller with new supplied albControllerConfig configuration
   169  func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Update(albSEGroupConfig *types.NsxtAlbServiceEngineGroup) (*NsxtAlbServiceEngineGroup, error) {
   170  	client := nsxtAlbServiceEngineGroup.vcdClient.Client
   171  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
   172  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  
   177  	if albSEGroupConfig.ID == "" {
   178  		return nil, fmt.Errorf("cannot update NSX-T ALB Service Engine Group without ID")
   179  	}
   180  
   181  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, albSEGroupConfig.ID)
   182  	if err != nil {
   183  		return nil, err
   184  	}
   185  
   186  	responseAlbController := &NsxtAlbServiceEngineGroup{
   187  		NsxtAlbServiceEngineGroup: &types.NsxtAlbServiceEngineGroup{},
   188  		vcdClient:                 nsxtAlbServiceEngineGroup.vcdClient,
   189  	}
   190  
   191  	err = client.OpenApiPutItem(apiVersion, urlRef, nil, albSEGroupConfig, responseAlbController.NsxtAlbServiceEngineGroup, nil)
   192  	if err != nil {
   193  		return nil, fmt.Errorf("error updating NSX-T ALB Service Engine Group: %s", err)
   194  	}
   195  
   196  	return responseAlbController, nil
   197  }
   198  
   199  // Delete deletes NSX-T ALB Service Engine Group configuration
   200  func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Delete() error {
   201  	client := nsxtAlbServiceEngineGroup.vcdClient.Client
   202  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
   203  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   204  	if err != nil {
   205  		return err
   206  	}
   207  
   208  	if nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID == "" {
   209  		return fmt.Errorf("cannot delete NSX-T ALB Service Engine Group without ID")
   210  	}
   211  
   212  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID)
   213  	if err != nil {
   214  		return err
   215  	}
   216  
   217  	err = client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil)
   218  	if err != nil {
   219  		return fmt.Errorf("error deleting NSX-T ALB Service Engine Group: %s", err)
   220  	}
   221  
   222  	return nil
   223  }
   224  
   225  // Sync syncs a specified Load Balancer Service Engine Group. It requests the HA mode and the maximum number of
   226  // supported Virtual Services for this Service Engine Group from the Load Balancer, and updates vCD's local record of
   227  // these properties.
   228  func (nsxtAlbServiceEngineGroup *NsxtAlbServiceEngineGroup) Sync() error {
   229  	client := nsxtAlbServiceEngineGroup.vcdClient.Client
   230  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointAlbServiceEngineGroups
   231  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   232  	if err != nil {
   233  		return err
   234  	}
   235  
   236  	if nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID == "" {
   237  		return fmt.Errorf("cannot sync NSX-T ALB Service Engine Group without ID")
   238  	}
   239  
   240  	urlRef, err := client.OpenApiBuildEndpoint(endpoint, nsxtAlbServiceEngineGroup.NsxtAlbServiceEngineGroup.ID, "/sync")
   241  	if err != nil {
   242  		return err
   243  	}
   244  
   245  	task, err := client.OpenApiPostItemAsync(apiVersion, urlRef, nil, nil)
   246  	if err != nil {
   247  		return fmt.Errorf("error syncing NSX-T ALB Service Engine Group: %s", err)
   248  	}
   249  
   250  	err = task.WaitTaskCompletion()
   251  	if err != nil {
   252  		return fmt.Errorf("sync task for NSX-T ALB Service Engine Group failed: %s", err)
   253  	}
   254  
   255  	return nil
   256  }