Commit graph

1204 commits

Author SHA1 Message Date
Christian Kellner
1d5d1fd44a sources/ostree: support format version 2
In format version 2, the source specific keys for the sources,
here "urls", is replaced by a generic `items` key, common to
all sources. Express that in the schema.
2021-02-12 15:55:43 +01:00
Christian Kellner
a065df5654 test/fmt_v2: add simple v2 format test
Check that module info and basic loading is working for format
version 2.
2021-02-12 15:55:43 +01:00
Christian Kellner
27a65caed3 stages/ostree.commit: port from assembler
Port the `org.osbuild.ostree.commit` assembler to a new assembler
like stage. The notable differences are: the fs tree preparation
now happens in the `ostree.preptree` stage and there is no option
to create a tarball, since that should be handled by a tar stage.
2021-02-12 15:55:43 +01:00
Christian Kellner
3aa88fe06c stages/ostree.preptree: prepare the tree
This new stage is a combination of the existing `rpm-ostree` stage
and the old `ostree.commit` assembler. It first does prepare a new
OSTree compliant root fs (previously done in `ostree.commit`) and
then uses `rpm-ostree tree postprocess` to perform various post-
processing on the tree to make it fully OSTree compliant.
2021-02-12 15:55:43 +01:00
Christian Kellner
e383359681 stages/ostree.pull: new stage to pull commits
New stage to pull one, or more, commits provided by the `commits`
input into the repository specified via `repo`.
2021-02-12 15:55:43 +01:00
Christian Kellner
f8b4541077 stages/ostree.init: new stage to init a repo
Add a new stage that does `ostree init`. The mode and path can be
specified via options.
2021-02-12 15:55:43 +01:00
Christian Kellner
7caa263659 inputs/ostree: support pipeline inputs
In addition to pulling ostree commits via sources, the input
now supports pulling commits that were built via an osbuild
pipeline.
2021-02-12 15:55:43 +01:00
Christian Kellner
34186daa4e monitor/log: print pipeline information
At the start of a pipeline, print its name and id so that it is
easier to follow along.
2021-02-12 15:55:43 +01:00
Christian Kellner
b6e42d8b25 test/data: add container example (format v2)
Add an example that builds a small container, based on the minimal
container fedora kickstart (see [1, 2]). There is a deviation
because osbuild currently does not support removing
random files like it is done in [2].
The build pipeline "build" in f32-build-v2.json) is a port of the
existing build pipeline in f32-build.json.

This manifest is currently not used in any automated tests (yet),
but is there as a showcase for the new format. It does however
test the format version 2 support for mpp, since that is called
in CI.

