155 lines
4.5 KiB
Python
155 lines
4.5 KiB
Python
# Copyright(c) 2015, Oracle and/or its affiliates. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
import logging
|
|
import os
|
|
import pexpect
|
|
import yaml
|
|
|
|
|
|
def get_kolla_home():
|
|
return os.environ.get("KOLLA_HOME", "/usr/share/kolla/")
|
|
|
|
|
|
def get_kolla_etc():
|
|
return os.environ.get("KOLLA_ETC", "/etc/kolla/")
|
|
|
|
|
|
def get_kollacli_home():
|
|
return os.environ.get("KOLLA_CLI_HOME", "/usr/share/kolla/kollacli/")
|
|
|
|
|
|
def get_kollacli_etc():
|
|
return os.environ.get("KOLLA_CLI_ETC", "/etc/kolla/kollacli/")
|
|
|
|
|
|
def get_admin_user():
|
|
return os.environ.get("KOLLA_CLI_ADMIN_USER", "kolla")
|
|
|
|
|
|
def get_setup_user():
|
|
return os.environ.get("KOLLA_CLI_SETUP_USER", "root")
|
|
|
|
|
|
def get_pk_password():
|
|
# TODO(bmace) what to do here? pull from a file?
|
|
return None
|
|
|
|
|
|
def get_pk_bits():
|
|
return 1024
|
|
|
|
|
|
def load_etc_yaml(fileName):
|
|
contents = {}
|
|
try:
|
|
with open(get_kollacli_etc() + fileName, 'r') as f:
|
|
contents = yaml.load(f)
|
|
except Exception:
|
|
# TODO(bmace) if file doesn't exist on a load we don't
|
|
# want to blow up, some better behavior here?
|
|
pass
|
|
return contents or {}
|
|
|
|
|
|
def save_etc_yaml(fileName, contents):
|
|
with open(get_kollacli_etc() + fileName, 'w') as f:
|
|
f.write(yaml.dump(contents))
|
|
|
|
|
|
def convert_to_unicode(the_string):
|
|
"""convert string to unicode.
|
|
|
|
This is used to fixup extended ascii chars in strings. these chars cause
|
|
errors in json pickle/unpickle.
|
|
"""
|
|
uni_string = ''
|
|
try:
|
|
uni_string = unicode(the_string)
|
|
except UnicodeDecodeError:
|
|
uni_string = the_string.decode('utf-8')
|
|
return uni_string
|
|
|
|
|
|
def run_cmd(cmd, print_output=True):
|
|
"""run a system command
|
|
|
|
return:
|
|
- err_flag: False=command succeeded
|
|
True=command failed
|
|
- output: [List of strings]
|
|
if error, provides error information
|
|
if success, provides command output
|
|
"""
|
|
log = logging.getLogger(__name__)
|
|
err_flag = False
|
|
output = []
|
|
try:
|
|
child = pexpect.spawn(cmd)
|
|
child.maxsize = 1
|
|
child.timeout = 86400
|
|
for line in child:
|
|
outline = line.rstrip()
|
|
output.append(outline)
|
|
if print_output:
|
|
log.info(outline)
|
|
child.close()
|
|
if child.exitstatus != 0:
|
|
err_flag = True
|
|
except Exception as e:
|
|
err_flag = True
|
|
output.append('%s' % e)
|
|
return err_flag, output
|
|
|
|
|
|
def change_property(file_path, property_key, property_value, clear=False):
|
|
"""change property with a file
|
|
|
|
file_path: path to property file
|
|
property_key: property name
|
|
property value: property value
|
|
clear: flag to remove property
|
|
|
|
If clear, and property exists, remove it from the property file.
|
|
If clear, and property doesn't exists, nothing is done.
|
|
If not clear, and key is not found, the new property will be appended.
|
|
If not clear, and key is found, edit property in place.
|
|
"""
|
|
try:
|
|
file_contents = []
|
|
with open(file_path, 'r+') as property_file:
|
|
new_line = '%s: "%s"\n' % (property_key, property_value)
|
|
property_key_found = False
|
|
for line in property_file:
|
|
if line[0:len(property_key)] == property_key:
|
|
property_key_found = True
|
|
if clear:
|
|
# clear existing property
|
|
line = ''
|
|
else:
|
|
# edit existing property
|
|
line = new_line
|
|
file_contents.append(line)
|
|
if not property_key_found and not clear:
|
|
# add new property to file
|
|
file_contents.append(new_line)
|
|
|
|
property_file.seek(0)
|
|
property_file.truncate()
|
|
|
|
with open(file_path, 'w') as property_file:
|
|
for line in file_contents:
|
|
property_file.write(line)
|
|
except Exception as e:
|
|
raise e
|