← Back to team overview

cloud-init-dev team mailing list archive

[Merge] ~chad.smith/cloud-init:json-datasource-metadata into cloud-init:master

 

Chad Smith has proposed merging ~chad.smith/cloud-init:json-datasource-metadata into cloud-init:master.

Requested reviews:
  Server Team CI bot (server-team-bot): continuous-integration
  cloud-init commiters (cloud-init-dev)

For more details, see:
https://code.launchpad.net/~chad.smith/cloud-init/+git/cloud-init/+merge/329589

Straw man for datasource storing /run/cloud-init/instance-data.json for discussion at the summit17
-- 
Your team cloud-init commiters is requested to review the proposed merge of ~chad.smith/cloud-init:json-datasource-metadata into cloud-init:master.
diff --git a/cloudinit/sources/DataSourceAltCloud.py b/cloudinit/sources/DataSourceAltCloud.py
index ed1d691..98c4206 100644
--- a/cloudinit/sources/DataSourceAltCloud.py
+++ b/cloudinit/sources/DataSourceAltCloud.py
@@ -112,7 +112,7 @@ class DataSourceAltCloud(sources.DataSource):
 
         return 'UNKNOWN'
 
-    def get_data(self):
+    def _get_data(self):
         '''
         Description:
             User Data is passed to the launching instance which
diff --git a/cloudinit/sources/DataSourceAzure.py b/cloudinit/sources/DataSourceAzure.py
index b5a95a1..b646a08 100644
--- a/cloudinit/sources/DataSourceAzure.py
+++ b/cloudinit/sources/DataSourceAzure.py
@@ -327,7 +327,7 @@ class DataSourceAzure(sources.DataSource):
         metadata['public-keys'] = key_value or pubkeys_from_crt_files(fp_files)
         return metadata
 
-    def get_data(self):
+    def _get_data(self):
         # azure removes/ejects the cdrom containing the ovf-env.xml
         # file on reboot.  So, in order to successfully reboot we
         # need to look in the datadir and consider that valid
diff --git a/cloudinit/sources/DataSourceBigstep.py b/cloudinit/sources/DataSourceBigstep.py
index d7fcd45..b441812 100644
--- a/cloudinit/sources/DataSourceBigstep.py
+++ b/cloudinit/sources/DataSourceBigstep.py
@@ -22,7 +22,7 @@ class DataSourceBigstep(sources.DataSource):
         self.vendordata_raw = ""
         self.userdata_raw = ""
 
-    def get_data(self, apply_filter=False):
+    def _get_data(self, apply_filter=False):
         url = get_url_from_file()
         if url is None:
             return False
diff --git a/cloudinit/sources/DataSourceCloudSigma.py b/cloudinit/sources/DataSourceCloudSigma.py
index 19df16b..f1cafde 100644
--- a/cloudinit/sources/DataSourceCloudSigma.py
+++ b/cloudinit/sources/DataSourceCloudSigma.py
@@ -46,7 +46,7 @@ class DataSourceCloudSigma(sources.DataSource):
         LOG.warning("failed to query dmi data for system product name")
         return False
 
-    def get_data(self):
+    def _get_data(self):
         """
         Metadata is the whole server context and /meta/cloud-config is used
         as userdata.
diff --git a/cloudinit/sources/DataSourceCloudStack.py b/cloudinit/sources/DataSourceCloudStack.py
index 0188d89..3124ec6 100644
--- a/cloudinit/sources/DataSourceCloudStack.py
+++ b/cloudinit/sources/DataSourceCloudStack.py
@@ -116,7 +116,7 @@ class DataSourceCloudStack(sources.DataSource):
     def get_config_obj(self):
         return self.cfg
 
-    def get_data(self):
+    def _get_data(self):
         seed_ret = {}
         if util.read_optional_seed(seed_ret, base=(self.seed_dir + "/")):
             self.userdata_raw = seed_ret['user-data']
diff --git a/cloudinit/sources/DataSourceConfigDrive.py b/cloudinit/sources/DataSourceConfigDrive.py
index ef374f3..63a261a 100644
--- a/cloudinit/sources/DataSourceConfigDrive.py
+++ b/cloudinit/sources/DataSourceConfigDrive.py
@@ -50,7 +50,7 @@ class DataSourceConfigDrive(openstack.SourceMixin, sources.DataSource):
         mstr += "[source=%s]" % (self.source)
         return mstr
 
-    def get_data(self):
+    def _get_data(self):
         found = None
         md = {}
         results = {}
diff --git a/cloudinit/sources/DataSourceDigitalOcean.py b/cloudinit/sources/DataSourceDigitalOcean.py
index 5e7e66b..cedc075 100644
--- a/cloudinit/sources/DataSourceDigitalOcean.py
+++ b/cloudinit/sources/DataSourceDigitalOcean.py
@@ -44,7 +44,7 @@ class DataSourceDigitalOcean(sources.DataSource):
     def _get_sysinfo(self):
         return do_helper.read_sysinfo()
 
-    def get_data(self):
+    def _get_data(self):
         (is_do, droplet_id) = self._get_sysinfo()
 
         # only proceed if we know we are on DigitalOcean
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index 8e5f8ee..96903b1 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -65,7 +65,7 @@ class DataSourceEc2(sources.DataSource):
         self.metadata_address = None
         self.seed_dir = os.path.join(paths.seed_dir, "ec2")
 
-    def get_data(self):
+    def _get_data(self):
         seed_ret = {}
         if util.read_optional_seed(seed_ret, base=(self.seed_dir + "/")):
             self.userdata_raw = seed_ret['user-data']
diff --git a/cloudinit/sources/DataSourceGCE.py b/cloudinit/sources/DataSourceGCE.py
index 684eac8..c7daba8 100644
--- a/cloudinit/sources/DataSourceGCE.py
+++ b/cloudinit/sources/DataSourceGCE.py
@@ -61,10 +61,16 @@ class DataSourceGCE(sources.DataSource):
         except Exception:
             return public_key
 
-    def get_data(self):
+    def _get_data(self):
         if not platform_reports_gce():
             return False
+        self.metadata = self.crawl_metadata()
+        return bool(self.metadata)
 
+
+    def crawl_metadata(self):
+        """Return a dict of metadata crawled do not persist the metadata."""
+        metadata = {}
         # url_map: (our-key, path, required, is_text)
         url_map = [
             ('instance-id', ('instance/id',), True, True),
@@ -80,7 +86,7 @@ class DataSourceGCE(sources.DataSource):
         # if we cannot resolve the metadata server, then no point in trying
         if not util.is_resolvable_url(self.metadata_address):
             LOG.debug("%s is not resolvable", self.metadata_address)
-            return False
+            return {}
 
         metadata_fetcher = GoogleMetadataFetcher(self.metadata_address)
         # iterate over url_map keys to get metadata items
@@ -91,39 +97,33 @@ class DataSourceGCE(sources.DataSource):
                 new_value = metadata_fetcher.get_value(path, is_text)
                 if new_value is not None:
                     value = new_value
-            if value:
-                running_on_gce = True
             if required and value is None:
                 msg = "required key %s returned nothing. not GCE"
-                if not running_on_gce:
-                    LOG.debug(msg, mkey)
-                else:
-                    LOG.warning(msg, mkey)
-                return False
-            self.metadata[mkey] = value
+                LOG.warning(msg, mkey)
+                return {}
+            metadata[mkey] = value
 
-        if self.metadata['public-keys']:
-            lines = self.metadata['public-keys'].splitlines()
-            self.metadata['public-keys'] = [self._trim_key(k) for k in lines]
+        if metadata['public-keys']:
+            lines = metadata['public-keys'].splitlines()
+            metadata['public-keys'] = [self._trim_key(k) for k in lines]
 
-        if self.metadata['availability-zone']:
-            self.metadata['availability-zone'] = self.metadata[
+        if metadata['availability-zone']:
+            metadata['availability-zone'] = metadata[
                 'availability-zone'].split('/')[-1]
 
-        encoding = self.metadata.get('user-data-encoding')
+        encoding = metadata.get('user-data-encoding')
         if encoding:
             if encoding == 'base64':
-                self.metadata['user-data'] = b64decode(
-                    self.metadata['user-data'])
+                metadata['user-data'] = b64decode(metadata['user-data'])
             else:
                 LOG.warning('unknown user-data-encoding: %s, ignoring',
                             encoding)
 
-        return running_on_gce
+        return metadata
 
     @property
     def launch_index(self):
-        # GCE does not provide lauch_index property
+        # GCE does not provide launch_index property
         return None
 
     def get_instance_id(self):
diff --git a/cloudinit/sources/DataSourceMAAS.py b/cloudinit/sources/DataSourceMAAS.py
index 77df5a5..c194b40 100644
--- a/cloudinit/sources/DataSourceMAAS.py
+++ b/cloudinit/sources/DataSourceMAAS.py
@@ -62,7 +62,7 @@ class DataSourceMAAS(sources.DataSource):
         root = sources.DataSource.__str__(self)
         return "%s [%s]" % (root, self.base_url)
 
-    def get_data(self):
+    def _get_data(self):
         mcfg = self.ds_cfg
 
         try:
diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py
index e641244..990a01b 100644
--- a/cloudinit/sources/DataSourceNoCloud.py
+++ b/cloudinit/sources/DataSourceNoCloud.py
@@ -32,7 +32,7 @@ class DataSourceNoCloud(sources.DataSource):
         root = sources.DataSource.__str__(self)
         return "%s [seed=%s][dsmode=%s]" % (root, self.seed, self.dsmode)
 
-    def get_data(self):
+    def _get_data(self):
         defaults = {
             "instance-id": "nocloud",
             "dsmode": self.dsmode,
diff --git a/cloudinit/sources/DataSourceNone.py b/cloudinit/sources/DataSourceNone.py
index 906bb27..feaf7c2 100644
--- a/cloudinit/sources/DataSourceNone.py
+++ b/cloudinit/sources/DataSourceNone.py
@@ -16,7 +16,7 @@ class DataSourceNone(sources.DataSource):
         self.metadata = {}
         self.userdata_raw = ''
 
-    def get_data(self):
+    def _get_data(self):
         # If the datasource config has any provided 'fallback'
         # userdata or metadata, use it...
         if 'userdata_raw' in self.ds_cfg:
diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py
index 73d3877..b8dc519 100644
--- a/cloudinit/sources/DataSourceOVF.py
+++ b/cloudinit/sources/DataSourceOVF.py
@@ -56,7 +56,7 @@ class DataSourceOVF(sources.DataSource):
         root = sources.DataSource.__str__(self)
         return "%s [seed=%s]" % (root, self.seed)
 
-    def get_data(self):
+    def _get_data(self):
         found = []
         md = {}
         ud = ""
diff --git a/cloudinit/sources/DataSourceOpenNebula.py b/cloudinit/sources/DataSourceOpenNebula.py
index 5fdac19..acb0886 100644
--- a/cloudinit/sources/DataSourceOpenNebula.py
+++ b/cloudinit/sources/DataSourceOpenNebula.py
@@ -40,7 +40,7 @@ class DataSourceOpenNebula(sources.DataSource):
         root = sources.DataSource.__str__(self)
         return "%s [seed=%s][dsmode=%s]" % (root, self.seed, self.dsmode)
 
-    def get_data(self):
+    def _get_data(self):
         defaults = {"instance-id": DEFAULT_IID}
         results = None
         seed = None
diff --git a/cloudinit/sources/DataSourceOpenStack.py b/cloudinit/sources/DataSourceOpenStack.py
index b64a7f2..e4ab2eb 100644
--- a/cloudinit/sources/DataSourceOpenStack.py
+++ b/cloudinit/sources/DataSourceOpenStack.py
@@ -96,7 +96,7 @@ class DataSourceOpenStack(openstack.SourceMixin, sources.DataSource):
         self.metadata_address = url2base.get(avail_url)
         return bool(avail_url)
 
-    def get_data(self):
+    def _get_data(self):
         try:
             if not self.wait_for_metadata_service():
                 return False
diff --git a/cloudinit/sources/DataSourceScaleway.py b/cloudinit/sources/DataSourceScaleway.py
index 3a8a8e8..9e07e58 100644
--- a/cloudinit/sources/DataSourceScaleway.py
+++ b/cloudinit/sources/DataSourceScaleway.py
@@ -184,7 +184,7 @@ class DataSourceScaleway(sources.DataSource):
         self.retries = int(self.ds_cfg.get('retries', DEF_MD_RETRIES))
         self.timeout = int(self.ds_cfg.get('timeout', DEF_MD_TIMEOUT))
 
-    def get_data(self):
+    def _get_data(self):
         if not on_scaleway():
             return False
 
diff --git a/cloudinit/sources/DataSourceSmartOS.py b/cloudinit/sources/DataSourceSmartOS.py
index 6c6902f..94484d9 100644
--- a/cloudinit/sources/DataSourceSmartOS.py
+++ b/cloudinit/sources/DataSourceSmartOS.py
@@ -211,7 +211,7 @@ class DataSourceSmartOS(sources.DataSource):
             os.rename('/'.join([svc_path, 'provisioning']),
                       '/'.join([svc_path, 'provision_success']))
 
-    def get_data(self):
+    def _get_data(self):
         self._init()
 
         md = {}
diff --git a/cloudinit/sources/__init__.py b/cloudinit/sources/__init__.py
index 952caf3..f940a6a 100644
--- a/cloudinit/sources/__init__.py
+++ b/cloudinit/sources/__init__.py
@@ -10,6 +10,7 @@
 
 import abc
 import copy
+import json
 import os
 import six
 
@@ -33,6 +34,9 @@ DEP_FILESYSTEM = "FILESYSTEM"
 DEP_NETWORK = "NETWORK"
 DS_PREFIX = 'DataSource'
 
+INSTANCE_DATA_JSON = '/run/cloud-init/instance-data.json'
+SENSITIVE_INSTANCE_DATA_JSON = '/run/cloud-init/instance-data-sec.json'
+
 LOG = logging.getLogger(__name__)
 
 
@@ -45,6 +49,11 @@ class DataSource(object):
 
     dsmode = DSMODE_NETWORK
 
+    # The metadata keys for the datasource which could contain sensitive
+    # content. These objects will be persisted by get_data to
+    # SENSITIVE_INSTANCE_DATA_JSON instead of INSTANCE_DATA_JSON.
+    ds_sensitive_metadata_keys = ()
+
     def __init__(self, sys_cfg, distro, paths, ud_proc=None):
         self.sys_cfg = sys_cfg
         self.distro = distro
@@ -77,6 +86,33 @@ class DataSource(object):
     def __str__(self):
         return type_utils.obj_name(self)
 
+    def get_data(self, instance_data_file=None):
+        """Datasources implement _get_data to seutp metadata and userdata_raw.
+
+        Minimally, the datasource should return a boolean True on success.
+        """
+        if not instance_data_file:
+            instance_data_file = INSTANCE_DATA_JSON
+        return_value = self._get_data()
+        if return_value:
+            instance_data = {
+                'meta-data': self.metadata,
+                'user-data': self.get_userdata_raw(),
+                'vendor-data': self.get_vendordata_raw()}
+            LOG.info('Persisting instance data JSON: %s' % instance_data_file)
+            try:
+                content = json.dumps(instance_data)
+            except TypeError as e:
+                LOG.warning('Error persisting instance-data.json: %s', str(e))
+                return return_value
+            util.write_file(instance_data_file, content)
+        return return_value
+
+    def _get_data(self):
+        raise NotImplementedError(
+            'Subclasses of DataSource must implement this method which '
+            ' sets up metadata and userdata_raw for the datasource.')
+
     def get_userdata(self, apply_filter=False):
         if self.userdata is None:
             self.userdata = self.ud_proc.process(self.get_userdata_raw())
diff --git a/tests/unittests/test_datasource/test_aliyun.py b/tests/unittests/test_datasource/test_aliyun.py
index 996560e..c37fb58 100644
--- a/tests/unittests/test_datasource/test_aliyun.py
+++ b/tests/unittests/test_datasource/test_aliyun.py
@@ -70,6 +70,7 @@ class TestAliYunDatasource(test_helpers.HttprettyTestCase):
         paths = helpers.Paths({})
         self.ds = ay.DataSourceAliYun(cfg, distro, paths)
         self.metadata_address = self.ds.metadata_urls[0]
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     @property
     def default_metadata(self):
@@ -118,7 +119,7 @@ class TestAliYunDatasource(test_helpers.HttprettyTestCase):
     def test_with_mock_server(self, m_is_aliyun):
         m_is_aliyun.return_value = True
         self.regist_default_server()
-        ret = self.ds.get_data()
+        ret = self.ds.get_data(self.json_instancedata)
         self.assertEqual(True, ret)
         self.assertEqual(1, m_is_aliyun.call_count)
         self._test_get_data()
@@ -132,7 +133,7 @@ class TestAliYunDatasource(test_helpers.HttprettyTestCase):
         """If is_aliyun returns false, then get_data should return False."""
         m_is_aliyun.return_value = False
         self.regist_default_server()
-        ret = self.ds.get_data()
+        ret = self.ds.get_data(self.json_instancedata)
         self.assertEqual(1, m_is_aliyun.call_count)
         self.assertEqual(False, ret)
 
diff --git a/tests/unittests/test_datasource/test_altcloud.py b/tests/unittests/test_datasource/test_altcloud.py
index 9c46abc..9beca0a 100644
--- a/tests/unittests/test_datasource/test_altcloud.py
+++ b/tests/unittests/test_datasource/test_altcloud.py
@@ -18,7 +18,7 @@ import tempfile
 from cloudinit import helpers
 from cloudinit import util
 
-from ..helpers import TestCase
+from ..helpers import CiTestCase
 
 import cloudinit.sources.DataSourceAltCloud as dsac
 
@@ -97,7 +97,7 @@ def _dmi_data(expected):
     return _data
 
 
-class TestGetCloudType(TestCase):
+class TestGetCloudType(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.get_cloud_type()
     '''
