Optimized sorting methods across nodes and profiles

This commit is contained in:
Gregory Kurtzer
2021-04-25 15:43:35 -07:00
parent a321709901
commit 4bc523a052
15 changed files with 266 additions and 234 deletions

View File

@@ -1,6 +1,7 @@
package console
import (
"fmt"
"os"
"github.com/hpcng/warewulf/internal/pkg/node"
@@ -11,27 +12,32 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) == 1 {
nodeList, _ = n.SearchByName(args[0])
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
wwlog.Printf(wwlog.ERROR, "Please specify a node\n")
os.Exit(255)
cmd.Usage()
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())

View File

@@ -12,6 +12,7 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var count int
var nodeList []node.NodeInfo
nodeDB, err := node.New()
if err != nil {
@@ -19,7 +20,30 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1)
}
nodeList, err := nodeDB.SearchByNameList(args)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
for _, r := range args {
var match bool
for _, n := range nodes {
if n.Id.Get() == r {
nodeList = append(nodeList, n)
match = true
}
}
if !match {
fmt.Fprintf(os.Stderr, "ERROR: No match for node: %s\n", r)
}
}
if len(nodeList) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
for _, n := range nodeList {
err := nodeDB.DelNode(n.Id.Get())
@@ -27,28 +51,25 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
} else {
count++
fmt.Printf("Deleting node: %s\n", n.Id.Print())
}
}
if count > 0 {
if SetYes == true {
nodeDB.Persist()
} else {
q := fmt.Sprintf("Are you sure you want to delete %d nodes(s)", count)
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
}
}
if SetYes {
nodeDB.Persist()
} else {
fmt.Printf("No nodes found\n")
q := fmt.Sprintf("Are you sure you want to delete %d nodes(s)", count)
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
}
}
return nil

View File

