mirror of
https://github.com/xcat2/confluent.git
synced 2024-11-22 17:43:14 +00:00
a9f0312acd
For the specific task of importing mac addresses but not perturbing other xCAT configuration, provide output that can be used with tabrestore.
104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
#!/usr/bin/env python
|
|
import csv
|
|
import optparse
|
|
import signal
|
|
import sys
|
|
import os
|
|
try:
|
|
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
|
except AttributeError:
|
|
pass
|
|
|
|
path = os.path.dirname(os.path.realpath(__file__))
|
|
path = os.path.realpath(os.path.join(path, '..', 'lib', 'python'))
|
|
if path.startswith('/opt'):
|
|
sys.path.append(path)
|
|
|
|
import confluent.client as client
|
|
import confluent.sortutil as sortutil
|
|
|
|
|
|
def lookupdata(data, key):
|
|
ret = data.get(key, {}).get('value', '')
|
|
if ret is None:
|
|
ret = ''
|
|
return ret
|
|
|
|
def main():
|
|
argparser = optparse.OptionParser(
|
|
usage='''\n %prog noderange -o ansible.hosts
|
|
\n ''')
|
|
argparser.add_option('-o', '--output',
|
|
help='xCAT stanza file')
|
|
argparser.add_option('-m', '--macs',
|
|
help='xCAT macs.csv to write')
|
|
(options, args) = argparser.parse_args()
|
|
try:
|
|
noderange = args[0]
|
|
except IndexError:
|
|
argparser.print_help()
|
|
sys.exit(1)
|
|
if not (options.output or options.macs):
|
|
sys.stderr.write('Output file must be specified by -o or -m\n')
|
|
sys.exit(1)
|
|
sess = client.Command()
|
|
databynode = {}
|
|
for res in sess.read('/noderange/{0}/attributes/all'.format(noderange)):
|
|
for node in res.get('databynode', {}):
|
|
if node not in databynode:
|
|
databynode[node] = {}
|
|
databynode[node].update(res['databynode'][node])
|
|
if options.output:
|
|
with open(options.output, 'w') as importfile:
|
|
for node in sortutil.natural_sort(databynode):
|
|
xcatattrs = collect_attribute_data(databynode, node)
|
|
importfile.write('{0}:\n'.format(node))
|
|
importfile.write(' objtype=node\n')
|
|
importfile.write(' arch=x86_64\n')
|
|
importfile.write(' netboot=xnba\n')
|
|
importfile.write(' mgt=ipmi\n')
|
|
for attr in xcatattrs:
|
|
if xcatattrs[attr] is None:
|
|
continue
|
|
importfile.write(' {0}={1}\n'.format(attr,
|
|
xcatattrs[attr]))
|
|
importfile.write('\n')
|
|
if options.macs:
|
|
with open(options.macs, 'w') as importfile:
|
|
macsv = csv.writer(importfile)
|
|
macsv.writerow(['#node', 'mac'])
|
|
for node in sortutil.natural_sort(databynode):
|
|
xcatattrs = collect_attribute_data(databynode, node)
|
|
macsv.writerow([node, xcatattrs['mac']])
|
|
|
|
|
|
|
|
def collect_attribute_data(databynode, node):
|
|
data = databynode[node]
|
|
xcatattrs = {}
|
|
xcatattrs['groups'] = ','.join(data.get('groups', []))
|
|
xcatattrs['bmc'] = data.get('hardwaremanagement.manager', {}).get(
|
|
'value', None)
|
|
xcatattrs['mpa'] = data.get('enclosure.manager', {}).get(
|
|
'value', None)
|
|
xcatattrs['slotid'] = data.get('enclosure.bay', {}).get(
|
|
'value', None)
|
|
gotmac = False
|
|
for key in data:
|
|
if key.startswith('net.') and 'hwaddr' in key:
|
|
currmac = data[key].get('value', None)
|
|
if currmac:
|
|
if gotmac:
|
|
sys.stderr.write(
|
|
'Ignoring {0} and using only {1} for mac, '
|
|
'multiple macs not supported by '
|
|
'confluent2xcat\n'.format(key, gotmac))
|
|
continue
|
|
gotmac = key
|
|
xcatattrs['mac'] = currmac
|
|
return xcatattrs
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|