@@ -143,7 +143,7 @@ class TestGetCloudType(TestCase):
         self.assertEqual('UNKNOWN', dsrc.get_cloud_type())
 
 
-class TestGetDataCloudInfoFile(TestCase):
+class TestGetDataCloudInfoFile(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.get_data()
     With a contrived CLOUD_INFO_FILE
@@ -154,6 +154,7 @@ class TestGetDataCloudInfoFile(TestCase):
         self.cloud_info_file = tempfile.mkstemp()[1]
         self.dmi_data = util.read_dmi_data
         dsac.CLOUD_INFO_FILE = self.cloud_info_file
+        self.json_instancedata =  self.tmp_path('instancedata.json')
 
     def tearDown(self):
         # Reset
@@ -173,7 +174,7 @@ class TestGetDataCloudInfoFile(TestCase):
         _write_cloud_info_file('RHEV')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_rhevm = lambda: True
-        self.assertEqual(True, dsrc.get_data())
+        self.assertEqual(True, dsrc.get_data(self.json_instancedata))
 
     def test_vsphere(self):
         '''Success Test module get_data() forcing VSPHERE.'''
@@ -181,7 +182,7 @@ class TestGetDataCloudInfoFile(TestCase):
         _write_cloud_info_file('VSPHERE')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_vsphere = lambda: True
-        self.assertEqual(True, dsrc.get_data())
+        self.assertEqual(True, dsrc.get_data(self.json_instancedata))
 
     def test_fail_rhev(self):
         '''Failure Test module get_data() forcing RHEV.'''
@@ -189,7 +190,7 @@ class TestGetDataCloudInfoFile(TestCase):
         _write_cloud_info_file('RHEV')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_rhevm = lambda: False
-        self.assertEqual(False, dsrc.get_data())
+        self.assertEqual(False, dsrc.get_data(self.json_instancedata))
 
     def test_fail_vsphere(self):
         '''Failure Test module get_data() forcing VSPHERE.'''
@@ -197,17 +198,17 @@ class TestGetDataCloudInfoFile(TestCase):
         _write_cloud_info_file('VSPHERE')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_vsphere = lambda: False
-        self.assertEqual(False, dsrc.get_data())
+        self.assertEqual(False, dsrc.get_data(self.json_instancedata))
 
     def test_unrecognized(self):
         '''Failure Test module get_data() forcing unrecognized.'''
 
         _write_cloud_info_file('unrecognized')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
-        self.assertEqual(False, dsrc.get_data())
+        self.assertEqual(False, dsrc.get_data(self.json_instancedata))
 
 
-class TestGetDataNoCloudInfoFile(TestCase):
+class TestGetDataNoCloudInfoFile(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.get_data()
     Without a CLOUD_INFO_FILE
@@ -221,6 +222,7 @@ class TestGetDataNoCloudInfoFile(TestCase):
         # We have a different code path for arm to deal with LP1243287
         # We have to switch arch to x86_64 to avoid test failure
         force_arch('x86_64')
+        self.json_instancedata =  self.tmp_path('instancedata.json')
 
     def tearDown(self):
         # Reset
@@ -236,7 +238,7 @@ class TestGetDataNoCloudInfoFile(TestCase):
         util.read_dmi_data = _dmi_data('RHEV Hypervisor')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_rhevm = lambda: True
-        self.assertEqual(True, dsrc.get_data())
+        self.assertEqual(True, dsrc.get_data(self.json_instancedata))
 
     def test_vsphere_no_cloud_file(self):
         '''Test No cloud info file module get_data() forcing VSPHERE.'''
@@ -244,17 +246,17 @@ class TestGetDataNoCloudInfoFile(TestCase):
         util.read_dmi_data = _dmi_data('VMware Virtual Platform')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
         dsrc.user_data_vsphere = lambda: True
-        self.assertEqual(True, dsrc.get_data())
+        self.assertEqual(True, dsrc.get_data(self.json_instancedata))
 
     def test_failure_no_cloud_file(self):
         '''Test No cloud info file module get_data() forcing unrecognized.'''
 
         util.read_dmi_data = _dmi_data('Unrecognized Platform')
         dsrc = dsac.DataSourceAltCloud({}, None, self.paths)
-        self.assertEqual(False, dsrc.get_data())
+        self.assertEqual(False, dsrc.get_data(self.json_instancedata))
 
 
-class TestUserDataRhevm(TestCase):
+class TestUserDataRhevm(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.user_data_rhevm()
     '''
@@ -320,7 +322,7 @@ class TestUserDataRhevm(TestCase):
         self.assertEqual(False, dsrc.user_data_rhevm())
 
 
-class TestUserDataVsphere(TestCase):
+class TestUserDataVsphere(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.user_data_vsphere()
     '''
@@ -368,7 +370,7 @@ class TestUserDataVsphere(TestCase):
         self.assertEqual(1, m_mount_cb.call_count)
 
 
-class TestReadUserDataCallback(TestCase):
+class TestReadUserDataCallback(CiTestCase):
     '''
     Test to exercise method: DataSourceAltCloud.read_user_data_callback()
     '''
diff --git a/tests/unittests/test_datasource/test_azure.py b/tests/unittests/test_datasource/test_azure.py
index 20e70fb..b369c04 100644
--- a/tests/unittests/test_datasource/test_azure.py
+++ b/tests/unittests/test_datasource/test_azure.py
@@ -84,8 +84,8 @@ class TestAzureDataSource(CiTestCase):
         super(TestAzureDataSource, self).setUp()
         if PY26:
             raise SkipTest("Does not work on python 2.6")
-        self.tmp = tempfile.mkdtemp()
-        self.addCleanup(shutil.rmtree, self.tmp)
+        self.tmp = self.tmp_dir()
+        self.json_instancedata =  self.tmp_path('instancedata.json', self.tmp)
 
         # patch cloud_dir, so our 'seed_dir' is guaranteed empty
         self.paths = helpers.Paths({'cloud_dir': self.tmp})
@@ -189,7 +189,7 @@ scbus-1 on xpt0 bus 0
         return dsrc
 
     def _get_and_setup(self, dsrc):
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         if ret:
             dsrc.setup(True)
         return ret
@@ -267,7 +267,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         m_read_dmi_data.return_value = nonazure_tag
         dsrc = dsaz.DataSourceAzure(
             {}, distro=None, paths=self.paths)
-        self.assertFalse(dsrc.get_data())
+        self.assertFalse(dsrc.get_data(self.json_instancedata))
         self.assertEqual(
             "DEBUG: Non-Azure DMI asset tag '{0}' discovered.\n".format(
                 nonazure_tag),
@@ -279,7 +279,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
                 'sys_cfg': {}}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(dsrc.userdata_raw, "")
         self.assertEqual(dsrc.metadata['local-hostname'], odata['HostName'])
@@ -289,7 +289,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
     def test_waagent_d_has_0700_perms(self):
         # we expect /var/lib/waagent to be created 0700
         dsrc = self._get_ds({'ovfcontent': construct_valid_ovf_env()})
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertTrue(os.path.isdir(self.waagent_d))
         self.assertEqual(stat.S_IMODE(os.stat(self.waagent_d).st_mode), 0o700)
@@ -337,7 +337,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(dsrc.cfg['system_info']['default_user']['name'],
                          "myuser")
@@ -348,7 +348,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertTrue('default_user' in dsrc.cfg['system_info'])
         defuser = dsrc.cfg['system_info']['default_user']
@@ -370,7 +370,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(decode_binary(dsrc.userdata_raw), mydata)
 
@@ -380,7 +380,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(dsrc.userdata_raw, mydata.encode('utf-8'))
 
@@ -388,7 +388,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         # no source should be found if no seed_dir and no devs
         data = {}
         dsrc = self._get_ds({})
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertFalse(ret)
         self.assertFalse('agent_invoked' in data)
 
@@ -444,7 +444,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
                 'sys_cfg': {}}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         cfg = dsrc.get_config_obj()
 
@@ -469,7 +469,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         data = {'ovfcontent': ovfcontent, 'sys_cfg': {}}
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         cfg = dsrc.get_config_obj()
         self.assertTrue(cfg)
@@ -479,7 +479,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         xml = construct_valid_ovf_env(data={}, userdata=userdata)
         data = {'ovfcontent': xml}
         dsrc = self._get_ds(data)
-        dsrc.get_data()
+        dsrc.get_data(self.json_instancedata)
 
         self.assertEqual(userdata.encode('us-ascii'), dsrc.userdata_raw)
 
@@ -488,7 +488,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
                  'UserPassword': "mypass"}
         data = {'ovfcontent': construct_valid_ovf_env(data=odata)}
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
 
         self.assertTrue(ret)
         ovf_env_path = os.path.join(self.waagent_d, 'ovf-env.xml')
@@ -510,7 +510,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
     def test_ovf_env_arrives_in_waagent_dir(self):
         xml = construct_valid_ovf_env(data={}, userdata="FOODATA")
         dsrc = self._get_ds({'ovfcontent': xml})
-        dsrc.get_data()
+        dsrc.get_data(self.json_instancedata)
 
         # 'data_dir' is '/var/lib/waagent' (walinux-agent's state dir)
         # we expect that the ovf-env.xml file is copied there.
@@ -522,7 +522,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         xml = construct_valid_ovf_env(data={})
         xml = u'\ufeff{0}'.format(xml)
         dsrc = self._get_ds({'ovfcontent': xml})
-        dsrc.get_data()
+        dsrc.get_data(self.json_instancedata)
 
     def test_exception_fetching_fabric_data_doesnt_propagate(self):
         """Errors communicating with fabric should warn, but return True."""
@@ -542,13 +542,13 @@ fdescfs            /dev/fd          fdescfs rw              0 0
 
     def test_instance_id_from_dmidecode_used(self):
         ds = self._get_ds({'ovfcontent': construct_valid_ovf_env()})
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertEqual(self.instance_id, ds.metadata['instance-id'])
 
     def test_instance_id_from_dmidecode_used_for_builtin(self):
         ds = self._get_ds({'ovfcontent': construct_valid_ovf_env()})
         ds.ds_cfg['agent_command'] = '__builtin__'
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertEqual(self.instance_id, ds.metadata['instance-id'])
 
     @mock.patch("cloudinit.sources.DataSourceAzure.util.is_FreeBSD")
@@ -588,7 +588,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         mock_get_mac.return_value = '00:11:22:33:44:55'
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         netconfig = dsrc.network_config
@@ -632,7 +632,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         mock_get_mac.return_value = '00:11:22:33:44:55'
 
         dsrc = self._get_ds(data)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         netconfig = dsrc.network_config
@@ -641,7 +641,7 @@ fdescfs            /dev/fd          fdescfs rw              0 0
         self.assertEqual(netconfig, expected_config)
 
 
-class TestAzureBounce(TestCase):
+class TestAzureBounce(CiTestCase):
 
     def mock_out_azure_moving_parts(self):
         self.patches.enter_context(
@@ -654,6 +654,7 @@ class TestAzureBounce(TestCase):
         self.patches.enter_context(
             mock.patch.object(dsaz, 'get_metadata_from_fabric',
                               mock.MagicMock(return_value={})))
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
         def _dmi_mocks(key):
             if key == 'system-uuid':
@@ -696,7 +697,7 @@ class TestAzureBounce(TestCase):
         return dsrc
 
     def _get_and_setup(self, dsrc):
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         if ret:
             dsrc.setup(True)
         return ret
@@ -713,21 +714,24 @@ class TestAzureBounce(TestCase):
 
     def test_disabled_bounce_does_not_change_hostname(self):
         cfg = {'hostname_bounce': {'policy': 'off'}}
-        self._get_ds(self.get_ovf_env_with_dscfg('test-host', cfg)).get_data()
+        ds = self._get_ds(self.get_ovf_env_with_dscfg('test-host', cfg))
+        ds.get_data(self.json_instancedata)
         self.assertEqual(0, self.set_hostname.call_count)
 
     @mock.patch('cloudinit.sources.DataSourceAzure.perform_hostname_bounce')
     def test_disabled_bounce_does_not_perform_bounce(
             self, perform_hostname_bounce):
         cfg = {'hostname_bounce': {'policy': 'off'}}
-        self._get_ds(self.get_ovf_env_with_dscfg('test-host', cfg)).get_data()
+        ds = self._get_ds(self.get_ovf_env_with_dscfg('test-host', cfg))
+        ds.get_data(self.json_instancedata)
         self.assertEqual(0, perform_hostname_bounce.call_count)
 
     def test_same_hostname_does_not_change_hostname(self):
         host_name = 'unchanged-host-name'
         self.get_hostname.return_value = host_name
         cfg = {'hostname_bounce': {'policy': 'yes'}}
-        self._get_ds(self.get_ovf_env_with_dscfg(host_name, cfg)).get_data()
+        ds = self._get_ds(self.get_ovf_env_with_dscfg(host_name, cfg))
+        ds.get_data(self.json_instancedata)
         self.assertEqual(0, self.set_hostname.call_count)
 
     @mock.patch('cloudinit.sources.DataSourceAzure.perform_hostname_bounce')
@@ -736,7 +740,8 @@ class TestAzureBounce(TestCase):
         host_name = 'unchanged-host-name'
         self.get_hostname.return_value = host_name
         cfg = {'hostname_bounce': {'policy': 'yes'}}
-        self._get_ds(self.get_ovf_env_with_dscfg(host_name, cfg)).get_data()
+        ds = self._get_ds(self.get_ovf_env_with_dscfg(host_name, cfg))
+        ds.get_data(self.json_instancedata)
         self.assertEqual(0, perform_hostname_bounce.call_count)
 
     @mock.patch('cloudinit.sources.DataSourceAzure.perform_hostname_bounce')
@@ -831,14 +836,14 @@ class TestAzureBounce(TestCase):
             self, perform_hostname_bounce):
         cfg = {'set_hostname': False, 'hostname_bounce': {'policy': 'force'}}
         data = self.get_ovf_env_with_dscfg('some-hostname', cfg)
-        self._get_ds(data).get_data()
+        self._get_ds(data).get_data(self.json_instancedata)
 
         self.assertEqual(0, perform_hostname_bounce.call_count)
 
     def test_set_hostname_option_can_disable_hostname_set(self):
         cfg = {'set_hostname': False, 'hostname_bounce': {'policy': 'force'}}
         data = self.get_ovf_env_with_dscfg('some-hostname', cfg)
-        self._get_ds(data).get_data()
+        self._get_ds(data).get_data(self.json_instancedata)
 
         self.assertEqual(0, self.set_hostname.call_count)
 
diff --git a/tests/unittests/test_datasource/test_cloudsigma.py b/tests/unittests/test_datasource/test_cloudsigma.py
index 5997102..f5b482e 100644
--- a/tests/unittests/test_datasource/test_cloudsigma.py
+++ b/tests/unittests/test_datasource/test_cloudsigma.py
@@ -38,13 +38,14 @@ class CepkoMock(Cepko):
         return self
 
 
-class DataSourceCloudSigmaTest(test_helpers.TestCase):
+class DataSourceCloudSigmaTest(test_helpers.CiTestCase):
     def setUp(self):
         super(DataSourceCloudSigmaTest, self).setUp()
         self.datasource = DataSourceCloudSigma.DataSourceCloudSigma("", "", "")
         self.datasource.is_running_in_cloudsigma = lambda: True
         self.datasource.cepko = CepkoMock(SERVER_CONTEXT)
-        self.datasource.get_data()
+        self.json_instancedata = self.tmp_path('instancedata.json')
+        self.datasource.get_data(self.json_instancedata)
 
     def test_get_hostname(self):
         self.assertEqual("test_server", self.datasource.get_hostname())
@@ -74,7 +75,7 @@ class DataSourceCloudSigmaTest(test_helpers.TestCase):
         encoded_context['meta']['base64_fields'] = 'cloudinit-user-data'
         encoded_context['meta']['cloudinit-user-data'] = 'aGkgd29ybGQK'
         self.datasource.cepko = CepkoMock(encoded_context)
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
 
         self.assertEqual(self.datasource.userdata_raw, b'hi world\n')
 
@@ -87,7 +88,7 @@ class DataSourceCloudSigmaTest(test_helpers.TestCase):
         del stripped_context["vendor_data"]
         self.datasource = DataSourceCloudSigma.DataSourceCloudSigma("", "", "")
         self.datasource.cepko = CepkoMock(stripped_context)
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
 
         self.assertIsNone(self.datasource.vendordata_raw)
 
@@ -96,7 +97,7 @@ class DataSourceCloudSigmaTest(test_helpers.TestCase):
         del stripped_context["vendor_data"]["cloudinit"]
         self.datasource = DataSourceCloudSigma.DataSourceCloudSigma("", "", "")
         self.datasource.cepko = CepkoMock(stripped_context)
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
 
         self.assertIsNone(self.datasource.vendordata_raw)
 
diff --git a/tests/unittests/test_datasource/test_cloudstack.py b/tests/unittests/test_datasource/test_cloudstack.py
index e94aad6..ba4c805 100644
--- a/tests/unittests/test_datasource/test_cloudstack.py
+++ b/tests/unittests/test_datasource/test_cloudstack.py
@@ -3,10 +3,10 @@
 from cloudinit import helpers
 from cloudinit.sources.DataSourceCloudStack import DataSourceCloudStack
 
-from ..helpers import TestCase, mock, ExitStack
+from ..helpers import CiTestCase, mock, ExitStack
 
 
-class TestCloudStackPasswordFetching(TestCase):
+class TestCloudStackPasswordFetching(CiTestCase):
 
     def setUp(self):
         super(TestCloudStackPasswordFetching, self).setUp()
@@ -25,6 +25,7 @@ class TestCloudStackPasswordFetching(TestCase):
         self.patches.enter_context(mock.patch(
             'cloudinit.sources.DataSourceCloudStack.get_default_gateway',
             get_default_gw))
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     def _set_password_server_response(self, response_string):
         subp = mock.MagicMock(return_value=(response_string, ''))
@@ -36,26 +37,26 @@ class TestCloudStackPasswordFetching(TestCase):
     def test_empty_password_doesnt_create_config(self):
         self._set_password_server_response('')
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertEqual({}, ds.get_config_obj())
 
     def test_saved_password_doesnt_create_config(self):
         self._set_password_server_response('saved_password')
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertEqual({}, ds.get_config_obj())
 
     def test_password_sets_password(self):
         password = 'SekritSquirrel'
         self._set_password_server_response(password)
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertEqual(password, ds.get_config_obj()['password'])
 
     def test_bad_request_doesnt_stop_ds_from_working(self):
         self._set_password_server_response('bad_request')
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        self.assertTrue(ds.get_data())
+        self.assertTrue(ds.get_data(self.json_instancedata))
 
     def assertRequestTypesSent(self, subp, expected_request_types):
         request_types = []
@@ -70,14 +71,14 @@ class TestCloudStackPasswordFetching(TestCase):
         password = 'SekritSquirrel'
         subp = self._set_password_server_response(password)
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertRequestTypesSent(subp,
                                     ['send_my_password', 'saved_password'])
 
     def _check_password_not_saved_for(self, response_string):
         subp = self._set_password_server_response(response_string)
         ds = DataSourceCloudStack({}, None, helpers.Paths({}))
-        ds.get_data()
+        ds.get_data(self.json_instancedata)
         self.assertRequestTypesSent(subp, ['send_my_password'])
 
     def test_password_not_saved_if_empty(self):
diff --git a/tests/unittests/test_datasource/test_configdrive.py b/tests/unittests/test_datasource/test_configdrive.py
index 337be66..3efd446 100644
--- a/tests/unittests/test_datasource/test_configdrive.py
+++ b/tests/unittests/test_datasource/test_configdrive.py
@@ -729,7 +729,8 @@ def cfg_ds_from_dir(seed_d):
                                       helpers.Paths({}))
     cfg_ds.seed_dir = seed_d
     cfg_ds.known_macs = KNOWN_MACS.copy()
