github.com/vmware/go-vcloud-director/v2@v2.24.0/govcd/nsxv_dhcplease.go (about)

     1  /*
     2   * Copyright 2020 VMware, Inc.  All rights reserved.  Licensed under the Apache v2 License.
     3   */
     4  
     5  package govcd
     6  
     7  import (
     8  	"encoding/xml"
     9  	"fmt"
    10  	"net/http"
    11  
    12  	"github.com/vmware/go-vcloud-director/v2/types/v56"
    13  	"github.com/vmware/go-vcloud-director/v2/util"
    14  )
    15  
    16  type responseEdgeDhcpLeases struct {
    17  	XMLName   xml.Name            `xml:"dhcpLeases"`
    18  	TimeStamp string              `xml:"timeStamp"`
    19  	DhcpLease types.EdgeDhcpLease `xml:"dhcpLeaseInfo"`
    20  }
    21  
    22  // GetNsxvActiveDhcpLeaseByMac finds active DHCP lease for a given hardware address (MAC)
    23  func (egw *EdgeGateway) GetNsxvActiveDhcpLeaseByMac(mac string) (*types.EdgeDhcpLeaseInfo, error) {
    24  	if mac == "" {
    25  		return nil, fmt.Errorf("MAC address must be provided to lookup DHCP lease")
    26  	}
    27  	dhcpLeases, err := egw.GetAllNsxvDhcpLeases()
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	util.Logger.Printf("[DEBUG] Looking up active DHCP lease for MAC: %s", mac)
    33  	for _, lease := range dhcpLeases {
    34  		util.Logger.Printf("[DEBUG] Checking DHCP lease: %#+v", lease)
    35  		if lease.BindingState == "active" && lease.MacAddress == mac {
    36  			return lease, nil
    37  		}
    38  	}
    39  
    40  	return nil, ErrorEntityNotFound
    41  }
    42  
    43  // GetAllNsxvDhcpLeases retrieves all DHCP leases defined in NSX-V edge gateway
    44  func (egw *EdgeGateway) GetAllNsxvDhcpLeases() ([]*types.EdgeDhcpLeaseInfo, error) {
    45  	if !egw.HasAdvancedNetworking() {
    46  		return nil, fmt.Errorf("only advanced edge gateways support DHCP")
    47  	}
    48  
    49  	httpPath, err := egw.buildProxiedEdgeEndpointURL(types.EdgeDhcpLeasePath)
    50  	if err != nil {
    51  		return nil, fmt.Errorf("could not get Edge Gateway API endpoint: %s", err)
    52  	}
    53  
    54  	dhcpLeases := &responseEdgeDhcpLeases{}
    55  
    56  	// This query returns all DHCP leases
    57  	_, err = egw.client.ExecuteRequest(httpPath, http.MethodGet, types.AnyXMLMime,
    58  		"unable to read DHCP leases: %s", nil, dhcpLeases)
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	if dhcpLeases != nil && len(dhcpLeases.DhcpLease.DhcpLeaseInfos) == 0 {
    64  		util.Logger.Printf("[DEBUG] GetAllNsxvDhcpLeases found 0 leases available")
    65  		return nil, ErrorEntityNotFound
    66  	}
    67  
    68  	return dhcpLeases.DhcpLease.DhcpLeaseInfos, nil
    69  }