[1] https://pagure.io/fedora-kickstarts/blob/main/f/fedora-container-common.ks
[2] https://pagure.io/fedora-kickstarts/blob/main/f/fedora-container-base-minimal.ks
2021-02-12 15:55:43 +01:00
Christian Kellner
e8e910f302 stages/oci-archive: port from assembler
This is the first assembler-like stage. It is a port of the
existing oci-archive assembler and explicitly only supports
format version 2.
2021-02-12 15:55:43 +01:00
Christian Kellner
f11817a1fa assembler/oci-archive: fix layer media type
When media type (mime type) of the layer was missing the "+"
separator between the compression and then base type.
2021-02-12 15:55:43 +01:00
Christian Kellner
a4127cce66 mpp/depsolve: support for format version 2
Support for dep-solving in format version 2. Instead of adding
the checksums to a key in the options, it will be added to the
references inside an input. The urls for the items are added
in the sources dict via the new format, i.e. in the `items`
dict instead of the `urls` dict.
2021-02-12 15:55:43 +01:00
Christian Kellner
7d72b2250c mpp/depsolve: prepare for multi format support
Rename the parsing and process functions to have a format version
specific suffix. This should make it easy to add support for the
format version 2. Logic should be unchanged.
2021-02-12 15:55:43 +01:00
Christian Kellner
49e1800503 mpp/import: support for format version 2
Add support for foramt version 2. This is slightly easier than
version 1, since there is no recursion. In addition to the
path of the manifest to import the pipeline from, the pipeline
identifier needs to be specified.
Source merging is also different since in format version two,
there is a generic "items" key, which means we can merge
other sources than "org.osbuild.files".
2021-02-12 15:55:43 +01:00
Christian Kellner
a38a3fa502 mpp/import: prepare for multi format support
Rename the parsing and process functions to have a format version
specific suffix. This should make it easy to add support for the
format version 2.
2021-02-12 15:55:43 +01:00
Christian Kellner
227d1aa536 main_cli: add --export command line argument
This new command line argument can be used to explicitly request
the exporting of built artifcats. They will be store in the
output directory in a subdirectory with the name or id that was
requested.
2021-02-12 15:55:43 +01:00
Christian Kellner
c9462bf48c inputs: add "type" property to schema
This was missed when `type` was added to the Inputs class.
2021-02-12 15:55:43 +01:00
Christian Kellner
429f833434 sources/files: add format version 2 support
In format version 2, the source specific keys for the sources,
here "urls", is replaced by a generic `items` key, common to
all sources. Express that in the schema.
2021-02-12 15:55:43 +01:00
Christian Kellner
ae33d37698 stages/rpm: add format version 2 support
Explicitly declare the schema for version 2. Notable differences
are the declaration of the `packages` input as well is the lack
of that property in `options`.
2021-02-12 15:55:43 +01:00
Christian Kellner
b05b9ba508 formats/v2: support for schema version 2
Add support for format version 2. The laoding fits to the manifest
description schema in `schema/osbuild2.json`. Loading, describing
and validation are fully functional. The `output` method resturns
results in a new format too but is very much work in progress and
quite a hack right now. The output format will definitely change
again.
2021-02-12 15:55:43 +01:00
Christian Kellner
2771656f02 schema: add version 2 manifest schema
This is the first draft of the new manifest version.
2021-02-12 15:55:43 +01:00
Christian Kellner
24f6ed471d test/osbuild: check version 1 and 2 schemata
Iterate through all modules and check they have valid schema
information for format version 1 and 2.
2021-02-12 15:55:43 +01:00
Christian Kellner
19e858baed meta: Index now support different schema versions
Add a `version` keyword argument to `Index.get_schema` which
will in turn look for `osbuild<version>.json` in case of the
schema for the manifest is requested and otherwise forward
the version argument to the `get_schema` method for the
respective `ModuleInfo`.
2021-02-12 15:55:43 +01:00
Christian Kellner
63eb7303e9 meta: support format version 2 for module infos
When loading the schema information via the source code of a
module, look for a `SCHEMA_2` global variable, representing
the schema version 2. Extend the `get_schema` method so in
takes a `version` keyword argument. Rework the code so that
if version 2 for the format is specified but no dedicated
schema data is found, a fallback based on the version 1 is
provided. This makes it easy to use all existing stages
without explicitly duplicating all schema information.

