blob: 95776d5efab6fb56642fbf728d9840fdf17becd9 [file] [log] [blame]
#!/usr/bin/env python
r"""
This module provides functions which are useful for running plug-ins.
"""
import sys
import os
import glob
import gen_print as gp
import gen_misc as gm
# Some help text that is common to more than one program.
plug_in_dir_paths_help_text = \
'This is a colon-separated list of plug-in directory paths. If one' +\
' of the entries in the list is a plain directory name (i.e. no' +\
' path info), it will be taken to be a native plug-in. In that case,' +\
' %(prog)s will search for the native plug-in in the "plug-ins"' +\
' subdirectory of each path in the PATH environment variable until it' +\
' is found. Also, integrated plug-ins will automatically be appended' +\
' to your plug_in_dir_paths list. An integrated plug-in is any plug-in' +\
' found using the PATH variable that contains a file named "integrated".'
mch_class_help_text = \
'The class of machine that we are testing (e.g. "op" = "open power",' +\
' "obmc" = "open bmc", etc).'
PATH_LIST = gm.return_path_list()
def get_plug_in_base_paths():
r"""
Get plug-in base paths and return them as a list.
This function searches the PATH_LIST (created from PATH environment variable) for any paths that have a
"plug_ins" subdirectory. All such paths are considered plug_in_base paths.
"""
global PATH_LIST
plug_in_base_path_list = []
for path in PATH_LIST:
candidate_plug_in_base_path = path + "plug_ins/"
if os.path.isdir(candidate_plug_in_base_path):
plug_in_base_path_list.append(candidate_plug_in_base_path)
return plug_in_base_path_list
# Define global plug_in_base_path_list and call get_plug_in_base_paths to set its value.
plug_in_base_path_list = get_plug_in_base_paths()
def find_plug_in_package(plug_in_name):
r"""
Find and return the normalized directory path of the specified plug in. This is done by searching the
global plug_in_base_path_list.
Description of arguments:
plug_in_name The unqualified name of the plug-in package.
"""
global plug_in_base_path_list
for plug_in_base_dir_path in plug_in_base_path_list:
candidate_plug_in_dir_path = os.path.normpath(plug_in_base_dir_path
+ plug_in_name) + \
os.sep
if os.path.isdir(candidate_plug_in_dir_path):
return candidate_plug_in_dir_path
return ""
def validate_plug_in_package(plug_in_dir_path,
mch_class="obmc"):
r"""
Validate the plug in package and return the normalized plug-in directory path.
Description of arguments:
plug_in_dir_path The "relative" or absolute path to a plug in package directory.
mch_class The class of machine that we are testing (e.g. "op" = "open power",
"obmc" = "open bmc", etc).
"""
gp.dprint_executing()
if os.path.isabs(plug_in_dir_path):
# plug_in_dir_path begins with a slash so it is an absolute path.
candidate_plug_in_dir_path = os.path.normpath(plug_in_dir_path) +\
os.sep
if not os.path.isdir(candidate_plug_in_dir_path):
gp.print_error_report("Plug-in directory path \""
+ plug_in_dir_path + "\" does not exist.\n")
exit(1)
else:
# The plug_in_dir_path is actually a simple name (e.g. "OBMC_Sample")...
candidate_plug_in_dir_path = find_plug_in_package(plug_in_dir_path)
if candidate_plug_in_dir_path == "":
global PATH_LIST
gp.print_error_report("Plug-in directory path \""
+ plug_in_dir_path + "\" could not be found"
+ " in any of the following directories:\n"
+ gp.sprint_var(PATH_LIST))
exit(1)
# Make sure that this plug-in supports us...
supports_file_path = candidate_plug_in_dir_path + "supports_" + mch_class
if not os.path.exists(supports_file_path):
gp.print_error_report("The following file path could not be"
+ " found:\n"
+ gp.sprint_varx("supports_file_path",
supports_file_path)
+ "\nThis file is necessary to indicate that"
+ " the given plug-in supports the class of"
+ " machine we are testing, namely \""
+ mch_class + "\".\n")
exit(1)
return candidate_plug_in_dir_path
def return_integrated_plug_ins(mch_class="obmc"):
r"""
Return a list of integrated plug-ins. Integrated plug-ins are plug-ins which are selected without regard
for whether the user has specified them. In other words, they are "integrated" into the program suite.
The programmer designates a plug-in as integrated by putting a file named "integrated" into the plug-in
package directory.
Description of arguments:
mch_class The class of machine that we are testing (e.g. "op" = "open power",
"obmc" = "open bmc", etc).
"""
global plug_in_base_path_list
integrated_plug_ins_list = []
DEBUG_SKIP_INTEGRATED = int(os.getenv('DEBUG_SKIP_INTEGRATED', '0'))
if DEBUG_SKIP_INTEGRATED:
return integrated_plug_ins_list
for plug_in_base_path in plug_in_base_path_list:
# Get a list of all plug-in paths that support our mch_class.
mch_class_candidate_list = glob.glob(plug_in_base_path
+ "*/supports_" + mch_class)
for candidate_path in mch_class_candidate_list:
integrated_plug_in_dir_path = os.path.dirname(candidate_path) +\
os.sep
integrated_file_path = integrated_plug_in_dir_path + "integrated"
if os.path.exists(integrated_file_path):
plug_in_name = \
os.path.basename(os.path.dirname(candidate_path))
if plug_in_name not in integrated_plug_ins_list:
# If this plug-in has not already been added to the list...
integrated_plug_ins_list.append(plug_in_name)
return integrated_plug_ins_list
def return_plug_in_packages_list(plug_in_dir_paths,
mch_class="obmc"):
r"""
Return a list of plug-in packages given the plug_in_dir_paths string. This function calls
validate_plug_in_package so it will fail if plug_in_dir_paths contains any invalid plug-ins.
Description of arguments:
plug_in_dir_path The "relative" or absolute path to a plug in package directory.
mch_class The class of machine that we are testing (e.g. "op" = "open power",
"obmc" = "open bmc", etc).
"""
if plug_in_dir_paths != "":
plug_in_packages_list = plug_in_dir_paths.split(":")
else:
plug_in_packages_list = []
# Get a list of integrated plug-ins (w/o full path names).
integrated_plug_ins_list = return_integrated_plug_ins(mch_class)
# Put both lists together in plug_in_packages_list with no duplicates. NOTE: This won't catch
# duplicates if the caller specifies the full path name of a native plug-in but that should be rare
# enough.
plug_in_packages_list = plug_in_packages_list + integrated_plug_ins_list
plug_in_packages_list = \
list(set([validate_plug_in_package(path, mch_class)
for path in plug_in_packages_list]))
return plug_in_packages_list