github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/openapi_org_network_dhcp.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  // OpenApiOrgVdcNetwork uses OpenAPI endpoint to operate both - NSX-T and NSX-V Org VDC network DHCP settings
    15  type OpenApiOrgVdcNetworkDhcp struct {
    16  	OpenApiOrgVdcNetworkDhcp *types.OpenApiOrgVdcNetworkDhcp
    17  	client                   *Client
    18  }
    19  
    20  // GetOpenApiOrgVdcNetworkDhcp allows to retrieve DHCP configuration for specific Org VDC network
    21  func (orgVdcNet *OpenApiOrgVdcNetwork) GetOpenApiOrgVdcNetworkDhcp() (*OpenApiOrgVdcNetworkDhcp, error) {
    22  	if orgVdcNet == nil || orgVdcNet.client == nil {
    23  		return nil, fmt.Errorf("error - Org VDC network and client cannot be nil")
    24  	}
    25  
    26  	client := orgVdcNet.client
    27  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointOrgVdcNetworksDhcp
    28  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    29  	if err != nil {
    30  		return nil, err
    31  	}
    32  
    33  	if orgVdcNet.OpenApiOrgVdcNetwork.ID == "" {
    34  		return nil, fmt.Errorf("empty Org VDC network ID")
    35  	}
    36  
    37  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, orgVdcNet.OpenApiOrgVdcNetwork.ID))
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	orgNetDhcp := &OpenApiOrgVdcNetworkDhcp{
    43  		OpenApiOrgVdcNetworkDhcp: &types.OpenApiOrgVdcNetworkDhcp{},
    44  		client:                   client,
    45  	}
    46  
    47  	err = client.OpenApiGetItem(apiVersion, urlRef, nil, orgNetDhcp.OpenApiOrgVdcNetworkDhcp, nil)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	return orgNetDhcp, nil
    53  }
    54  
    55  // GetOpenApiOrgVdcNetworkDhcp allows to retrieve DHCP configuration for specific Org VDC network
    56  // ID specified as orgNetworkId using OpenAPI
    57  func (vdc *Vdc) GetOpenApiOrgVdcNetworkDhcp(orgNetworkId string) (*OpenApiOrgVdcNetworkDhcp, error) {
    58  
    59  	client := vdc.client
    60  	// Inject Vdc ID filter to perform filtering on server side
    61  	params := url.Values{}
    62  	queryParameters := queryParameterFilterAnd("orgVdc.id=="+vdc.Vdc.ID, params)
    63  
    64  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointOrgVdcNetworksDhcp
    65  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
    66  	if err != nil {
    67  		return nil, err
    68  	}
    69  
    70  	if orgNetworkId == "" {
    71  		return nil, fmt.Errorf("empty Org VDC network ID")
    72  	}
    73  
    74  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, orgNetworkId))
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  
    79  	orgNetDhcp := &OpenApiOrgVdcNetworkDhcp{
    80  		OpenApiOrgVdcNetworkDhcp: &types.OpenApiOrgVdcNetworkDhcp{},
    81  		client:                   client,
    82  	}
    83  
    84  	err = client.OpenApiGetItem(apiVersion, urlRef, queryParameters, orgNetDhcp.OpenApiOrgVdcNetworkDhcp, nil)
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  
    89  	return orgNetDhcp, nil
    90  }
    91  
    92  // UpdateOpenApiOrgVdcNetworkDhcp allows to update DHCP configuration for specific Org VDC network
    93  // ID specified as orgNetworkId using OpenAPI
    94  func (vdc *Vdc) UpdateOpenApiOrgVdcNetworkDhcp(orgNetworkId string, orgVdcNetworkDhcpConfig *types.OpenApiOrgVdcNetworkDhcp) (*OpenApiOrgVdcNetworkDhcp, error) {
    95  	return updateOrgNetworkDhcp(vdc.client, orgNetworkId, orgVdcNetworkDhcpConfig)
    96  }
    97  
    98  // DeleteOpenApiOrgVdcNetworkDhcp allows to perform HTTP DELETE request on DHCP pool configuration for specified Org VDC
    99  // Network ID
   100  func (vdc *Vdc) DeleteOpenApiOrgVdcNetworkDhcp(orgNetworkId string) error {
   101  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointOrgVdcNetworksDhcp
   102  	apiVersion, err := vdc.client.getOpenApiHighestElevatedVersion(endpoint)
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	if orgNetworkId == "" {
   108  		return fmt.Errorf("cannot delete Org VDC network DHCP configuration without ID")
   109  	}
   110  
   111  	urlRef, err := vdc.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, orgNetworkId))
   112  	if err != nil {
   113  		return err
   114  	}
   115  
   116  	err = vdc.client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil)
   117  
   118  	if err != nil {
   119  		return fmt.Errorf("error deleting Org VDC network DHCP configuration: %s", err)
   120  	}
   121  
   122  	return nil
   123  }
   124  
   125  // DeletNetworkDhcp allows to perform HTTP DELETE request on DHCP pool configuration for Org network
   126  func (orgVdcNet *OpenApiOrgVdcNetwork) DeletNetworkDhcp() error {
   127  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointOrgVdcNetworksDhcp
   128  	apiVersion, err := orgVdcNet.client.getOpenApiHighestElevatedVersion(endpoint)
   129  	if err != nil {
   130  		return err
   131  	}
   132  
   133  	if orgVdcNet.OpenApiOrgVdcNetwork.ID == "" {
   134  		return fmt.Errorf("cannot delete Org VDC network DHCP configuration without ID")
   135  	}
   136  
   137  	urlRef, err := orgVdcNet.client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, orgVdcNet.OpenApiOrgVdcNetwork.ID))
   138  	if err != nil {
   139  		return err
   140  	}
   141  
   142  	err = orgVdcNet.client.OpenApiDeleteItem(apiVersion, urlRef, nil, nil)
   143  
   144  	if err != nil {
   145  		return fmt.Errorf("error deleting Org VDC network DHCP configuration: %s", err)
   146  	}
   147  
   148  	return nil
   149  }
   150  
   151  func updateOrgNetworkDhcp(client *Client, orgNetworkId string, orgVdcNetworkDhcpConfig *types.OpenApiOrgVdcNetworkDhcp) (*OpenApiOrgVdcNetworkDhcp, error) {
   152  	endpoint := types.OpenApiPathVersion1_0_0 + types.OpenApiEndpointOrgVdcNetworksDhcp
   153  	apiVersion, err := client.getOpenApiHighestElevatedVersion(endpoint)
   154  	if err != nil {
   155  		return nil, err
   156  	}
   157  
   158  	urlRef, err := client.OpenApiBuildEndpoint(fmt.Sprintf(endpoint, orgNetworkId))
   159  	if err != nil {
   160  		return nil, err
   161  	}
   162  
   163  	orgNetDhcpResponse := &OpenApiOrgVdcNetworkDhcp{
   164  		OpenApiOrgVdcNetworkDhcp: &types.OpenApiOrgVdcNetworkDhcp{},
   165  		client:                   client,
   166  	}
   167  
   168  	// From v35.0 onwards, if orgVdcNetworkDhcpConfig.LeaseTime or orgVdcNetworkDhcpConfig.Mode are not explicitly
   169  	// passed, the API doesn't use any defaults returning an error. Previous API versions were setting
   170  	// LeaseTime to 86400 seconds and Mode to EDGE if these values were not supplied. These two conditional
   171  	// address the situation.
   172  	if orgVdcNetworkDhcpConfig.LeaseTime == nil {
   173  		orgVdcNetworkDhcpConfig.LeaseTime = addrOf(86400)
   174  	}
   175  
   176  	if len(orgVdcNetworkDhcpConfig.Mode) == 0 {
   177  		orgVdcNetworkDhcpConfig.Mode = "EDGE"
   178  	}
   179  
   180  	err = client.OpenApiPutItem(apiVersion, urlRef, nil, orgVdcNetworkDhcpConfig, orgNetDhcpResponse.OpenApiOrgVdcNetworkDhcp, nil)
   181  	if err != nil {
   182  		return nil, fmt.Errorf("error updating Org VDC network DHCP configuration: %s", err)
   183  	}
   184  
   185  	return orgNetDhcpResponse, nil
   186  }