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.
108 lines
2.4 KiB
Python
Executable file
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()
|