diff --git a/etc/nodes.conf b/etc/nodes.conf index 2adba2ec..29e4d0e9 100644 --- a/etc/nodes.conf +++ b/etc/nodes.conf @@ -1,10 +1,11 @@ nodeprofiles: default: - comment: "" + comment: "Hello from the default profile" vnfs: "" kernel version: "" kernel args: crashkernel=no quiet + control: localhost: comment: This is the first control system @@ -37,51 +38,40 @@ control: start command: service nfs start restart command: service nfs restart enable command: chkconfig nfs on - nodegroups: - default: - comment: This is the default group - domain name: cluster01 - profiles: - - default - nodes: - n0000: - hostname: n0000 - netdevs: - eth0: - type: ethernet - hwaddr: 00:0c:29:23:8b:48 - ipaddr: 192.168.1.100 - netmask: 255.255.255.0 - gateway: 192.168.1.1 - ib0: - type: infiniband - hwaddr: aa:bb:cc:dd:ee:a0 - ipaddr: 192.168.10.100 - netmask: 255.255.255.0 - n0001: - hostname: n0001 - ipmi ipaddr: x.x.x.x - netdevs: - eth0: - hwaddr: aa:bb:cc:dd:ee:b0 - ipaddr: 192.168.1.101 - netmask: 255.255.255.0 - gateway: 192.168.1.1 - ib0: - hwaddr: aa:bb:cc:dd:ee:b1 - ipaddr: 192.168.10.100 - netmask: 255.255.255.0 - group_1: - comment: This is the group 1 - domain name: group1 - profiles: - - default - nodes: - n0000: - hostname: n0000 - netdevs: - eth0: - hwaddr: aa:bb:cc:dd:ee:c0 - ipaddr: 192.168.2.100 - netmask: 255.255.255.0 - gateway: 192.168.2.1 + +nodes: + n0000.cluster01: + profiles: + - default + netdevs: + eth0: + type: ethernet + hwaddr: 00:0c:29:23:8b:48 + ipaddr: 192.168.1.100 + netmask: 255.255.255.0 + gateway: 192.168.1.1 + ib0: + type: infiniband + hwaddr: aa:bb:cc:dd:ee:a0 + ipaddr: 192.168.10.100 + netmask: 255.255.255.0 + n0001.cluster01: + profiles: + - default + netdevs: + eth0: + hwaddr: aa:bb:cc:dd:ee:b0 + ipaddr: 192.168.1.101 + netmask: 255.255.255.0 + gateway: 192.168.1.1 + ib0: + hwaddr: aa:bb:cc:dd:ee:b1 + ipaddr: 192.168.10.100 + netmask: 255.255.255.0 + n0000.cluster02: + netdevs: + eth0: + hwaddr: aa:bb:cc:dd:ee:c0 + ipaddr: 192.168.2.100 + netmask: 255.255.255.0 + gateway: 192.168.1.1 diff --git a/internal/app/wwctl/kernel/build/main.go b/internal/app/wwctl/kernel/build/main.go index b1390231..25d0ef01 100644 --- a/internal/app/wwctl/kernel/build/main.go +++ b/internal/app/wwctl/kernel/build/main.go @@ -41,7 +41,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - wwlog.Printf(wwlog.DEBUG, "evaluating node/kernel: %s/%s\n", node.Fqdn.Get(), node.KernelVersion.Get()) + wwlog.Printf(wwlog.DEBUG, "evaluating node/kernel: %s/%s\n", node.Id.Get(), node.KernelVersion.Get()) if node.KernelVersion.Defined() == true { set[node.KernelVersion.Get()]++ } diff --git a/internal/app/wwctl/node/add/main.go b/internal/app/wwctl/node/add/main.go index 232ee268..22937985 100644 --- a/internal/app/wwctl/node/add/main.go +++ b/internal/app/wwctl/node/add/main.go @@ -16,15 +16,95 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, a := range args { - err = nodeDB.AddNode(SetController, SetGroup, a) + n, err := nodeDB.AddNode(a) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } fmt.Printf("Added node: %s\n", a) + + if SetIpaddr != "" { + if SetNetDev == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netdev' option\n") + os.Exit(1) + } + + if _, ok := n.NetDevs[SetNetDev]; !ok { + var netdev node.NetDevEntry + n.NetDevs[SetNetDev] = &netdev + } + + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Ipaddr to: %s\n", n.Id, SetNetDev, SetIpaddr) + + n.NetDevs[SetNetDev].Ipaddr.Set(SetIpaddr) + n.NetDevs[SetNetDev].Default.SetB(true) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + if SetNetmask != "" { + if SetNetDev == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netdev' option\n") + os.Exit(1) + } + + if _, ok := n.NetDevs[SetNetDev]; !ok { + wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) + os.Exit(1) + } + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting netmask to: %s\n", n.Id, SetNetDev, SetNetmask) + + n.NetDevs[SetNetDev].Netmask.Set(SetNetmask) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + if SetGateway != "" { + if SetNetDev == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netdev' option\n") + os.Exit(1) + } + + if _, ok := n.NetDevs[SetNetDev]; !ok { + wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) + os.Exit(1) + } + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting gateway to: %s\n", n.Id, SetNetDev, SetGateway) + + n.NetDevs[SetNetDev].Gateway.Set(SetGateway) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + if SetHwaddr != "" { + if SetNetDev == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--netdev' option\n") + os.Exit(1) + } + + if _, ok := n.NetDevs[SetNetDev]; !ok { + wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) + os.Exit(1) + } + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting HW address to: %s\n", n.Id, SetNetDev, SetHwaddr) + + n.NetDevs[SetNetDev].Hwaddr.Set(SetHwaddr) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + } nodeDB.Persist() return nil -} \ No newline at end of file +} diff --git a/internal/app/wwctl/node/add/root.go b/internal/app/wwctl/node/add/root.go index 2e815fd2..f794ef80 100644 --- a/internal/app/wwctl/node/add/root.go +++ b/internal/app/wwctl/node/add/root.go @@ -12,11 +12,22 @@ var ( } SetGroup string SetController string + SetNetDev string + SetIpaddr string + SetNetmask string + SetGateway string + SetHwaddr string ) func init() { baseCmd.PersistentFlags().StringVarP(&SetGroup, "group", "g", "default", "Group to add nodes to") baseCmd.PersistentFlags().StringVarP(&SetController, "controller", "c", "localhost", "Controller to add nodes to") + baseCmd.PersistentFlags().StringVarP(&SetNetDev, "netdev", "n", "eth0", "Define the network device to configure") + baseCmd.PersistentFlags().StringVarP(&SetIpaddr, "ipaddr", "I", "", "Set the node's network device IP address") + baseCmd.PersistentFlags().StringVarP(&SetNetmask, "netmask", "M", "", "Set the node's network device netmask") + baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") + baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") + } // GetRootCommand returns the root cobra.Command for the application. diff --git a/internal/app/wwctl/node/delete/main.go b/internal/app/wwctl/node/delete/main.go index 249001f9..2730c967 100644 --- a/internal/app/wwctl/node/delete/main.go +++ b/internal/app/wwctl/node/delete/main.go @@ -21,11 +21,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { nodeList, err := nodeDB.SearchByNameList(args) for _, n := range nodeList { - if SetGroup != "" && SetGroup != n.Gid.Print() { - wwlog.Printf(wwlog.DEBUG, "skipping node of different group: %s/%s\n", n.Gid, n.Id) - continue - } - err := nodeDB.DelNode(n.Cid.Get(), n.Gid.Get(), n.Id.Get()) + err := nodeDB.DelNode(n.Id.Get()) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) } else { diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 7c91c133..416ce7d2 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -31,9 +31,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } sort.Slice(nodes, func(i, j int) bool { - if nodes[i].Gid.Get() < nodes[j].Gid.Get() { + if nodes[i].DomainName.Get() < nodes[j].DomainName.Get() { return true - } else if nodes[i].Gid.Get() == nodes[j].Gid.Get() { + } else if nodes[i].DomainName.Get() == nodes[j].DomainName.Get() { if nodes[i].Id.Get() < nodes[j].Id.Get() { return true } @@ -44,28 +44,29 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if ShowAll == true { for _, node := range nodes { fmt.Printf("################################################################################\n") - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Id", node.Id.Source(), node.Id.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Comment", node.Comment.Source(), node.Comment.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "GroupName", node.Gid.Source(), node.Gid.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "DomainName", node.DomainName.Source(), node.DomainName.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Profiles (Group)", "group", strings.Join(node.GroupProfiles, ",")) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Profiles (Node)", "node", strings.Join(node.Profiles, ",")) + fmt.Printf("%-20s %-18s %-12s %s\n", "NODE", "FIELD", "PROFILE", "VALUE") + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Id", node.Id.Source(), node.Id.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Comment", node.Comment.Source(), node.Comment.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "DomainName", node.DomainName.Source(), node.DomainName.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Profiles", "--", strings.Join(node.Profiles, ",")) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Vnfs", node.Vnfs.Source(), node.Vnfs.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "KernelVersion", node.KernelVersion.Source(), node.KernelVersion.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "KernelArgs", node.KernelArgs.Source(), node.KernelArgs.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "SystemOverlay", node.SystemOverlay.Source(), node.SystemOverlay.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "Ipxe", node.Ipxe.Source(), node.Ipxe.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "IpmiIpaddr", node.IpmiIpaddr.Source(), node.IpmiIpaddr.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "IpmiNetmask", node.IpmiNetmask.Source(), node.IpmiNetmask.Print()) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Vnfs", node.Vnfs.Source(), node.Vnfs.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "KernelVersion", node.KernelVersion.Source(), node.KernelVersion.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "KernelArgs", node.KernelArgs.Source(), node.KernelArgs.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Source(), node.RuntimeOverlay.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "SystemOverlay", node.SystemOverlay.Source(), node.SystemOverlay.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Ipxe", node.Ipxe.Source(), node.Ipxe.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiIpaddr", node.IpmiIpaddr.Source(), node.IpmiIpaddr.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiNetmask", node.IpmiNetmask.Source(), node.IpmiNetmask.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print()) for name, netdev := range node.NetDevs { - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), name+":IPADDR", "node", netdev.Ipaddr) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), name+":NETMASK", "node", netdev.Netmask) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), name+":GATEWAY", "node", netdev.Gateway) - fmt.Printf("%-20s %-18s %8s: %s\n", node.Fqdn.Get(), name+":HWADDR", "node", netdev.Hwaddr) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":IPADDR", netdev.Ipaddr.Source(), netdev.Ipaddr.Get()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":NETMASK", netdev.Netmask.Source(), netdev.Netmask.Get()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":GATEWAY", netdev.Gateway.Source(), netdev.Gateway.Get()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":HWADDR", netdev.Hwaddr.Source(), netdev.Hwaddr.Get()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":TYPE", netdev.Type.Source(), netdev.Type.Get()) + } // v := reflect.ValueOf(node) @@ -83,10 +84,10 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodes { if len(node.NetDevs) > 0 { for name, dev := range node.NetDevs { - fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Fqdn.Get(), name, dev.Hwaddr, dev.Ipaddr, dev.Gateway) + fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Id.Get(), name, dev.Hwaddr, dev.Ipaddr, dev.Gateway) } } else { - fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Fqdn.Get(), "--", "--", "--", "--") + fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Id.Get(), "--", "--", "--", "--") } } @@ -95,31 +96,30 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Println(strings.Repeat("=", 80)) for _, node := range nodes { - fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Fqdn.Get(), node.IpmiIpaddr.Print(), node.IpmiUserName.Print(), node.IpmiPassword.Print()) + fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Id.Get(), node.IpmiIpaddr.Print(), node.IpmiUserName.Print(), node.IpmiPassword.Print()) } } else if ShowLong == true { - fmt.Printf("%-22s %-12s %-26s %-35s %s\n", "NODE NAME", "GROUP NAME", "KERNEL VERSION", "VNFS IMAGE", "OVERLAYS (S/R)") + fmt.Printf("%-22s %-26s %-35s %s\n", "NODE NAME", "KERNEL VERSION", "VNFS IMAGE", "OVERLAYS (S/R)") fmt.Println(strings.Repeat("=", 120)) for _, node := range nodes { - fmt.Printf("%-22s %-12s %-26s %-35s %s\n", node.Fqdn.Get(), node.Gid.Print(), node.KernelVersion.Print(), node.Vnfs.Print(), node.SystemOverlay.Print()+"/"+node.RuntimeOverlay.Print()) + fmt.Printf("%-22s %-26s %-35s %s\n", node.Id.Get(), node.KernelVersion.Print(), node.Vnfs.Print(), node.SystemOverlay.Print()+"/"+node.RuntimeOverlay.Print()) } } else { - fmt.Printf("%-22s: %-25s %s\n", "NODE NAME", "PROFILES", "NETDEVS") + fmt.Printf("%-22s %-26s %s\n", "NODE NAME", "PROFILES", "NETWORK") for _, node := range nodes { var netdevs []string if len(node.NetDevs) > 0 { for name, dev := range node.NetDevs { - netdevs = append(netdevs, fmt.Sprintf("%s[%s/%s]", name, dev.Ipaddr, dev.Netmask)) + netdevs = append(netdevs, fmt.Sprintf("%s:%s", name, dev.Ipaddr.Get())) } } sort.Strings(netdevs) - allProfiles := append(node.GroupProfiles, node.Profiles...) - fmt.Printf("%-22s: %-25s %s\n", node.Fqdn.Get(), strings.Join(allProfiles, ","), strings.Join(netdevs, ", ")) + fmt.Printf("%-22s %-26s %s\n", node.Id.Get(), strings.Join(node.Profiles, ","), strings.Join(netdevs, ", ")) } } diff --git a/internal/app/wwctl/node/poweroff/power.go b/internal/app/wwctl/node/poweroff/power.go index c8810c4e..42a13c91 100644 --- a/internal/app/wwctl/node/poweroff/power.go +++ b/internal/app/wwctl/node/poweroff/power.go @@ -35,7 +35,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { if node.IpmiIpaddr.Get() == "" { - wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) + wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) continue } @@ -49,12 +49,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error { out, err := ipmiCmd.PowerOff() if err != nil { - wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.Id.Get(), out) returnErr = err continue } - wwlog.Printf(wwlog.INFO, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.INFO, "%s: %s\n", node.Id.Get(), out) } return returnErr diff --git a/internal/app/wwctl/node/poweron/power.go b/internal/app/wwctl/node/poweron/power.go index b8cd8ccf..8232ecc4 100644 --- a/internal/app/wwctl/node/poweron/power.go +++ b/internal/app/wwctl/node/poweron/power.go @@ -37,7 +37,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var powerCmd power.PowerOnInterface if node.IpmiIpaddr.Get() == "" { - wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) + wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) continue } @@ -53,12 +53,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error { out, err := powerCmd.PowerOn() if err != nil { - wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.Id.Get(), out) returnErr = err continue } - wwlog.Printf(wwlog.INFO, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.INFO, "%s: %s\n", node.Id.Get(), out) } return returnErr diff --git a/internal/app/wwctl/node/powerstatus/power.go b/internal/app/wwctl/node/powerstatus/power.go index 8d93a868..69b063ac 100644 --- a/internal/app/wwctl/node/powerstatus/power.go +++ b/internal/app/wwctl/node/powerstatus/power.go @@ -35,7 +35,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { if node.IpmiIpaddr.Get() == "" { - wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) + wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) continue } @@ -49,12 +49,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error { out, err := ipmiCmd.PowerStatus() if err != nil { - wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.ERROR, "%s: %s\n", node.Id.Get(), out) returnErr = err continue } - wwlog.Printf(wwlog.INFO, "%s: %s\n", node.HostName, out) + wwlog.Printf(wwlog.INFO, "%s: %s\n", node.Id.Get(), out) } return returnErr diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index c7e03cb0..dc5b6e0b 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -44,12 +44,22 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, n := range nodes { - wwlog.Printf(wwlog.VERBOSE, "Evaluating node: %s\n", n.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "Evaluating node: %s\n", n.Id.Get()) + if SetComment != "" { + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting comment to: %s\n", n.Id.Get(), SetComment) + + n.Comment.Set(SetComment) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } if SetVnfs != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting vnfs to: %s\n", n.Fqdn.Get(), SetVnfs) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting vnfs to: %s\n", n.Id.Get(), SetVnfs) - n.Vnfs.SetNode(SetVnfs) + n.Vnfs.Set(SetVnfs) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -57,9 +67,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetKernel != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Fqdn.Get(), SetKernel) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Id.Get(), SetKernel) - n.KernelVersion.SetNode(SetKernel) + n.KernelVersion.Set(SetKernel) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -67,9 +77,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetDomainName != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting domain name to: %s\n", n.Fqdn.Get(), SetDomainName) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting domain name to: %s\n", n.Id.Get(), SetDomainName) - n.DomainName.SetNode(SetDomainName) + n.DomainName.Set(SetDomainName) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -77,9 +87,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetIpxe != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting iPXE template to: %s\n", n.Fqdn.Get(), SetIpxe) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting iPXE template to: %s\n", n.Id.Get(), SetIpxe) - n.Ipxe.SetNode(SetIpxe) + n.Ipxe.Set(SetIpxe) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -87,9 +97,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetRuntimeOverlay != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting runtime overlay to: %s\n", n.Fqdn.Get(), SetRuntimeOverlay) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting runtime overlay to: %s\n", n.Id.Get(), SetRuntimeOverlay) - n.RuntimeOverlay.SetNode(SetRuntimeOverlay) + n.RuntimeOverlay.Set(SetRuntimeOverlay) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -97,19 +107,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetSystemOverlay != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting system overlay to: %s\n", n.Fqdn.Get(), SetSystemOverlay) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting system overlay to: %s\n", n.Id.Get(), SetSystemOverlay) - n.SystemOverlay.SetNode(SetSystemOverlay) - err := nodeDB.NodeUpdate(n) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - os.Exit(1) - } - } - if SetHostname != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting hostname to: %s\n", n.Fqdn.Get(), SetHostname) - - n.HostName.SetNode(SetHostname) + n.SystemOverlay.Set(SetSystemOverlay) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -117,9 +117,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetIpmiIpaddr != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP address to: %s\n", n.Fqdn.Get(), SetIpmiIpaddr) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP address to: %s\n", n.Id.Get(), SetIpmiIpaddr) - n.IpmiIpaddr.SetNode(SetIpmiIpaddr) + n.IpmiIpaddr.Set(SetIpmiIpaddr) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -127,9 +127,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetIpmiNetmask != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI netmask to: %s\n", n.Fqdn.Get(), SetIpmiNetmask) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI netmask to: %s\n", n.Id.Get(), SetIpmiNetmask) - n.IpmiNetmask.SetNode(SetIpmiNetmask) + n.IpmiNetmask.Set(SetIpmiNetmask) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -137,9 +137,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetIpmiUsername != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP username to: %s\n", n.Fqdn.Get(), SetIpmiUsername) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP username to: %s\n", n.Id.Get(), SetIpmiUsername) - n.IpmiUserName.SetNode(SetIpmiUsername) + n.IpmiUserName.Set(SetIpmiUsername) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -147,9 +147,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } if SetIpmiPassword != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP password to: %s\n", n.Fqdn.Get(), SetIpmiPassword) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP password to: %s\n", n.Id.Get(), SetIpmiPassword) - n.IpmiPassword.SetNode(SetIpmiPassword) + n.IpmiPassword.Set(SetIpmiPassword) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -159,7 +159,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if len(SetAddProfile) > 0 { for _, p := range SetAddProfile { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, adding profile to '%s'\n", n.Fqdn, p) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, adding profile to '%s'\n", n.Id.Get(), p) n.Profiles = util.SliceAddUniqueElement(n.Profiles, p) } err := nodeDB.NodeUpdate(n) @@ -170,7 +170,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if len(SetDelProfile) > 0 { for _, p := range SetDelProfile { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, deleting profile from '%s'\n", n.Fqdn, p) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, deleting profile from '%s'\n", n.Id.Get(), p) n.Profiles = util.SliceRemoveElement(n.Profiles, p) } err := nodeDB.NodeUpdate(n) @@ -185,7 +185,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "You must include the '--netdev' option\n") os.Exit(1) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting network device: %s\n", n.Fqdn, SetNetDev) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting network device: %s\n", n.Id.Get(), SetNetDev) if _, ok := n.NetDevs[SetNetDev]; !ok { wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) @@ -209,9 +209,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) os.Exit(1) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Ipaddr to: %s\n", n.Fqdn, SetNetDev, SetIpaddr) + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Ipaddr to: %s\n", n.Id.Get(), SetNetDev, SetIpaddr) - n.NetDevs[SetNetDev].Ipaddr = SetIpaddr + n.NetDevs[SetNetDev].Ipaddr.Set(SetIpaddr) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -228,9 +228,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) os.Exit(1) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting netmask to: %s\n", n.Fqdn, SetNetDev, SetNetmask) + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting netmask to: %s\n", n.Id.Get(), SetNetDev, SetNetmask) - n.NetDevs[SetNetDev].Netmask = SetNetmask + n.NetDevs[SetNetDev].Netmask.Set(SetNetmask) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -247,9 +247,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) os.Exit(1) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting gateway to: %s\n", n.Fqdn, SetNetDev, SetGateway) + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting gateway to: %s\n", n.Id.Get(), SetNetDev, SetGateway) - n.NetDevs[SetNetDev].Gateway = SetGateway + n.NetDevs[SetNetDev].Gateway.Set(SetGateway) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -266,9 +266,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "Network Device doesn't exist: %s\n", SetNetDev) os.Exit(1) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting HW address to: %s\n", n.Fqdn, SetNetDev, SetHwaddr) + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting HW address to: %s\n", n.Id.Get(), SetNetDev, SetHwaddr) - n.NetDevs[SetNetDev].Hwaddr = SetHwaddr + n.NetDevs[SetNetDev].Hwaddr.Set(SetHwaddr) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 0f97c81b..35065683 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -9,6 +9,7 @@ var ( Long: "Set node configurations ", RunE: CobraRunE, } + SetComment string SetVnfs string SetKernel string SetNetDev string @@ -21,7 +22,6 @@ var ( SetIpxe string SetRuntimeOverlay string SetSystemOverlay string - SetHostname string SetIpmiIpaddr string SetIpmiNetmask string SetIpmiUsername string @@ -33,13 +33,13 @@ var ( ) func init() { + baseCmd.PersistentFlags().StringVarP(&SetComment, "comment", "C", "", "Set a comment for this node") baseCmd.PersistentFlags().StringVarP(&SetVnfs, "vnfs", "V", "", "Set node Virtual Node File System (VNFS)") baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes") baseCmd.PersistentFlags().StringVarP(&SetDomainName, "domain", "D", "", "Set the node's domain name") baseCmd.PersistentFlags().StringVarP(&SetIpxe, "ipxe", "P", "", "Set the node's iPXE template name") baseCmd.PersistentFlags().StringVarP(&SetRuntimeOverlay, "runtime", "R", "", "Set the node's runtime overlay") baseCmd.PersistentFlags().StringVarP(&SetSystemOverlay, "system", "S", "", "Set the node's system overlay") - baseCmd.PersistentFlags().StringVarP(&SetHostname, "hostname", "N", "", "Set the node's hostname") baseCmd.PersistentFlags().StringVar(&SetIpmiIpaddr, "ipmi", "", "Set the node's IPMI IP address") baseCmd.PersistentFlags().StringVar(&SetIpmiNetmask, "ipminetmask", "", "Set the node's IPMI netmask") baseCmd.PersistentFlags().StringVar(&SetIpmiUsername, "ipmiuser", "", "Set the node's IPMI username") @@ -48,12 +48,12 @@ func init() { baseCmd.PersistentFlags().StringSliceVarP(&SetAddProfile, "addprofile", "p", []string{}, "Add Profile(s) to node") baseCmd.PersistentFlags().StringSliceVarP(&SetDelProfile, "delprofile", "r", []string{}, "Remove Profile(s) to node") - baseCmd.PersistentFlags().StringVarP(&SetNetDev, "netdev", "n", "", "Define the network device to configure") + baseCmd.PersistentFlags().StringVarP(&SetNetDev, "netdev", "n", "eth0", "Define the network device to configure") baseCmd.PersistentFlags().StringVarP(&SetIpaddr, "ipaddr", "I", "", "Set the node's network device IP address") baseCmd.PersistentFlags().StringVarP(&SetNetmask, "netmask", "M", "", "Set the node's network device netmask") baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "H", "", "Set the node's network device HW address") - baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "delete", false, "Delete the node's network device") + baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") baseCmd.PersistentFlags().BoolVarP(&SetNodeAll, "all", "a", false, "Set all nodes") baseCmd.PersistentFlags().BoolVarP(&SetYes, "yes", "y", false, "Set 'yes' to all questions asked") diff --git a/internal/app/wwctl/profile/add/main.go b/internal/app/wwctl/profile/add/main.go index b5c61387..f21e6e69 100644 --- a/internal/app/wwctl/profile/add/main.go +++ b/internal/app/wwctl/profile/add/main.go @@ -15,7 +15,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, p := range args { - err = nodeDB.AddProfile(p) + _, err := nodeDB.AddProfile(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -25,4 +25,4 @@ func CobraRunE(cmd *cobra.Command, args []string) error { nodeDB.Persist() return nil -} \ No newline at end of file +} diff --git a/internal/app/wwctl/profile/delete/main.go b/internal/app/wwctl/profile/delete/main.go index ffab3be5..6909d34b 100644 --- a/internal/app/wwctl/profile/delete/main.go +++ b/internal/app/wwctl/profile/delete/main.go @@ -15,7 +15,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var numNodes int var numGroups int - nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Failed to open node database: %s\n", err) @@ -27,12 +26,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "Could not load all nodes: %s\n", err) os.Exit(1) } - groups, err := nodeDB.FindAllGroups() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not load all groups: %s\n", err) - os.Exit(1) - } - for _, p := range args { err := nodeDB.DelProfile(p) @@ -44,22 +37,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, np := range n.Profiles { if np == p { numNodes++ - wwlog.Printf(wwlog.VERBOSE, "Removing profile from node %s: %s\n", n.Fqdn.Get(), p) + wwlog.Printf(wwlog.VERBOSE, "Removing profile from node %s: %s\n", n.Id.Get(), p) n.Profiles = util.SliceRemoveElement(n.Profiles, p) nodeDB.NodeUpdate(n) } } } - for _, g := range groups { - for _, np := range g.Profiles { - if np == p { - numGroups++ - wwlog.Printf(wwlog.VERBOSE, "Removing profile from group %s: %s\n", g.Id, p) - g.Profiles = util.SliceRemoveElement(g.Profiles, p) - nodeDB.GroupUpdate(g) - } - } - } count++ } diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index 93a78486..850b2d76 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -6,7 +6,6 @@ import ( "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/spf13/cobra" "os" - "reflect" ) func CobraRunE(cmd *cobra.Command, args []string) error { @@ -23,14 +22,30 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - for _, group := range profiles { - v := reflect.ValueOf(group) - typeOfS := v.Type() + for _, node := range profiles { fmt.Printf("################################################################################\n") - for i := 0; i< v.NumField(); i++ { - fmt.Printf("%-25s %s = %v\n", group.Id, typeOfS.Field(i).Name, v.Field(i).Interface()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "Id", node.Id.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "Comment", node.Comment.Print()) + + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "Vnfs", node.Vnfs.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "KernelVersion", node.KernelVersion.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "KernelArgs", node.KernelArgs.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "RuntimeOverlay", node.RuntimeOverlay.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "SystemOverlay", node.SystemOverlay.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "Ipxe", node.Ipxe.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "IpmiIpaddr", node.IpmiIpaddr.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "IpmiNetmask", node.IpmiNetmask.Print()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Print()) + + for name, netdev := range node.NetDevs { + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), name+":IPADDR", netdev.Ipaddr.Get()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), name+":NETMASK", netdev.Netmask.Get()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), name+":GATEWAY", netdev.Gateway.Get()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), name+":HWADDR", netdev.Hwaddr.Get()) + fmt.Printf("%-20s %-18s: %s\n", node.Id.Get(), name+":TYPE", netdev.Hwaddr.Get()) + } } return nil -} \ No newline at end of file +} diff --git a/internal/app/wwctl/profile/set/main.go b/internal/app/wwctl/profile/set/main.go index c9b95b29..6936670b 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -11,7 +11,7 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var err error - var profiles []node.ProfileInfo + var profiles []node.NodeInfo nodeDB, err := node.New() if err != nil { @@ -19,29 +19,18 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - if err != nil { - wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) - os.Exit(1) - } - if len(args) == 0 { args = append(args, "default") } if SetAll == true { - var tmp []node.ProfileInfo - tmp, err = nodeDB.FindAllProfiles() + profiles, err = nodeDB.FindAllProfiles() if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } - - for _, p := range tmp { - profiles = append(profiles, p) - } - } else { - var tmp []node.ProfileInfo + var tmp []node.NodeInfo tmp, err = nodeDB.FindAllProfiles() if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -50,7 +39,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, a := range args { for _, p := range tmp { - if p.Id == a { + if p.Id.Get() == a { profiles = append(profiles, p) } } @@ -59,10 +48,20 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, p := range profiles { + if SetComment != "" { + wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting comment to: %s\n", p.Id, SetComment) + + p.Comment.Set(SetComment) + err := nodeDB.ProfileUpdate(p) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } if SetDomainName != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting domain name to: %s\n", p.Id, SetDomainName) - p.DomainName = SetDomainName + p.DomainName.Set(SetDomainName) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -72,7 +71,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetVnfs != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting VNFS to: %s\n", p.Id, SetVnfs) - p.Vnfs = SetVnfs + p.Vnfs.Set(SetVnfs) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -82,7 +81,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetKernel != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting Kernel version to: %s\n", p.Id, SetKernel) - p.KernelVersion = SetKernel + p.KernelVersion.Set(SetKernel) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -92,7 +91,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetIpxe != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting iPXE template to: %s\n", p.Id, SetIpxe) - p.Ipxe = SetIpxe + p.Ipxe.Set(SetIpxe) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -102,7 +101,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetRuntimeOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting runtime overlay to: %s\n", p.Id, SetRuntimeOverlay) - p.RuntimeOverlay = SetRuntimeOverlay + p.RuntimeOverlay.Set(SetRuntimeOverlay) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -112,7 +111,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetSystemOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting system overlay to: %s\n", p.Id, SetSystemOverlay) - p.SystemOverlay = SetSystemOverlay + p.SystemOverlay.Set(SetSystemOverlay) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -122,7 +121,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetIpmiNetmask != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting IPMI username to: %s\n", p.Id, SetIpmiNetmask) - p.IpmiNetmask = SetIpmiNetmask + p.IpmiNetmask.Set(SetIpmiNetmask) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -132,7 +131,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetIpmiUsername != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting IPMI username to: %s\n", p.Id, SetIpmiUsername) - p.IpmiUserName = SetIpmiUsername + p.IpmiUserName.Set(SetIpmiUsername) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) @@ -142,7 +141,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { if SetIpmiPassword != "" { wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting IPMI username to: %s\n", p.Id, SetIpmiPassword) - p.IpmiPassword = SetIpmiPassword + p.IpmiPassword.Set(SetIpmiPassword) err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 1a3197f3..ee80c043 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -10,6 +10,7 @@ var ( RunE: CobraRunE, } SetAll bool + SetComment string SetVnfs string SetKernel string SetDomainName string @@ -22,6 +23,7 @@ var ( ) func init() { + baseCmd.PersistentFlags().StringVarP(&SetComment, "comment", "C", "", "Set a comment for this node") baseCmd.PersistentFlags().StringVarP(&SetVnfs, "vnfs", "V", "", "Set node Virtual Node File System (VNFS)") baseCmd.PersistentFlags().StringVarP(&SetKernel, "kernel", "K", "", "Set Kernel version for nodes") baseCmd.PersistentFlags().StringVarP(&SetDomainName, "domain", "D", "", "Set the node's domain name") diff --git a/internal/app/wwctl/ready/main.go b/internal/app/wwctl/ready/main.go index 483f6c23..b58d0ef2 100644 --- a/internal/app/wwctl/ready/main.go +++ b/internal/app/wwctl/ready/main.go @@ -42,11 +42,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { vnfs_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "VNFS not found: %s, %s\n", node.Fqdn.Get(), v.Source) + wwlog.Printf(wwlog.VERBOSE, "VNFS not found: %s, %s\n", node.Id.Get(), v.Source) } } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Node Kernel not defined: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "Node Kernel not defined: %s\n", node.Id.Get()) } if node.KernelVersion.Get() != "" { @@ -54,44 +54,44 @@ func CobraRunE(cmd *cobra.Command, args []string) error { kernel_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Node Kernel not found: %s, %s\n", node.Fqdn.Get(), node.KernelVersion.Get()) + wwlog.Printf(wwlog.VERBOSE, "Node Kernel not found: %s, %s\n", node.Id.Get(), node.KernelVersion.Get()) } if util.IsFile(config.KmodsImage(node.KernelVersion.Get())) == true { kmods_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Node Kmods not found: %s, %s\n", node.Fqdn.Get(), node.KernelVersion.Get()) + wwlog.Printf(wwlog.VERBOSE, "Node Kmods not found: %s, %s\n", node.Id.Get(), node.KernelVersion.Get()) } } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Node Kernel version not defined: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "Node Kernel version not defined: %s\n", node.Id.Get()) } if node.SystemOverlay.Get() != "" { - if util.IsFile(config.SystemOverlayImage(node.Fqdn.Get())) == true { + if util.IsFile(config.SystemOverlayImage(node.Id.Get())) == true { systemo_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "System Overlay not found: %s\n", config.SystemOverlayImage(node.Fqdn.Get())) + wwlog.Printf(wwlog.VERBOSE, "System Overlay not found: %s\n", config.SystemOverlayImage(node.Id.Get())) } } else { status = false - wwlog.Printf(wwlog.VERBOSE, "System Overlay not defined: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "System Overlay not defined: %s\n", node.Id.Get()) } if node.RuntimeOverlay.Get() != "" { - if util.IsFile(config.RuntimeOverlayImage(node.Fqdn.Get())) == true { + if util.IsFile(config.RuntimeOverlayImage(node.Id.Get())) == true { runtimeo_good = true } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not found: %s\n", config.RuntimeOverlaySource(node.Fqdn.Get())) + wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not found: %s\n", config.RuntimeOverlaySource(node.Id.Get())) } } else { status = false - wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not defined: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "Runtime Overlay not defined: %s\n", node.Id.Get()) } - fmt.Printf("%-25s %-10t %-6t %-6t %-6t %-6t %-6t\n", node.Fqdn.Get(), status, vnfs_good, kernel_good, kmods_good, systemo_good, runtimeo_good) + fmt.Printf("%-25s %-10t %-6t %-6t %-6t %-6t %-6t\n", node.Id.Get(), status, vnfs_good, kernel_good, kmods_good, systemo_good, runtimeo_good) } return nil diff --git a/internal/app/wwctl/root.go b/internal/app/wwctl/root.go index 15e6ccfb..b4639562 100644 --- a/internal/app/wwctl/root.go +++ b/internal/app/wwctl/root.go @@ -1,14 +1,11 @@ package wwctl import ( - "github.com/hpcng/warewulf/internal/app/wwctl/controller" - "github.com/hpcng/warewulf/internal/app/wwctl/group" "github.com/hpcng/warewulf/internal/app/wwctl/kernel" "github.com/hpcng/warewulf/internal/app/wwctl/node" "github.com/hpcng/warewulf/internal/app/wwctl/overlay" "github.com/hpcng/warewulf/internal/app/wwctl/profile" "github.com/hpcng/warewulf/internal/app/wwctl/ready" - "github.com/hpcng/warewulf/internal/app/wwctl/service" "github.com/hpcng/warewulf/internal/app/wwctl/vnfs" "github.com/hpcng/warewulf/internal/pkg/wwlog" @@ -33,13 +30,13 @@ func init() { //rootCmd.AddCommand(build.GetCommand()) rootCmd.AddCommand(overlay.GetCommand()) - rootCmd.AddCommand(controller.GetCommand()) + // rootCmd.AddCommand(controller.GetCommand()) rootCmd.AddCommand(vnfs.GetCommand()) rootCmd.AddCommand(node.GetCommand()) rootCmd.AddCommand(kernel.GetCommand()) - rootCmd.AddCommand(group.GetCommand()) + // rootCmd.AddCommand(group.GetCommand()) rootCmd.AddCommand(profile.GetCommand()) - rootCmd.AddCommand(service.GetCommand()) + // rootCmd.AddCommand(service.GetCommand()) rootCmd.AddCommand(ready.GetCommand()) } diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 3270be2d..843e0d90 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -7,6 +7,7 @@ import ( "gopkg.in/yaml.v2" "io/ioutil" "regexp" + "strings" ) func New() (nodeYaml, error) { @@ -30,142 +31,104 @@ func New() (nodeYaml, error) { func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { var ret []NodeInfo - for controllername, controller := range self.Controllers { - for groupname, group := range controller.NodeGroups { - for nodename, node := range group.Nodes { - var n NodeInfo - var allProfiles []string + for nodename, node := range self.Nodes { + var n NodeInfo - if node.Disabled == true || group.Disabled == true { - wwlog.Printf(wwlog.VERBOSE, "Skipping disabled node: %s/%s\n", groupname, nodename) - continue + n.NetDevs = make(map[string]*NetDevEntry) + n.SystemOverlay.Set("default") + n.RuntimeOverlay.Set("default") + n.Ipxe.Set("default") + + fullname := strings.SplitN(nodename, ".", 2) + if len(fullname) > 1 { + n.DomainName.Set(fullname[1]) + } + + if len(node.Profiles) == 0 { + n.Profiles = []string{"default"} + } else { + n.Profiles = node.Profiles + } + + n.Id.Set(nodename) + n.Comment.Set(node.Comment) + n.Vnfs.Set(node.Vnfs) + n.KernelVersion.Set(node.KernelVersion) + n.KernelArgs.Set(node.KernelArgs) + n.DomainName.Set(node.DomainName) + n.Ipxe.Set(node.Ipxe) + n.IpmiIpaddr.Set(node.IpmiIpaddr) + n.IpmiNetmask.Set(node.IpmiNetmask) + n.IpmiUserName.Set(node.IpmiUserName) + n.IpmiPassword.Set(node.IpmiPassword) + n.SystemOverlay.Set(node.SystemOverlay) + n.RuntimeOverlay.Set(node.RuntimeOverlay) + + for devname, netdev := range node.NetDevs { + if _, ok := n.NetDevs[devname]; !ok { + var netdev NetDevEntry + n.NetDevs[devname] = &netdev + } + + n.NetDevs[devname].Ipaddr.Set(netdev.Ipaddr) + n.NetDevs[devname].Netmask.Set(netdev.Netmask) + n.NetDevs[devname].Hwaddr.Set(netdev.Hwaddr) + n.NetDevs[devname].Gateway.Set(netdev.Gateway) + n.NetDevs[devname].Type.Set(netdev.Type) + n.NetDevs[devname].Default.SetB(netdev.Default) + } + + for _, p := range n.Profiles { + if _, ok := self.NodeProfiles[p]; !ok { + wwlog.Printf(wwlog.WARN, "Profile not found for node '%s': %s\n", nodename, p) + continue + } + + wwlog.Printf(wwlog.VERBOSE, "Merging profile into node: %s <- %s\n", nodename, p) + + pstring := fmt.Sprintf("%s", p) + + n.Comment.SetAlt(self.NodeProfiles[p].Comment, pstring) + n.DomainName.SetAlt(self.NodeProfiles[p].DomainName, pstring) + n.Vnfs.SetAlt(self.NodeProfiles[p].Vnfs, pstring) + n.KernelVersion.SetAlt(self.NodeProfiles[p].KernelVersion, pstring) + n.KernelArgs.SetAlt(self.NodeProfiles[p].KernelArgs, pstring) + n.Ipxe.SetAlt(self.NodeProfiles[p].Ipxe, pstring) + n.IpmiIpaddr.SetAlt(self.NodeProfiles[p].IpmiIpaddr, pstring) + n.IpmiNetmask.SetAlt(self.NodeProfiles[p].IpmiNetmask, pstring) + n.IpmiUserName.SetAlt(self.NodeProfiles[p].IpmiUserName, pstring) + n.IpmiPassword.SetAlt(self.NodeProfiles[p].IpmiPassword, pstring) + n.SystemOverlay.SetAlt(self.NodeProfiles[p].SystemOverlay, pstring) + n.RuntimeOverlay.SetAlt(self.NodeProfiles[p].RuntimeOverlay, pstring) + + for devname, netdev := range self.NodeProfiles[p].NetDevs { + if _, ok := n.NetDevs[devname]; !ok { + var netdev NetDevEntry + n.NetDevs[devname] = &netdev } - n.Id.SetNode(nodename) - n.Gid.SetNode(groupname) - n.Cid.SetNode(controllername) - n.HostName.SetNode(node.Hostname) - n.IpmiIpaddr.SetNode(node.IpmiIpaddr) - n.IpmiNetmask.SetNode(node.IpmiNetmask) - n.DomainName.SetNode(node.DomainName) - n.Vnfs.SetNode(node.Vnfs) - n.KernelVersion.SetNode(node.KernelVersion) - n.KernelArgs.SetNode(node.KernelArgs) - n.Ipxe.SetNode(node.Ipxe) - n.IpmiUserName.SetNode(node.IpmiUserName) - n.IpmiPassword.SetNode(node.IpmiPassword) - n.SystemOverlay.SetNode(node.SystemOverlay) - n.RuntimeOverlay.SetNode(node.RuntimeOverlay) - - n.DomainName.SetGroup(group.DomainName) - n.Vnfs.SetGroup(group.Vnfs) - n.KernelVersion.SetGroup(group.KernelVersion) - n.KernelArgs.SetGroup(group.KernelArgs) - n.Ipxe.SetGroup(group.Ipxe) - n.IpmiNetmask.SetGroup(group.IpmiNetmask) - n.IpmiUserName.SetGroup(group.IpmiUserName) - n.IpmiPassword.SetGroup(group.IpmiPassword) - n.SystemOverlay.SetGroup(group.SystemOverlay) - n.RuntimeOverlay.SetGroup(group.RuntimeOverlay) - - n.RuntimeOverlay.SetDefault("default") - n.SystemOverlay.SetDefault("default") - n.Ipxe.SetDefault("default") - n.KernelArgs.SetDefault("crashkernel=no quiet") - - n.GroupProfiles = group.Profiles - n.Profiles = node.Profiles - - allProfiles = append(allProfiles, group.Profiles...) - allProfiles = append(allProfiles, node.Profiles...) - - for _, p := range allProfiles { - if _, ok := self.NodeProfiles[p]; !ok { - wwlog.Printf(wwlog.WARN, "Profile not found for node '%s': %s\n", nodename, p) - continue - } - - n.DomainName.SetProfile(self.NodeProfiles[p].DomainName) - n.Vnfs.SetProfile(self.NodeProfiles[p].Vnfs) - n.KernelVersion.SetProfile(self.NodeProfiles[p].KernelVersion) - n.KernelArgs.SetProfile(self.NodeProfiles[p].KernelArgs) - n.Ipxe.SetProfile(self.NodeProfiles[p].Ipxe) - n.IpmiNetmask.SetProfile(self.NodeProfiles[p].IpmiNetmask) - n.IpmiUserName.SetProfile(self.NodeProfiles[p].IpmiUserName) - n.IpmiPassword.SetProfile(self.NodeProfiles[p].IpmiPassword) - n.SystemOverlay.SetProfile(self.NodeProfiles[p].SystemOverlay) - n.RuntimeOverlay.SetProfile(self.NodeProfiles[p].RuntimeOverlay) - } - - if n.DomainName.Defined() == true { - n.Fqdn.SetNode(node.Hostname + "." + n.DomainName.Get()) - } else { - n.Fqdn.SetNode(node.Hostname) - } - - n.NetDevs = node.NetDevs - - ret = append(ret, n) + n.NetDevs[devname].Ipaddr.SetAlt(netdev.Ipaddr, pstring) + n.NetDevs[devname].Netmask.SetAlt(netdev.Netmask, pstring) + n.NetDevs[devname].Hwaddr.SetAlt(netdev.Hwaddr, pstring) + n.NetDevs[devname].Gateway.SetAlt(netdev.Gateway, pstring) + n.NetDevs[devname].Type.SetAlt(netdev.Type, pstring) + n.NetDevs[devname].Default.SetAltB(netdev.Default, pstring) } } + + ret = append(ret, n) + } return ret, nil } -func (self *nodeYaml) FindAllGroups() ([]GroupInfo, error) { - var ret []GroupInfo +/* +func (self *nodeYaml) FindAllControllers() ([]ControllerConf, error) { + var ret []ControllerConf for controllername, controller := range self.Controllers { - for groupname, group := range controller.NodeGroups { - var g GroupInfo - - g.Id.SetGroup(groupname) - g.Cid.SetGroup(controllername) - g.DomainName.SetGroup(group.DomainName) - g.Comment.SetGroup(group.Comment) - g.Vnfs.SetGroup(group.Vnfs) - g.KernelVersion.SetGroup(group.KernelVersion) - g.KernelArgs.SetGroup(group.KernelArgs) - g.IpmiNetmask.SetGroup(group.IpmiNetmask) - g.IpmiPassword.SetGroup(group.IpmiPassword) - g.IpmiUserName.SetGroup(group.IpmiUserName) - g.SystemOverlay.SetGroup(group.SystemOverlay) - g.RuntimeOverlay.SetGroup(group.RuntimeOverlay) - - g.Profiles = group.Profiles - - for _, p := range group.Profiles { - if _, ok := self.NodeProfiles[p]; !ok { - wwlog.Printf(wwlog.WARN, "Profile not found for group '%s': %s\n", groupname, p) - continue - } - - g.DomainName.SetProfile(self.NodeProfiles[p].DomainName) - g.Vnfs.SetProfile(self.NodeProfiles[p].Vnfs) - g.KernelVersion.SetProfile(self.NodeProfiles[p].KernelVersion) - g.KernelArgs.SetProfile(self.NodeProfiles[p].KernelArgs) - g.Ipxe.SetProfile(self.NodeProfiles[p].Ipxe) - g.IpmiNetmask.SetProfile(self.NodeProfiles[p].IpmiNetmask) - g.IpmiUserName.SetProfile(self.NodeProfiles[p].IpmiUserName) - g.IpmiPassword.SetProfile(self.NodeProfiles[p].IpmiPassword) - g.SystemOverlay.SetProfile(self.NodeProfiles[p].SystemOverlay) - g.RuntimeOverlay.SetProfile(self.NodeProfiles[p].RuntimeOverlay) - } - - // TODO: Validate or die on all inputs - - ret = append(ret, g) - } - } - return ret, nil -} - -func (self *nodeYaml) FindAllControllers() ([]ControllerInfo, error) { - var ret []ControllerInfo - - for controllername, controller := range self.Controllers { - var c ControllerInfo + var c ControllerConf c.Id = controllername c.Ipaddr = controller.Ipaddr @@ -223,25 +186,39 @@ func (self *nodeYaml) FindAllControllers() ([]ControllerInfo, error) { } return ret, nil } +*/ -func (self *nodeYaml) FindAllProfiles() ([]ProfileInfo, error) { - var ret []ProfileInfo +func (self *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { + var ret []NodeInfo for name, profile := range self.NodeProfiles { - var p ProfileInfo + var p NodeInfo - p.Id = name - p.Comment = profile.Comment - p.Vnfs = profile.Vnfs - p.Ipxe = profile.Ipxe - p.KernelVersion = profile.KernelVersion - p.KernelArgs = profile.KernelArgs - p.IpmiNetmask = profile.IpmiNetmask - p.IpmiUserName = profile.IpmiUserName - p.IpmiPassword = profile.IpmiPassword - p.DomainName = profile.DomainName - p.RuntimeOverlay = profile.RuntimeOverlay - p.SystemOverlay = profile.SystemOverlay + p.Id.Set(name) + p.Comment.Set(profile.Comment) + p.Vnfs.Set(profile.Vnfs) + p.Ipxe.Set(profile.Ipxe) + p.KernelVersion.Set(profile.KernelVersion) + p.KernelArgs.Set(profile.KernelArgs) + p.IpmiNetmask.Set(profile.IpmiNetmask) + p.IpmiUserName.Set(profile.IpmiUserName) + p.IpmiPassword.Set(profile.IpmiPassword) + p.RuntimeOverlay.Set(profile.RuntimeOverlay) + p.SystemOverlay.Set(profile.SystemOverlay) + + for devname, netdev := range profile.NetDevs { + if _, ok := p.NetDevs[devname]; !ok { + var netdev NetDevEntry + p.NetDevs[devname] = &netdev + } + + p.NetDevs[devname].Ipaddr.Set(netdev.Ipaddr) + p.NetDevs[devname].Netmask.Set(netdev.Netmask) + p.NetDevs[devname].Hwaddr.Set(netdev.Hwaddr) + p.NetDevs[devname].Gateway.Set(netdev.Gateway) + p.NetDevs[devname].Type.Set(netdev.Type) + p.NetDevs[devname].Default.SetB(netdev.Default) + } // TODO: Validate or die on all inputs @@ -257,7 +234,7 @@ func (self *nodeYaml) FindByHwaddr(hwa string) (NodeInfo, error) { for _, node := range n { for _, dev := range node.NetDevs { - if dev.Hwaddr == hwa { + if dev.Hwaddr.Get() == hwa { return node, nil } } @@ -273,7 +250,7 @@ func (self *nodeYaml) FindByIpaddr(ipaddr string) (NodeInfo, error) { for _, node := range n { for _, dev := range node.NetDevs { - if dev.Ipaddr == ipaddr { + if dev.Ipaddr.Get() == ipaddr { return node, nil } } @@ -288,7 +265,7 @@ func (nodes *nodeYaml) SearchByName(search string) ([]NodeInfo, error) { n, _ := nodes.FindAllNodes() for _, node := range n { - b, _ := regexp.MatchString(search, node.Fqdn.Get()) + b, _ := regexp.MatchString(search, node.Id.Get()) if b == true { ret = append(ret, node) } @@ -304,7 +281,7 @@ func (nodes *nodeYaml) SearchByNameList(searchList []string) ([]NodeInfo, error) for _, search := range searchList { for _, node := range n { - b, _ := regexp.MatchString(search, node.Fqdn.Get()) + b, _ := regexp.MatchString(search, node.Id.Get()) if b == true { ret = append(ret, node) } diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index be324799..d5b270bd 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -11,22 +11,28 @@ import ( ******/ type nodeYaml struct { - NodeProfiles map[string]*ProfileConf - Controllers map[string]*ControllerConf `yaml:"control"` + Controllers map[string]*ControllerConf `yaml:"controlers"` + NodeProfiles map[string]*NodeConf + Nodes map[string]*NodeConf } -type ProfileConf struct { - Comment string `yaml:"comment"` - Vnfs string `yaml:"vnfs,omitempty"` - Ipxe string `yaml:"ipxe template,omitempty"` - KernelVersion string `yaml:"kernel version,omitempty"` - KernelArgs string `yaml:"kernel args,omitempty"` - IpmiNetmask string `yaml:"ipmi netmask,omitempty"` - IpmiUserName string `yaml:"ipmi username,omitempty"` - IpmiPassword string `yaml:"ipmi password,omitempty"` - DomainName string `yaml:"domain name,omitempty"` - RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` - SystemOverlay string `yaml:"system overlay files,omitempty"` +type NodeConf struct { + Comment string `yaml:"comment,omitempty"` + Disabled bool `yaml:"disabled,omitempty"` + // Hostname string `yaml:"hostname,omitempty"` + DomainName string `yaml:"domain name,omitempty"` + Vnfs string `yaml:"vnfs,omitempty"` + Ipxe string `yaml:"ipxe template,omitempty"` + KernelVersion string `yaml:"kernel version,omitempty"` + KernelArgs string `yaml:"kernel args,omitempty"` + IpmiUserName string `yaml:"ipmi username,omitempty"` + IpmiPassword string `yaml:"ipmi password,omitempty"` + IpmiIpaddr string `yaml:"ipmi ipaddr,omitempty"` + IpmiNetmask string `yaml:"ipmi netmask,omitempty"` + RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` + SystemOverlay string `yaml:"system overlay files,omitempty"` + Profiles []string `yaml:"profiles,omitempty"` + NetDevs map[string]*NetDevs } type ControllerConf struct { @@ -66,43 +72,6 @@ type ControllerConf struct { EnableCmd string `yaml:"enable command,omitempty"` } `yaml:"nfs,omitempty"` } `yaml:"services"` - NodeGroups map[string]*GroupConf -} - -type GroupConf struct { - Comment string `yaml:"comment"` - Disabled bool `yaml:"disabled,omitempty"` - DomainName string `yaml:"domain name"` - Vnfs string `yaml:"vnfs,omitempty"` - Ipxe string `yaml:"ipxe template,omitempty"` - KernelVersion string `yaml:"kernel version,omitempty"` - KernelArgs string `yaml:"kernel args,omitempty"` - IpmiNetmask string `yaml:"ipmi netmask,omitempty"` - IpmiUserName string `yaml:"ipmi username,omitempty"` - IpmiPassword string `yaml:"ipmi password,omitempty"` - RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` - SystemOverlay string `yaml:"system overlay files,omitempty"` - Profiles []string `yaml:"profiles,omitempty"` - Nodes map[string]*NodeConf -} - -type NodeConf struct { - Comment string `yaml:"comment,omitempty"` - Disabled bool `yaml:"disabled,omitempty"` - Hostname string `yaml:"hostname,omitempty"` - DomainName string `yaml:"domain name,omitempty"` - Vnfs string `yaml:"vnfs,omitempty"` - Ipxe string `yaml:"ipxe template,omitempty"` - KernelVersion string `yaml:"kernel version,omitempty"` - KernelArgs string `yaml:"kernel args,omitempty"` - IpmiUserName string `yaml:"ipmi username,omitempty"` - IpmiPassword string `yaml:"ipmi password,omitempty"` - IpmiIpaddr string `yaml:"ipmi ipaddr,omitempty"` - IpmiNetmask string `yaml:"ipmi netmask,omitempty"` - RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` - SystemOverlay string `yaml:"system overlay files,omitempty"` - Profiles []string `yaml:"profiles,omitempty"` - NetDevs map[string]*NetDevs } type NetDevs struct { @@ -115,24 +84,23 @@ type NetDevs struct { } /****** - * Code internal data representations + * Internal code data representations ******/ type Entry struct { - Node string - Profile string - Group string - Controller string - Default string + value string + altvalue string + bool bool + altbool bool + from string } type NodeInfo struct { - Id Entry - Gid Entry - Cid Entry - Comment Entry - HostName Entry - Fqdn Entry + Id Entry + Cid Entry + Comment Entry + // HostName Entry + // Fqdn Entry DomainName Entry Vnfs Entry Ipxe Entry @@ -146,80 +114,16 @@ type NodeInfo struct { SystemOverlay Entry Profiles []string GroupProfiles []string - NetDevs map[string]*NetDevs + NetDevs map[string]*NetDevEntry } -type ControllerInfo struct { - Id string - Comment string - Ipaddr string - Fqdn string - DomainName string - Services struct { - Warewulfd struct { - Port string - Secure bool - StartCmd string - RestartCmd string - EnableCmd string - } - Dhcp struct { - Enabled bool - Template string - RangeStart string - RangeEnd string - ConfigFile string - StartCmd string - RestartCmd string - EnableCmd string - } - Tftp struct { - Enabled bool - TftpRoot string - StartCmd string - RestartCmd string - EnableCmd string - } - Nfs struct { - Enabled bool - Exports []string - StartCmd string - RestartCmd string - EnableCmd string - } - } -} - -type GroupInfo struct { - Id Entry - Cid Entry - Comment Entry - Vnfs Entry - Ipxe Entry - KernelVersion Entry - KernelArgs Entry - IpmiNetmask Entry - IpmiUserName Entry - IpmiPassword Entry - DomainName Entry - RuntimeOverlay Entry - SystemOverlay Entry - Profiles []string -} - -type ProfileInfo struct { - Id string - Comment string - Vnfs string - Ipxe string - KernelVersion string - KernelArgs string - IpmiNetmask string - IpmiUserName string - IpmiPassword string - DomainName string - RuntimeOverlay string - SystemOverlay string +type NetDevEntry struct { + Type Entry `yaml:"type,omitempty"` + Default Entry `yaml:"default"` + Hwaddr Entry + Ipaddr Entry + Netmask Entry + Gateway Entry `yaml:"gateway,omitempty"` } const ConfigFile = "/etc/warewulf/nodes.conf" diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 521b8595..f81fab8d 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -1,135 +1,103 @@ package node -import ( - "strings" -) +import "strings" + +/********** + * + * Sets + * + *********/ + +func (self *Entry) Set(val string) { + if val == "" { + return + } + + if strings.ToUpper(val) == "DELETE" { + self.value = "" + } else { + self.value = val + } + + return +} + +func (self *Entry) SetB(val bool) { + self.bool = val + return +} + +func (self *Entry) SetAlt(val string, from string) { + if val == "" { + return + } + + self.altvalue = val + self.from = from + + return +} + +func (self *Entry) SetAltB(val bool, from string) { + self.altbool = val + self.from = from + return +} + +/********** + * + * Gets + * + *********/ + +func (self *Entry) Get() string { + if self.value != "" { + return self.value + } + if self.altvalue != "" { + return self.altvalue + } + return "" +} + +func (self *Entry) GetB() bool { + return self.bool +} + +func (self *Entry) GetReal() string { + return self.value +} + +func (self *Entry) GetRealB() bool { + return self.bool +} + +/********** + * + * Misc + * + *********/ func (self *Entry) Print() string { - if self.Node != "" { - return self.Node + if self.value != "" { + return self.value } - if self.Group != "" { - return self.Group - } - if self.Profile != "" { - return self.Profile - } - if self.Controller != "" { - return self.Controller - } - if self.Default != "" { - return self.Default + if self.altvalue != "" { + return self.altvalue } return "--" } func (self *Entry) Source() string { - if self.Node != "" { - return "node" + if self.from == "" { + return "--" } - if self.Group != "" { - return "group" - } - if self.Profile != "" { - return "profile" - } - if self.Controller != "" { - return "controller" - } - if self.Default != "" { - return "default" - } - return "" -} - -func (self *Entry) Get() string { - if self.Node != "" { - return self.Node - } - if self.Group != "" { - return self.Group - } - if self.Profile != "" { - return self.Profile - } - if self.Controller != "" { - return self.Controller - } - if self.Default != "" { - return self.Default - } - return "" + return self.from } func (self *Entry) Defined() bool { - if self.Get() == "" { - return false + if self.value != "" { + return true } - - return true -} - -func (self *Entry) SetDefault(value string) { - if value == "" { - return - } else if strings.ToUpper(value) == "UNDEF" { - value = "" - } - self.Default = value -} - -func (self *Entry) SetGroup(value string) { - if value == "" { - return - } else if strings.ToUpper(value) == "UNDEF" { - value = "" - } - self.Group = value -} - -func (self *Entry) SetProfile(value string) { - if value == "" { - return - } else if strings.ToUpper(value) == "UNDEF" { - value = "" - } - self.Profile = value -} - -func (self *Entry) SetController(value string) { - if value == "" { - return - } else if strings.ToUpper(value) == "UNDEF" { - value = "" - } - self.Controller = value -} - -func (self *Entry) SetNode(value string) { - if value == "" { - return - } else if strings.ToUpper(value) == "UNDEF" { - value = "" - } - self.Node = value -} - -func (self *Entry) GetNode() string { - return self.Node -} - -func (self *Entry) GetGroup() string { - return self.Group -} - -func (self *Entry) GetController() string { - return self.Controller -} - -func (self *Entry) GetProfile() string { - return self.Profile -} - -func (self *Entry) GetDefault() string { - return self.Default + return false } diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index 4686dfa0..2217d3e8 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -3,244 +3,84 @@ package node import ( "github.com/hpcng/warewulf/internal/pkg/errors" "github.com/hpcng/warewulf/internal/pkg/wwlog" - "strings" - "gopkg.in/yaml.v2" "os" ) -func get2Set(input string) string { - if strings.ToUpper(input) == "UNDEF" { - return "" - } - return input -} - /**** * * NODE MODIFIERS * ****/ -func (self *nodeYaml) AddNode(controllerID string, groupID string, nodeID string) error { +func (self *nodeYaml) AddNode(nodeID string) (NodeInfo, error) { var node NodeConf + var n NodeInfo - wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s/%s\n", groupID, nodeID) + wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s\n", nodeID) - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) + if _, ok := self.Nodes[nodeID]; ok { + return n, errors.New("Nodename already exists: " + nodeID) } - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok { - return errors.New("Group does not exist: " + groupID) - } + self.Nodes[nodeID] = &node + self.Nodes[nodeID].Profiles = []string{"default"} + self.Nodes[nodeID].NetDevs = make(map[string]*NetDevs) - if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[groupID]; ok { - return errors.New("Nodename already exists in group: " + nodeID) - } + n.Id.Set(nodeID) + n.Profiles = []string{"default"} + n.NetDevs = make(map[string]*NetDevEntry) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID] = &node - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Hostname = nodeID - - return nil + return n, nil } -func (self *nodeYaml) DelNode(controllerID string, groupID string, nodeID string) error { +func (self *nodeYaml) DelNode(nodeID string) error { - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) + if _, ok := self.Nodes[nodeID]; !ok { + return errors.New("Nodename does not exist: " + nodeID) } - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok { - return errors.New("Group does not exist: " + groupID) - } - - if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[groupID]; ok { - return errors.New("Nodename does not exist in group: " + nodeID) - } - - wwlog.Printf(wwlog.VERBOSE, "Deleting node network device: %s/%s\n", groupID, nodeID) - delete(self.Controllers[controllerID].NodeGroups[groupID].Nodes, nodeID) + wwlog.Printf(wwlog.VERBOSE, "Deleting node: %s\n", nodeID) + delete(self.Nodes, nodeID) return nil } func (self *nodeYaml) NodeUpdate(node NodeInfo) error { - controllerID := node.Cid.Get() - groupID := node.Gid.Get() nodeID := node.Id.Get() - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) + if _, ok := self.Nodes[nodeID]; !ok { + return errors.New("Nodename does not exist: " + nodeID) } - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok { - return errors.New("Group does not exist: " + groupID) + self.Nodes[nodeID].Comment = node.Comment.GetReal() + self.Nodes[nodeID].Vnfs = node.Vnfs.GetReal() + self.Nodes[nodeID].DomainName = node.DomainName.GetReal() + self.Nodes[nodeID].Ipxe = node.Ipxe.GetReal() + self.Nodes[nodeID].KernelVersion = node.KernelVersion.GetReal() + self.Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal() + self.Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal() + self.Nodes[nodeID].IpmiNetmask = node.IpmiNetmask.GetReal() + self.Nodes[nodeID].IpmiUserName = node.IpmiUserName.GetReal() + self.Nodes[nodeID].IpmiPassword = node.IpmiPassword.GetReal() + self.Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetReal() + self.Nodes[nodeID].SystemOverlay = node.SystemOverlay.GetReal() + self.Nodes[nodeID].Profiles = node.Profiles + + for devname, netdev := range node.NetDevs { + if _, ok := self.Nodes[nodeID].NetDevs[devname]; !ok { + var netdev NetDevs + self.Nodes[nodeID].NetDevs[devname] = &netdev + } + + self.Nodes[nodeID].NetDevs[devname].Ipaddr = netdev.Ipaddr.GetReal() + self.Nodes[nodeID].NetDevs[devname].Netmask = netdev.Netmask.GetReal() + self.Nodes[nodeID].NetDevs[devname].Hwaddr = netdev.Hwaddr.GetReal() + self.Nodes[nodeID].NetDevs[devname].Gateway = netdev.Gateway.GetReal() + self.Nodes[nodeID].NetDevs[devname].Type = netdev.Type.GetReal() + self.Nodes[nodeID].NetDevs[devname].Default = netdev.Default.GetRealB() } - if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID]; !ok { - return errors.New("Nodename does not exist in group: " + nodeID) - } - - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Hostname = get2Set(node.HostName.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Vnfs = get2Set(node.Vnfs.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].DomainName = get2Set(node.DomainName.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Ipxe = get2Set(node.Ipxe.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelVersion = get2Set(node.KernelVersion.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelArgs = get2Set(node.KernelArgs.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = get2Set(node.IpmiIpaddr.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiNetmask = get2Set(node.IpmiNetmask.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiUserName = get2Set(node.IpmiUserName.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiPassword = get2Set(node.IpmiPassword.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = get2Set(node.RuntimeOverlay.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].SystemOverlay = get2Set(node.SystemOverlay.GetNode()) - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Profiles = node.Profiles - self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].NetDevs = node.NetDevs - - return nil -} - -/**** - * - * GROUP MODIFIERS - * -****/ - -func (self *nodeYaml) AddGroup(controllerID string, groupID string) error { - var group GroupConf - - wwlog.Printf(wwlog.VERBOSE, "Adding new group: %s/%s\n", groupID) - - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) - } - - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; ok { - return errors.New("Group already exists: " + groupID) - } - - self.Controllers[controllerID].NodeGroups[groupID] = &group - self.Controllers[controllerID].NodeGroups[groupID].DomainName = groupID - self.Controllers[controllerID].NodeGroups[groupID].Profiles = []string{"default"} - - return nil -} - -func (self *nodeYaml) DelGroup(controllerID string, groupID string) error { - - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) - } - - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok { - return errors.New("Group does not exist: " + groupID) - } - - wwlog.Printf(wwlog.VERBOSE, "Deleting group: %s\n", groupID) - delete(self.Controllers[controllerID].NodeGroups, groupID) - - return nil -} - -func (self *nodeYaml) GroupUpdate(group GroupInfo) error { - controllerID := group.Cid.Get() - groupID := group.Id.Get() - - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) - } - - if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok { - return errors.New("Group does not exist: " + groupID) - } - - self.Controllers[controllerID].NodeGroups[groupID].DomainName = group.DomainName.Get() - self.Controllers[controllerID].NodeGroups[groupID].Vnfs = group.Vnfs.Get() - self.Controllers[controllerID].NodeGroups[groupID].KernelVersion = group.KernelVersion.Get() - self.Controllers[controllerID].NodeGroups[groupID].KernelArgs = group.KernelArgs.Get() - self.Controllers[controllerID].NodeGroups[groupID].Ipxe = group.Ipxe.Get() - self.Controllers[controllerID].NodeGroups[groupID].IpmiNetmask = group.IpmiNetmask.Get() - self.Controllers[controllerID].NodeGroups[groupID].IpmiUserName = group.IpmiUserName.Get() - self.Controllers[controllerID].NodeGroups[groupID].IpmiPassword = group.IpmiPassword.Get() - self.Controllers[controllerID].NodeGroups[groupID].RuntimeOverlay = group.RuntimeOverlay.Get() - self.Controllers[controllerID].NodeGroups[groupID].SystemOverlay = group.SystemOverlay.Get() - self.Controllers[controllerID].NodeGroups[groupID].Profiles = group.Profiles - - return nil -} - -/**** - * - * CONTROLLER MODIFIERS - * -****/ - -func (self *nodeYaml) AddController(controllerID string) error { - var controller ControllerConf - var group GroupConf - - wwlog.Printf(wwlog.VERBOSE, "Adding new controller: %s/%s\n", controllerID) - - if _, ok := self.Controllers[controllerID]; ok { - return errors.New("Controller already exists: " + controllerID) - } - - self.Controllers[controllerID] = &controller - self.Controllers[controllerID].NodeGroups = make(map[string]*GroupConf) - self.Controllers[controllerID].NodeGroups["default"] = &group - - return nil -} - -func (self *nodeYaml) DelController(controllerID string) error { - - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) - } - - wwlog.Printf(wwlog.VERBOSE, "Deleting controller: %s\n", controllerID) - delete(self.Controllers, controllerID) - - return nil -} - -func (self *nodeYaml) ControllerUpdate(controller ControllerInfo) error { - controllerID := controller.Id - - if _, ok := self.Controllers[controllerID]; !ok { - return errors.New("Controller does not exist: " + controllerID) - } - - self.Controllers[controllerID].Ipaddr = controller.Ipaddr - self.Controllers[controllerID].Comment = controller.Comment - self.Controllers[controllerID].Fqdn = controller.Fqdn - - self.Controllers[controllerID].Services.Warewulfd.Port = get2Set(controller.Services.Warewulfd.Port) - self.Controllers[controllerID].Services.Warewulfd.Secure = controller.Services.Warewulfd.Secure - self.Controllers[controllerID].Services.Warewulfd.StartCmd = get2Set(controller.Services.Warewulfd.StartCmd) - self.Controllers[controllerID].Services.Warewulfd.RestartCmd = get2Set(controller.Services.Warewulfd.RestartCmd) - self.Controllers[controllerID].Services.Warewulfd.EnableCmd = get2Set(controller.Services.Warewulfd.EnableCmd) - - self.Controllers[controllerID].Services.Dhcp.Enabled = controller.Services.Dhcp.Enabled - self.Controllers[controllerID].Services.Dhcp.ConfigFile = get2Set(controller.Services.Dhcp.ConfigFile) - self.Controllers[controllerID].Services.Dhcp.RangeStart = get2Set(controller.Services.Dhcp.RangeStart) - self.Controllers[controllerID].Services.Dhcp.RangeEnd = get2Set(controller.Services.Dhcp.RangeEnd) - self.Controllers[controllerID].Services.Dhcp.StartCmd = get2Set(controller.Services.Dhcp.StartCmd) - self.Controllers[controllerID].Services.Dhcp.RestartCmd = get2Set(controller.Services.Dhcp.RestartCmd) - self.Controllers[controllerID].Services.Dhcp.EnableCmd = get2Set(controller.Services.Dhcp.EnableCmd) - - self.Controllers[controllerID].Services.Nfs.Enabled = controller.Services.Nfs.Enabled - self.Controllers[controllerID].Services.Nfs.Exports = controller.Services.Nfs.Exports - self.Controllers[controllerID].Services.Nfs.StartCmd = get2Set(controller.Services.Nfs.StartCmd) - self.Controllers[controllerID].Services.Nfs.RestartCmd = get2Set(controller.Services.Nfs.RestartCmd) - self.Controllers[controllerID].Services.Nfs.EnableCmd = get2Set(controller.Services.Nfs.EnableCmd) - - self.Controllers[controllerID].Services.Tftp.Enabled = controller.Services.Tftp.Enabled - self.Controllers[controllerID].Services.Tftp.TftpRoot = get2Set(controller.Services.Tftp.TftpRoot) - self.Controllers[controllerID].Services.Tftp.StartCmd = get2Set(controller.Services.Tftp.StartCmd) - self.Controllers[controllerID].Services.Tftp.RestartCmd = get2Set(controller.Services.Tftp.RestartCmd) - self.Controllers[controllerID].Services.Tftp.EnableCmd = get2Set(controller.Services.Tftp.EnableCmd) - return nil } @@ -250,6 +90,74 @@ func (self *nodeYaml) ControllerUpdate(controller ControllerInfo) error { * ****/ +func (self *nodeYaml) AddProfile(profileID string) (NodeInfo, error) { + var node NodeConf + var n NodeInfo + + wwlog.Printf(wwlog.VERBOSE, "Adding new profile: %s\n", profileID) + + if _, ok := self.NodeProfiles[profileID]; ok { + return n, errors.New("Profile name already exists: " + profileID) + } + + self.NodeProfiles[profileID] = &node + + n.Id.Set(profileID) + + return n, nil +} + +func (self *nodeYaml) DelProfile(profileID string) error { + + if _, ok := self.NodeProfiles[profileID]; !ok { + return errors.New("Profile does not exist: " + profileID) + } + + wwlog.Printf(wwlog.VERBOSE, "Deleting profile: %s\n", profileID) + delete(self.NodeProfiles, profileID) + + return nil +} + +func (self *nodeYaml) ProfileUpdate(profile NodeInfo) error { + profileID := profile.Id.Get() + + if _, ok := self.NodeProfiles[profileID]; !ok { + return errors.New("Profile name does not exist: " + profileID) + } + self.NodeProfiles[profileID].Comment = profile.Comment.GetReal() + self.NodeProfiles[profileID].Vnfs = profile.Vnfs.GetReal() + self.NodeProfiles[profileID].Ipxe = profile.Ipxe.GetReal() + self.NodeProfiles[profileID].KernelVersion = profile.KernelVersion.GetReal() + self.NodeProfiles[profileID].KernelArgs = profile.KernelArgs.GetReal() + self.NodeProfiles[profileID].IpmiIpaddr = profile.IpmiIpaddr.GetReal() + self.NodeProfiles[profileID].IpmiNetmask = profile.IpmiNetmask.GetReal() + self.NodeProfiles[profileID].IpmiUserName = profile.IpmiUserName.GetReal() + self.NodeProfiles[profileID].IpmiPassword = profile.IpmiPassword.GetReal() + self.NodeProfiles[profileID].RuntimeOverlay = profile.RuntimeOverlay.GetReal() + self.NodeProfiles[profileID].SystemOverlay = profile.SystemOverlay.GetReal() + self.NodeProfiles[profileID].Profiles = profile.Profiles + + for devname, netdev := range profile.NetDevs { + if _, ok := self.NodeProfiles[profileID].NetDevs[devname]; !ok { + var netdev NetDevs + self.NodeProfiles[profileID].NetDevs[devname] = &netdev + } + + self.NodeProfiles[profileID].NetDevs[devname].Ipaddr = netdev.Ipaddr.GetReal() + self.NodeProfiles[profileID].NetDevs[devname].Netmask = netdev.Netmask.GetReal() + self.NodeProfiles[profileID].NetDevs[devname].Hwaddr = netdev.Hwaddr.GetReal() + self.NodeProfiles[profileID].NetDevs[devname].Gateway = netdev.Gateway.GetReal() + self.NodeProfiles[profileID].NetDevs[devname].Type = netdev.Type.GetReal() + self.NodeProfiles[profileID].NetDevs[devname].Default = netdev.Default.GetRealB() + } + + return nil +} + +/* + + func (self *nodeYaml) AddProfile(profileID string) error { var profile ProfileConf @@ -295,6 +203,12 @@ func (self *nodeYaml) ProfileUpdate(profile ProfileInfo) error { return nil } + + + + +*/ + /**** * * PERSISTENCE diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 528e3017..1b0a06a0 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -123,38 +123,42 @@ func buildOverlay(nodeList []node.NodeInfo, overlayType string) error { if overlayType == "runtime" { OverlayDir = config.RuntimeOverlaySource(node.RuntimeOverlay.Get()) - OverlayFile = config.RuntimeOverlayImage(node.Fqdn.Get()) + OverlayFile = config.RuntimeOverlayImage(node.Id.Get()) } else if overlayType == "system" { OverlayDir = config.SystemOverlaySource(node.RuntimeOverlay.Get()) - OverlayFile = config.SystemOverlayImage(node.Fqdn.Get()) + OverlayFile = config.SystemOverlayImage(node.Id.Get()) } else { wwlog.Printf(wwlog.ERROR, "overlayType requested is not supported: %s\n", overlayType) os.Exit(1) } - wwlog.Printf(wwlog.DEBUG, "Processing overlay for node: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.DEBUG, "Processing overlay for node: %s\n", node.Id.Get()) - t.Self.Fqdn = node.Fqdn.Get() - t.Self.Hostname = node.HostName.Get() - t.Self.GroupName = node.Gid.Get() + t.Self.Fqdn = node.Id.Get() + t.Self.Hostname = node.Id.Get() t.Self.Vnfs = node.Vnfs.Get() t.Self.IpmiIpaddr = node.IpmiIpaddr.Get() t.Self.IpmiNetmask = node.IpmiNetmask.Get() t.Self.IpmiUserName = node.IpmiUserName.Get() t.Self.IpmiPassword = node.IpmiPassword.Get() - t.Self.NetDevs = node.NetDevs + for devname, netdev := range node.NetDevs { + t.Self.NetDevs[devname].Ipaddr = netdev.Ipaddr.Get() + t.Self.NetDevs[devname].Netmask = netdev.Netmask.Get() + t.Self.NetDevs[devname].Gateway = netdev.Gateway.Get() + t.Self.NetDevs[devname].Type = netdev.Type.Get() + } t.AllNodes = allNodes if overlayType == "runtime" && node.RuntimeOverlay.Defined() == false { - wwlog.Printf(wwlog.WARN, "Undefined runtime overlay, skipping node: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.WARN, "Undefined runtime overlay, skipping node: %s\n", node.Id.Get()) } if overlayType == "system" && node.SystemOverlay.Defined() == false { - wwlog.Printf(wwlog.WARN, "Undefined system overlay, skipping node: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.WARN, "Undefined system overlay, skipping node: %s\n", node.Id.Get()) } wwlog.Printf(wwlog.DEBUG, "Checking to see if overlay directory exists: %s\n", OverlayDir) if util.IsDir(OverlayDir) == false { - wwlog.Printf(wwlog.WARN, "%-35s: Skipped (runtime overlay template not found)\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.WARN, "%-35s: Skipped (runtime overlay template not found)\n", node.Id.Get()) continue } @@ -235,7 +239,7 @@ func buildOverlay(nodeList []node.NodeInfo, overlayType string) error { return nil }) - wwlog.Printf(wwlog.VERBOSE, "Finished generating overlay directory for: %s\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.VERBOSE, "Finished generating overlay directory for: %s\n", node.Id.Get()) cmd := fmt.Sprintf("cd \"%s\"; find . | cpio --quiet -o -H newc -F \"%s\"", tmpDir, OverlayFile) wwlog.Printf(wwlog.DEBUG, "RUNNING: %s\n", cmd) @@ -244,7 +248,7 @@ func buildOverlay(nodeList []node.NodeInfo, overlayType string) error { wwlog.Printf(wwlog.ERROR, "Could not generate runtime image overlay: %s\n", err) continue } - wwlog.Printf(wwlog.INFO, "%-35s: Done\n", node.Fqdn.Get()) + wwlog.Printf(wwlog.INFO, "%-35s: Done\n", node.Id.Get()) wwlog.Printf(wwlog.DEBUG, "Removing temporary directory: %s\n", tmpDir) os.RemoveAll(tmpDir)