commit 1bb457168a846a6e4ada5835ca29bd96878f53f1 Author: Jarrod Johnson Date: Thu Jul 18 22:27:45 2013 -0400 Begin exploration of confluent concept First order of business will be a console server. Will see where things go from there. diff --git a/confluent.py b/confluent.py new file mode 100644 index 00000000..66718f49 --- /dev/null +++ b/confluent.py @@ -0,0 +1,12 @@ +# Copyright 2013 IBM Corporation +# All rights reserved + +# This is the main application. +# It should check for existing UDP socket to negotiate socket listen takeover +# It will have three paths into it: +# -Unix domain socket +# -TLS socket +# -WSGI +# Additionally, it will be able to receive particular UDP packets to facilitate +# Things like heartbeating and discovery +# It also will optionally snoop SLP DA requests diff --git a/confluent/attribs.py b/confluent/attribs.py new file mode 100644 index 00000000..8d731d56 --- /dev/null +++ b/confluent/attribs.py @@ -0,0 +1,225 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 +# Copyright 2013 IBM Corporation +# all rights reserved + + +#This defines the attributes of variou classes of things + +# 'nic', meant to be a nested structure under node +nic = { + 'Name': { + 'description': 'Name in ip/ifconfig as desired by administrator', + }, + 'Port': { + 'description': 'Port that this nic connects to', + }, + 'Switch': { + 'description': 'Switch that this nic connects to', + }, + 'ManagedHardwareAddress': { + 'description': 'Mac address to push to nic', + }, + 'DNSSuffix': { + 'description': ('String to place after nodename, but before' + 'Network.Domain to derive FQDN for this NIC'), + }, + 'HardwareAddress': { + 'description': 'Hardware address discovered on nic', + }, + 'IPAddresses': { + 'description': 'IPv4 and IPv6 addresses in CIDR format' + }, + 'PVID': { + 'description': 'PVID of port on switch this nic connects to', + }, + 'MTU': { + 'description': 'Requested MTU to configure on this interface', + }, + 'VLANs': { + 'description': 'Tagged VLANs to apply to nic/switch', + }, + 'DHCPv4Enabled': { + 'description': ('Whether DHCP should be attempted to acquire IPv4' + 'address on this interface'), + }, + 'DHCPv6Enabled': { + 'description': ('Whether DHCP should be attempted to acquire IPv6' + 'address on this interface'), + }, +} + + +# 'node', which can be considered a 'system' or a 'vm' +node = { + 'Groups': { + 'default': 'all', + 'description': ('List of static groups for which this node is' + 'considered a member'), + }, + 'Type': { + 'hidden': True, + # This is used to ascertain if this is a 'system', 'vm', etc... + }, + 'Numeric': { + 'hidden': True, + # a number for use in substitutions, not guaranteed to be unique + }, + 'TimeZone': { + 'description': 'POSIX timezone to apply to this node', + }, + 'Operators': { + 'description': 'User(s) granted operator privilege over this node', + }, + 'Status.HealthSummary': { + 'description': ('An assessment of the overall health of the node. It + 'can be "optimal", "warning", "critical'"), + }, + 'Status.LastHeartbeat': { + 'description': "Timestamp of last received heartbeat", + }, + 'Status.HeartbeatDeadline': { + 'description': "Time when Heartbeat will be considered expired", + }, + 'Status.DeploymentState': { + 'description': "State of any deployment activity in progress", + }, + 'Network.Gateway': { + 'description': ''''Default gateway to configure node with''', + }, + 'Network.NameServers': { + 'description': '''DNS servers for node to use''', + }, + 'Network.Domain': { + 'description': 'Value to append to nodename, if any, to get FQDN', + }, + 'Network.Interfaces': { + 'listof': 'nic', + 'description': 'List of network interfaces to configure on node', + }, + 'Storage.OSVolume': { + 'default': 'auto', + 'description': 'Description of storage to target when deploying OS', + }, + 'Storage.ClientIQN': { + 'description': ('Indicates IQN used by this node when communicating' + 'with iSCSI servers'), + }, + 'Storage.iSCSIServer': { + 'description': 'Address of iSCSI server used for boot if applicable', + }, + 'Storage.Pool': { + 'description': ('For scenarios like SAN boot and virtualization, this' + 'describes the pool to allocate boot volume from'), + }, + 'OS.ImageName': { + 'description': 'The OS Image applied or to be applied to node', + }, + 'Console.Speed': { + 'default': 'auto', + 'description': '''Indicate the speed at which to run serial port. +Default behavior is to autodetect the appropriate value as possible''', + }, + 'Console.Port': { + 'default': 'auto', + 'description': '''Indicate which port to use for text console. Default +behavior is to auto detect the value appropriate for the platform. 'Disable' +can be used to suppress serial console configuration''' + }, + 'Console.Method': { + 'description': '''Indicate the method used to access the console of +The managed node.''' + }, + 'Virtualization.Host': { + 'description': 'Hypervisor where this node does/should reside', + 'appliesto': ['vm'], + }, + 'Virtualization.ComputePool': { + 'description': ('Set of compute resources this node is permitted to' + ' be created on/be migrated to'), + 'appliesto': ['vm'], + }, + 'Virtualization.StorageModel': { + 'description': ('The model of storage adapter to emulate in a virtual' + 'machine. Defaults to virtio-blk for KVM, vmscsi for' + 'VMware'), + 'appliesto': ['vm'], + }, + 'Virtualization.NicModel': { + 'description': ('The model of NIC adapter to emulate in a virtual' + 'machine. Defaults to virtio-net for KVM, vmxnet3 for' + 'VMware'), + 'appliesto': ['vm'], + }, + 'HardwareManagement.Method': { + 'default': 'ipmi', + 'description': '''The method used to perform operations such as power +control. ''' + }, + 'Enclosure.Manager': { + 'description': "The management device for this node's chassis", + 'appliesto': ['system'], + }, + 'Enclosure.Bay': { + 'description': 'The bay in the enclosure, if any', + 'appliesto': ['system'], + }, + 'Enclosure.Type': { + 'description': '''The type of enclosure in use (e.g. IBM BladeCenter, +IBM Flex)''', + 'appliesto': ['system'], + }, + 'Identity.SerialNumber': { + 'description': 'The manufacturer serial number of node', + }, + 'Identity.UUID': { + 'description': 'The UUID of the node as presented in DMI', + }, + 'Identity.ModelNumber': { + 'description': 'The manufacturer dictated model number for the node', + }, + 'Identity.SNMPEngineId': { + 'description': 'The SNMP Engine id used by this node', + }, + 'Credentials.SNMPUser': { + 'description': 'The user to use for SNMPv3 access to this node', + }, + 'Credentials.SNMPPassword': { + 'description': 'The password to use for SNMPv3 access to this node', + }, + 'Credentials.SNMPLocalizedKey': { + 'description': "SNMPv3 key localized to this node's SNMP Engine id", + }, + 'Credentials.SNMPCommunity': { + 'description': 'SNMPv1 community string', + }, + 'Credentials.RootPassword': { + 'description': '''The password to apply to local root account. +The value may be in the clear or already crypted as it would appear in +/etc/shadow''', + }, + 'Credentials.AdministratorPassword': { + 'description': '''The password to apply to local Administrator account. +Due to limitations, this value must be stored in the clear. A blank value +indicates local Administrrator account be disabled, allowing only AD accounts +access''' + }, + 'Credentials.IPMIUser': { + 'description': '''Username to use by ipmi plugin. If unspecified, the +client behavior will default to USERID. BMC configuration will default to +setting a randomized username.''', + }, + 'Credentials.IPMIPassword': { + 'description': '''Password to use by ipmi plugin. If unspecified, the +client behavior defaults to PASSW0RD. BMC configuration defaults to randomized +password to mitigate offline attack risk and eliminate storing a clear text +credential of import on the BMC.''' + }, + 'Credentials.ManagementUser': { + 'description': ('Username to be set and used by protocols like SSH and' + ' HTTP'), + }, + 'Credentials.ManagementPassword': { + 'description': ('Password to be set and used by protocols like SSH and' + ' HTTP'), + }, +} diff --git a/confluent/config.py b/confluent/config.py new file mode 100644 index 00000000..b7f09e0f --- /dev/null +++ b/confluent/config.py @@ -0,0 +1,19 @@ +# Copyright 2013 IBM +# All rights reserved + +# This would be similar to Table.pm functionality +# Two backends +# simple plain JSON +# redis + +# This time around, expression based values will be parsed when set, and the +# parsing results will be stored rather than parsing on every evaluation +# Additionally, the option will be made available to use other attributes +# as well as the $1, $2, etc extracted from nodename. Left hand side can +# be requested to customize $1 and $2, but it is not required + +# In JSON mode, will just read and write entire thing, with a comment +# to dissuade people from hand editing. + +# In JSON mode, a file for different categories (site, nodes, etc) +# in redis, each category is a different database number