NB: The code is not very pretty, the hope is that in the
future, the module, being an executable, could be called
with a command line switch, a la `--schema <version>` and
this would return the schema data. So that hackery code
we currently have will hopefully vanish soon. I am sorry
though for this mess.
2021-02-12 15:55:43 +01:00
Christian Kellner
23df7a4c02 meta: prepare module info for multiple schemata
Prepare the current logic so that when parsing the schema and
passing it on, it is done in a version specific manner.
2021-02-12 15:55:43 +01:00
Christian Kellner
5008b7703f meta: ModuleInfo.{schema -> get_schema()}
Change the `ModuleInfo.schema` propertly into a `get_schema`
method call. This is in preparation to allow for different
schemata versions to be supported.
2021-02-12 15:55:43 +01:00
Christian Kellner
3f18b9d682 meta: fix type for ModuleInfo's info ctor param
It is a in fact a dict, not a string.
2021-02-12 15:55:43 +01:00
Christian Kellner
94dc11a910 meta: require name to match module in schema
When generating the schema information for a Stage, Assemgbler,
ensure that `name` is actually the one that matches the module.
2021-02-12 15:55:43 +01:00
Christian Kellner
48418be8de buildroot: rename path argument to rundir
This matches the internal, "private", property and better
describes what the variable is for. Additionally, make it
into a proper keyword argument.
2021-02-11 23:49:18 +01:00
Christian Kellner
749f59cc9a buildroot: make var a positional argument
Commit d028ea5b16 introduced bug when introducing the `store`
argument to `Stage.run`, instead of passing `var=var`, i.e.
`var` is being passed as keyword argument, it is now being
passed as a positional one. Since the `path=/run/osbuild`
keyword argument comes before the `var=/var/tmp` argument,
`var` is now being passed as `path` instead of var.
Since `var` is always being passed in throughout the entire
codebase, make it a positional argument, and move it before
`path`.
Adapt the tests to pass `var` as positional argument.
2021-02-11 23:49:18 +01:00
Christian Kellner
dd50387bbc inputs/tree: remove trailing whitespace
This one is for David. And pylint, but mostly David.
2021-02-11 23:49:18 +01:00
Christian Kellner
68f5c38e61 main: print all pipeline names and ids
Instead of printing the tree_id and output_id, which are format
dependent, print all pipelines, with their name and ids.
2021-02-10 17:50:41 +01:00
Christian Kellner
931eac23c3 sources: introduce source items
All sources fetch various types of `items`, the specific nature
of which is dependent on the source type, but they are all
identifyable by a opaque identifier. In order for osbuild to
check that all the inputs that a stage needs are are indeed
contained in the manifest description, osbuild must learn what
ids are fetched by what source. This is done by standarzing
the common "items" part, i.e. the "id" -> "options for that id"
mapping that is common to all sources.
For the version 1 of the format, extract the files and ostree
the item information from the respective options.
Adapt the sources (files, ostree) so that they use the new items
information, but also fall back to the old style; the latter is
needed since the sources tests still uses the SourceServer.
2021-02-10 15:44:24 +01:00
Christian Kellner
3b7141417c formats/v1: extract source loading code
Extract the code that loads individual source into its own
function.
2021-02-10 15:44:24 +01:00
Christian Kellner
598cfd0d76 test/fmt_v1: add format info checks
Add basic checks to make sure the format version 1 is detected
for manifest of version 1.
2021-02-09 13:08:24 +01:00
Christian Kellner
6d674a0970 main_cli: detect format
Now that meta.Index provides a way to detect the format given the
input data, use that method instead of the hard-coded use of the
version 1 format via the input. This should make the main entry
point format independent.
2021-02-09 13:08:24 +01:00
Christian Kellner
8f97c13dda formats/v1: specify format version
Specify the version, i.e. "1", that this format is able to read
and write. Additionally add a proper doc string describing the
format.
2021-02-09 13:08:24 +01:00
Christian Kellner
7e2c0c7000 meta: introduce format information
Introdcue a `FormatInfo` class that, very much like `ModuleInfo`
can be used to obtain meta information about a format. Methods
are added to `Index` to allow the enumeration of available formats,
getting the `FormatInfo` for a format given its name and to detect
a format via the manifest description data.