-    if not cfg_ds.get_data():
+    tmp = tempfile.mkdtemp()
+    if not cfg_ds.get_data(os.path.join(tmp, 'instancedata.json')):
         raise RuntimeError("Data source did not extract itself from"
                            " seed directory %s" % seed_d)
     return cfg_ds
diff --git a/tests/unittests/test_datasource/test_digitalocean.py b/tests/unittests/test_datasource/test_digitalocean.py
index e97a679..7ac9732 100644
--- a/tests/unittests/test_datasource/test_digitalocean.py
+++ b/tests/unittests/test_datasource/test_digitalocean.py
@@ -13,7 +13,7 @@ from cloudinit import settings
 from cloudinit.sources import DataSourceDigitalOcean
 from cloudinit.sources.helpers import digitalocean
 
-from ..helpers import mock, TestCase
+from ..helpers import mock, CiTestCase
 
 DO_MULTIPLE_KEYS = ["ssh-rsa AAAAB3NzaC1yc2EAAAA... test1@xxxxx",
                     "ssh-rsa AAAAB3NzaC1yc2EAAAA... test2@xxxxx"]
@@ -135,10 +135,13 @@ def _mock_dmi():
     return (True, DO_META.get('id'))
 
 
-class TestDataSourceDigitalOcean(TestCase):
+class TestDataSourceDigitalOcean(CiTestCase):
     """
     Test reading the meta-data
     """
