From c08cd82e68ff33aa8704be5a2d1357200e6d03be Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Wed, 17 Jul 2024 15:47:45 +0200 Subject: [PATCH] don't use net.IPMask net.IPMask doesn't have any advantages, as it would marshalled to mask: - 1 - 2 - 3 - 4 Signed-off-by: Christian Goll --- internal/pkg/node/datastructure.go | 4 +-- internal/pkg/node/flags.go | 14 -------- internal/pkg/node/list.go | 34 +++++++++++++------ internal/pkg/node/methods.go | 22 ++++++++---- internal/pkg/node/util.go | 9 ++--- .../system-connections/ww4-managed.ww | 4 +-- .../rootfs/etc/wicked/ifconfig/ifcfg.xml.ww | 2 +- 7 files changed, 46 insertions(+), 43 deletions(-) diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index fe47fae9..187e5e13 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -63,7 +63,7 @@ type IpmiConf struct { Password string `yaml:"password,omitempty" lopt:"ipmipass" comment:"Set the IPMI password"` Ipaddr net.IP `yaml:"ipaddr,omitempty" lopt:"ipmiaddr" comment:"Set the IPMI IP address" type:"IP"` Gateway net.IP `yaml:"gateway,omitempty" lopt:"ipmigateway" comment:"Set the IPMI gateway" type:"IP"` - Netmask net.IPMask `yaml:"netmask,omitempty" lopt:"ipminetmask" comment:"Set the IPMI netmask" type:"IP"` + Netmask net.IP `yaml:"netmask,omitempty" lopt:"ipminetmask" comment:"Set the IPMI netmask" type:"IP"` Port string `yaml:"port,omitempty" lopt:"ipmiport" comment:"Set the IPMI port"` Interface string `yaml:"interface,omitempty" lopt:"ipmiinterface" comment:"Set the node's IPMI interface (defaults: 'lan')"` EscapeChar string `yaml:"escapechar,omitempty" lopt:"ipmiescapechar" comment:"Set the IPMI escape character (defaults: '~')"` @@ -85,7 +85,7 @@ type NetDevs struct { Ipaddr net.IP `yaml:"ipaddr,omitempty" comment:"IPv4 address in given network" sopt:"I" lopt:"ipaddr" type:"IP"` Ipaddr6 net.IP `yaml:"ip6addr,omitempty" lopt:"ipaddr6" comment:"IPv6 address" type:"IP"` Prefix net.IP `yaml:"prefix,omitempty"` - Netmask net.IPMask `yaml:"netmask,omitempty" lopt:"netmask" sopt:"M" comment:"Set the networks netmask" type:"IP"` + Netmask net.IP `yaml:"netmask,omitempty" lopt:"netmask" sopt:"M" comment:"Set the networks netmask" type:"IP"` Gateway net.IP `yaml:"gateway,omitempty" lopt:"gateway" sopt:"G" comment:"Set the node's network device gateway" type:"IP"` MTU string `yaml:"mtu,omitempty" lopt:"mtu" comment:"Set the mtu" type:"uint"` primary bool `yaml:"primary,omitempty"` diff --git a/internal/pkg/node/flags.go b/internal/pkg/node/flags.go index 04e97476..c286ccb7 100644 --- a/internal/pkg/node/flags.go +++ b/internal/pkg/node/flags.go @@ -157,20 +157,6 @@ func createFlags(baseCmd *cobra.Command, net.IP{}, // empty default! myType.Tag.Get("comment")) } - } else if myType.Type == reflect.TypeOf(net.IPMask{}) { - ptr := myVal.Addr().Interface().(*net.IPMask) - if myType.Tag.Get("sopt") != "" { - baseCmd.PersistentFlags().IPMaskVarP(ptr, - myType.Tag.Get("lopt"), - myType.Tag.Get("sopt"), - net.IPMask{}, // empty default! - myType.Tag.Get("comment")) - } else { - baseCmd.PersistentFlags().IPMaskVar(ptr, - myType.Tag.Get("lopt"), - net.IPMask{}, // empty default! - myType.Tag.Get("comment")) - } } else if myType.Type == reflect.TypeOf(wwbool) { ptr := myVal.Addr().Interface().(*wwtype.WWbool) if myType.Tag.Get("sopt") != "" { diff --git a/internal/pkg/node/list.go b/internal/pkg/node/list.go index b82bf246..1b85a06f 100644 --- a/internal/pkg/node/list.go +++ b/internal/pkg/node/list.go @@ -96,7 +96,15 @@ func (fieldMap fieldMap) recursiveFields(obj interface{}, prefix string, source case reflect.Map: mapIter := valObj.Elem().Field(i).MapRange() for mapIter.Next() { - fieldMap.recursiveFields(mapIter.Value().Interface(), prefix+typeObj.Elem().Field(i).Name+"["+mapIter.Key().String()+"].", source) + if mapIter.Value().Kind() == reflect.String { + fieldMap[prefix+typeObj.Elem().Field(i).Name+"["+mapIter.Key().String()+"]"] = &NodeFields{ + Field: prefix + typeObj.Elem().Field(i).Name + "[" + mapIter.Key().String() + "]", + Source: source, + Value: mapIter.Value().String(), + } + } else { + fieldMap.recursiveFields(mapIter.Value().Interface(), prefix+typeObj.Elem().Field(i).Name+"["+mapIter.Key().String()+"].", source) + } } if valObj.Elem().Field(i).Len() == 0 { fieldMap[prefix+typeObj.Elem().Field(i).Name] = &NodeFields{ @@ -120,9 +128,22 @@ func (fieldMap fieldMap) recursiveFields(obj interface{}, prefix string, source switch typeObj.Elem().Field(i).Type { case reflect.TypeOf([]string{}): vals := (valObj.Elem().Field(i).Interface()).([]string) + src_str := source + if oldVal, ok := fieldMap[prefix+typeObj.Elem().Field(i).Name]; ok { + if oldVal.Value != "" { + if len(vals) > 0 { + src_str = oldVal.Source + "+" + } else { + src_str = oldVal.Source + } + vals = append(vals, oldVal.Value) + } else { + src_str = oldVal.Source + } + } fieldMap[prefix+typeObj.Elem().Field(i).Name] = &NodeFields{ Field: prefix + typeObj.Elem().Field(i).Name, - Source: source, + Source: src_str, Value: strings.Join(vals, ","), } case reflect.TypeOf(net.IP{}): @@ -130,11 +151,6 @@ func (fieldMap fieldMap) recursiveFields(obj interface{}, prefix string, source if val != nil { fieldMap[prefix+typeObj.Elem().Field(i).Name].Set(source, val.String()) } - case reflect.TypeOf(net.IPMask{}): - val := (valObj.Elem().Field(i).Interface()).(net.IPMask) - if val != nil { - fieldMap[prefix+typeObj.Elem().Field(i).Name].Set(source, val.String()) - } case reflect.TypeOf(true): val := (valObj.Elem().Field(i).Interface()).(bool) if val { @@ -144,9 +160,7 @@ func (fieldMap fieldMap) recursiveFields(obj interface{}, prefix string, source fieldMap[prefix+typeObj.Elem().Field(i).Name].Set(source, valObj.Elem().Field(i).String()) } - } /*else if typeObj.Elem().Field(i).Type.Kind() == reflect.Ptr { - fieldMap.recursiveFields(valObj.Elem().Field(i).Interface(), emptyFields, prefix+typeObj.Elem().Field(i).Name+".", source) - }*/ + } } } } diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 72929a42..00b2a74e 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -150,7 +150,6 @@ func recursiveFlatten(obj interface{}) (hasContent bool) { for mapIter.Next() { if mapIter.Value().Kind() == reflect.String { if mapIter.Value().String() != "" { - // fmt.Println("map") hasContent = true } } else { @@ -203,12 +202,6 @@ func recursiveFlatten(obj interface{}) (hasContent bool) { if len(val) != 0 && !val.IsUnspecified() { hasContent = true } - case reflect.TypeOf(net.IPMask{}): - val := valObj.Elem().Field(i).Interface().(net.IPMask) - if len(val) != 0 { - // fmt.Println("Mask") - hasContent = true - } default: } } @@ -346,3 +339,18 @@ func cleanList(list []string) (ret []string) { } return ret } + +/* +Return the ipv4 address and mask in CIDR format. Aimed for the use in +templates. +*/ +func (netdev *NetDevs) IpCIDR() string { + if netdev.Ipaddr.IsUnspecified() || netdev.Netmask.IsUnspecified() { + return "" + } + ipCIDR := net.IPNet{ + IP: netdev.Ipaddr, + Mask: net.IPMask(netdev.Netmask), + } + return ipCIDR.String() +} diff --git a/internal/pkg/node/util.go b/internal/pkg/node/util.go index 213b797d..bf44a928 100644 --- a/internal/pkg/node/util.go +++ b/internal/pkg/node/util.go @@ -71,7 +71,8 @@ func ObjectIsEmpty(obj interface{}) bool { return false } } else if varType.Field(i).Type == reflect.TypeOf(map[string]string{}) { - if len(varVal.Field(i).Interface().(map[string]string)) != 0 { + if varVal.Field(i).Len() != 0 { + // if len(varVal.Field(i).Interface().(map[string]string)) != 0 { return false } } else if varType.Field(i).Type.Kind() == reflect.Ptr { @@ -83,13 +84,7 @@ func ObjectIsEmpty(obj interface{}) bool { if len(val) != 0 && !val.IsUnspecified() { return false } - } else if varType.Field(i).Type == reflect.TypeOf(net.IPMask{}) { - o, b := varVal.Field(i).Interface().(net.IPMask).Size() - if o == 0 && b == 0 { - return false - } } - } return true } diff --git a/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww b/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww index 88172091..cb7e2bc6 100644 --- a/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww +++ b/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww @@ -52,9 +52,9 @@ mtu={{ $netdev.MTU }} {{ end -}} {{ end -}} -{{ if and ($netdev.Ipaddr) (ne $netdev.Type "bond-slave") -}} +{{ if and ($netdev.IpCIDR) (ne $netdev.Type "bond-slave") -}} [ipv4] -address={{ $netdev.Ipaddr }} +address={{ $netdev.IpCIDR }} {{ if $netdev.Gateway -}} gateway={{ $netdev.Gateway }} {{ end -}} diff --git a/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww b/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww index 4b456a74..db9d6865 100644 --- a/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww +++ b/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww @@ -24,7 +24,7 @@ This file is autogenerated by warewulf
- {{$netdev.Ipaddr}}/{{$netdev.Ipmask}} + {{$netdev.IpCIDR}}
{{ if $netdev.Gateway.Get -}}