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 }