debian-forge/inputs/org.osbuild.files
Christian Kellner 08bc9ab7d8 inputs: pre-defined input paths
Instead of bind-mounting each individual input into the container,
create a temporary directory that is used by all inputs and bind-
mount this to the well known location ("/run/osbuild/inputs"). The
temporary directory is then passed to the input so that it can
make the requested resources available relative to that directory.
This is enforced by the common input handling code.
Additionally, pass the well known input path via a new "paths" key
to the arguments dictionary passed to the stage.
2021-06-09 18:37:47 +01:00

115 lines
2.5 KiB
Python
Executable file

#!/usr/bin/python3
"""
Inputs for individual files
Provides all the files, named via their content hash, specified
via `references` in a new directory.
The returned data in `refs` is a dictionary where the keys are
the content hash of a file and the values dictionaries with
metadata for it. The input itself currently does not set any
metadata itself, but will forward any metadata set via the
`metadata` property. Keys in that must start with a prefix,
like `rpm.` to avoid namespace clashes. This is enforced via
schema validation.
"""
import json
import sys
import subprocess
from osbuild.objectstore import StoreClient
SCHEMA = r"""
"additionalProperties": false,
"definitions": {
"metadata": {
"description": "Additional metadata to forward to the stage",
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^\\w+[.]{1}\\w+$": {
"additionalProperties": false
}
}
},
"plain-ref": {
"type": "array",
"items": {
"type": "string"
}
},
"object-ref": {
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"patternProperties": {
".*": {
"type": "object",
"additionalProperties": false,
"properties": {
"metadata": {"$ref": "#/definitions/metadata"}
}
}
}
}
},
"required": ["type", "origin", "references"],
"properties": {
"type": {
"enum": ["org.osbuild.files"]
},
"origin": {
"description": "The origin of the input (must be 'org.osbuild.source')",
"type": "string",
"enum": ["org.osbuild.source"]
},
"references": {
"description": "Checksums of files to use as files input",
"oneOf": [
{"$ref": "#/definitions/plain-ref"},
{"$ref": "#/definitions/object-ref"}
]
}
}
"""
def main():
args = json.load(sys.stdin)
refs = args["refs"]
target = args["target"]
store = StoreClient(connect_to=args["api"]["store"])
source = store.source("org.osbuild.files")
for checksum in refs:
try:
subprocess.run(
[
"ln",
f"{source}/{checksum}",
f"{target}/{checksum}",
],
check=True,
)
except subprocess.CalledProcessError as e:
json.dump({"error": e.output}, sys.stdout)
return 1
reply = {
"path": target,
"data": {
"refs": refs
}
}
json.dump(reply, sys.stdout)
return 0
if __name__ == '__main__':
r = main()
sys.exit(r)