diff --git a/internal/pkg/overlay/datastructure.go b/internal/pkg/overlay/datastructure.go index 70e5f79b..4a0575af 100644 --- a/internal/pkg/overlay/datastructure.go +++ b/internal/pkg/overlay/datastructure.go @@ -1,8 +1,14 @@ package overlay import ( + "net" + "os" + "strconv" + "time" + "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/warewulfconf" + "github.com/hpcng/warewulf/internal/pkg/wwlog" ) /* @@ -38,3 +44,105 @@ type TemplateStruct struct { Nfs warewulfconf.NfsConf Warewulf warewulfconf.WarewulfConf } + +/* +Initialize an TemplateStruct with the given node.NodeInfo +*/ +func InitStruct(nodeInfo node.NodeInfo) TemplateStruct { + var tstruct TemplateStruct + controller, err := warewulfconf.New() + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + nodeDB, err := node.New() + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + allNodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + + tstruct.Kernel = new(node.KernelConf) + tstruct.Ipmi = new(node.IpmiConf) + tstruct.Id = nodeInfo.Id.Get() + tstruct.Hostname = nodeInfo.Id.Get() + tstruct.Id = nodeInfo.Id.Get() + tstruct.Hostname = nodeInfo.Id.Get() + tstruct.ClusterName = nodeInfo.ClusterName.Get() + tstruct.Container = nodeInfo.ContainerName.Get() + tstruct.Kernel.Version = nodeInfo.Kernel.Override.Get() + tstruct.Kernel.Override = nodeInfo.Kernel.Override.Get() + tstruct.Kernel.Args = nodeInfo.Kernel.Args.Get() + tstruct.Init = nodeInfo.Init.Get() + tstruct.Root = nodeInfo.Root.Get() + tstruct.Ipmi.Ipaddr = nodeInfo.Ipmi.Ipaddr.Get() + tstruct.Ipmi.Netmask = nodeInfo.Ipmi.Netmask.Get() + tstruct.Ipmi.Port = nodeInfo.Ipmi.Port.Get() + tstruct.Ipmi.Gateway = nodeInfo.Ipmi.Gateway.Get() + tstruct.Ipmi.UserName = nodeInfo.Ipmi.UserName.Get() + tstruct.Ipmi.Password = nodeInfo.Ipmi.Password.Get() + tstruct.Ipmi.Interface = nodeInfo.Ipmi.Interface.Get() + tstruct.Ipmi.Write = nodeInfo.Ipmi.Write.Get() + tstruct.RuntimeOverlay = nodeInfo.RuntimeOverlay.Print() + tstruct.SystemOverlay = nodeInfo.SystemOverlay.Print() + tstruct.NetDevs = make(map[string]*node.NetDevs) + tstruct.Keys = make(map[string]string) + tstruct.Tags = make(map[string]string) + for devname, netdev := range nodeInfo.NetDevs { + var nd node.NetDevs + tstruct.NetDevs[devname] = &nd + tstruct.NetDevs[devname].Device = netdev.Device.Get() + tstruct.NetDevs[devname].Hwaddr = netdev.Hwaddr.Get() + tstruct.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() + tstruct.NetDevs[devname].Netmask = netdev.Netmask.Get() + tstruct.NetDevs[devname].Gateway = netdev.Gateway.Get() + tstruct.NetDevs[devname].Type = netdev.Type.Get() + tstruct.NetDevs[devname].OnBoot = netdev.OnBoot.Get() + tstruct.NetDevs[devname].Primary = netdev.Primary.Get() + mask := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()) + ipaddr := net.ParseIP(netdev.Ipaddr.Get()).To4() + netaddr := net.IPNet{IP: ipaddr, Mask: mask} + netPrefix, _ := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()).Size() + tstruct.NetDevs[devname].Prefix = strconv.Itoa(netPrefix) + tstruct.NetDevs[devname].IpCIDR = netaddr.String() + tstruct.NetDevs[devname].Ipaddr6 = netdev.Ipaddr6.Get() + tstruct.NetDevs[devname].Tags = make(map[string]string) + for key, value := range netdev.Tags { + tstruct.NetDevs[devname].Tags[key] = value.Get() + } + } + // Backwards compatibility for templates using "Keys" + for keyname, key := range nodeInfo.Tags { + tstruct.Keys[keyname] = key.Get() + } + for keyname, key := range nodeInfo.Tags { + tstruct.Tags[keyname] = key.Get() + } + tstruct.AllNodes = allNodes + tstruct.Nfs = *controller.Nfs + tstruct.Dhcp = *controller.Dhcp + tstruct.Warewulf = *controller.Warewulf + tstruct.Ipaddr = controller.Ipaddr + tstruct.Ipaddr6 = controller.Ipaddr6 + tstruct.Netmask = controller.Netmask + tstruct.Network = controller.Network + netaddrStruct := net.IPNet{IP: net.ParseIP(controller.Network), Mask: net.IPMask(net.ParseIP(controller.Netmask))} + tstruct.NetworkCIDR = netaddrStruct.String() + if controller.Ipaddr6 != "" { + tstruct.Ipv6 = true + } else { + tstruct.Ipv6 = false + } + hostname, _ := os.Hostname() + tstruct.BuildHost = hostname + dt := time.Now() + tstruct.BuildTime = dt.Format("01-02-2006 15:04:05 MST") + tstruct.BuildTimeUnix = strconv.FormatInt(dt.Unix(), 10) + + return tstruct + +} diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 8037c2b6..6a8a15b7 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -6,19 +6,15 @@ import ( "fmt" "io/fs" "io/ioutil" - "net" "os" "path" "path/filepath" "regexp" - "strconv" "strings" "text/template" - "time" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/util" - "github.com/hpcng/warewulf/internal/pkg/warewulfconf" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/pkg/errors" ) @@ -199,106 +195,17 @@ func BuildOverlayIndir(nodeInfo node.NodeInfo, overlayNames []string, outputDir if !util.IsDir(outputDir) { return errors.Errorf("output must a be a directory: %s", outputDir) } - controller, err := warewulfconf.New() - if err != nil { - wwlog.ErrorExc(err, "") - os.Exit(1) - } - nodeDB, err := node.New() - if err != nil { - wwlog.ErrorExc(err, "") - os.Exit(1) - } - allNodes, err := nodeDB.FindAllNodes() - if err != nil { - wwlog.ErrorExc(err, "") - os.Exit(1) - } if !util.ValidString(strings.Join(overlayNames, ""), "^[a-zA-Z0-9-._:]+$") { return errors.Errorf("overlay names contains illegal characters: %v", overlayNames) } - wwlog.Verbose("Processing node/overlay: %s/%s", nodeInfo.Id.Get(), strings.Join(overlayNames, "-")) - var tstruct TemplateStruct - tstruct.Kernel = new(node.KernelConf) - tstruct.Ipmi = new(node.IpmiConf) - tstruct.Id = nodeInfo.Id.Get() - tstruct.Hostname = nodeInfo.Id.Get() - tstruct.ClusterName = nodeInfo.ClusterName.Get() - tstruct.Container = nodeInfo.ContainerName.Get() - tstruct.Kernel.Version = nodeInfo.Kernel.Override.Get() - tstruct.Kernel.Override = nodeInfo.Kernel.Override.Get() - tstruct.Kernel.Args = nodeInfo.Kernel.Args.Get() - tstruct.Init = nodeInfo.Init.Get() - tstruct.Root = nodeInfo.Root.Get() - tstruct.Ipmi.Ipaddr = nodeInfo.Ipmi.Ipaddr.Get() - tstruct.Ipmi.Netmask = nodeInfo.Ipmi.Netmask.Get() - tstruct.Ipmi.Port = nodeInfo.Ipmi.Port.Get() - tstruct.Ipmi.Gateway = nodeInfo.Ipmi.Gateway.Get() - tstruct.Ipmi.UserName = nodeInfo.Ipmi.UserName.Get() - tstruct.Ipmi.Password = nodeInfo.Ipmi.Password.Get() - tstruct.Ipmi.Interface = nodeInfo.Ipmi.Interface.Get() - tstruct.Ipmi.Write = nodeInfo.Ipmi.Write.Get() - tstruct.RuntimeOverlay = nodeInfo.RuntimeOverlay.Print() - tstruct.SystemOverlay = nodeInfo.SystemOverlay.Print() - tstruct.NetDevs = make(map[string]*node.NetDevs) - tstruct.Keys = make(map[string]string) - tstruct.Tags = make(map[string]string) - for devname, netdev := range nodeInfo.NetDevs { - var nd node.NetDevs - tstruct.NetDevs[devname] = &nd - tstruct.NetDevs[devname].Device = netdev.Device.Get() - tstruct.NetDevs[devname].Hwaddr = netdev.Hwaddr.Get() - tstruct.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() - tstruct.NetDevs[devname].Netmask = netdev.Netmask.Get() - tstruct.NetDevs[devname].Gateway = netdev.Gateway.Get() - tstruct.NetDevs[devname].Type = netdev.Type.Get() - tstruct.NetDevs[devname].OnBoot = netdev.OnBoot.Get() - tstruct.NetDevs[devname].Primary = netdev.Primary.Get() - mask := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()) - ipaddr := net.ParseIP(netdev.Ipaddr.Get()).To4() - netaddr := net.IPNet{IP: ipaddr, Mask: mask} - netPrefix, _ := net.IPMask(net.ParseIP(netdev.Netmask.Get()).To4()).Size() - tstruct.NetDevs[devname].Prefix = strconv.Itoa(netPrefix) - tstruct.NetDevs[devname].IpCIDR = netaddr.String() - tstruct.NetDevs[devname].Ipaddr6 = netdev.Ipaddr6.Get() - tstruct.NetDevs[devname].Tags = make(map[string]string) - for key, value := range netdev.Tags { - tstruct.NetDevs[devname].Tags[key] = value.Get() - } - } - // Backwards compatibility for templates using "Keys" - for keyname, key := range nodeInfo.Tags { - tstruct.Keys[keyname] = key.Get() - } - for keyname, key := range nodeInfo.Tags { - tstruct.Tags[keyname] = key.Get() - } - tstruct.AllNodes = allNodes - tstruct.Nfs = *controller.Nfs - tstruct.Dhcp = *controller.Dhcp - tstruct.Warewulf = *controller.Warewulf - tstruct.Ipaddr = controller.Ipaddr - tstruct.Ipaddr6 = controller.Ipaddr6 - tstruct.Netmask = controller.Netmask - tstruct.Network = controller.Network - netaddrStruct := net.IPNet{IP: net.ParseIP(controller.Network), Mask: net.IPMask(net.ParseIP(controller.Netmask))} - tstruct.NetworkCIDR = netaddrStruct.String() - if controller.Ipaddr6 != "" { - tstruct.Ipv6 = true - } else { - tstruct.Ipv6 = false - } - hostname, _ := os.Hostname() - tstruct.BuildHost = hostname - dt := time.Now() - tstruct.BuildTime = dt.Format("01-02-2006 15:04:05 MST") - tstruct.BuildTimeUnix = strconv.FormatInt(dt.Unix(), 10) + + wwlog.Printf(wwlog.VERBOSE, "Processing node/overlay: %s/%s\n", nodeInfo.Id.Get(), strings.Join(overlayNames, "-")) for _, overlayName := range overlayNames { wwlog.Verbose("Building overlay %s for node %s in %s", overlayName, nodeInfo.Id.Get(), outputDir) overlaySourceDir := OverlaySourceDir(overlayName) - wwlog.Debug("Starting to build overlay %s\nChanging directory to OverlayDir: %s", overlayName, overlaySourceDir) - err = os.Chdir(overlaySourceDir) + wwlog.Printf(wwlog.DEBUG, "Starting to build overlay %s\nChanging directory to OverlayDir: %s\n", overlayName, overlaySourceDir) + err := os.Chdir(overlaySourceDir) if err != nil { return errors.Wrap(err, "could not change directory to overlay dir") } @@ -330,6 +237,7 @@ func BuildOverlayIndir(nodeInfo node.NodeInfo, overlayNames []string, outputDir wwlog.Debug("Created directory in overlay: %s", location) } else if filepath.Ext(location) == ".ww" { + tstruct := InitStruct(nodeInfo) tstruct.BuildSource = path.Join(overlaySourceDir, location) wwlog.Verbose("Evaluating overlay template file: %s", location) destFile := strings.TrimSuffix(location, ".ww")