# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html package xCAT::Schema; #Note that the SQL is far from imaginative. Fact of the matter is that #certain SQL backends don't ascribe meaning to the data types anyway. #New format, not sql statements, but info enough to describe xcat tables %tabspec = ( nodetype => { cols => [qw(node os arch profile comments disable)], keys => [qw(node)], }, nodepos => { cols => [qw(node rack u chassis slot room comments disable)], keys => [qw(node)], }, vpd => { cols => [qw(node serial mtm comments disable)], keys => [qw(node)], }, nodehm => { cols => [qw(node power mgt cons termserver termport conserver serialspeed serialflow getmac comments disable)], keys => [qw(node)], }, hosts => { cols => [qw(node ip hostnames comments disable)], keys => [qw(node)], }, mp => { cols => [qw(node mpa id comments disable)], keys => [qw(node)], }, mpa => { cols => [qw(mpa username password comments disable)], keys => [qw(mpa)], }, mac => { cols => [qw(node interface mac comments disable)], keys => [qw(node interface)], }, chain => { cols => [qw(node currstate currchain chain ondiscover comments disable)], keys => [qw(node)], }, noderes => { cols => [qw(node servicenode netboot tftpserver nfsserver kernel initrd kcmdline nfsdir serialport installnic primarynic xcatmaster current_osimage next_osimage comments disable)], keys => [qw(node)], }, networks => { cols => [qw(netname net mask gateway dhcpserver tftpserver nameservers dynamicrange comments disable)], keys => [qw(net mask)] }, switch => { cols => [qw(node switch vlan port comments disable)], keys => [qw(node switch port)] }, nodelist => { cols => [qw(node nodetype groups comments disable)], keys => [qw(node)], }, site => { cols => [qw(key value comments disable)], keys => [qw(key)] }, passwd => { cols => [qw(key username password comments disable)], keys => [qw(key)] }, ipmi => { cols => [qw(node bmc username password comments disable )], keys => [qw(node)] }, policy => { cols => [qw(priority name host commands noderange parameters time rule comments disable)], keys => [qw(priority)] }, notification => { cols => [qw(filename tables tableops comments disable)], keys => [qw(filename)], required => [qw(tables filename)] } ); #################################################### # # Data abstraction definitions # For each table entry added to the database schema, # a corresponding attribute should be added to one of # the data objects below, or new data objects should # be created as needed. # # Definition format: # List of data object hashes: # => # {attrs => # [ {attr_name => '', # only_if => '=', # # optional, used to define conditional attributes. # # is a previously resolved attribute from # # this data object. # tabentry => '', # # where the data is stored in the database # access_tabentry => '=', # # how to look up tabentry. For , # # if "attr:", use a previously resolved # # attribute value from the data object # # if "str:" use the value directly # description => '', # }, # {attr_name => , # ... # } ], # attrhash => {}, # internally generated hash of attrs array # # to allow code direct access to an attr def # objkey => 'attribute_name' # key attribute for this data object # } # # #################################################### %defspec = ( node => { attrs => [], attrhash => {}, objkey => 'node' }, osimage => { attrs => [], attrhash => {}, objkey => 'imagename' }, network => { attrs => [], attrhash => {}, objkey => 'netname' }, site => { attrs => [], attrhash => {}, objkey => 'master' } ); ############# # TODO: Need to figure out how to map the following to data objects: # nodetype table (does this get moved to the osimage table?) # --> do we need an arch attr per node that is stored in nodehm? # mac table (are we going to have an interface object definition?) # switch table (each interface on a node can have its own switch # table entry, part of interface object, too?) # username/password from password, hmc, ivm, mpa, and ipmi tables # (do we need special encryption and display masking for passwords?) # chain table (I think this is internal use only, do not abstract?) # noderes entries for kernel, initrd, kcmdline # ppc table (waiting on Scot to add to tabspec) # policy table - ? do we need a data abstraction for this? # notification - is this handled by Ling's commands? # site - need to figure out what entries we will have in the # site table since they are not listed individually in the # tabspec # nodelist.groups # new group table and object # new osimage table and object ############### # TODO: need to fill out all the "description" fields # These will be used for verbose usage with the def* cmds ############## @{$defspec{node}->{'attrs'}} = ( {attr_name => 'node', tabentry => 'nodelist.node', access_tabentry => 'objkeyvalue'}, ############ # TODO: The attr name for nodelist.nodetype is in conflict with the existing # nodetype table. With the osimage table, the nodetype table should go # away. Will reuse of this name cause confusion for xcat users? ############ {attr_name => 'nodetype', tabentry => 'nodelist.nodetype', access_tabentry => 'nodelist.node=attr:node', description => 'Type of node: osi,hmc,fsp,mpa,???'}, {attr_name => 'xcatmaster', tabentry => 'noderes.xcatmaster', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'servicenode', tabentry => 'noderes.servicenode', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'mgt', tabentry => 'nodehm.mgt', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'power', tabentry => 'nodehm.power', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'cons', tabentry => 'nodehm.cons', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'termserver', tabentry => 'nodehm.termserver', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'termport', tabentry => 'nodehm.termport', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'conserver', tabentry => 'nodehm.conserver', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'getmac', tabentry => 'nodehm.getmac', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'serialport', tabentry => 'noderes.serialport', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'serialspeed', tabentry => 'nodehm.serialspeed', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'serialflow', tabentry => 'nodehm.serialflow', access_tabentry => 'nodehm.node=attr:node'}, {attr_name => 'ip', tabentry => 'hosts.ip', access_tabentry => 'hosts.node=attr:node'}, {attr_name => 'hostnames', tabentry => 'hosts.hostnames', access_tabentry => 'hosts.node=attr:node'}, {attr_name => 'serialnumber', tabentry => 'vpd.serial', access_tabentry => 'vpd.node=attr:node'}, {attr_name => 'mtm', tabentry => 'vpd.mtm', access_tabentry => 'vpd.node=attr:node'}, {attr_name => 'rackloc', tabentry => 'nodepos.rack', access_tabentry => 'nodepos.node=attr:node'}, {attr_name => 'unitloc', tabentry => 'nodepos.u', access_tabentry => 'nodepos.node=attr:node'}, {attr_name => 'chassisloc', tabentry => 'nodepos.chassis', access_tabentry => 'nodepos.node=attr:node'}, {attr_name => 'slotloc', tabentry => 'nodepos.slot', access_tabentry => 'nodepos.node=attr:node'}, {attr_name => 'roomloc', tabentry => 'nodepos.room', access_tabentry => 'nodepos.node=attr:node'}, # Conditional attributes: # OSI node attributes: {attr_name => 'tftpserver', only_if => 'nodetype=osi', tabentry => 'noderes.tftpserver', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'nfsserver', only_if => 'nodetype=osi', tabentry => 'noderes.nfsserver', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'nfsdir', only_if => 'nodetype=osi', tabentry => 'noderes.nfsdir', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'primarynic', only_if => 'nodetype=osi', tabentry => 'noderes.primarynic', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'installnic', only_if => 'nodetype=osi', tabentry => 'noderes.installnic', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'netboot', only_if => 'nodetype=osi', tabentry => 'noderes.netboot', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'current_osimage', only_if => 'nodetype=osi', tabentry => 'noderes.current_osimage', access_tabentry => 'noderes.node=attr:node'}, {attr_name => 'next_osimage', only_if => 'nodetype=osi', tabentry => 'noderes.next_osimage', access_tabentry => 'noderes.node=attr:node'}, # Hardware Control node attributes: {attr_name => hdwctrlpoint, only_if => 'mgtmethod=mp', tabentry => 'mp.mpa', access_tabentry => 'mp.node=attr:node'}, # {attr_name => hdwctrlpoint, # only_if => 'mgtmethod=hmc', # tabentry => 'ppc.hcp', # access_tabentry => 'ppc.node=attr:node'}, {attr_name => hdwctrlpoint, only_if => 'mgtmethod=ipmi', tabentry => 'ipmi.bmc', access_tabentry => 'ipmi.node=attr:node'}, {attr_name => hdwctrlnodeid, only_if => 'mgtmethod=mp', tabentry => 'mp.id', access_tabentry => 'mp.node=attr:node'}, # {attr_name => hdwctrlnodeid, # only_if => 'mgtmethod=hmc', # tabentry => 'ppc.id', # access_tabentry => 'ppc.node=attr:node'} ); @{$defspec{osimage}->{'attrs'}} = ( {attr_name => 'imagename', tabentry => 'osimage.imagename', access_tabentry => 'objkeyvalue', description => 'Name of OS image'}, {attr_name => 'osdistro', tabentry => 'osimage.osdistro', access_tabentry => 'osimage.objname=attr:imagename'}, ); @{$defspec{network}->{'attrs'}} = ( {attr_name => 'netname', tabentry => 'networks.netname', access_tabentry => 'objkeyvalue', description => 'Name to identify the network'}, {attr_name => 'net', tabentry => 'networks.net', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'mask', tabentry => 'networks.mask', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'gateway', tabentry => 'networks.gateway', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'dhcpserver', tabentry => 'networks.dhcpserver', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'tftpserver', tabentry => 'networks.tftpserver', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'nameservers', tabentry => 'networks.nameservers', access_tabentry => 'networks.netname=attr:netname'}, {attr_name => 'dynamicrange', tabentry => 'networks.dynamicrange', access_tabentry => 'networks.netname=attr:netname'}, ); ############## # TODO: need to figure out how to handle a key for the site table. # since this is really implemented differently than all the other # data objects, it doesn't map as cleanly. # change format of site table so each column is an attr and there # is only a single row in the table keyed by xcatmaster name? ############# @{$defspec{site}->{'attrs'}} = ( {attr_name => 'master', tabentry => 'site.value', access_tabentry => 'site.key=str:master', description => 'The management node'}, {attr_name => 'installdir', tabentry => 'site.value', access_tabentry => 'site.key=str:installdir', description => 'The installation directory'}, {attr_name => 'xcatdport', tabentry => 'site.value', access_tabentry => 'site.key=str:xcatdport', description => 'Port used by xcatd daemon on master'}, );