removed NodeInfo and using NodeConf instead
This is a significant change in the undelying data model! nodeDb, err := node.New() will result in a structure which contains the on disk values. Only nodeDb.FindAllNodes() or nodeDb.GetNode(id) will give the nodes with its merged in profiles. Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
committed by
Jonathon Anderson
parent
dc8fb2d6f2
commit
28a7b9fe84
@@ -1,5 +1,9 @@
|
||||
package node
|
||||
|
||||
import "net"
|
||||
|
||||
const undef string = "UNDEF"
|
||||
|
||||
/******
|
||||
* YAML data representations
|
||||
******/
|
||||
@@ -8,7 +12,7 @@ Structure of which goes to disk
|
||||
*/
|
||||
type NodeYaml struct {
|
||||
WWInternal int `yaml:"WW_INTERNAL,omitempty" json:"WW_INTERNAL,omitempty"`
|
||||
NodeProfiles map[string]*NodeConf
|
||||
NodeProfiles map[string]*ProfileConf
|
||||
Nodes map[string]*NodeConf
|
||||
}
|
||||
|
||||
@@ -16,56 +20,47 @@ type NodeYaml struct {
|
||||
NodeConf is the datastructure describing a node and a profile which in disk format.
|
||||
*/
|
||||
type NodeConf struct {
|
||||
Comment string `yaml:"comment,omitempty" lopt:"comment" comment:"Set arbitrary string comment" json:"comment,omitempty"`
|
||||
ClusterName string `yaml:"cluster name,omitempty" lopt:"cluster" sopt:"c" comment:"Set cluster group" json:"cluster name,omitempty"`
|
||||
ContainerName string `yaml:"container name,omitempty" lopt:"container" sopt:"C" comment:"Set container name" json:"container name,omitempty"`
|
||||
Ipxe string `yaml:"ipxe template,omitempty" lopt:"ipxe" comment:"Set the iPXE template name" json:"ipxe template,omitempty"`
|
||||
// Deprecated start
|
||||
// Kernel settings here are deprecated and here for backward compatibility
|
||||
KernelVersion string `yaml:"kernel version,omitempty" json:"kernel version,omitempty"`
|
||||
KernelOverride string `yaml:"kernel override,omitempty" json:"kernel override,omitempty"`
|
||||
KernelArgs string `yaml:"kernel args,omitempty" json:"kernel args,omitempty"`
|
||||
// Ipmi settings herer are deprecated and here for backward compatibility
|
||||
IpmiUserName string `yaml:"ipmi username,omitempty" json:"ipmi username,omitempty"`
|
||||
IpmiPassword string `yaml:"ipmi password,omitempty" json:"ipmi password,omitempty"`
|
||||
IpmiIpaddr string `yaml:"ipmi ipaddr,omitempty" json:"ipmi ipaddr,omitempty"`
|
||||
IpmiNetmask string `yaml:"ipmi netmask,omitempty" json:"ipmi netmask,omitempty"`
|
||||
IpmiPort string `yaml:"ipmi port,omitempty" json:"ipmi port,omitempty"`
|
||||
IpmiGateway string `yaml:"ipmi gateway,omitempty" json:"ipmi gateway,omitempty"`
|
||||
IpmiInterface string `yaml:"ipmi interface,omitempty" json:"ipmi interface,omitempty"`
|
||||
IpmiEscapeChar string `yaml:"ipmi escapechar,omitempty" json:"ipmi escapechar,omitempty"`
|
||||
IpmiWrite string `yaml:"ipmi write,omitempty" json:"ipmi write,omitempty"`
|
||||
// Deprecated end
|
||||
RuntimeOverlay []string `yaml:"runtime overlay,omitempty" lopt:"runtime" sopt:"R" comment:"Set the runtime overlay" json:"runtime overlay,omitempty"`
|
||||
SystemOverlay []string `yaml:"system overlay,omitempty" lopt:"wwinit" sopt:"O" comment:"Set the system overlay" json:"system overlay,omitempty"`
|
||||
Kernel *KernelConf `yaml:"kernel,omitempty" json:"kernel,omitempty"`
|
||||
Ipmi *IpmiConf `yaml:"ipmi,omitempty" json:"ipmi,omitempty"`
|
||||
Init string `yaml:"init,omitempty" lopt:"init" sopt:"i" comment:"Define the init process to boot the container" json:"init,omitempty"`
|
||||
Root string `yaml:"root,omitempty" lopt:"root" comment:"Define the rootfs" json:"root,omitempty"`
|
||||
AssetKey string `yaml:"asset key,omitempty" lopt:"asset" comment:"Set the node's Asset tag (key)" json:"asset key,omitempty"`
|
||||
Discoverable string `yaml:"discoverable,omitempty" lopt:"discoverable" sopt:"e" comment:"Make discoverable in given network (true/false)" type:"bool" json:"discoverable,omitempty"`
|
||||
Profiles []string `yaml:"profiles,omitempty" lopt:"profile" sopt:"P" comment:"Set the node's profile members (comma separated)" json:"profiles,omitempty"`
|
||||
NetDevs map[string]*NetDevs `yaml:"network devices,omitempty" json:"network devices,omitempty"`
|
||||
Tags map[string]string `yaml:"tags,omitempty" lopt:"tagadd" comment:"base key" json:"tags,omitempty"`
|
||||
TagsDel []string `yaml:"tagsdel,omitempty" lopt:"tagdel" comment:"remove this tags" json:"tagsdel,omitempty"` // should not go to disk only to wire
|
||||
Keys map[string]string `yaml:"keys,omitempty" json:"keys,omitempty"` // Reverse compatibility
|
||||
PrimaryNetDev string `yaml:"primary network,omitempty" lopt:"primarynet" sopt:"p" comment:"Set the primary network interface" json:"primary network,omitempty"`
|
||||
Disks map[string]*Disk `yaml:"disks,omitempty" json:"disks,omitempty"`
|
||||
FileSystems map[string]*FileSystem `yaml:"filesystems,omitempty" json:"filesystems,omitempty"`
|
||||
id string
|
||||
valid bool // Is set true, if called by the constructor
|
||||
Discoverable bool `yaml:"discoverable,omitempty" lopt:"discoverable" sopt:"e" comment:"Make discoverable in given network (true/false)"`
|
||||
AssetKey string `yaml:"asset key,omitempty" lopt:"asset" comment:"Set the node's Asset tag (key)"`
|
||||
Profiles []string `yaml:"profiles,omitempty" lopt:"profile" sopt:"P" comment:"Set the node's profile members (comma separated)"`
|
||||
ProfileConf `yaml:"-,inline"` // include all values set in the profile, but inline them in yaml output if these are part of NodeConf
|
||||
}
|
||||
|
||||
/*
|
||||
Holds the data which can be set for profiles and nodes.
|
||||
*/
|
||||
type ProfileConf struct {
|
||||
// exported values
|
||||
Comment string `yaml:"comment,omitempty" lopt:"comment" comment:"Set arbitrary string comment"`
|
||||
ClusterName string `yaml:"cluster name,omitempty" lopt:"cluster" sopt:"c" comment:"Set cluster group"`
|
||||
ContainerName string `yaml:"container name,omitempty" lopt:"container" sopt:"C" comment:"Set container name"`
|
||||
Ipxe string `yaml:"ipxe template,omitempty" lopt:"ipxe" comment:"Set the iPXE template name"`
|
||||
RuntimeOverlay []string `yaml:"runtime overlay,omitempty" lopt:"runtime" sopt:"R" comment:"Set the runtime overlay"`
|
||||
SystemOverlay []string `yaml:"system overlay,omitempty" lopt:"wwinit" sopt:"O" comment:"Set the system overlay"`
|
||||
Kernel *KernelConf `yaml:"kernel,omitempty"`
|
||||
Ipmi *IpmiConf `yaml:"ipmi,omitempty"`
|
||||
Init string `yaml:"init,omitempty" lopt:"init" sopt:"i" comment:"Define the init process to boot the container"`
|
||||
Root string `yaml:"root,omitempty" lopt:"root" comment:"Define the rootfs" `
|
||||
NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"`
|
||||
Tags map[string]string `yaml:"tags,omitempty"`
|
||||
PrimaryNetDev string `yaml:"primary network,omitempty" lopt:"primarynet" sopt:"p" comment:"Set the primary network interface"`
|
||||
Disks map[string]*Disk `yaml:"disks,omitempty"`
|
||||
FileSystems map[string]*FileSystem `yaml:"filesystems,omitempty"`
|
||||
}
|
||||
|
||||
type IpmiConf struct {
|
||||
UserName string `yaml:"username,omitempty" lopt:"ipmiuser" comment:"Set the IPMI username" json:"username,omitempty"`
|
||||
Password string `yaml:"password,omitempty" lopt:"ipmipass" comment:"Set the IPMI password" json:"password,omitempty"`
|
||||
Ipaddr string `yaml:"ipaddr,omitempty" lopt:"ipmiaddr" comment:"Set the IPMI IP address" type:"IP" json:"ipaddr,omitempty"`
|
||||
Netmask string `yaml:"netmask,omitempty" lopt:"ipminetmask" comment:"Set the IPMI netmask" type:"IP" json:"netmask,omitempty"`
|
||||
Port string `yaml:"port,omitempty" lopt:"ipmiport" comment:"Set the IPMI port" json:"port,omitempty"`
|
||||
Gateway string `yaml:"gateway,omitempty" lopt:"ipmigateway" comment:"Set the IPMI gateway" type:"IP" json:"gateway,omitempty"`
|
||||
Interface string `yaml:"interface,omitempty" lopt:"ipmiinterface" comment:"Set the node's IPMI interface (defaults: 'lan')" json:"interface,omitempty"`
|
||||
EscapeChar string `yaml:"escapechar,omitempty" lopt:"ipmiescapechar" comment:"Set the IPMI escape character (defaults: '~')" json:"escapechar,omitempty"`
|
||||
Write string `yaml:"write,omitempty" lopt:"ipmiwrite" comment:"Enable the write of impi configuration (true/false)" type:"bool" json:"write,omitempty"`
|
||||
Tags map[string]string `yaml:"tags,omitempty" lopt:"ipmitagadd" comment:"add ipmitags" json:"tags,omitempty"`
|
||||
TagsDel []string `yaml:"tagsdel,omitempty" lopt:"ipmitagdel" comment:"remove ipmitags" json:"tagsdel,omitempty"` // should not go to disk only to wire
|
||||
UserName string `yaml:"username,omitempty" lopt:"ipmiuser" comment:"Set the IPMI username"`
|
||||
Password string `yaml:"password,omitempty" lopt:"ipmipass" comment:"Set the IPMI password"`
|
||||
Ipaddr net.IP `yaml:"ipaddr,omitempty" lopt:"ipmiaddr" comment:"Set the IPMI IP address" type:"IP"`
|
||||
Gateway net.IP `yaml:"gateway,omitempty" lopt:"ipmigateway" comment:"Set the IPMI gateway" type:"IP"`
|
||||
Netmask net.IPMask `yaml:"netmask,omitempty" lopt:"ipminetmask" comment:"Set the IPMI netmask" type:"IP"`
|
||||
Port string `yaml:"port,omitempty" lopt:"ipmiport" comment:"Set the IPMI port"`
|
||||
Interface string `yaml:"interface,omitempty" lopt:"ipmiinterface" comment:"Set the node's IPMI interface (defaults: 'lan')"`
|
||||
EscapeChar string `yaml:"escapechar,omitempty" lopt:"ipmiescapechar" comment:"Set the IPMI escape character (defaults: '~')"`
|
||||
Write bool `yaml:"write,omitempty" lopt:"ipmiwrite" comment:"Enable the write of impi configuration (true/false)"`
|
||||
Tags map[string]string `yaml:"tags,omitempty"`
|
||||
}
|
||||
type KernelConf struct {
|
||||
Version string `yaml:"version,omitempty" json:"version,omitempty"`
|
||||
@@ -75,27 +70,24 @@ type KernelConf struct {
|
||||
|
||||
type NetDevs struct {
|
||||
Type string `yaml:"type,omitempty" lopt:"type" sopt:"T" comment:"Set device type of given network"`
|
||||
OnBoot string `yaml:"onboot,omitempty" lopt:"onboot" comment:"Enable/disable network device (true/false)" type:"bool"`
|
||||
OnBoot bool `yaml:"onboot,omitempty" lopt:"onboot" comment:"Enable/disable network device (true/false)"`
|
||||
Device string `yaml:"device,omitempty" lopt:"netdev" sopt:"N" comment:"Set the device for given network"`
|
||||
Hwaddr string `yaml:"hwaddr,omitempty" lopt:"hwaddr" sopt:"H" comment:"Set the device's HW address for given network" type:"MAC"`
|
||||
Ipaddr string `yaml:"ipaddr,omitempty" comment:"IPv4 address in given network" sopt:"I" lopt:"ipaddr" type:"IP"`
|
||||
IpCIDR string `yaml:"ipcidr,omitempty"`
|
||||
Ipaddr6 string `yaml:"ip6addr,omitempty" lopt:"ipaddr6" comment:"IPv6 address" type:"IP"`
|
||||
Prefix string `yaml:"prefix,omitempty"`
|
||||
Netmask string `yaml:"netmask,omitempty" lopt:"netmask" sopt:"M" comment:"Set the networks netmask" type:"IP"`
|
||||
Gateway string `yaml:"gateway,omitempty" lopt:"gateway" sopt:"G" comment:"Set the node's network device gateway" type:"IP"`
|
||||
Ipaddr net.IP `yaml:"ipaddr,omitempty" comment:"IPv4 address in given network" sopt:"I" lopt:"ipaddr" type:"IP"`
|
||||
Ipaddr6 net.IP `yaml:"ip6addr,omitempty" lopt:"ipaddr6" comment:"IPv6 address" type:"IP"`
|
||||
Prefix net.IP `yaml:"prefix,omitempty"`
|
||||
Netmask net.IPMask `yaml:"netmask,omitempty" lopt:"netmask" sopt:"M" comment:"Set the networks netmask" type:"IP"`
|
||||
Gateway net.IP `yaml:"gateway,omitempty" lopt:"gateway" sopt:"G" comment:"Set the node's network device gateway" type:"IP"`
|
||||
MTU string `yaml:"mtu,omitempty" lopt:"mtu" comment:"Set the mtu" type:"uint"`
|
||||
Primary string `yaml:"primary,omitempty" type:"bool"`
|
||||
Default string `yaml:"default,omitempty"` /* backward compatibility */
|
||||
Tags map[string]string `yaml:"tags,omitempty" lopt:"nettagadd" comment:"network tags"`
|
||||
TagsDel []string `yaml:"tagsdel,omitempty" lopt:"nettagdel" comment:"delete network tags"` // should not go to disk only to wire
|
||||
primary bool `yaml:"primary,omitempty"`
|
||||
Tags map[string]string `yaml:"tags,omitempty"`
|
||||
}
|
||||
|
||||
/*
|
||||
Holds the disks of a node
|
||||
*/
|
||||
type Disk struct {
|
||||
WipeTable string `yaml:"wipe_table,omitempty" type:"bool" lopt:"diskwipe" comment:"whether or not the partition tables shall be wiped"`
|
||||
WipeTable bool `yaml:"wipe_table,omitempty" lopt:"diskwipe" comment:"whether or not the partition tables shall be wiped"`
|
||||
Partitions map[string]*Partition `yaml:"partitions,omitempty"`
|
||||
}
|
||||
|
||||
@@ -104,14 +96,14 @@ partition definition, the label must be uniq so its used as the key in the
|
||||
Partitions map
|
||||
*/
|
||||
type Partition struct {
|
||||
Number string `yaml:"number,omitempty" lopt:"partnumber" comment:"set the partition number, if not set next free slot is used"`
|
||||
SizeMiB string `yaml:"size_mib,omitempty" lopt:"partsize" comment:"set the size of the partition, if not set maximal possible size is used"`
|
||||
StartMiB string `yaml:"start_mib,omitempty" comment:"the start of the partition"`
|
||||
Number string `yaml:"number,omitempty" lopt:"partnumber" comment:"set the partition number, if not set next free slot is used" type:"uint"`
|
||||
SizeMiB string `yaml:"size_mib,omitempty" lopt:"partsize " comment:"set the size of the partition, if not set maximal possible size is used" type:"uint"`
|
||||
StartMiB string `yaml:"start_mib,omitempty" comment:"the start of the partition" type:"uint"`
|
||||
TypeGuid string `yaml:"type_guid,omitempty" comment:"Linux filesystem data will be used if empty"`
|
||||
Guid string `yaml:"guid,omitempty" comment:"the GPT unique partition GUID"`
|
||||
WipePartitionEntry string `yaml:"wipe_partition_entry,omitempty" comment:"if true, Ignition will clobber an existing partition if it does not match the config" type:"bool"`
|
||||
ShouldExist string `yaml:"should_exist,omitempty" lopt:"partcreate" comment:"create partition if not exist" type:"bool"`
|
||||
Resize string `yaml:"resize,omitempty" comment:" whether or not the existing partition should be resize" type:"bool"`
|
||||
WipePartitionEntry bool `yaml:"wipe_partition_entry,omitempty" comment:"if true, Ignition will clobber an existing partition if it does not match the config"`
|
||||
ShouldExist bool `yaml:"should_exist,omitempty" lopt:"partcreate" comment:"create partition if not exist"`
|
||||
Resize bool `yaml:"resize,omitempty" comment:" whether or not the existing partition should be resize"`
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -120,122 +112,9 @@ Definition of a filesystem. The device is uniq so its used as key
|
||||
type FileSystem struct {
|
||||
Format string `yaml:"format,omitempty" lopt:"fsformat" comment:"format of the file system"`
|
||||
Path string `yaml:"path,omitempty" lopt:"fspath" comment:"the mount point of the file system"`
|
||||
WipeFileSystem string `yaml:"wipe_filesystem,omitempty" lopt:"fswipe" comment:"wipe file system at boot" type:"bool"`
|
||||
WipeFileSystem bool `yaml:"wipe_filesystem,omitempty" lopt:"fswipe" comment:"wipe file system at boot"`
|
||||
Label string `yaml:"label,omitempty" comment:"the label of the filesystem"`
|
||||
Uuid string `yaml:"uuid,omitempty" comment:"the uuid of the filesystem"`
|
||||
Options []string `yaml:"options,omitempty" comment:"any additional options to be passed to the format-specific mkfs utility"`
|
||||
MountOptions []string `yaml:"mount_options,omitempty" comment:"any special options to be passed to the mount command"`
|
||||
}
|
||||
|
||||
/******
|
||||
* Internal code data representations
|
||||
******/
|
||||
/*
|
||||
Holds string values, when accessed via Get, its value
|
||||
is returned which is the default or if set the value
|
||||
from the profile or if set the value of the node itself
|
||||
*/
|
||||
type Entry struct {
|
||||
value []string
|
||||
altvalue []string
|
||||
from string
|
||||
def []string
|
||||
isSlice bool
|
||||
}
|
||||
|
||||
/*
|
||||
NodeInfo is the in memory datastructure, which can containe
|
||||
a default value, which is overwritten by the overlay from the
|
||||
overlay (altvalue) which is overwitten by the value of the
|
||||
node itself, for all values of type Entry.
|
||||
*/
|
||||
type NodeInfo struct {
|
||||
Id Entry
|
||||
Comment Entry
|
||||
ClusterName Entry
|
||||
ContainerName Entry
|
||||
Ipxe Entry
|
||||
Grub Entry
|
||||
RuntimeOverlay Entry
|
||||
SystemOverlay Entry
|
||||
Root Entry
|
||||
Discoverable Entry
|
||||
Init Entry //TODO: Finish adding this...
|
||||
AssetKey Entry
|
||||
Kernel *KernelEntry
|
||||
Ipmi *IpmiEntry
|
||||
Profiles Entry
|
||||
PrimaryNetDev Entry
|
||||
NetDevs map[string]*NetDevEntry
|
||||
Tags map[string]*Entry
|
||||
Disks map[string]*DiskEntry
|
||||
FileSystems map[string]*FileSystemEntry
|
||||
}
|
||||
|
||||
type IpmiEntry struct {
|
||||
Ipaddr Entry
|
||||
Netmask Entry
|
||||
Port Entry
|
||||
Gateway Entry
|
||||
UserName Entry
|
||||
Password Entry
|
||||
Interface Entry
|
||||
EscapeChar Entry
|
||||
Write Entry
|
||||
Tags map[string]*Entry
|
||||
}
|
||||
|
||||
type KernelEntry struct {
|
||||
Override Entry
|
||||
Args Entry
|
||||
}
|
||||
|
||||
type NetDevEntry struct {
|
||||
Type Entry
|
||||
OnBoot Entry
|
||||
Device Entry
|
||||
Hwaddr Entry
|
||||
Ipaddr Entry
|
||||
Ipaddr6 Entry
|
||||
IpCIDR Entry
|
||||
Prefix Entry
|
||||
Netmask Entry
|
||||
Gateway Entry
|
||||
MTU Entry
|
||||
Primary Entry
|
||||
Tags map[string]*Entry
|
||||
}
|
||||
|
||||
type DiskEntry struct {
|
||||
WipeTable Entry
|
||||
Partitions map[string]*PartitionEntry
|
||||
}
|
||||
|
||||
type PartitionEntry struct {
|
||||
Number Entry
|
||||
SizeMiB Entry
|
||||
StartMiB Entry
|
||||
TypeGuid Entry
|
||||
Guid Entry
|
||||
WipePartitionEntry Entry
|
||||
ShouldExist Entry
|
||||
Resize Entry
|
||||
}
|
||||
|
||||
type FileSystemEntry struct {
|
||||
Format Entry
|
||||
Path Entry
|
||||
WipeFileSystem Entry
|
||||
Label Entry
|
||||
Uuid Entry
|
||||
Options Entry
|
||||
MountOptions Entry
|
||||
}
|
||||
|
||||
// string which is printed if no value is set
|
||||
const NoValue = "--"
|
||||
|
||||
func (e Entry) MarshalText() (buf []byte, err error) {
|
||||
buf = append(buf, []byte(e.Get())...)
|
||||
return buf, nil
|
||||
MountOptions string `yaml:"mount_options,omitempty" comment:"any special options to be passed to the mount command"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user