+    def setUp(self):
+        super(TestDataSourceDigitalOcean, self).setUp()
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     def get_ds(self, get_sysinfo=_mock_dmi):
         ds = DataSourceDigitalOcean.DataSourceDigitalOcean(
@@ -152,7 +155,7 @@ class TestDataSourceDigitalOcean(TestCase):
     def test_returns_false_not_on_docean(self, m_read_sysinfo):
         m_read_sysinfo.return_value = (False, None)
         ds = self.get_ds(get_sysinfo=None)
-        self.assertEqual(False, ds.get_data())
+        self.assertEqual(False, ds.get_data(self.json_instancedata))
         self.assertTrue(m_read_sysinfo.called)
 
     @mock.patch('cloudinit.sources.helpers.digitalocean.read_metadata')
@@ -160,7 +163,7 @@ class TestDataSourceDigitalOcean(TestCase):
         mock_readmd.return_value = DO_META.copy()
 
         ds = self.get_ds()
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         self.assertTrue(mock_readmd.called)
@@ -184,7 +187,7 @@ class TestDataSourceDigitalOcean(TestCase):
         mock_readmd.return_value = metadata.copy()
 
         ds = self.get_ds()
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         self.assertTrue(mock_readmd.called)
@@ -194,7 +197,7 @@ class TestDataSourceDigitalOcean(TestCase):
         self.assertIsInstance(ds.get_public_ssh_keys(), list)
 
 
-class TestNetworkConvert(TestCase):
+class TestNetworkConvert(CiTestCase):
 
     @mock.patch('cloudinit.net.get_interfaces_by_mac')
     def _get_networking(self, m_get_by_mac):
diff --git a/tests/unittests/test_datasource/test_ec2.py b/tests/unittests/test_datasource/test_ec2.py
index 33d0261..9d54950 100644
--- a/tests/unittests/test_datasource/test_ec2.py
+++ b/tests/unittests/test_datasource/test_ec2.py
@@ -159,6 +159,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
         super(TestEc2, self).setUp()
         self.datasource = ec2.DataSourceEc2
         self.metadata_addr = self.datasource.metadata_urls[0]
+        self.json_instancedata = self.tmp_path('instance-data.json')
 
     @property
     def metadata_url(self):
@@ -202,7 +203,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data=self.valid_platform_data,
             sys_cfg={'datasource': {'Ec2': {'strict_id': True}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(0, m_dhcp.call_count)
 
@@ -213,7 +214,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data=self.valid_platform_data,
             sys_cfg={'datasource': {'Ec2': {'strict_id': False}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
     @httpretty.activate
@@ -224,7 +225,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data={'uuid': uuid, 'uuid_source': 'dmi', 'serial': ''},
             sys_cfg={'datasource': {'Ec2': {'strict_id': True}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertFalse(ret)
 
     @httpretty.activate
@@ -235,7 +236,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data={'uuid': uuid, 'uuid_source': 'dmi', 'serial': ''},
             sys_cfg={'datasource': {'Ec2': {'strict_id': False}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
     @httpretty.activate
@@ -251,7 +252,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data=self.valid_platform_data,
             sys_cfg={'datasource': {'Ec2': {'strict_id': False}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertFalse(ret)
         self.assertIn(
             "FreeBSD doesn't support running dhclient with -sf",
@@ -278,7 +279,7 @@ class TestEc2(test_helpers.HttprettyTestCase):
             platform_data=self.valid_platform_data,
             sys_cfg={'datasource': {'Ec2': {'strict_id': False}}},
             md=DEFAULT_METADATA)
-        ret = ds.get_data()
+        ret = ds.get_data(self.json_instancedata)
         self.assertTrue(ret)
         m_dhcp.assert_called_once_with()
         m_net.assert_called_once_with(
diff --git a/tests/unittests/test_datasource/test_gce.py b/tests/unittests/test_datasource/test_gce.py
index ad608be..b6e1db5 100644
--- a/tests/unittests/test_datasource/test_gce.py
+++ b/tests/unittests/test_datasource/test_gce.py
@@ -77,11 +77,12 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
         self.m_platform_reports_gce = ppatch.start()
         self.m_platform_reports_gce.return_value = True
         self.addCleanup(ppatch.stop)
+        self.json_instancedata = self.tmp_path('instance-data.json')
         super(TestDataSourceGCE, self).setUp()
 
     def test_connection(self):
         _set_mock_metadata()
-        success = self.ds.get_data()
+        success = self.ds.get_data(self.json_instancedata)
         self.assertTrue(success)
 
         req_header = httpretty.last_request().headers
@@ -89,7 +90,7 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
 
     def test_metadata(self):
         _set_mock_metadata()
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         shostname = GCE_META.get('instance/hostname').split('.')[0]
         self.assertEqual(shostname,
@@ -104,7 +105,7 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
     # test partial metadata (missing user-data in particular)
     def test_metadata_partial(self):
         _set_mock_metadata(GCE_META_PARTIAL)
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         self.assertEqual(GCE_META_PARTIAL.get('instance/id'),
                          self.ds.get_instance_id())
@@ -114,7 +115,7 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
 
     def test_metadata_encoding(self):
         _set_mock_metadata(GCE_META_ENCODING)
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         decoded = b64decode(
             GCE_META_ENCODING.get('instance/attributes/user-data'))
@@ -126,12 +127,12 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
             meta = GCE_META_PARTIAL.copy()
             del meta[required_key]
             _set_mock_metadata(meta)
-            self.assertEqual(False, self.ds.get_data())
+            self.assertEqual(False, self.ds.get_data(self.json_instancedata))
             httpretty.reset()
 
     def test_project_level_ssh_keys_are_used(self):
         _set_mock_metadata()
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         # we expect a list of public ssh keys with user names stripped
         self.assertEqual(['ssh-rsa AA2..+aRD0fyVw== root@server'],
@@ -143,7 +144,7 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
         meta['instance/attributes/ssh-keys'] = 'user:{0}'.format(key_content)
 
         _set_mock_metadata(meta)
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         self.assertIn(key_content, self.ds.get_public_ssh_keys())
 
@@ -153,20 +154,20 @@ class TestDataSourceGCE(test_helpers.HttprettyTestCase):
         meta['instance/attributes/ssh-keys'] = 'user:{0}'.format(key_content)
 
         _set_mock_metadata(meta)
-        self.ds.get_data()
+        self.ds.get_data(self.json_instancedata)
 
         self.assertEqual([key_content], self.ds.get_public_ssh_keys())
 
     def test_only_last_part_of_zone_used_for_availability_zone(self):
         _set_mock_metadata()
-        r = self.ds.get_data()
+        r = self.ds.get_data(self.json_instancedata)
         self.assertEqual(True, r)
         self.assertEqual('bar', self.ds.availability_zone)
 
     @mock.patch("cloudinit.sources.DataSourceGCE.GoogleMetadataFetcher")
     def test_get_data_returns_false_if_not_on_gce(self, m_fetcher):
         self.m_platform_reports_gce.return_value = False
-        ret = self.ds.get_data()
+        ret = self.ds.get_data(self.json_instancedata)
         self.assertEqual(False, ret)
         m_fetcher.assert_not_called()
 
diff --git a/tests/unittests/test_datasource/test_nocloud.py b/tests/unittests/test_datasource/test_nocloud.py
index ff29439..afb320f 100644
--- a/tests/unittests/test_datasource/test_nocloud.py
+++ b/tests/unittests/test_datasource/test_nocloud.py
@@ -3,7 +3,7 @@
 from cloudinit import helpers
 from cloudinit.sources import DataSourceNoCloud
 from cloudinit import util
-from ..helpers import TestCase, populate_dir, mock, ExitStack
+from ..helpers import CiTestCase, populate_dir, mock, ExitStack
 
 import os
 import shutil
@@ -12,12 +12,12 @@ import textwrap
 import yaml
 
 
-class TestNoCloudDataSource(TestCase):
+class TestNoCloudDataSource(CiTestCase):
 
     def setUp(self):
         super(TestNoCloudDataSource, self).setUp()
-        self.tmp = tempfile.mkdtemp()
-        self.addCleanup(shutil.rmtree, self.tmp)
+        self.tmp = self.tmp_dir()
+        self.json_instancedata = self.tmp_path('instancedata.json', self.tmp)
         self.paths = helpers.Paths({'cloud_dir': self.tmp})
 
         self.cmdline = "root=TESTCMDLINE"
@@ -41,7 +41,7 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertEqual(dsrc.userdata_raw, ud)
         self.assertEqual(dsrc.metadata, md)
         self.assertTrue(ret)
@@ -63,12 +63,13 @@ class TestNoCloudDataSource(TestCase):
         # by default, NoCloud should search for filesystems by label
         sys_cfg = {'datasource': {'NoCloud': {}}}
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        self.assertRaises(PsuedoException, dsrc.get_data)
+        self.assertRaises(
+            PsuedoException, dsrc.get_data, self.json_instancedata)
 
         # but disabling searching should just end up with None found
         sys_cfg = {'datasource': {'NoCloud': {'fs_label': None}}}
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertFalse(ret)
 
     def test_no_datasource_expected(self):
@@ -77,7 +78,7 @@ class TestNoCloudDataSource(TestCase):
 
         ds = DataSourceNoCloud.DataSourceNoCloud
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        self.assertFalse(dsrc.get_data())
+        self.assertFalse(dsrc.get_data(self.json_instancedata))
 
     def test_seed_in_config(self):
         ds = DataSourceNoCloud.DataSourceNoCloud
@@ -90,7 +91,7 @@ class TestNoCloudDataSource(TestCase):
 
         sys_cfg = {'datasource': {'NoCloud': data}}
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertEqual(dsrc.userdata_raw, b"USER_DATA_RAW")
         self.assertEqual(dsrc.metadata.get('instance-id'), 'IID')
         self.assertTrue(ret)
@@ -111,7 +112,7 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertEqual(dsrc.userdata_raw, ud)
         self.assertEqual(dsrc.metadata, md)
         self.assertEqual(dsrc.vendordata_raw, vd)
@@ -126,7 +127,7 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertEqual(dsrc.userdata_raw, b"ud")
         self.assertFalse(dsrc.vendordata)
         self.assertTrue(ret)
@@ -155,7 +156,7 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         # very simple check just for the strings above
         self.assertIn(gateway, str(dsrc.network_config))
@@ -176,7 +177,7 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(netconf, dsrc.network_config)
 
@@ -209,13 +210,13 @@ class TestNoCloudDataSource(TestCase):
         ds = DataSourceNoCloud.DataSourceNoCloud
 
         dsrc = ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(netconf, dsrc.network_config)
         self.assertNotIn(gateway, str(dsrc.network_config))
 
 
-class TestParseCommandLineData(TestCase):
+class TestParseCommandLineData(CiTestCase):
 
     def test_parse_cmdline_data_valid(self):
         ds_id = "ds=nocloud"
diff --git a/tests/unittests/test_datasource/test_opennebula.py b/tests/unittests/test_datasource/test_opennebula.py
index b0f8e43..dd53180 100644
--- a/tests/unittests/test_datasource/test_opennebula.py
+++ b/tests/unittests/test_datasource/test_opennebula.py
@@ -3,7 +3,7 @@
 from cloudinit import helpers
 from cloudinit.sources import DataSourceOpenNebula as ds
 from cloudinit import util
-from ..helpers import mock, populate_dir, TestCase
+from ..helpers import mock, populate_dir, CiTestCase
 
 import os
 import pwd
@@ -36,13 +36,13 @@ PUBLIC_IP = '10.0.0.3'
 DS_PATH = "cloudinit.sources.DataSourceOpenNebula"
 
 
-class TestOpenNebulaDataSource(TestCase):
+class TestOpenNebulaDataSource(CiTestCase):
     parsed_user = None
 
     def setUp(self):
         super(TestOpenNebulaDataSource, self).setUp()
-        self.tmp = tempfile.mkdtemp()
-        self.addCleanup(shutil.rmtree, self.tmp)
+        self.tmp = self.tmp_dir()
+        self.json_instancedata = self.tmp_path('instancedata.json', self.tmp)
         self.paths = helpers.Paths({'cloud_dir': self.tmp})
 
         # defaults for few tests
@@ -68,7 +68,7 @@ class TestOpenNebulaDataSource(TestCase):
             # dont' try to lookup for CDs
             util.find_devs_with = lambda n: []
             dsrc = self.ds(sys_cfg=self.sys_cfg, distro=None, paths=self.paths)
-            ret = dsrc.get_data()
+            ret = dsrc.get_data(self.json_instancedata)
             self.assertFalse(ret)
         finally:
             util.find_devs_with = orig_find_devs_with
@@ -80,7 +80,8 @@ class TestOpenNebulaDataSource(TestCase):
             util.find_devs_with = lambda n: []
             populate_dir(self.seed_dir, {'context.sh': INVALID_CONTEXT})
             dsrc = self.ds(sys_cfg=self.sys_cfg, distro=None, paths=self.paths)
-            self.assertRaises(ds.BrokenContextDiskDir, dsrc.get_data)
+            self.assertRaises(
+                ds.BrokenContextDiskDir, dsrc.get_data, self.json_instancedata)
         finally:
             util.find_devs_with = orig_find_devs_with
 
@@ -102,7 +103,8 @@ class TestOpenNebulaDataSource(TestCase):
             util.find_devs_with = lambda n: []
             populate_context_dir(self.seed_dir, {'KEY1': 'val1'})
             dsrc = self.ds(sys_cfg=sys_cfg, distro=None, paths=self.paths)
-            self.assertRaises(ds.BrokenContextDiskDir, dsrc.get_data)
+            self.assertRaises(
+                ds.BrokenContextDiskDir, dsrc.get_data, self.json_instancedata)
         finally:
             util.find_devs_with = orig_find_devs_with
 
@@ -113,7 +115,7 @@ class TestOpenNebulaDataSource(TestCase):
             util.find_devs_with = lambda n: []
             populate_context_dir(self.seed_dir, {'KEY1': 'val1'})
             dsrc = self.ds(sys_cfg=self.sys_cfg, distro=None, paths=self.paths)
-            ret = dsrc.get_data()
+            ret = dsrc.get_data(self.json_instancedata)
             self.assertTrue(ret)
         finally:
             util.find_devs_with = orig_find_devs_with
diff --git a/tests/unittests/test_datasource/test_openstack.py b/tests/unittests/test_datasource/test_openstack.py
index c2905d1..b6f865e 100644
--- a/tests/unittests/test_datasource/test_openstack.py
+++ b/tests/unittests/test_datasource/test_openstack.py
@@ -128,6 +128,10 @@ def _read_metadata_service():
 class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
     VERSION = 'latest'
 
+    def setUp(self):
+        super(TestOpenStackDataSource, self).setUp()
+        self.json_instancedata = self.tmp_path('instancedata.json')
+
     @hp.activate
     def test_successful(self):
         _register_uris(self.VERSION, EC2_FILES, EC2_META, OS_FILES)
@@ -231,7 +235,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
                                        None,
                                        helpers.Paths({}))
         self.assertIsNone(ds_os.version)
-        found = ds_os.get_data()
+        found = ds_os.get_data(self.json_instancedata)
         self.assertTrue(found)
         self.assertEqual(2, ds_os.version)
         md = dict(ds_os.metadata)
@@ -255,7 +259,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
                                        None,
                                        helpers.Paths({}))
         self.assertIsNone(ds_os.version)
-        found = ds_os.get_data()
+        found = ds_os.get_data(self.json_instancedata)
         self.assertFalse(found)
         self.assertIsNone(ds_os.version)
 
@@ -274,7 +278,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
             'timeout': 0,
         }
         self.assertIsNone(ds_os.version)
-        found = ds_os.get_data()
+        found = ds_os.get_data(self.json_instancedata)
         self.assertFalse(found)
         self.assertIsNone(ds_os.version)
 
@@ -297,7 +301,7 @@ class TestOpenStackDataSource(test_helpers.HttprettyTestCase):
             'timeout': 0,
         }
         self.assertIsNone(ds_os.version)
-        found = ds_os.get_data()
+        found = ds_os.get_data(self.json_instancedata)
         self.assertFalse(found)
         self.assertIsNone(ds_os.version)
 
diff --git a/tests/unittests/test_datasource/test_scaleway.py b/tests/unittests/test_datasource/test_scaleway.py
index 65d83ad..3411fc5 100644
--- a/tests/unittests/test_datasource/test_scaleway.py
+++ b/tests/unittests/test_datasource/test_scaleway.py
@@ -9,7 +9,7 @@ from cloudinit import helpers
 from cloudinit import settings
 from cloudinit.sources import DataSourceScaleway
 
-from ..helpers import mock, HttprettyTestCase, TestCase
+from ..helpers import mock, HttprettyTestCase, CiTestCase
 
 
 class DataResponses(object):
@@ -63,7 +63,11 @@ class MetadataResponses(object):
         return 200, headers, json.dumps(cls.FAKE_METADATA)
 
 
-class TestOnScaleway(TestCase):
+class TestOnScaleway(CiTestCase):
+
+    def setUp(self):
+        super(TestOnScaleway, self).setUp()
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     def install_mocks(self, fake_dmi, fake_file_exists, fake_cmdline):
         mock, faked = fake_dmi
@@ -93,7 +97,7 @@ class TestOnScaleway(TestCase):
         datasource = DataSourceScaleway.DataSourceScaleway(
             settings.CFG_BUILTIN, None, helpers.Paths({})
         )
-        self.assertFalse(datasource.get_data())
+        self.assertFalse(datasource.get_data(self.json_instancedata))
 
     @mock.patch('cloudinit.util.get_cmdline')
     @mock.patch('os.path.exists')
@@ -170,6 +174,7 @@ class TestDataSourceScaleway(HttprettyTestCase):
             DataSourceScaleway.BUILTIN_DS_CONFIG['userdata_url']
         self.vendordata_url = \
             DataSourceScaleway.BUILTIN_DS_CONFIG['vendordata_url']
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     @httpretty.activate
     @mock.patch('cloudinit.sources.DataSourceScaleway.SourceAddressAdapter',
@@ -189,7 +194,7 @@ class TestDataSourceScaleway(HttprettyTestCase):
                                body=DataResponses.get_ok)
         httpretty.register_uri(httpretty.GET, self.vendordata_url,
                                body=DataResponses.get_ok)
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
 
         self.assertEqual(self.datasource.get_instance_id(),
                          MetadataResponses.FAKE_METADATA['id'])
@@ -226,7 +231,7 @@ class TestDataSourceScaleway(HttprettyTestCase):
                                body=DataResponses.empty)
         httpretty.register_uri(httpretty.GET, self.vendordata_url,
                                body=DataResponses.empty)
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
         self.assertIsNone(self.datasource.get_userdata_raw())
         self.assertIsNone(self.datasource.get_vendordata_raw())
         self.assertEqual(sleep.call_count, 0)
@@ -256,7 +261,7 @@ class TestDataSourceScaleway(HttprettyTestCase):
                 httpretty.Response(body=DataResponses.get_ok),
             ]
         )
-        self.datasource.get_data()
+        self.datasource.get_data(self.json_instancedata)
         self.assertEqual(self.datasource.get_userdata_raw(),
                          DataResponses.FAKE_USER_DATA)
         self.assertEqual(sleep.call_count, 2)
diff --git a/tests/unittests/test_datasource/test_smartos.py b/tests/unittests/test_datasource/test_smartos.py
index e3c99bb..ac0e456 100644
--- a/tests/unittests/test_datasource/test_smartos.py
+++ b/tests/unittests/test_datasource/test_smartos.py
@@ -366,6 +366,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
 
         self.orig_lud = DataSourceSmartOS.LEGACY_USER_D
         DataSourceSmartOS.LEGACY_USER_D = self.legacy_user_d
+        self.json_instancedata = self.tmp_path('instancedata.json')
 
     def tearDown(self):
         DataSourceSmartOS.LEGACY_USER_D = self.orig_lud
@@ -389,40 +390,40 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
     def test_no_base64(self):
         ds_cfg = {'no_base64_decode': ['test_var1'], 'all_base': True}
         dsrc = self._get_ds(ds_cfg=ds_cfg)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
     def test_uuid(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['sdc:uuid'],
                          dsrc.metadata['instance-id'])
 
     def test_root_keys(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['root_authorized_keys'],
                          dsrc.metadata['public-keys'])
 
     def test_hostname_b64(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['hostname'],
                          dsrc.metadata['local-hostname'])
 
     def test_hostname(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['hostname'],
                          dsrc.metadata['local-hostname'])
 
     def test_userdata(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['user-data'],
                          dsrc.metadata['legacy-user-data'])
@@ -431,14 +432,14 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
 
     def test_sdc_nics(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(json.loads(MOCK_RETURNS['sdc:nics']),
                          dsrc.metadata['network-data'])
 
     def test_sdc_scripts(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['user-script'],
                          dsrc.metadata['user-script'])
@@ -451,7 +452,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
 
     def test_scripts_shebanged(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['user-script'],
                          dsrc.metadata['user-script'])
@@ -478,7 +479,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
                                                'print("hi")', ''])
 
         dsrc = self._get_ds(mockdata=my_returns)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(my_returns['user-script'],
                          dsrc.metadata['user-script'])
@@ -507,7 +508,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
         del my_returns['user-data']
 
         dsrc = self._get_ds(mockdata=my_returns)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertFalse(dsrc.metadata.get('legacy-user-data'))
 
@@ -525,7 +526,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
 
     def test_vendor_data_not_default(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['sdc:vendor-data'],
                          dsrc.metadata['vendor-data'])
@@ -535,7 +536,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
         def_op_script = my_returns['sdc:vendor-data']
         del my_returns['sdc:vendor-data']
         dsrc = self._get_ds(mockdata=my_returns)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertNotEqual(def_op_script, dsrc.metadata['vendor-data'])
 
@@ -544,14 +545,14 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
 
     def test_disable_iptables_flag(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['disable_iptables_flag'],
                          dsrc.metadata['iptables_disable'])
 
     def test_motd_sys_info(self):
         dsrc = self._get_ds(mockdata=MOCK_RETURNS)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
         self.assertEqual(MOCK_RETURNS['enable_motd_sys_info'],
                          dsrc.metadata['motd_sys_info'])
@@ -562,7 +563,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
         dsrc = self._get_ds()
         cfg = dsrc.get_config_obj()
 
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         assert 'disk_setup' in cfg
@@ -581,7 +582,7 @@ class TestSmartOSDataSource(FilesystemMockingTestCase):
             self.assertIn(k, builtin)
 
         dsrc = self._get_ds(ds_cfg=mydscfg)
-        ret = dsrc.get_data()
+        ret = dsrc.get_data(self.json_instancedata)
         self.assertTrue(ret)
 
         self.assertEqual(mydscfg['disk_aliases']['FOO'],