I create custom LXD images from Ubuntu minimal images for an OpenStack environment based on LXD containers and the images I created worked on Ubuntu 18.04 hosts until around the cloud-init v18.5 release where subplatform was introduced. My images produced this error:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 760, in find_source
if s.update_metadata([EventType.BOOT_NEW_INSTANCE]):
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 649, in update_metadata
result = self.get_data()
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 276, in get_data
self.persist_instance_data()
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 306, in persist_instance_data
self._get_standardized_metadata())
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 246, in _get_standardized_metadata
'subplatform': self.subplatform}}
File "/usr/lib/python3/dist-packages/cloudinit/sources/__init__.py", line 419, in subplatform
self._subplatform = self._get_subplatform()
File "/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceConfigDrive.py", line 170, in _get_subplatform
return '%s (%s)' % (subplatform_type, self.source)
This code uses and if/elif which leaves subplatform_type undefined on my image. I don't have any idea what this is supposed to be, but looking at other DataSources, they use an if/else so that subplatform_type is alway defined. This diff makes the code work for my image:
diff --git a/cloudinit/sources/DataSourceConfigDrive.py b/cloudinit/sources/DataSourceConfigDrive.py
index c3627152..f77923c2 100644
--- a/cloudinit/sources/DataSourceConfigDrive.py
+++ b/cloudinit/sources/DataSourceConfigDrive.py
@@ -163,10 +163,10 @@ class DataSourceConfigDrive(openstack.SourceMixin, sources.DataSource):
def _get_subplatform(self):
"""Return the subplatform metadata source details."""
- if self.seed_dir in self.source:
- subplatform_type = 'seed-dir'
- elif self.source.startswith('/dev'):
+ if self.source.startswith('/dev'): subplatform_type = 'config-disk'
+ else:
+ subplatform_type = 'seed-dir'
return '%s (%s)' % (subplatform_type, self.source)
I create custom LXD images from Ubuntu minimal images for an OpenStack environment based on LXD containers and the images I created worked on Ubuntu 18.04 hosts until around the cloud-init v18.5 release where subplatform was introduced. My images produced this error: python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 760, in find_source metadata( [EventType. BOOT_NEW_ INSTANCE] ): python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 649, in update_metadata python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 276, in get_data persist_ instance_ data() python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 306, in persist_ instance_ data _get_standardiz ed_metadata( )) python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 246, in _get_standardiz ed_metadata python3/ dist-packages/ cloudinit/ sources/ __init_ _.py", line 419, in subplatform _subplatform = self._get_ subplatform( ) python3/ dist-packages/ cloudinit/ sources/ DataSourceConfi gDrive. py", line 170, in _get_subplatform
Traceback (most recent call last):
File "/usr/lib/
if s.update_
File "/usr/lib/
result = self.get_data()
File "/usr/lib/
self.
File "/usr/lib/
self.
File "/usr/lib/
'subplatform': self.subplatform}}
File "/usr/lib/
self.
File "/usr/lib/
return '%s (%s)' % (subplatform_type, self.source)
This code uses and if/elif which leaves subplatform_type undefined on my image. I don't have any idea what this is supposed to be, but looking at other DataSources, they use an if/else so that subplatform_type is alway defined. This diff makes the code work for my image: sources/ DataSourceConfi gDrive. py b/cloudinit/ sources/ DataSourceConfi gDrive. py sources/ DataSourceConfi gDrive. py sources/ DataSourceConfi gDrive. py gDrive( openstack. SourceMixin, sources. DataSource) :
diff --git a/cloudinit/
index c3627152..f77923c2 100644
--- a/cloudinit/
+++ b/cloudinit/
@@ -163,10 +163,10 @@ class DataSourceConfi
def _get_subplatfor m(self) : startswith( '/dev') : startswith( '/dev') :
subplatfo rm_type = 'config-disk'
"""Return the subplatform metadata source details."""
- if self.seed_dir in self.source:
- subplatform_type = 'seed-dir'
- elif self.source.
+ if self.source.
+ else:
+ subplatform_type = 'seed-dir'
return '%s (%s)' % (subplatform_type, self.source)