Change the top-level documentation to reflect the changes. Also
remove an outdated section about validation of the schema; this
was moved to the format specific code some time ago.
2021-02-09 13:08:24 +01:00
Christian Kellner
7ffae5669c osbuild: convert ostree stage to inputs
Convert the `org.osbuild.ostree` stage to use inputs instead of
sources. In the format (version 1) loading code, convert the
stage to use an input based on the existing stage options.
2021-02-06 12:04:30 +01:00
Christian Kellner
17c6446a7c inputs: add org.osbuild.ostree input
Add a new input that can handle ostree commits. For source origins,
it will pull any number of commits specified via `references`. For
pipeline origins it will use the compose.json to obtain the commit
id and pull that. Either way the data passed onto the stage is a
dictionary of commit ids and commit metadata, such as the `ref`
that is an ostree ref that is optionally created in case the `ref`
option for that reference was specified.
2021-02-06 12:04:30 +01:00
Christian Kellner
0256396270 osbuild: convert rpm stage to use inputs
Convert the `org.osbuild.rpm` stage to use inputs instead of
sources. When loading v1 formats the input is generated from
the stage options.
2021-02-06 12:04:30 +01:00
Christian Kellner
1f89d2fd9d inputs: add files input
Create a new input for resources of the `org.osbuild.files` type,
i.e. individual files, addressed in the store via their content
hash.
2021-02-06 12:04:30 +01:00
Christian Kellner
57ccf403e1 formats/v1: use new Stage.add_input
Instead of manually constructing and appending the input for
stages (here the stages that replace the assembler), use the
new `Stage.add_input` method.
2021-02-06 12:04:30 +01:00
Christian Kellner
9e8b254687 stage: introduce add_input method
In much the same way has `Pipeline` has `add_stage` and `Manifest`
has `add_pipeline`, introduce an `add_input` method to `Stage` to
be able add `Inputs` to stages.
2021-02-06 12:04:30 +01:00
Christian Kellner
ad8baab819 inputs: remove type info for info param
The `info` parameter for Input constructor is of type `PModuleInfo`,
which is located in `meta`. This in turn imports jsonschema. Ergo,
importing importing `inputs` will create a dependency on jsonschema.
At the same time the `osbuild` package globally imports `Pipeline`,
via `__init__.py`, and `osbuild.api` is used in the runners and
stages, which are run inside the buildroot. If one now wanted to
use `inputs` from `Pipeline`, it would lead to jsonschema being
imported (via `meta`) which might not be available on the build-
root and it is a rather random dependency to have.
On obvious solution would be to use a construct with `TYPE_CHECKING`,
a la:
  if TYPE_CHECKING:
    from .meta import ModuleInfo
Sadly, pylint will now complain about it. This could be fixed with:
  if TYPE_CHECKING:
    from .meta import ModuleInfo
  else:
    ModuleInfo = "osbuild.meta.ModuleInfo"
But this is just gross. So we will have to accept that Python is,
well, Python und omit the type information for the `info` param.
2021-02-06 12:04:30 +01:00
Christian Kellner
ba7f6fe7c7 formats/v1: extract stage parsing into function
Extract the code that creates a stage given its description into
its own function.
2021-02-06 12:04:30 +01:00
Christian Kellner
aa9fee7b51 objectstore: add source method to api
Add a new jsoncomm rpc method call, `source`, that will return
the directory within the store where resources for that specific
type of resource, like e.g. tree, files, or ostree can be found
or stored.
2021-02-06 12:04:30 +01:00
Christian Kellner
eb1d17d8ac input: add references and origin
Currently all options for inputs are totally opaque to osbuild
itself. This is neat from a seperation of concerns point of view
but has one major downside: osbuild can not verify the integrity
of the pipeline graph, i.e. if all inputs that need pipelines or
sources do indeed exists. Therefore intrdouce two generic fields
for inputs: `origin` and `references`. The former can either be
a source or a pipeline. The latter is an array of identifiers or
a dictionary where the keys are the identifiers and the values
are additional options for that id. The identifiers then refer
to either resources obtained via a source or a pipeline that has
already been built.
2021-02-06 12:04:30 +01:00
Christian Kellner
f450338809 test/fmt_v1: schema validate the basic manifest
Incldue the basic test manifest in the schema validation test.
2021-02-06 12:04:30 +01:00
Christian Kellner
d3e85fe6a4 test/fmt_v1: use noop stages in test manifest
Instead of using `org.osbuild.test` stages, so `org.osbuild.noop`
stages so that the options we pass are actually valid and we can
use the manifest in schema validation checking.
2021-02-06 12:04:30 +01:00