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 }