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  }