polardbxengine/storage/ndb/mcc/config_parser.py

156 lines
4.7 KiB
Python

# Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
""" Tools for parsing and extracting information from cluster config.ini files. """
import StringIO
import ConfigParser
def parse_cluster_config_ini(path):
"""Unused"""
with open(path) as ini:
return parse_cluster_config_ini_(ini)
def parse_cluster_config_ini_(ini):
"""Unused"""
c = []
s = None
for l in map(str.rstrip, ini):
if l == '' or l.startswith('#'):
continue
if l.startswith('['):
s = {'name': l[1:-1], 'options': {}}
c.append(s)
continue
(k, v) = l.split('=', 1)
s['options'][k] = v
return c
def write_cluster_config_ini(c):
"""-"""
return '\n'.join(['[{0}]\n{1}\n'.format(s['name'], '\n'.join(['{0}={1}'.\
format(k, s['options'][k]) for k in s['options'].keys()])) for s in c])
def parse_cluster_config_ini_x(path):
"""-"""
c = {}
with open(path) as ini:
key = None
opts = {}
for l in map(str.rstrip, ini):
if l == '' or l.startswith('#'):
continue
if l.startswith('['):
if key is not None:
c[key] = opts
key = l
continue
(k, v) = l.split('=', 1)
opts[k] = v
if k == 'NodeId':
key = (key, v)
return c
def parse_config_ini(path):
"""Deprecated"""
ini = open(path)
buf = StringIO.StringIO()
sections = {}
for l in map(str.rstrip, ini):
if not 'DEFAULT' in l and len(l) > 2 and l[0] == '[' and l[-1] == ']':
section = l[1:-1]
n = 0
if sections.has_key(section):
n = sections[section] + 1
sections[section] = n
buf.write('[' + section + '_' + repr(n) + ']\n')
else:
buf.write(l+'\n')
ini.close()
buf.seek(0)
cp = ConfigParser.ConfigParser()
cp.optionxform = str
cp.readfp(buf)
buf.close()
return cp
def get_option_value_set(cp, option):
"""-"""
return set([cp.get(s, option) for s in filter(lambda s: cp.has_option(s, option), \
cp.sections())])
def get_node_dicts(cp, portbase):
"""-"""
node_sections = filter(lambda s: cp.has_option(s, 'NodeId') and not 'API' in s, \
cp.sections())
ndicts = []
for ns in node_sections:
t = '_'.join(ns.split('_')[:-1])
nalist = [('_NodeType', t.lower())]
if t == 'MYSQLD':
nalist += [('_MysqlPort', portbase)]
portbase += 1
if cp.has_section(t+' DEFAULT'):
nalist += cp.items(t+' DEFAULT')
nalist += cp.items(ns)
ndicts.append(dict(nalist))
return ndicts
def get_actual_section(s):
"""-"""
if 'DEFAULT' in s:
return s
return '_'.join(s.split('_')[:-1])
def get_proct1(s):
"""-"""
if 'DEFAULT' in s:
s = s.rstrip(' DEFAULT')
else:
s = '_'.join(s.split('_')[:-1])
return s.lower()
def get_pid1(cp, s):
"""-"""
if cp.has_option(s, 'NodeId'):
return cp.get(s, 'NodeId')
return None
def get_ndbconnecturl(cp):
"""Returns data node connection string"""
return ','.join(["{0}:{1}".format(cp.get(s, 'HostName'), cp.get(s, 'PortNumber')) \
for s in filter(lambda se: 'NDB_MGMD_' in se, cp.sections())])
def get_configvalues(cp):
"""-"""
return [{'section': get_actual_section(s), 'key': k, 'proct1': get_proct1(s), \
'pid1': get_pid1(cp, s), 'proct2':None, 'pid2':None, 'val': v} for s in cp.sections() \
for (k, v) in cp.items(s)]
def get_processes(cp):
"""-"""
return [{'desired_process_status': 0,
'restartlevel': 0,
'xtraoptions': 0,
'processname': get_proct1(s),
'internalid': get_pid1(cp, s),
'package': {},
'hostaddress': cp.get(s, 'HostName'),
'configfilepath':None,
'ndbconnecturl': get_ndbconnecturl(cp)} for s in filter(\
lambda s: cp.has_option(s, 'NodeId') and not 'API' in s, cp.sections())]