pkg/ibaddrparser/ib_addr.go (50 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package ibaddrparser
import (
"encoding/json"
"fmt"
"log"
"net"
"strings"
"github.com/Azure/hyperkv"
)
const (
IPoIBDataKey = "IPoIB_Data"
)
func GetIBAddr(rawContent []byte, macAddr string) (*net.IPNet, error) {
log.Print("GetIBAddr", macAddr)
list := hyperkv.Parse(rawContent)
var ipoibData string
for _, item := range list {
if strings.EqualFold(item.Key, IPoIBDataKey) {
ipoibData = item.Value
}
}
if ipoibData == "" {
return nil, fmt.Errorf("IPoIB_Data not found in config file")
}
configMap, err := ParseIBAddrConfig([]byte(ipoibData))
if err != nil {
return nil, err
}
if configMap == nil {
return nil, fmt.Errorf("invalid config map")
}
contractedMacAddr := ConvertHardwareAddr(macAddr)
if ipAddr, ok := configMap[strings.ToLower(contractedMacAddr)]; ok {
return ipAddr, nil
} else {
content, err := json.Marshal(configMap)
if err != nil {
return nil, err
}
return nil, fmt.Errorf("failed to get ip address %s,contracted %s, got %s", strings.ToLower(macAddr), ConvertHardwareAddr(macAddr), (content))
}
}
func ConvertHardwareAddr(s string) string {
elements := strings.Split(s, ":")
length := len(elements)
if length < 20 {
return s
}
return strings.Join(append(elements[length-8:length-5], elements[length-3:]...), ":")
}