debian-forge/inputs/org.osbuild.files
Christian Kellner 1ed85dc790 inputs: convert to host service
Create a `InputService` class with an abstract method called `map`,
meant to be implemented by all inputs. An `unmap` method may be
optionally overridden by inputs to cleanup resources.
Instantiate a `host.ServiceManager` in the `Stage.run` section and
pass the to the host side input code so it can be used to spawn the
input services.
Convert all existing inputs to the new service framework.
2021-06-09 18:37:47 +01:00

108 lines
2.4 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 sys
import subprocess
from osbuild import inputs
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"}
]
}
}
"""
class FilesInput(inputs.InputService):
def map(self, store, _origin, refs, target, _options):
source = store.source("org.osbuild.files")
for checksum in refs:
subprocess.run(
[
"ln",
f"{source}/{checksum}",
f"{target}/{checksum}",
],
check=True,
)
reply = {
"path": target,
"data": {
"refs": refs
}
}
return reply
def main():
service = FilesInput.from_args(sys.argv[1:])
service.main()
if __name__ == '__main__':
main()