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 }