config: Remove dynamic configuration variant
We no longer see an urging use case for it. All field scenarios can perfectly be modeled with the static format. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
13a87cb8c7
commit
9e136e532d
@ -122,15 +122,6 @@ Use Cases
|
|||||||
Project Configuration
|
Project Configuration
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
Two types of configuration file formats are supported.
|
|
||||||
|
|
||||||
For most purposes the static configuration should be used.
|
|
||||||
In case this static configuration file does not provide enough options for
|
|
||||||
customization, the dynamic configuration file format can be used.
|
|
||||||
|
|
||||||
Static project configuration
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Currently JSON and YAML is supported as the base file format. Since YAML is
|
Currently JSON and YAML is supported as the base file format. Since YAML is
|
||||||
arguable easier to read, this documentation focuses on the YAML format.
|
arguable easier to read, this documentation focuses on the YAML format.
|
||||||
|
|
||||||
@ -189,7 +180,7 @@ append entries in files that include this configuration by naming an entry the
|
|||||||
same (overwriting) or using a unused name (appending).
|
same (overwriting) or using a unused name (appending).
|
||||||
|
|
||||||
Including in-tree configuration files
|
Including in-tree configuration files
|
||||||
.....................................
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Its currently possible to include kas configuration files from the same
|
Its currently possible to include kas configuration files from the same
|
||||||
repository/layer like this:
|
repository/layer like this:
|
||||||
@ -206,7 +197,7 @@ repository/layer like this:
|
|||||||
The specified files are addressed relative to your current configuration file.
|
The specified files are addressed relative to your current configuration file.
|
||||||
|
|
||||||
Including configuration files from other repos
|
Including configuration files from other repos
|
||||||
..............................................
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Its also possible to include configuration files from other repos like this:
|
Its also possible to include configuration files from other repos like this:
|
||||||
|
|
||||||
@ -253,8 +244,8 @@ different include files. Note that the order of the configuration file entries
|
|||||||
is not preserved within one include file, because the parser creates normal
|
is not preserved within one include file, because the parser creates normal
|
||||||
unordered dictionaries.
|
unordered dictionaries.
|
||||||
|
|
||||||
Static configuration reference
|
Configuration reference
|
||||||
..............................
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
* ``header``: dict [required]
|
* ``header``: dict [required]
|
||||||
The header of every kas configuration file. It contains information about
|
The header of every kas configuration file. It contains information about
|
||||||
@ -370,73 +361,3 @@ Static configuration reference
|
|||||||
* ``http_proxy``: string [optional]
|
* ``http_proxy``: string [optional]
|
||||||
* ``https_proxy``: string [optional]
|
* ``https_proxy``: string [optional]
|
||||||
* ``no_proxy``: string [optional]
|
* ``no_proxy``: string [optional]
|
||||||
|
|
||||||
Dynamic project configuration
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
**NOTE: Dynamic project configuration is experimental. The API may change or
|
|
||||||
even be obsoleted in future versions. Please provide feedback if you consider
|
|
||||||
it useful.**
|
|
||||||
|
|
||||||
The dynamic project configuration is plain Python with following
|
|
||||||
mandatory functions which need to be provided:
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def get_machine(config):
|
|
||||||
return 'qemu'
|
|
||||||
|
|
||||||
|
|
||||||
def get_distro(config):
|
|
||||||
return 'poky'
|
|
||||||
|
|
||||||
|
|
||||||
def get_repos(target):
|
|
||||||
repos = []
|
|
||||||
|
|
||||||
repos.append(Repo(
|
|
||||||
url='URL',
|
|
||||||
refspec='REFSPEC'))
|
|
||||||
|
|
||||||
repos.append(Repo(
|
|
||||||
url='https://git.yoctoproject.org/git/poky',
|
|
||||||
refspec='krogoth',
|
|
||||||
layers=['meta', 'meta-poky', 'meta-yocto-bsp'])))
|
|
||||||
|
|
||||||
return repos
|
|
||||||
|
|
||||||
Additionally, ``get_bblayers_conf_header()``, ``get_local_conf_header()`` can
|
|
||||||
be added.
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def get_bblayers_conf_header():
|
|
||||||
return """POKY_BBLAYERS_CONF_VERSION = "2"
|
|
||||||
BBPATH = "${TOPDIR}"
|
|
||||||
BBFILES ?= ""
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
def get_local_conf_header():
|
|
||||||
return """PATCHRESOLVE = "noop"
|
|
||||||
CONF_VERSION = "1"
|
|
||||||
IMAGE_FSTYPES = "tar"
|
|
||||||
"""
|
|
||||||
|
|
||||||
Furthermore, you can add pre and post hooks (``*_prepend``, ``*_append``) for
|
|
||||||
the exection steps in kas core, e.g.
|
|
||||||
|
|
||||||
.. code-block:: python
|
|
||||||
|
|
||||||
def build_prepend(config):
|
|
||||||
# disable distro check
|
|
||||||
with open(config.build_dir + '/conf/sanity.conf', 'w') as f:
|
|
||||||
f.write('\n')
|
|
||||||
|
|
||||||
|
|
||||||
def build_append(config):
|
|
||||||
if 'CI' in os.environ:
|
|
||||||
build_native_package(config)
|
|
||||||
run_wic(config)
|
|
||||||
|
|
||||||
TODO: Document the complete configuration API.
|
|
||||||
|
138
kas/config.py
138
kas/config.py
@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
import errno
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from distro import id as get_distro_id
|
from distro import id as get_distro_id
|
||||||
@ -198,135 +197,6 @@ class Config:
|
|||||||
return self._config.get('gitlabci_config', '')
|
return self._config.get('gitlabci_config', '')
|
||||||
|
|
||||||
|
|
||||||
class ConfigPython(Config):
|
|
||||||
"""
|
|
||||||
Implementation of a configuration that uses a Python script.
|
|
||||||
"""
|
|
||||||
def __init__(self, filename, target, task):
|
|
||||||
# pylint: disable=exec-used
|
|
||||||
|
|
||||||
super().__init__()
|
|
||||||
self.filename = os.path.abspath(filename)
|
|
||||||
try:
|
|
||||||
with open(self.filename) as fds:
|
|
||||||
env = {}
|
|
||||||
data = fds.read()
|
|
||||||
exec(data, env)
|
|
||||||
self._config = env
|
|
||||||
except IOError:
|
|
||||||
raise IOError(errno.ENOENT, os.strerror(errno.ENOENT),
|
|
||||||
self.filename)
|
|
||||||
|
|
||||||
self.create_config(target, task)
|
|
||||||
self.setup_environ()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
output = 'target: {}\n'.format(self.target)
|
|
||||||
output = 'task: {}\n'.format(self.task)
|
|
||||||
output += 'repos:\n'
|
|
||||||
for repo in self.get_repos():
|
|
||||||
output += ' {}\n'.format(repo.__str__())
|
|
||||||
output += 'environ:\n'
|
|
||||||
for key, value in self.environ.items():
|
|
||||||
output += ' {} = {}\n'.format(key, value)
|
|
||||||
output += 'proxy:\n'
|
|
||||||
for key, value in self.get_proxy_config().items():
|
|
||||||
output += ' {} = {}\n'.format(key, value)
|
|
||||||
return output
|
|
||||||
|
|
||||||
def pre_hook(self, fname):
|
|
||||||
try:
|
|
||||||
self._config[fname + '_prepend'](self)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def post_hook(self, fname):
|
|
||||||
try:
|
|
||||||
self._config[fname + '_append'](self)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def get_hook(self, fname):
|
|
||||||
try:
|
|
||||||
return self._config[fname]
|
|
||||||
except KeyError:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def create_config(self, target, task):
|
|
||||||
"""
|
|
||||||
Sets the configuration for `target`
|
|
||||||
"""
|
|
||||||
self.target = 'core-image-minimal' if target is None else target
|
|
||||||
self.task = 'build' if task is None else task
|
|
||||||
self.repos = self._config['get_repos'](self, target)
|
|
||||||
|
|
||||||
def get_proxy_config(self):
|
|
||||||
return self._config['get_proxy_config']()
|
|
||||||
|
|
||||||
def get_repos(self):
|
|
||||||
return iter(self.repos)
|
|
||||||
|
|
||||||
def get_target(self):
|
|
||||||
"""
|
|
||||||
Returns the target
|
|
||||||
"""
|
|
||||||
return self.target
|
|
||||||
|
|
||||||
def get_bitbake_target(self):
|
|
||||||
"""
|
|
||||||
Return the bitbake target
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_bitbake_target'](self)
|
|
||||||
except KeyError:
|
|
||||||
return self.target
|
|
||||||
|
|
||||||
def get_bblayers_conf_header(self):
|
|
||||||
"""
|
|
||||||
Returns the bblayers.conf header
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_bblayers_conf_header']()
|
|
||||||
except KeyError:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def get_local_conf_header(self):
|
|
||||||
"""
|
|
||||||
Returns the local.conf header
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_local_conf_header']()
|
|
||||||
except KeyError:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def get_machine(self):
|
|
||||||
"""
|
|
||||||
Returns the machine
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_machine'](self)
|
|
||||||
except KeyError:
|
|
||||||
return 'qemu'
|
|
||||||
|
|
||||||
def get_distro(self):
|
|
||||||
"""
|
|
||||||
Returns the distro
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_distro'](self)
|
|
||||||
except KeyError:
|
|
||||||
return 'poky'
|
|
||||||
|
|
||||||
def get_gitlabci_config(self):
|
|
||||||
"""
|
|
||||||
Returns the GitlabCI configuration
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
return self._config['get_gitlabci_config'](self)
|
|
||||||
except KeyError:
|
|
||||||
return ''
|
|
||||||
|
|
||||||
|
|
||||||
class ConfigStatic(Config):
|
class ConfigStatic(Config):
|
||||||
"""
|
"""
|
||||||
Implements the static kas configuration based on config files.
|
Implements the static kas configuration based on config files.
|
||||||
@ -437,10 +307,4 @@ def load_config(filename, target, task):
|
|||||||
Return configuration generated from `filename`.
|
Return configuration generated from `filename`.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
(_, ext) = os.path.splitext(filename)
|
return ConfigStatic(filename, target, task)
|
||||||
if ext == '.py':
|
|
||||||
cfg = ConfigPython(filename, target, task)
|
|
||||||
else:
|
|
||||||
cfg = ConfigStatic(filename, target, task)
|
|
||||||
|
|
||||||
return cfg
|
|
||||||
|
Loading…
Reference in New Issue
Block a user