diff --git a/cloudbaseinit/conf/factory.py b/cloudbaseinit/conf/factory.py index 665ce73d..7cdd1fdc 100644 --- a/cloudbaseinit/conf/factory.py +++ b/cloudbaseinit/conf/factory.py @@ -26,6 +26,7 @@ _OPT_PATHS = ( 'cloudbaseinit.conf.packet.PacketOptions', 'cloudbaseinit.conf.vmwareguestinfo.VMwareGuestInfoConfigOptions', 'cloudbaseinit.conf.gce.GCEOptions', + 'cloudbaseinit.conf.nocloud.NoCloudOptions', ) diff --git a/cloudbaseinit/conf/nocloud.py b/cloudbaseinit/conf/nocloud.py new file mode 100644 index 00000000..8b0d2302 --- /dev/null +++ b/cloudbaseinit/conf/nocloud.py @@ -0,0 +1,47 @@ +# Copyright 2024 Cloudbase Solutions Srl +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Config options available for the OpenStack metadata service.""" + +from oslo_config import cfg + +from cloudbaseinit.conf import base as conf_base + + +class NoCloudOptions(conf_base.Options): + + """Config options available for the OpenStack metadata service.""" + + def __init__(self, config): + super(NoCloudOptions, self).__init__(config, group="nocloud") + self._options = [ + cfg.StrOpt( + "metadata_file", default="meta-data", + help="The file name where the service looks for" + "metadata"), + cfg.StrOpt( + "userdata_file", default="user-data", + help="The file name where the service looks for" + "userdata"), + ] + + def register(self): + """Register the current options to the global ConfigOpts object.""" + group = cfg.OptGroup(self.group_name, title='NoCloud Options') + self._config.register_group(group) + self._config.register_opts(self._options, group=group) + + def list(self): + """Return a list which contains all the available options.""" + return self._options diff --git a/cloudbaseinit/metadata/services/baseconfigdrive.py b/cloudbaseinit/metadata/services/baseconfigdrive.py index 33aa6f98..0f8a6eb4 100644 --- a/cloudbaseinit/metadata/services/baseconfigdrive.py +++ b/cloudbaseinit/metadata/services/baseconfigdrive.py @@ -32,10 +32,12 @@ CD_LOCATIONS = constant.CD_LOCATIONS class BaseConfigDriveService(base.BaseMetadataService): - def __init__(self, drive_label, metadata_file): + def __init__(self, drive_label, metadata_file, + userdata_file='user-data'): super(BaseConfigDriveService, self).__init__() self._drive_label = drive_label self._metadata_file = metadata_file + self._userdata_file = userdata_file self._metadata_path = None self._searched_types = set() self._searched_locations = set() diff --git a/cloudbaseinit/metadata/services/nocloudservice.py b/cloudbaseinit/metadata/services/nocloudservice.py index 591dd03c..6e21b3f7 100644 --- a/cloudbaseinit/metadata/services/nocloudservice.py +++ b/cloudbaseinit/metadata/services/nocloudservice.py @@ -276,17 +276,19 @@ class NoCloudConfigDriveService(baseconfigdrive.BaseConfigDriveService): def __init__(self): super(NoCloudConfigDriveService, self).__init__( - 'cidata', 'meta-data') + 'cidata', CONF.nocloud.metadata_file, + CONF.nocloud.userdata_file) self._meta_data = {} def get_user_data(self): - return self._get_cache_data("user-data") + return self._get_cache_data(self._userdata_file) def _get_meta_data(self): if self._meta_data: return self._meta_data - raw_meta_data = self._get_cache_data("meta-data", decode=True) + raw_meta_data = self._get_cache_data( + self._metadata_file, decode=True) try: self._meta_data = ( serialization.parse_json_yaml(raw_meta_data)) diff --git a/doc/source/services.rst b/doc/source/services.rst index a38b6438..3da6b426 100644 --- a/doc/source/services.rst +++ b/doc/source/services.rst @@ -128,13 +128,15 @@ similar to the EC2 metadata in terms of how the metadata files are named and str The metadata is provided on a config-drive (vfat or iso9660) with the label cidata or CIDATA. -The folder structure for NoCloud is: +The default folder structure for NoCloud is: * /user-data * /meta-data The user-data and meta-data files respect the EC2 metadata service format. +The names of the meta-data and user-data files can be configured. + Capabilities: * instance id @@ -153,6 +155,11 @@ Config options for `config_drive` section: * types (list: ["vfat", "iso"]) * locations (list: ["cdrom", "hdd", "partition"]) +Config options for `nocloud` section: + + * metadata_file (string: "meta-data") + * userdata_file (string: "user-data") + Example metadata: .. code-block:: yaml