summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/apport.py1
-rw-r--r--cloudinit/sources/DataSourceEc2.py12
-rw-r--r--doc/rtd/topics/datasources.rst3
-rw-r--r--doc/rtd/topics/datasources/e24cloud.rst9
-rw-r--r--tests/unittests/test_datasource/test_ec2.py15
-rw-r--r--tests/unittests/test_ds_identify.py18
-rwxr-xr-xtools/ds-identify5
7 files changed, 59 insertions, 4 deletions
diff --git a/cloudinit/apport.py b/cloudinit/apport.py
index fde1f75b..c6797f12 100644
--- a/cloudinit/apport.py
+++ b/cloudinit/apport.py
@@ -22,6 +22,7 @@ KNOWN_CLOUD_NAMES = [
'CloudSigma',
'CloudStack',
'DigitalOcean',
+ 'E24Cloud',
'GCE - Google Compute Engine',
'Exoscale',
'Hetzner Cloud',
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index 6c72ace2..1d88c9b1 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -34,6 +34,7 @@ class CloudNames(object):
AWS = "aws"
BRIGHTBOX = "brightbox"
ZSTACK = "zstack"
+ E24CLOUD = "e24cloud"
# UNKNOWN indicates no positive id. If strict_id is 'warn' or 'false',
# then an attempt at the Ec2 Metadata service will be made.
UNKNOWN = "unknown"
@@ -483,11 +484,16 @@ def identify_zstack(data):
return CloudNames.ZSTACK
+def identify_e24cloud(data):
+ if data['vendor'] == 'e24cloud':
+ return CloudNames.E24CLOUD
+
+
def identify_platform():
# identify the platform and return an entry in CloudNames.
data = _collect_platform_data()
checks = (identify_aws, identify_brightbox, identify_zstack,
- lambda x: CloudNames.UNKNOWN)
+ identify_e24cloud, lambda x: CloudNames.UNKNOWN)
for checker in checks:
try:
result = checker(data)
@@ -506,6 +512,7 @@ def _collect_platform_data():
uuid_source: 'hypervisor' (/sys/hypervisor/uuid) or 'dmi'
serial: dmi 'system-serial-number' (/sys/.../product_serial)
asset_tag: 'dmidecode -s chassis-asset-tag'
+ vendor: dmi 'system-manufacturer' (/sys/.../sys_vendor)
On Ec2 instances experimentation is that product_serial is upper case,
and product_uuid is lower case. This returns lower case values for both.
@@ -534,6 +541,9 @@ def _collect_platform_data():
data['asset_tag'] = asset_tag.lower()
+ vendor = util.read_dmi_data('system-manufacturer')
+ data['vendor'] = (vendor if vendor else '').lower()
+
return data
diff --git a/doc/rtd/topics/datasources.rst b/doc/rtd/topics/datasources.rst
index a337c08c..70fbe07d 100644
--- a/doc/rtd/topics/datasources.rst
+++ b/doc/rtd/topics/datasources.rst
@@ -29,8 +29,9 @@ The following is a list of documents for each supported datasource:
datasources/aliyun.rst
datasources/altcloud.rst
- datasources/ec2.rst
datasources/azure.rst
+ datasources/ec2.rst
+ datasources/e24cloud.rst
datasources/cloudsigma.rst
datasources/cloudstack.rst
datasources/configdrive.rst
diff --git a/doc/rtd/topics/datasources/e24cloud.rst b/doc/rtd/topics/datasources/e24cloud.rst
new file mode 100644
index 00000000..de9a4127
--- /dev/null
+++ b/doc/rtd/topics/datasources/e24cloud.rst
@@ -0,0 +1,9 @@
+.. _datasource_e24cloud:
+
+E24Cloud
+========
+`E24Cloud <https://www.e24cloud.com/en/>` platform provides an AWS Ec2 metadata
+service clone. It identifies itself to guests using the dmi
+system-manufacturer (/sys/class/dmi/id/sys_vendor).
+
+.. vi: textwidth=78
diff --git a/tests/unittests/test_datasource/test_ec2.py b/tests/unittests/test_datasource/test_ec2.py
index 6fabf258..5e1dd777 100644
--- a/tests/unittests/test_datasource/test_ec2.py
+++ b/tests/unittests/test_datasource/test_ec2.py
@@ -672,13 +672,14 @@ class TesIdentifyPlatform(test_helpers.CiTestCase):
'serial': 'H23-C4J3JV-R6',
'uuid': '81c7e555-6471-4833-9551-1ab366c4cfd2',
'uuid_source': 'dmi',
+ 'vendor': 'tothecloud',
}
unspecial.update(**kwargs)
return unspecial
@mock.patch('cloudinit.sources.DataSourceEc2._collect_platform_data')
def test_identify_zstack(self, m_collect):
- """zstack should be identified if cassis-asset-tag ends in .zstack.io
+ """zstack should be identified if chassis-asset-tag ends in .zstack.io
"""
m_collect.return_value = self.collmock(asset_tag='123456.zstack.io')
self.assertEqual(ec2.CloudNames.ZSTACK, ec2.identify_platform())
@@ -690,4 +691,16 @@ class TesIdentifyPlatform(test_helpers.CiTestCase):
m_collect.return_value = self.collmock(asset_tag='123456.buzzstack.io')
self.assertEqual(ec2.CloudNames.UNKNOWN, ec2.identify_platform())
+ @mock.patch('cloudinit.sources.DataSourceEc2._collect_platform_data')
+ def test_identify_e24cloud(self, m_collect):
+ """e24cloud identified if vendor is e24cloud"""
+ m_collect.return_value = self.collmock(vendor='e24cloud')
+ self.assertEqual(ec2.CloudNames.E24CLOUD, ec2.identify_platform())
+
+ @mock.patch('cloudinit.sources.DataSourceEc2._collect_platform_data')
+ def test_identify_e24cloud_negative(self, m_collect):
+ """e24cloud identified if vendor is e24cloud"""
+ m_collect.return_value = self.collmock(vendor='e24cloudyday')
+ self.assertEqual(ec2.CloudNames.UNKNOWN, ec2.identify_platform())
+
# vi: ts=4 expandtab
diff --git a/tests/unittests/test_ds_identify.py b/tests/unittests/test_ds_identify.py
index c5b5c46c..12c6ae36 100644
--- a/tests/unittests/test_ds_identify.py
+++ b/tests/unittests/test_ds_identify.py
@@ -616,6 +616,14 @@ class TestDsIdentify(DsIdentifyBase):
"""EC2: chassis asset tag ends with 'zstack.io'"""
self._test_ds_found('Ec2-ZStack')
+ def test_e24cloud_is_ec2(self):
+ """EC2: e24cloud identified by sys_vendor"""
+ self._test_ds_found('Ec2-E24Cloud')
+
+ def test_e24cloud_not_active(self):
+ """EC2: bobrightbox.com in product_serial is not brightbox'"""
+ self._test_ds_not_found('Ec2-E24Cloud-negative')
+
class TestIsIBMProvisioning(DsIdentifyBase):
"""Test the is_ibm_provisioning method in ds-identify."""
@@ -994,7 +1002,15 @@ VALID_CFG = {
'Ec2-ZStack': {
'ds': 'Ec2',
'files': {P_CHASSIS_ASSET_TAG: '123456.zstack.io\n'},
- }
+ },
+ 'Ec2-E24Cloud': {
+ 'ds': 'Ec2',
+ 'files': {P_SYS_VENDOR: 'e24cloud\n'},
+ },
+ 'Ec2-E24Cloud-negative': {
+ 'ds': 'Ec2',
+ 'files': {P_SYS_VENDOR: 'e24cloudyday\n'},
+ }
}
# vi: ts=4 expandtab
diff --git a/tools/ds-identify b/tools/ds-identify
index 40fc0604..20a99ee9 100755
--- a/tools/ds-identify
+++ b/tools/ds-identify
@@ -905,6 +905,11 @@ ec2_identify_platform() {
*.zstack.io) _RET="ZStack"; return 0;;
esac
+ local vendor="${DI_DMI_SYS_VENDOR}"
+ case "$vendor" in
+ e24cloud) _RET="E24cloud"; return 0;;
+ esac
+
# AWS http://docs.aws.amazon.com/AWSEC2/
# latest/UserGuide/identify_ec2_instances.html
local uuid="" hvuuid="${PATH_SYS_HYPERVISOR}/uuid"