Commit 0cf1c210 authored by Lorenz Huedepohl's avatar Lorenz Huedepohl
Browse files

Update of mpcdf_enable_repositories

Has a (hopefully) less confusing syntax now, option to directly restrict
set of compiler/MPI/CUDA modules from commandline
parent 5f1bda7a
......@@ -71,17 +71,67 @@ def get_attribute_values(api_url, project, package, attribute, with_project=Fals
return list(value.text for value in attribute.findall("./value"))
def set_attribute(api_url, path, attribute):
def set_attribute(api_url, project, package, attribute):
path = ["source", project]
if package:
path.append(package)
path.append("_attribute")
attr_meta = ElementTree.tostring(attribute, encoding=osc.core.ET_ENCODING)
url = osc.core.makeurl(api_url, ["source"] + list(path) + ["_attribute"])
url = osc.core.makeurl(api_url, path)
resp = ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_POST, data=attr_meta))
if resp.find("./summary").text != "Ok":
raise osc.oscerr.APIError("Could not store attribute")
def mpcdf_enable_repositories(api_url, project, package, verbose=False):
def set_attribute_values(api_url, project, package, attribute, values):
root = ElementTree.Element("attributes")
attr = ElementTree.SubElement(root, "attribute")
namespace, name = attribute.split(":")
attr.set("namespace", namespace)
attr.set("name", name)
for value in values:
v = ElementTree.SubElement(attr, "value")
v.text = value
set_attribute(api_url, project, package, root)
def has_attribute(api_url, project, package, attribute):
path = ["source", project]
if package:
path.append(package)
path.append("_attribute")
path.append(attribute)
url = osc.core.makeurl(api_url, path)
resp = ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_GET))
namespace, name = attribute.split(":")
for a in resp.findall("./attribute"):
if a.get("namespace") == namespace and a.get("name") == name:
return True
return False
def remove_attribute(api_url, project, package, attribute_name):
path = ["source"] + [project]
if package:
path.append(package)
path.append("_attribute")
path.append(attribute_name)
url = osc.core.makeurl(api_url, path)
resp = ElementTree.fromstringlist(osc.core.streamfile(url, osc.core.http_DELETE))
if resp.find("./summary").text != "Ok":
raise osc.oscerr.APIError("Could not remove attribute")
def mpcdf_enable_repositories(api_url, project, package, verbose=False):
root = ElementTree.fromstringlist(osc.core.show_package_meta(api_url, project, package))
build = root.find("./build")
if build is None:
......@@ -151,7 +201,7 @@ def mpcdf_setup_repositories(api_url, project, distribution=None, parent=None, p
if parent:
for attribute in ["MPCDF:compiler_modules", "MPCDF:mpi_modules", "MPCDF:cuda_modules"]:
print("Copying attribute '{0}' from parent project".format(attribute))
set_attribute(api_url, (project,), get_attribute(api_url, parent, None, attribute))
set_attribute(api_url, project, None, get_attribute(api_url, parent, None, attribute))
compilers = list(get_attribute_values(api_url, project, None, "MPCDF:compiler_modules"))
mpis = list(get_attribute_values(api_url, project, None, "MPCDF:mpi_modules"))
......
#!/usr/bin/python2
from __future__ import print_function
from xml.etree import ElementTree
import mpcdf_common
......@@ -11,20 +10,18 @@ import osc.core
import osc.cmdln
@osc.cmdln.option('--cuda-mpi', action="store_true",
help="Flag to enable for all CUDA+MPI repositories")
@osc.cmdln.option('--cuda', action="store_true",
help="Flag to enable for all CUDA repositories")
@osc.cmdln.option('--mpi', action="store_true",
help="Flag to enable for all MPI module repositories")
@osc.cmdln.option('--compilers', action="store_true",
help="Flag to enable for all compiler module repositories")
@osc.cmdln.option('--system', action="store_true",
help="Flag to enable for System repository")
@osc.cmdln.option('--reset', action="store_true",
help="Re-create the set of enabled repositories from the MPCDF:enable_repositores attribute")
@osc.cmdln.option('--set', action="store_true",
help="Modify the set of enabled repositories, without this the current setup is displayed")
@osc.cmdln.option('--recreate', action="store_true",
help="Re-create the set of enabled repositories from the stored attributes on the server")
@osc.cmdln.option('--compiler-modules', nargs=1,
help="Restrict the set of compilers to use")
@osc.cmdln.option('--mpi-modules', nargs=1,
help="Restrict the set of MPI implementations to use")
@osc.cmdln.option('--cuda-modules', nargs=1,
help="Restrict the set of CUDA implementations to use")
@osc.cmdln.option('--set', nargs=1, metavar="FLAGS",
help="Modify the set of enabled repositories, without this the current setup is displayed. "
"FLAGS is a comma-separated list of a subset of 'system', 'compilers', 'mpi', 'cuda_mpi'")
@osc.cmdln.alias("mpcdf_enable_repos")
def do_mpcdf_enable_repositories(self, subcmd, opts, *args):
"""${cmd_name}: Select all appropriate repositories for an MPCDF package
......@@ -43,9 +40,9 @@ def do_mpcdf_enable_repositories(self, subcmd, opts, *args):
troublesome compiler)
Usage:
osc ${cmd_name} [[PROJECT] PACKAGE]
osc ${cmd_name} --set [ flags ] [[PROJECT] PACKAGE]
osc ${cmd_name} --reset [[PROJECT] PACKAGE]
osc ${cmd_name} [[PROJECT] PACKAGE]
osc ${cmd_name} --set FLAGS [options] [[PROJECT] PACKAGE]
osc ${cmd_name} --recreate [[PROJECT] PACKAGE]
${cmd_option_list}
"""
......@@ -69,37 +66,23 @@ def do_mpcdf_enable_repositories(self, subcmd, opts, *args):
api_url = self.get_api_url()
if opts.set:
root = ElementTree.fromstringlist(osc.core.show_attribute_meta(api_url, project, package, None, "MPCDF:enable_repositories", False, False))
attribute = root.find("./attribute")
if attribute is None:
attribute = ElementTree.SubElement(root, "attribute")
attribute.set("namespace", "MPCDF")
attribute.set("name", "enable_repositories")
for value in attribute.findall("./value"):
attribute.remove(value)
def value(content):
v = ElementTree.SubElement(attribute, "value")
v.text = content
if opts.system:
value("system")
if opts.compilers:
value("compilers")
if opts.mpi:
value("mpi")
if opts.cuda:
value("cuda")
if opts.cuda_mpi:
value("cuda_mpi")
mpcdf_common.set_attribute(api_url, (project, package), root)
if opts.reset or opts.set:
mpcdf_common.set_attribute_values(api_url, project, package, "MPCDF:enable_repositories", opts.set.split(","))
def set_or_remove(flag, attribute_name):
if flag:
print("Setting attribute", attribute_name, "to", flag)
mpcdf_common.set_attribute_values(api_url, project, package, attribute_name, flag.split(","))
elif mpcdf_common.has_attribute(api_url, project, package, attribute_name):
print("Removing attribute", attribute_name, "from package")
mpcdf_common.remove_attribute(api_url, project, package, attribute_name)
set_or_remove(opts.mpi_modules, "MPCDF:mpi_modules")
set_or_remove(opts.cuda_modules, "MPCDF:cuda_modules")
set_or_remove(opts.compiler_modules, "MPCDF:compiler_modules")
if opts.recreate or opts.set:
mpcdf_common.mpcdf_enable_repositories(api_url, project, package, verbose=True)
elif (opts.compilers or opts.mpi or opts.cuda or opts.cuda_mpi):
elif (opts.compiler_modules or opts.mpi_modules or opts.cuda_modules):
print("ERROR: Invalid arguments, try --help")
else:
try:
......@@ -108,4 +91,14 @@ def do_mpcdf_enable_repositories(self, subcmd, opts, *args):
repos = ()
print("ERRROR: No attribute MPCDF:enable_repositories present, package unmanaged")
if repos:
def print_attr(description, attribute_name):
try:
values = mpcdf_common.get_attribute_values(api_url, project, package, attribute_name)
except Exception:
return
print(description, ", ".join(values))
print("Enabled for:", *repos)
print_attr("Compilers modules acive:", "MPCDF:compiler_modules")
print_attr("MPI modules active:", "MPCDF:mpi_modules")
print_attr("CUDA modules active:", "MPCDF:cuda_modules")
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment