github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/proto/fleetmanager/methods.go (about) 1 package fleetmanager 2 3 import ( 4 "bytes" 5 "errors" 6 "net" 7 ) 8 9 func listsEqual(left, right []string) bool { 10 if len(left) != len(right) { 11 return false 12 } 13 for index, leftString := range left { 14 if leftString != right[index] { 15 return false 16 } 17 } 18 return true 19 } 20 21 func parseMAC(text []byte) (HardwareAddr, error) { 22 text = bytes.ToLower(text) 23 buf := make([]byte, 20) 24 writePosition := 0 25 for _, char := range text { 26 var value byte 27 if char >= '0' && char <= '9' { 28 value = char - '0' 29 } else if char >= 'a' && char <= 'f' { 30 value = 10 + char - 'a' 31 } else if char == ':' { 32 writePosition++ 33 if writePosition >= len(buf) { 34 return nil, errors.New("invalid MAC") 35 } 36 continue 37 } else { 38 return nil, errors.New("invalid MAC") 39 } 40 if buf[writePosition]&0xf0 != 0 { 41 return nil, errors.New("invalid MAC") 42 } 43 buf[writePosition] = buf[writePosition]<<4 + value 44 } 45 addr := make([]byte, writePosition+1) // Make a copy just long enough. 46 copy(addr, buf) 47 return addr, nil 48 } 49 50 func (left *Machine) Equal(right *Machine) bool { 51 if !left.IPMI.Equal(&right.IPMI) { 52 return false 53 } 54 if !left.NetworkEntry.Equal(&right.NetworkEntry) { 55 return false 56 } 57 if !listsEqual(left.OwnerGroups, right.OwnerGroups) { 58 return false 59 } 60 if !listsEqual(left.OwnerUsers, right.OwnerUsers) { 61 return false 62 } 63 if len(left.SecondaryNetworkEntries) != len(right.SecondaryNetworkEntries) { 64 return false 65 } 66 for index, leftNetworkEntry := range left.SecondaryNetworkEntries { 67 if !leftNetworkEntry.Equal(&right.SecondaryNetworkEntries[index]) { 68 return false 69 } 70 } 71 if !left.Tags.Equal(right.Tags) { 72 return false 73 } 74 return true 75 } 76 77 func (left *NetworkEntry) Equal(right *NetworkEntry) bool { 78 if left.Hostname != right.Hostname { 79 return false 80 } 81 if !left.HostIpAddress.Equal(right.HostIpAddress) { 82 return false 83 } 84 if left.HostMacAddress.String() != right.HostMacAddress.String() { 85 return false 86 } 87 if left.SubnetId != right.SubnetId { 88 return false 89 } 90 if left.VlanTrunk != right.VlanTrunk { 91 return false 92 } 93 return true 94 } 95 96 func (addr HardwareAddr) MarshalText() (text []byte, err error) { 97 return []byte(addr.String()), nil 98 } 99 100 func (addr HardwareAddr) String() string { 101 return net.HardwareAddr(addr).String() 102 } 103 104 func (addr *HardwareAddr) UnmarshalText(text []byte) error { 105 text = bytes.ToLower(text) 106 if newAddr, err := parseMAC(text); err == nil { 107 *addr = newAddr 108 return nil 109 } 110 if hw, err := net.ParseMAC(string(text)); err != nil { 111 return err 112 } else { 113 *addr = HardwareAddr(hw) 114 return nil 115 } 116 }