@@ -4,7 +4,7 @@ import "github.com/spf13/cobra"
var (
baseCmd = &cobra.Command{
Use: "delete [flags] [node pattern]...",
Use: "delete [flags] [exact node name]...",
Short: "Delete a node from Warewulf",
Long: "This command will remove a node from the Warewulf node configuration.",
Args: cobra.MinimumNArgs(1),

View File

@@ -13,26 +13,21 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var err error
var nodes []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) > 0 {
nodes, err = n.SearchByNameList(args)
} else {
nodes, err = n.FindAllNodes()
}
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if ShowAll {
for _, node := range nodes {
for _, node := range node.FilterByName(nodes, args) {
fmt.Printf("################################################################################\n")
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())
@@ -63,20 +58,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":TYPE", netdev.Type.Source(), netdev.Type.Print())
fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), name+":DEFAULT", netdev.Default.Source(), netdev.Default.PrintB())
}
// v := reflect.ValueOf(node)
// typeOfS := v.Type()
// for i := 0; i< v.NumField(); i++ {
// //TODO: Fix for NetDevs and Interface should print Fprint() method
// fmt.Printf("%-25s %s = %#v\n", node.Fqdn.Get(), typeOfS.Field(i).Name, v.Field(i).Interface())
// }
}
} else if ShowNet {
fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", "NODE NAME", "DEVICE", "HWADDR", "IPADDR", "GATEWAY")
fmt.Println(strings.Repeat("=", 80))
for _, node := range nodes {
for _, node := range node.FilterByName(nodes, args) {
if len(node.NetDevs) > 0 {
for name, dev := range node.NetDevs {
fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Id.Get(), name, dev.Hwaddr.Print(), dev.Ipaddr.Print(), dev.Gateway.Print())
@@ -90,7 +78,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-22s %-16s %-20s %-20s\n", "NODE NAME", "IPMI IPADDR", "IPMI USERNAME", "IPMI PASSWORD")
fmt.Println(strings.Repeat("=", 80))
for _, node := range nodes {
for _, node := range node.FilterByName(nodes, args) {
fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Id.Get(), node.IpmiIpaddr.Print(), node.IpmiUserName.Print(), node.IpmiPassword.Print())
}
@@ -98,7 +86,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-22s %-26s %-35s %s\n", "NODE NAME", "KERNEL VERSION", "CONTAINER", "OVERLAYS (S/R)")
fmt.Println(strings.Repeat("=", 120))
for _, node := range nodes {
for _, node := range node.FilterByName(nodes, args) {
fmt.Printf("%-22s %-26s %-35s %s\n", node.Id.Get(), node.KernelVersion.Print(), node.ContainerName.Print(), node.SystemOverlay.Print()+"/"+node.RuntimeOverlay.Print())
}
@@ -106,7 +94,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-22s %-26s %s\n", "NODE NAME", "PROFILES", "NETWORK")
fmt.Println(strings.Repeat("=", 80))
for _, node := range nodes {
for _, node := range node.FilterByName(nodes, args) {
var netdevs []string
if len(node.NetDevs) > 0 {
for name, dev := range node.NetDevs {

View File

@@ -13,31 +13,36 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) >= 1 {
nodeList, _ = n.SearchByNameList(args)
} else {
wwlog.Printf(wwlog.ERROR, "No requested nodes\n")
os.Exit(255)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodeList)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())
@@ -55,7 +60,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fullFlag := full
batchpool.Submit(func() {
if fullFlag == true {
if fullFlag {
ipmiCmd.SensorList()
} else {
ipmiCmd.SDRList()

View File

@@ -16,7 +16,6 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var err error
var nodes []node.NodeInfo
var SetProfiles []string
nodeDB, err := node.New()
@@ -25,26 +24,23 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1)
}
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if SetNodeAll == true {
nodes, err = nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
if !SetNodeAll {
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
cmd.Usage()
os.Exit(1)
}
}
} else if len(args) > 0 {
nodes, err = nodeDB.SearchByNameList(args)
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
} else {
cmd.Usage()
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
@@ -336,28 +332,23 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
}
}
if len(nodes) > 0 {
if SetYes == true {
nodeDB.Persist()
warewulfd.DaemonReload()
} else {
q := fmt.Sprintf("Are you sure you want to modify %d nodes(s)", len(nodes))
if SetYes == true {
nodeDB.Persist()
warewulfd.DaemonReload()
} else {
q := fmt.Sprintf("Are you sure you want to modify %d nodes(s)", len(nodes))
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
warewulfd.DaemonReload()
}
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
} else {
fmt.Printf("No nodes found\n")
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
warewulfd.DaemonReload()
}
}
return nil

View File

@@ -13,31 +13,36 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) >= 1 {
nodeList, _ = n.SearchByNameList(args)
} else {
wwlog.Printf(wwlog.ERROR, "No requested nodes\n")
os.Exit(255)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodeList)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())

View File

@@ -13,31 +13,36 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) >= 1 {
nodeList, _ = n.SearchByNameList(args)
} else {
wwlog.Printf(wwlog.ERROR, "No requested nodes\n")
os.Exit(255)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodeList)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())

View File

@@ -13,33 +13,36 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) >= 1 {
nodeList, _ = n.SearchByNameList(args)
} else {
wwlog.Printf(wwlog.ERROR, "No requested nodes\n")
os.Exit(255)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
wwlog.Printf(wwlog.VERBOSE, "Found %d matching nodes for power command\n", len(nodeList))
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodeList)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())

View File

@@ -13,33 +13,36 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
var nodeList []node.NodeInfo
n, err := node.New()
nodeDB, err := node.New()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err)
os.Exit(1)
}
if len(args) >= 1 {
nodeList, _ = n.SearchByNameList(args)
} else {
wwlog.Printf(wwlog.ERROR, "No requested nodes\n")
os.Exit(255)
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err)
os.Exit(1)
}
if len(nodeList) == 0 {
wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0])
os.Exit(255)
if len(args) > 0 {
nodes = node.FilterByName(nodes, args)
} else {
wwlog.Printf(wwlog.VERBOSE, "Found %d matching nodes for power command\n", len(nodeList))
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
fmt.Printf("No nodes found\n")
os.Exit(1)
}
batchpool := batch.New(50)
jobcount := len(nodeList)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodeList {
for _, node := range nodes {
if node.IpmiIpaddr.Get() == "" {
wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get())

View File

@@ -13,8 +13,6 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var count int
var numNodes int
var numGroups int
nodeDB, err := node.New()
if err != nil {
@@ -22,50 +20,71 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1)
}
nodes, err := nodeDB.FindAllNodes()
profiles, err := nodeDB.FindAllProfiles()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not load all nodes: %s\n", err)
wwlog.Printf(wwlog.ERROR, "Could not load all profiles: %s\n", err)
os.Exit(1)
}
for _, p := range args {
err := nodeDB.DelProfile(p)
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
continue
}
for _, n := range nodes {
for _, np := range n.Profiles {
if np == p {
numNodes++
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 _, r := range args {
for _, p := range profiles {
if p.Id.Get() == r {
nodes, err := nodeDB.FindAllNodes()
if err != nil {
wwlog.Printf(wwlog.ERROR, "Could not load all nodes: %s\n", err)
os.Exit(1)
}
for _, n := range nodes {
for _, np := range n.Profiles {
if np == r {
wwlog.Printf(wwlog.VERBOSE, "Removing profile from node %s: %s\n", n.Id.Get(), r)
n.Profiles = util.SliceRemoveElement(n.Profiles, r)
nodeDB.NodeUpdate(n)
}
}
}
}
}
count++
}
if count > 0 {
if SetYes == true {
nodeDB.Persist()
} else {
q := fmt.Sprintf("Are you sure you want to delete %d profile(s) (%d groups, %d nodes)", count, numGroups, numNodes)
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
for _, r := range args {
var found bool
for _, p := range profiles {
if p.Id.Get() == r {
count++
found = true
err := nodeDB.DelProfile(r)
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
}
}
}
if !found {
fmt.Fprintf(os.Stderr, "Profile not found: %s\n", r)
}
}
if count == 0 {
fmt.Fprintf(os.Stderr, "No profiles found\n")
os.Exit(1)
}
if SetYes {
nodeDB.Persist()
} else {
wwlog.Printf(wwlog.INFO, "No groups found\n")
q := fmt.Sprintf("Are you sure you want to delete %d profile(s)", count)
prompt := promptui.Prompt{
Label: q,
IsConfirm: true,
}
result, _ := prompt.Run()
if result == "y" || result == "yes" {
nodeDB.Persist()
}
}
return nil

View File

@@ -25,7 +25,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
}
if ShowAll {
for _, profile := range profiles {
for _, profile := range node.FilterByName(profiles, args) {
fmt.Printf("################################################################################\n")
fmt.Printf("%-20s %-18s %s\n", "PROFILE NAME", "FIELD", "VALUE")
fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Id", profile.Id.Print())
@@ -59,7 +59,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
fmt.Printf("%-20s %s\n", "PROFILE NAME", "COMMENT/DESCRIPTION")
fmt.Println(strings.Repeat("=", 80))
for _, profile := range profiles {
for _, profile := range node.FilterByName(profiles, args) {
fmt.Printf("%-20s %s\n", profile.Id.Print(), profile.Comment.Print())
}
}

View File

@@ -15,7 +15,6 @@ import (
func CobraRunE(cmd *cobra.Command, args []string) error {
var err error
var profiles []node.NodeInfo
nodeDB, err := node.New()
if err != nil {
@@ -23,31 +22,24 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1)
}
if len(args) == 0 {
args = append(args, "default")
profiles, err := nodeDB.FindAllProfiles()
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
os.Exit(1)
}
if SetAll == true {
profiles, err = nodeDB.FindAllProfiles()
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
os.Exit(1)
}
} else {
var tmp []node.NodeInfo
tmp, err = nodeDB.FindAllProfiles()
if err != nil {
wwlog.Printf(wwlog.ERROR, "%s\n", err)
if !SetAll {
if len(args) > 0 {
profiles = node.FilterByName(profiles, args)
} else {
cmd.Usage()
os.Exit(1)
}
}
for _, a := range args {
for _, p := range tmp {
if p.Id.Get() == a {
profiles = append(profiles, p)
}
}
}
if len(profiles) == 0 {
fmt.Printf("No profiles found\n")
os.Exit(1)
}
if SetContainer != "" {

View File

@@ -3,7 +3,6 @@ package node
import (
"fmt"
"io/ioutil"
"regexp"
"sort"
"strings"
@@ -264,35 +263,3 @@ func (config *nodeYaml) FindByIpaddr(ipaddr string) (NodeInfo, error) {
return ret, errors.New("No nodes found with IP Addr: " + ipaddr)
}
func (nodes *nodeYaml) SearchByName(search string) ([]NodeInfo, error) {
var ret []NodeInfo
n, _ := nodes.FindAllNodes()
for _, node := range n {
b, _ := regexp.MatchString(search, node.Id.Get())
if b {
ret = append(ret, node)
}
}
return ret, nil
}
func (nodes *nodeYaml) SearchByNameList(searchList []string) ([]NodeInfo, error) {
var ret []NodeInfo
n, _ := nodes.FindAllNodes()
for _, search := range searchList {
for _, node := range n {
b, _ := regexp.MatchString(search, node.Id.Get())
if b {
ret = append(ret, node)
}
}
}
return ret, nil
}

View File

@@ -1,5 +1,32 @@
package node
import "regexp"
/**********
*
* Filters
*
*********/
func FilterByName(set []NodeInfo, searchList []string) []NodeInfo {
var ret []NodeInfo
if len(searchList) > 0 {
for _, search := range searchList {
for _, entry := range set {
b, _ := regexp.MatchString(search, entry.Id.Get())
if b {
ret = append(ret, entry)
}
}
}
} else {
ret = set
}
return ret
}
/**********
*
* Sets