github.com/Cloud-Foundations/Dominator@v0.3.4/hypervisor/rpcd/registerExternalLeases.go (about)

     1  package rpcd
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  
     7  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     8  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
     9  	"github.com/Cloud-Foundations/Dominator/proto/hypervisor"
    10  )
    11  
    12  func (t *srpcType) RegisterExternalLeases(conn *srpc.Conn,
    13  	request hypervisor.RegisterExternalLeasesRequest,
    14  	reply *hypervisor.RegisterExternalLeasesResponse) error {
    15  	*reply = hypervisor.RegisterExternalLeasesResponse{
    16  		errors.ErrorToString(t.registerExternalLeases(request, false))}
    17  	return nil
    18  }
    19  
    20  func (t *srpcType) registerExternalLeases(
    21  	request hypervisor.RegisterExternalLeasesRequest, manage bool) error {
    22  	hostnames := make(map[ipv4Address]string)
    23  	leasesToRegister := make(map[ipv4Address]string)
    24  	for index, address := range request.Addresses {
    25  		if ip4 := address.IpAddress.To4(); ip4 == nil {
    26  			return fmt.Errorf("%s is not an IPv4 address", address.IpAddress)
    27  		} else {
    28  			var addr [4]byte
    29  			copy(addr[:], ip4)
    30  			leasesToRegister[addr] = address.MacAddress
    31  			if index < len(request.Hostnames) {
    32  				hostnames[addr] = request.Hostnames[index]
    33  			}
    34  		}
    35  	}
    36  	leasesToDelete := make(map[ipv4Address]struct{})
    37  	t.mutex.Lock()
    38  	defer t.mutex.Unlock()
    39  	for ipAddr := range t.externalLeases {
    40  		ipAddr := ipAddr // Make a unique copy of the array.
    41  		leasesToDelete[ipAddr] = struct{}{}
    42  	}
    43  	for ipAddr, macAddr := range leasesToRegister {
    44  		if leasedMac, ok := t.externalLeases[ipAddr]; ok {
    45  			if macAddr == leasedMac {
    46  				delete(leasesToDelete, ipAddr)
    47  				delete(leasesToRegister, ipAddr)
    48  			}
    49  		}
    50  	}
    51  	t.logger.Printf("RegisterExternalLeases: adding: %d, deleting: %d\n",
    52  		len(leasesToRegister), len(leasesToDelete))
    53  	for ipAddr := range leasesToDelete {
    54  		ip := net.IP(ipAddr[:])
    55  		t.logger.Debugf(1, "deleting: %s\n", ip)
    56  		t.dhcpServer.RemoveLease(ip)
    57  		delete(t.externalLeases, ipAddr)
    58  	}
    59  	for ipAddr, macAddr := range leasesToRegister {
    60  		ipAddr := ipAddr // Make a unique copy of the array.
    61  		addr := hypervisor.Address{IpAddress: ipAddr[:], MacAddress: macAddr}
    62  		t.logger.Debugf(1, "adding: %s\n", addr)
    63  		hostname := hostnames[ipAddr]
    64  		if hostname == "" {
    65  			hostname = addr.IpAddress.String()
    66  		}
    67  		if err := t.dhcpServer.AddLease(addr, hostname); err != nil {
    68  			return err
    69  		}
    70  		t.externalLeases[ipAddr] = macAddr
    71  	}
    72  	t.manageExternalLeases = manage
    73  	return nil
    74  }
    75  
    76  func (t *srpcType) registerManagedExternalLeases(
    77  	request hypervisor.RegisterExternalLeasesRequest) {
    78  	if err := t.registerExternalLeases(request, true); err != nil {
    79  		t.logger.Println(err)
    80  		return
    81  	}
    82  }
    83  
    84  func (t *srpcType) unregisterManagedExternalLeases() {
    85  	t.mutex.Lock()
    86  	defer t.mutex.Unlock()
    87  	if !t.manageExternalLeases {
    88  		return
    89  	}
    90  	t.manageExternalLeases = false
    91  	if len(t.externalLeases) < 1 {
    92  		return
    93  	}
    94  	t.logger.Printf("deleting %d managed external leases\n",
    95  		len(t.externalLeases))
    96  	for ipAddr := range t.externalLeases {
    97  		ip := net.IP(ipAddr[:])
    98  		t.logger.Debugf(1, "deleting: %s\n", ip)
    99  		t.dhcpServer.RemoveLease(ip)
   100  		delete(t.externalLeases, ipAddr)
   101  	}
   102  }