def validate(self): """Additional validation of options""" error_msgs = [] for opt in ['software', 'try-software', 'toolchain', 'try-toolchain']: val = getattr(self.options, opt.replace('-', '_')) if val and len(val) != 2: msg = "--%s requires NAME,VERSION (given %s)" % (opt, ','.join(val)) error_msgs.append(msg) if self.options.umask: umask_regex = re.compile('^[0-7]{3}$') if not umask_regex.match(self.options.umask): msg = "--umask value should be 3 digits (0-7) (regex pattern '%s')" % umask_regex.pattern error_msgs.append(msg) # subdir options must be relative for typ in ['modules', 'software']: subdir_opt = 'subdir_%s' % typ val = getattr(self.options, subdir_opt) if os.path.isabs(getattr(self.options, subdir_opt)): msg = "Configuration option '%s' must specify a *relative* path (use 'installpath-%s' instead?): '%s'" msg = msg % (subdir_opt, typ, val) error_msgs.append(msg) # specified module naming scheme must be a known one avail_mnss = avail_module_naming_schemes() if self.options.module_naming_scheme and self.options.module_naming_scheme not in avail_mnss: msg = "Selected module naming scheme '%s' is unknown: %s" % (self.options.module_naming_scheme, avail_mnss) error_msgs.append(msg) if error_msgs: raise EasyBuildError("Found problems validating the options: %s", '\n'.join(error_msgs))
def config_options(self): # config options descr = ("Configuration options", "Configure EasyBuild behavior.") opts = OrderedDict({ 'avail-module-naming-schemes': ("Show all supported module naming schemes", None, 'store_true', False,), 'avail-modules-tools': ("Show all supported module tools", None, "store_true", False,), 'avail-repositories': ("Show all repository types (incl. non-usable)", None, "store_true", False,), 'buildpath': ("Temporary build path", None, 'store', mk_full_default_path('buildpath')), 'ignore-dirs': ("Directory names to ignore when searching for files/dirs", 'strlist', 'store', ['.git', '.svn']), 'installpath': ("Install path for software and modules", None, 'store', mk_full_default_path('installpath')), 'config': ("Path to EasyBuild config file (DEPRECATED, use --configfiles instead!)", None, 'store', get_default_oldstyle_configfile(), 'C'), # purposely take a copy for the default logfile format 'logfile-format': ("Directory name and format of the log file", 'strtuple', 'store', DEFAULT_LOGFILE_FORMAT[:], {'metavar': 'DIR,FORMAT'}), 'module-naming-scheme': ("Module naming scheme", 'choice', 'store', DEFAULT_MNS, sorted(avail_module_naming_schemes().keys())), 'moduleclasses': (("Extend supported module classes " "(For more info on the default classes, use --show-default-moduleclasses)"), None, 'extend', [x[0] for x in DEFAULT_MODULECLASSES]), 'modules-footer': ("Path to file containing footer to be added to all generated module files", None, 'store_or_None', None, {'metavar': "PATH"}), 'modules-tool': ("Modules tool to use", 'choice', 'store', DEFAULT_MODULES_TOOL, sorted(avail_modules_tools().keys())), 'prefix': (("Change prefix for buildpath, installpath, sourcepath and repositorypath " "(used prefix for defaults %s)" % DEFAULT_PREFIX), None, 'store', None), 'recursive-module-unload': ("Enable generating of modules that unload recursively.", None, 'store_true', False), 'repository': ("Repository type, using repositorypath", 'choice', 'store', DEFAULT_REPOSITORY, sorted(avail_repositories().keys())), 'repositorypath': (("Repository path, used by repository " "(is passed as list of arguments to create the repository instance). " "For more info, use --avail-repositories."), 'strlist', 'store', [mk_full_default_path('repositorypath')]), 'show-default-moduleclasses': ("Show default module classes with description", None, 'store_true', False), 'sourcepath': ("Path(s) to where sources should be downloaded (string, colon-separated)", None, 'store', mk_full_default_path('sourcepath')), 'subdir-modules': ("Installpath subdir for modules", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_modules']), 'subdir-software': ("Installpath subdir for software", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_software']), 'suffix-modules-path': ("Suffix for module files install path", None, 'store', GENERAL_CLASS), # this one is sort of an exception, it's something jobscripts can set, # has no real meaning for regular eb usage 'testoutput': ("Path to where a job should place the output (to be set within jobscript)", None, 'store', None), 'tmp-logdir': ("Log directory where temporary log files are stored", None, 'store', DEFAULT_TMP_LOGDIR), 'tmpdir': ('Directory to use for temporary storage', None, 'store', None), }) self.log.debug("config_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def _postprocess_list_avail(self): """Create all the additional info that can be requested (exit at the end)""" msg = '' # dump supported configuration file constants if self.options.avail_cfgfile_constants: msg += self.avail_cfgfile_constants() # dump possible easyconfig params if self.options.avail_easyconfig_params: msg += avail_easyconfig_params( self.options.easyblock, self.options.avail_easyconfig_params) # dump easyconfig template options if self.options.avail_easyconfig_templates: msg += template_documentation() # dump easyconfig constant options if self.options.avail_easyconfig_constants: msg += constant_documentation() # dump easyconfig license options if self.options.avail_easyconfig_licenses: msg += license_documentation() # dump available easyblocks if self.options.list_easyblocks: msg += self.avail_easyblocks() # dump known toolchains if self.options.list_toolchains: msg += self.avail_toolchains() # dump known repository types if self.options.avail_repositories: msg += self.avail_repositories() # dump supported modules tools if self.options.avail_modules_tools: msg += self.avail_list('modules tools', avail_modules_tools()) # dump supported module naming schemes if self.options.avail_module_naming_schemes: msg += self.avail_list('module naming schemes', avail_module_naming_schemes()) # dump default list of config files that are considered if self.options.show_default_configfiles: msg += self.show_default_configfiles() # dump default moduleclasses with description if self.options.show_default_moduleclasses: msg += self.show_default_moduleclasses() if self.options.unittest_file: self.log.info(msg) else: print msg sys.exit(0)
def _postprocess_list_avail(self): """Create all the additional info that can be requested (exit at the end)""" msg = "" # dump supported configuration file constants if self.options.avail_cfgfile_constants: msg += self.avail_cfgfile_constants() # dump possible easyconfig params if self.options.avail_easyconfig_params: msg += avail_easyconfig_params(self.options.easyblock, self.options.avail_easyconfig_params) # dump easyconfig template options if self.options.avail_easyconfig_templates: msg += template_documentation() # dump easyconfig constant options if self.options.avail_easyconfig_constants: msg += constant_documentation() # dump easyconfig license options if self.options.avail_easyconfig_licenses: msg += license_documentation() # dump available easyblocks if self.options.list_easyblocks: msg += self.avail_easyblocks() # dump known toolchains if self.options.list_toolchains: msg += self.avail_toolchains() # dump known repository types if self.options.avail_repositories: msg += self.avail_repositories() # dump supported modules tools if self.options.avail_modules_tools: msg += self.avail_list("modules tools", avail_modules_tools()) # dump supported module naming schemes if self.options.avail_module_naming_schemes: msg += self.avail_list("module naming schemes", avail_module_naming_schemes()) # dump default list of config files that are considered if self.options.show_default_configfiles: msg += self.show_default_configfiles() # dump default moduleclasses with description if self.options.show_default_moduleclasses: msg += self.show_default_moduleclasses() if self.options.unittest_file: self.log.info(msg) else: print msg sys.exit(0)
def __init__(self, *args, **kwargs): """Initialize logger.""" self.log = fancylogger.getLogger(self.__class__.__name__, fname=False) # determine active module naming scheme avail_mnss = avail_module_naming_schemes() self.log.debug("List of available module naming schemes: %s" % avail_mnss.keys()) sel_mns = get_module_naming_scheme() if sel_mns in avail_mnss: self.mns = avail_mnss[sel_mns]() else: self.log.error("Selected module naming scheme %s could not be found in %s" % (sel_mns, avail_mnss.keys()))
def config_options(self): # config options descr = ("Configuration options", "Configure EasyBuild behavior.") opts = OrderedDict( { "avail-module-naming-schemes": ("Show all supported module naming schemes", None, "store_true", False), "avail-modules-tools": ("Show all supported module tools", None, "store_true", False), "avail-repositories": ("Show all repository types (incl. non-usable)", None, "store_true", False), "buildpath": ("Temporary build path", None, "store", mk_full_default_path("buildpath")), "external-modules-metadata": ( "List of files specifying metadata for external modules (INI format)", "strlist", "store", [], ), "ignore-dirs": ( "Directory names to ignore when searching for files/dirs", "strlist", "store", [".git", ".svn"], ), "installpath": ( "Install path for software and modules", None, "store", mk_full_default_path("installpath"), ), "installpath-modules": ( "Install path for modules (if None, combine --installpath and --subdir-modules)", None, "store", None, ), "installpath-software": ( "Install path for software (if None, combine --installpath and --subdir-software)", None, "store", None, ), # purposely take a copy for the default logfile format "logfile-format": ( "Directory name and format of the log file", "strtuple", "store", DEFAULT_LOGFILE_FORMAT[:], {"metavar": "DIR,FORMAT"}, ), "module-naming-scheme": ( "Module naming scheme", "choice", "store", DEFAULT_MNS, sorted(avail_module_naming_schemes().keys()), ), "module-syntax": ( "Syntax to be used for module files", "choice", "store", DEFAULT_MODULE_SYNTAX, sorted(avail_module_generators().keys()), ), "moduleclasses": ( ( "Extend supported module classes " "(For more info on the default classes, use --show-default-moduleclasses)" ), None, "extend", [x[0] for x in DEFAULT_MODULECLASSES], ), "modules-footer": ( "Path to file containing footer to be added to all generated module files", None, "store_or_None", None, {"metavar": "PATH"}, ), "modules-tool": ( "Modules tool to use", "choice", "store", DEFAULT_MODULES_TOOL, sorted(avail_modules_tools().keys()), ), "prefix": ( ( "Change prefix for buildpath, installpath, sourcepath and repositorypath " "(used prefix for defaults %s)" % DEFAULT_PREFIX ), None, "store", None, ), "recursive-module-unload": ( "Enable generating of modules that unload recursively.", None, "store_true", False, ), "repository": ( "Repository type, using repositorypath", "choice", "store", DEFAULT_REPOSITORY, sorted(avail_repositories().keys()), ), "repositorypath": ( ( "Repository path, used by repository " "(is passed as list of arguments to create the repository instance). " "For more info, use --avail-repositories." ), "strlist", "store", self.default_repositorypath, ), "sourcepath": ( "Path(s) to where sources should be downloaded (string, colon-separated)", None, "store", mk_full_default_path("sourcepath"), ), "subdir-modules": ( "Installpath subdir for modules", None, "store", DEFAULT_PATH_SUBDIRS["subdir_modules"], ), "subdir-software": ( "Installpath subdir for software", None, "store", DEFAULT_PATH_SUBDIRS["subdir_software"], ), "suffix-modules-path": ("Suffix for module files install path", None, "store", GENERAL_CLASS), # this one is sort of an exception, it's something jobscripts can set, # has no real meaning for regular eb usage "testoutput": ( "Path to where a job should place the output (to be set within jobscript)", None, "store", None, ), "tmp-logdir": ("Log directory where temporary log files are stored", None, "store", None), "tmpdir": ("Directory to use for temporary storage", None, "store", None), } ) self.log.debug("config_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def config_options(self): # config options descr = ("Configuration options", "Configure EasyBuild behavior.") opts = OrderedDict({ 'avail-module-naming-schemes': ( "Show all supported module naming schemes", None, 'store_true', False, ), 'avail-modules-tools': ( "Show all supported module tools", None, "store_true", False, ), 'avail-repositories': ( "Show all repository types (incl. non-usable)", None, "store_true", False, ), 'buildpath': ("Temporary build path", None, 'store', mk_full_default_path('buildpath')), 'ignore-dirs': ("Directory names to ignore when searching for files/dirs", 'strlist', 'store', ['.git', '.svn']), 'installpath': ("Install path for software and modules", None, 'store', mk_full_default_path('installpath')), # purposely take a copy for the default logfile format 'logfile-format': ("Directory name and format of the log file", 'strtuple', 'store', DEFAULT_LOGFILE_FORMAT[:], { 'metavar': 'DIR,FORMAT' }), 'module-naming-scheme': ("Module naming scheme", 'choice', 'store', DEFAULT_MNS, sorted(avail_module_naming_schemes().keys())), 'moduleclasses': (("Extend supported module classes " "(For more info on the default classes, use --show-default-moduleclasses)" ), None, 'extend', [x[0] for x in DEFAULT_MODULECLASSES]), 'modules-footer': ("Path to file containing footer to be added to all generated module files", None, 'store_or_None', None, { 'metavar': "PATH" }), 'modules-tool': ("Modules tool to use", 'choice', 'store', DEFAULT_MODULES_TOOL, sorted(avail_modules_tools().keys())), 'prefix': (("Change prefix for buildpath, installpath, sourcepath and repositorypath " "(used prefix for defaults %s)" % DEFAULT_PREFIX), None, 'store', None), 'recursive-module-unload': ("Enable generating of modules that unload recursively.", None, 'store_true', False), 'repository': ("Repository type, using repositorypath", 'choice', 'store', DEFAULT_REPOSITORY, sorted(avail_repositories().keys())), 'repositorypath': (("Repository path, used by repository " "(is passed as list of arguments to create the repository instance). " "For more info, use --avail-repositories."), 'strlist', 'store', [mk_full_default_path('repositorypath')]), 'show-default-moduleclasses': ("Show default module classes with description", None, 'store_true', False), 'sourcepath': ("Path(s) to where sources should be downloaded (string, colon-separated)", None, 'store', mk_full_default_path('sourcepath')), 'subdir-modules': ("Installpath subdir for modules", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_modules']), 'subdir-software': ("Installpath subdir for software", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_software']), 'suffix-modules-path': ("Suffix for module files install path", None, 'store', GENERAL_CLASS), # this one is sort of an exception, it's something jobscripts can set, # has no real meaning for regular eb usage 'testoutput': ("Path to where a job should place the output (to be set within jobscript)", None, 'store', None), 'tmp-logdir': ("Log directory where temporary log files are stored", None, 'store', None), 'tmpdir': ('Directory to use for temporary storage', None, 'store', None), }) self.log.debug("config_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)
def _postprocess_list_avail(self): """Create all the additional info that can be requested (exit at the end)""" msg = '' # dump supported configuration file constants if self.options.avail_cfgfile_constants: msg += self.avail_cfgfile_constants() # dump possible easyconfig params if self.options.avail_easyconfig_params: msg += avail_easyconfig_params(self.options.easyblock, self.options.avail_easyconfig_params) # dump easyconfig template options if self.options.avail_easyconfig_templates: msg += template_documentation() # dump easyconfig constant options if self.options.avail_easyconfig_constants: msg += constant_documentation() # dump easyconfig license options if self.options.avail_easyconfig_licenses: msg += license_documentation() # dump available easyblocks if self.options.list_easyblocks: msg += self.avail_easyblocks() # dump known toolchains if self.options.list_toolchains: msg += self.avail_toolchains() # dump known repository types if self.options.avail_repositories: msg += self.avail_repositories() # dump supported modules tools if self.options.avail_modules_tools: msg += self.avail_list('modules tools', avail_modules_tools()) # dump supported module naming schemes if self.options.avail_module_naming_schemes: msg += self.avail_list('module naming schemes', avail_module_naming_schemes()) # dump default list of config files that are considered if self.options.show_default_configfiles: msg += self.show_default_configfiles() # dump default moduleclasses with description if self.options.show_default_moduleclasses: msg += self.show_default_moduleclasses() if self.options.unittest_file: self.log.info(msg) else: print msg # cleanup tmpdir try: shutil.rmtree(self.tmpdir) except OSError as err: raise EasyBuildError("Failed to clean up temporary directory %s: %s", self.tmpdir, err) sys.exit(0)
def config_options(self): # config options descr = ("Configuration options", "Configure EasyBuild behavior.") opts = OrderedDict({ 'avail-module-naming-schemes': ("Show all supported module naming schemes", None, 'store_true', False,), 'avail-modules-tools': ("Show all supported module tools", None, "store_true", False,), 'avail-repositories': ("Show all repository types (incl. non-usable)", None, "store_true", False,), 'buildpath': ("Temporary build path", None, 'store', mk_full_default_path('buildpath')), 'external-modules-metadata': ("List of files specifying metadata for external modules (INI format)", 'strlist', 'store', []), 'ignore-dirs': ("Directory names to ignore when searching for files/dirs", 'strlist', 'store', ['.git', '.svn']), 'include-easyblocks': ("Location(s) of extra or customized easyblocks", 'strlist', 'store', []), 'include-module-naming-schemes': ("Location(s) of extra or customized module naming schemes", 'strlist', 'store', []), 'include-toolchains': ("Location(s) of extra or customized toolchains or toolchain components", 'strlist', 'store', []), 'installpath': ("Install path for software and modules", None, 'store', mk_full_default_path('installpath')), 'installpath-modules': ("Install path for modules (if None, combine --installpath and --subdir-modules)", None, 'store', None), 'installpath-software': ("Install path for software (if None, combine --installpath and --subdir-software)", None, 'store', None), 'job-backend': ("Backend to use for submitting jobs", 'choice', 'store', DEFAULT_JOB_BACKEND, sorted(avail_job_backends().keys())), # purposely take a copy for the default logfile format 'logfile-format': ("Directory name and format of the log file", 'strtuple', 'store', DEFAULT_LOGFILE_FORMAT[:], {'metavar': 'DIR,FORMAT'}), 'module-naming-scheme': ("Module naming scheme", 'choice', 'store', DEFAULT_MNS, sorted(avail_module_naming_schemes().keys())), 'module-syntax': ("Syntax to be used for module files", 'choice', 'store', DEFAULT_MODULE_SYNTAX, sorted(avail_module_generators().keys())), 'moduleclasses': (("Extend supported module classes " "(For more info on the default classes, use --show-default-moduleclasses)"), None, 'extend', [x[0] for x in DEFAULT_MODULECLASSES]), 'modules-footer': ("Path to file containing footer to be added to all generated module files", None, 'store_or_None', None, {'metavar': "PATH"}), 'modules-tool': ("Modules tool to use", 'choice', 'store', DEFAULT_MODULES_TOOL, sorted(avail_modules_tools().keys())), 'packagepath': ("The destination path for the packages built by package-tool", None, 'store', mk_full_default_path('packagepath')), 'package-naming-scheme': ("Packaging naming scheme choice", 'choice', 'store', DEFAULT_PNS, sorted(avail_package_naming_schemes().keys())), 'prefix': (("Change prefix for buildpath, installpath, sourcepath and repositorypath " "(used prefix for defaults %s)" % DEFAULT_PREFIX), None, 'store', None), 'recursive-module-unload': ("Enable generating of modules that unload recursively.", None, 'store_true', False), 'repository': ("Repository type, using repositorypath", 'choice', 'store', DEFAULT_REPOSITORY, sorted(avail_repositories().keys())), 'repositorypath': (("Repository path, used by repository " "(is passed as list of arguments to create the repository instance). " "For more info, use --avail-repositories."), 'strlist', 'store', self.default_repositorypath), 'sourcepath': ("Path(s) to where sources should be downloaded (string, colon-separated)", None, 'store', mk_full_default_path('sourcepath')), 'subdir-modules': ("Installpath subdir for modules", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_modules']), 'subdir-software': ("Installpath subdir for software", None, 'store', DEFAULT_PATH_SUBDIRS['subdir_software']), 'suffix-modules-path': ("Suffix for module files install path", None, 'store', GENERAL_CLASS), # this one is sort of an exception, it's something jobscripts can set, # has no real meaning for regular eb usage 'testoutput': ("Path to where a job should place the output (to be set within jobscript)", None, 'store', None), 'tmp-logdir': ("Log directory where temporary log files are stored", None, 'store', None), 'tmpdir': ('Directory to use for temporary storage', None, 'store', None), }) self.log.debug("config_options: descr %s opts %s" % (descr, opts)) self.add_group_parser(opts, descr)