forked from canonical/cloud-init
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
schema and docs: Add jsonschema to resizefs and bootcmd modules
Add schema definitions to both cc_resizefs and cc_bootcmd modules. Extend schema.py to parse and document enumerated json types. Schema definitions are used to generate module documention and log warnings for schema infractions. This branch also does the following: - drops vestigial 'resize_rootfs_tmp' option from cc_resizefs. That option only created the specified directory and didn't make use of that directory for any resize operations. - Drop yaml.dumps calls from schema documentation generation to avoid yaml import costs on module load - Add __doc__ = get_schema_doc(schema) definitions it each module to supplement python help() calls for cc_runcmd, cc_bootcmd, cc_ntp and cc_resizefs - Add a SCHEMA_EXAMPLES_SPACER_TEMPLATE string to docs for modules which contain more than one example
- Loading branch information
1 parent
a4c1d57
commit ed8f1b1
Showing
8 changed files
with
586 additions
and
168 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,45 +3,73 @@ | |
# | ||
# Author: Scott Moser <[email protected]> | ||
# Author: Juerg Haefliger <[email protected]> | ||
# Author: Chad Smith <[email protected]> | ||
# | ||
# This file is part of cloud-init. See LICENSE file for license information. | ||
|
||
""" | ||
Bootcmd | ||
------- | ||
**Summary:** run commands early in boot process | ||
This module runs arbitrary commands very early in the boot process, | ||
only slightly after a boothook would run. This is very similar to a | ||
boothook, but more user friendly. The environment variable ``INSTANCE_ID`` | ||
will be set to the current instance id for all run commands. Commands can be | ||
specified either as lists or strings. For invocation details, see ``runcmd``. | ||
.. note:: | ||
bootcmd should only be used for things that could not be done later in the | ||
boot process. | ||
**Internal name:** ``cc_bootcmd`` | ||
**Module frequency:** per always | ||
**Supported distros:** all | ||
**Config keys**:: | ||
bootcmd: | ||
- echo 192.168.1.130 us.archive.ubuntu.com > /etc/hosts | ||
- [ cloud-init-per, once, mymkfs, mkfs, /dev/vdb ] | ||
""" | ||
"""Bootcmd: run arbitrary commands early in the boot process.""" | ||
|
||
import os | ||
from textwrap import dedent | ||
|
||
from cloudinit.config.schema import ( | ||
get_schema_doc, validate_cloudconfig_schema) | ||
from cloudinit.settings import PER_ALWAYS | ||
from cloudinit import temp_utils | ||
from cloudinit import util | ||
|
||
frequency = PER_ALWAYS | ||
|
||
# The schema definition for each cloud-config module is a strict contract for | ||
# describing supported configuration parameters for each cloud-config section. | ||
# It allows cloud-config to validate and alert users to invalid or ignored | ||
# configuration options before actually attempting to deploy with said | ||
# configuration. | ||
|
||
distros = ['all'] | ||
|
||
schema = { | ||
'id': 'cc_bootcmd', | ||
'name': 'Bootcmd', | ||
'title': 'Run arbitrary commands early in the boot process', | ||
'description': dedent("""\ | ||
This module runs arbitrary commands very early in the boot process, | ||
only slightly after a boothook would run. This is very similar to a | ||
boothook, but more user friendly. The environment variable | ||
``INSTANCE_ID`` will be set to the current instance id for all run | ||
commands. Commands can be specified either as lists or strings. For | ||
invocation details, see ``runcmd``. | ||
.. note:: | ||
bootcmd should only be used for things that could not be done later | ||
in the boot process."""), | ||
'distros': distros, | ||
'examples': [dedent("""\ | ||
bootcmd: | ||
- echo 192.168.1.130 us.archive.ubuntu.com > /etc/hosts | ||
- [ cloud-init-per, once, mymkfs, mkfs, /dev/vdb ] | ||
""")], | ||
'frequency': PER_ALWAYS, | ||
'type': 'object', | ||
'properties': { | ||
'bootcmd': { | ||
'type': 'array', | ||
'items': { | ||
'oneOf': [ | ||
{'type': 'array', 'items': {'type': 'string'}}, | ||
{'type': 'string'}] | ||
}, | ||
'additionalItems': False, # Reject items of non-string non-list | ||
'additionalProperties': False, | ||
'minItems': 1, | ||
'required': [], | ||
'uniqueItems': True | ||
} | ||
} | ||
} | ||
|
||
__doc__ = get_schema_doc(schema) # Supplement python help() | ||
|
||
|
||
def handle(name, cfg, cloud, log, _args): | ||
|
||
|
@@ -50,13 +78,14 @@ def handle(name, cfg, cloud, log, _args): | |
" no 'bootcmd' key in configuration"), name) | ||
return | ||
|
||
validate_cloudconfig_schema(cfg, schema) | ||
with temp_utils.ExtendedTemporaryFile(suffix=".sh") as tmpf: | ||
try: | ||
content = util.shellify(cfg["bootcmd"]) | ||
tmpf.write(util.encode_text(content)) | ||
tmpf.flush() | ||
except Exception: | ||
util.logexc(log, "Failed to shellify bootcmd") | ||
except Exception as e: | ||
util.logexc(log, "Failed to shellify bootcmd: %s", str(e)) | ||
raise | ||
|
||
try: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.