summaryrefslogtreecommitdiff
path: root/debian
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2018-05-18 14:41:34 -0400
committerScott Moser <smoser@ubuntu.com>2018-05-18 14:43:40 -0400
commitb7cca5fae8fe5b6fd557a31d6bfdfbfb65cce43f (patch)
tree1aaf8405105eb13d3526439c98477b88a5a3be07 /debian
parent50f3462cc28f302912d71f3c9a9c9a817d3e190c (diff)
downloadvyos-cloud-init-b7cca5fae8fe5b6fd557a31d6bfdfbfb65cce43f.tar.gz
vyos-cloud-init-b7cca5fae8fe5b6fd557a31d6bfdfbfb65cce43f.zip
drop cherry picks.
Next upload will be from a snapshot of trunk which will have the cherry-picks listed here. In order to make daily build recipes build correctly we drop the cherry-picks from the packaging branch now. drop the following cherry picks: cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if
Diffstat (limited to 'debian')
-rw-r--r--debian/patches/cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if230
-rw-r--r--debian/patches/cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during389
-rw-r--r--debian/patches/series2
3 files changed, 0 insertions, 621 deletions
diff --git a/debian/patches/cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if b/debian/patches/cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if
deleted file mode 100644
index 83aca30c..00000000
--- a/debian/patches/cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if
+++ /dev/null
@@ -1,230 +0,0 @@
-From 11172924a48a47a7231d19d9cefe628dfddda8bf Mon Sep 17 00:00:00 2001
-From: Scott Moser <smoser@ubuntu.com>
-Date: Mon, 30 Apr 2018 13:21:51 -0600
-Subject: [PATCH] IBMCloud: Disable config-drive and nocloud only if IBMCloud
- is enabled.
-
-Ubuntu images on IBMCloud for 16.04 have some seed data in
-/var/lib/cloud/data/seed/nocloud-net. In order to have systems with
-IBMCloud enabled, we modified ds-identify detection to skip that seed
-if the system was on IBMCloud. That change did not consider the
-fact that IBMCloud might not be in the datasource list.
-
-There was similar logic in the ConfigDrive datasource in ds-identify
-and the datasource itself.
-
-Config drive is now updated to only check and avoid IBMCloud if IBMCloud
-is enabled. The check in ds-identify for nocloud was dropped. If a
-user provides a nocloud seed on IBMCloud, then that can be used.
-
-This means that systems running Xenial will continue to get their
-old datasources.
-
-LP: #1766401
----
- cloudinit/sources/DataSourceConfigDrive.py | 11 +++-
- tests/unittests/test_ds_identify.py | 77 ++++++++++++++++++++--
- tools/ds-identify | 17 +++--
- 3 files changed, 91 insertions(+), 14 deletions(-)
-
---- a/cloudinit/sources/DataSourceConfigDrive.py
-+++ b/cloudinit/sources/DataSourceConfigDrive.py
-@@ -69,7 +69,8 @@ class DataSourceConfigDrive(openstack.So
- util.logexc(LOG, "Failed reading config drive from %s", sdir)
-
- if not found:
-- for dev in find_candidate_devs():
-+ dslist = self.sys_cfg.get('datasource_list')
-+ for dev in find_candidate_devs(dslist=dslist):
- try:
- # Set mtype if freebsd and turn off sync
- if dev.startswith("/dev/cd"):
-@@ -211,7 +212,7 @@ def write_injected_files(files):
- util.logexc(LOG, "Failed writing file: %s", filename)
-
-
--def find_candidate_devs(probe_optical=True):
-+def find_candidate_devs(probe_optical=True, dslist=None):
- """Return a list of devices that may contain the config drive.
-
- The returned list is sorted by search order where the first item has
-@@ -227,6 +228,9 @@ def find_candidate_devs(probe_optical=Tr
- * either vfat or iso9660 formated
- * labeled with 'config-2' or 'CONFIG-2'
- """
-+ if dslist is None:
-+ dslist = []
-+
- # query optical drive to get it in blkid cache for 2.6 kernels
- if probe_optical:
- for device in OPTICAL_DEVICES:
-@@ -257,7 +261,8 @@ def find_candidate_devs(probe_optical=Tr
- devices = [d for d in candidates
- if d in by_label or not util.is_partition(d)]
-
-- if devices:
-+ LOG.debug("devices=%s dslist=%s", devices, dslist)
-+ if devices and "IBMCloud" in dslist:
- # IBMCloud uses config-2 label, but limited to a single UUID.
- ibm_platform, ibm_path = get_ibm_platform()
- if ibm_path in devices:
---- a/tests/unittests/test_ds_identify.py
-+++ b/tests/unittests/test_ds_identify.py
-@@ -184,17 +184,18 @@ class DsIdentifyBase(CiTestCase):
- data, RC_FOUND, dslist=[data.get('ds'), DS_NONE])
-
- def _check_via_dict(self, data, rc, dslist=None, **kwargs):
-- found_rc, out, err, cfg, files = self._call_via_dict(data, **kwargs)
-+ ret = self._call_via_dict(data, **kwargs)
- good = False
- try:
-- self.assertEqual(rc, found_rc)
-+ self.assertEqual(rc, ret.rc)
- if dslist is not None:
-- self.assertEqual(dslist, cfg['datasource_list'])
-+ self.assertEqual(dslist, ret.cfg['datasource_list'])
- good = True
- finally:
- if not good:
-- _print_run_output(rc, out, err, cfg, files)
-- return rc, out, err, cfg, files
-+ _print_run_output(ret.rc, ret.stdout, ret.stderr, ret.cfg,
-+ ret.files)
-+ return ret
-
-
- class TestDsIdentify(DsIdentifyBase):
-@@ -245,13 +246,40 @@ class TestDsIdentify(DsIdentifyBase):
- def test_config_drive(self):
- """ConfigDrive datasource has a disk with LABEL=config-2."""
- self._test_ds_found('ConfigDrive')
-- return
-
- def test_config_drive_upper(self):
- """ConfigDrive datasource has a disk with LABEL=CONFIG-2."""
- self._test_ds_found('ConfigDriveUpper')
- return
-
-+ def test_config_drive_seed(self):
-+ """Config Drive seed directory."""
-+ self._test_ds_found('ConfigDrive-seed')
-+
-+ def test_config_drive_interacts_with_ibmcloud_config_disk(self):
-+ """Verify ConfigDrive interaction with IBMCloud.
-+
-+ If ConfigDrive is enabled and not IBMCloud, then ConfigDrive
-+ should claim the ibmcloud 'config-2' disk.
-+ If IBMCloud is enabled, then ConfigDrive should skip."""
-+ data = copy.deepcopy(VALID_CFG['IBMCloud-config-2'])
-+ files = data.get('files', {})
-+ if not files:
-+ data['files'] = files
-+ cfgpath = 'etc/cloud/cloud.cfg.d/99_networklayer_common.cfg'
-+
-+ # with list including IBMCloud, config drive should be not found.
-+ files[cfgpath] = 'datasource_list: [ ConfigDrive, IBMCloud ]\n'
-+ ret = self._check_via_dict(data, shell_true)
-+ self.assertEqual(
-+ ret.cfg.get('datasource_list'), ['IBMCloud', 'None'])
-+
-+ # But if IBMCloud is not enabled, config drive should claim this.
-+ files[cfgpath] = 'datasource_list: [ ConfigDrive, NoCloud ]\n'
-+ ret = self._check_via_dict(data, shell_true)
-+ self.assertEqual(
-+ ret.cfg.get('datasource_list'), ['ConfigDrive', 'None'])
-+
- def test_ibmcloud_template_userdata_in_provisioning(self):
- """Template provisioned with user-data during provisioning stage.
-
-@@ -307,6 +335,37 @@ class TestDsIdentify(DsIdentifyBase):
- self._check_via_dict(
- data, rc=RC_FOUND, dslist=['ConfigDrive', DS_NONE])
-
-+ def test_ibmcloud_with_nocloud_seed(self):
-+ """NoCloud seed should be preferred over IBMCloud.
-+
-+ A nocloud seed should be preferred over IBMCloud even if enabled.
-+ Ubuntu 16.04 images have <vlc>/seed/nocloud-net. LP: #1766401."""
-+ data = copy.deepcopy(VALID_CFG['IBMCloud-config-2'])
-+ files = data.get('files', {})
-+ if not files:
-+ data['files'] = files
-+ files.update(VALID_CFG['NoCloud-seed']['files'])
-+ ret = self._check_via_dict(data, shell_true)
-+ self.assertEqual(
-+ ['NoCloud', 'IBMCloud', 'None'],
-+ ret.cfg.get('datasource_list'))
-+
-+ def test_ibmcloud_with_configdrive_seed(self):
-+ """ConfigDrive seed should be preferred over IBMCloud.
-+
-+ A ConfigDrive seed should be preferred over IBMCloud even if enabled.
-+ Ubuntu 16.04 images have a fstab entry that mounts the
-+ METADATA disk into <vlc>/seed/config_drive. LP: ##1766401."""
-+ data = copy.deepcopy(VALID_CFG['IBMCloud-config-2'])
-+ files = data.get('files', {})
-+ if not files:
-+ data['files'] = files
-+ files.update(VALID_CFG['ConfigDrive-seed']['files'])
-+ ret = self._check_via_dict(data, shell_true)
-+ self.assertEqual(
-+ ['ConfigDrive', 'IBMCloud', 'None'],
-+ ret.cfg.get('datasource_list'))
-+
- def test_policy_disabled(self):
- """A Builtin policy of 'disabled' should return not found.
-
-@@ -684,6 +743,12 @@ VALID_CFG = {
- },
- ],
- },
-+ 'ConfigDrive-seed': {
-+ 'ds': 'ConfigDrive',
-+ 'files': {
-+ os.path.join(P_SEED_DIR, 'config_drive', 'openstack',
-+ 'latest', 'meta_data.json'): 'md\n'},
-+ },
- 'Hetzner': {
- 'ds': 'Hetzner',
- 'files': {P_SYS_VENDOR: 'Hetzner\n'},
---- a/tools/ds-identify
-+++ b/tools/ds-identify
-@@ -601,7 +601,6 @@ dscheck_NoCloud() {
- *\ ds=nocloud*) return ${DS_FOUND};;
- esac
-
-- is_ibm_cloud && return ${DS_NOT_FOUND}
- for d in nocloud nocloud-net; do
- check_seed_dir "$d" meta-data user-data && return ${DS_FOUND}
- check_writable_seed_dir "$d" meta-data user-data && return ${DS_FOUND}
-@@ -612,11 +611,12 @@ dscheck_NoCloud() {
- return ${DS_NOT_FOUND}
- }
-
-+is_ds_enabled() {
-+ local name="$1" pad=" ${DI_DSLIST} "
-+ [ "${pad#* $name }" != "${pad}" ]
-+}
-+
- check_configdrive_v2() {
-- is_ibm_cloud && return ${DS_NOT_FOUND}
-- if has_fs_with_label CONFIG-2 config-2; then
-- return ${DS_FOUND}
-- fi
- # look in /config-drive <vlc>/seed/config_drive for a directory
- # openstack/YYYY-MM-DD format with a file meta_data.json
- local d=""
-@@ -631,6 +631,13 @@ check_configdrive_v2() {
- debug 1 "config drive seeded directory had only 'latest'"
- return ${DS_FOUND}
- fi
-+
-+ is_ds_enabled "IBMCloud"
-+ debug 1 "is_ds_enabled returned $?: $DI_DSLIST"
-+ is_ds_enabled "IBMCloud" && is_ibm_cloud && return ${DS_NOT_FOUND}
-+ if has_fs_with_label CONFIG-2 config-2; then
-+ return ${DS_FOUND}
-+ fi
- return ${DS_NOT_FOUND}
- }
-
diff --git a/debian/patches/cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during b/debian/patches/cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during
deleted file mode 100644
index a693543c..00000000
--- a/debian/patches/cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during
+++ /dev/null
@@ -1,389 +0,0 @@
-From 6ef92c98c3d2b127b05d6708337efc8a81e00071 Mon Sep 17 00:00:00 2001
-From: Scott Moser <smoser@ubuntu.com>
-Date: Thu, 26 Apr 2018 16:24:24 -0500
-Subject: [PATCH] IBMCloud: recognize provisioning environment during debug
- boots.
-
-When images are deployed from template in a production environment
-the artifacts of the provisioning stage (provisioningConfiguration.cfg)
-that cloud-init referenced are cleaned up. However, when provisioned
-in "debug" mode (internal to IBM) the artifacts are left.
-
-This changes the 'is_ibm_provisioning' implementations in both
-ds-identify and in the IBM datasource to identify the provisioning
-stage more correctly. The change is to consider provisioning only
-if the provisioing file existed and there was no log file or
-the log file was older than this boot.
-
-LP: #1767166
----
- cloudinit/sources/DataSourceIBMCloud.py | 42 +++++++----
- cloudinit/tests/helpers.py | 13 +++-
- .../test_datasource/test_ibmcloud.py | 50 +++++++++++++
- tests/unittests/test_ds_identify.py | 72 ++++++++++++++++---
- tools/ds-identify | 21 +++++-
- 5 files changed, 175 insertions(+), 23 deletions(-)
-
---- a/cloudinit/sources/DataSourceIBMCloud.py
-+++ b/cloudinit/sources/DataSourceIBMCloud.py
-@@ -8,17 +8,11 @@ There are 2 different api exposed launch
- * template: This is the legacy method of launching instances.
- When booting from an image template, the system boots first into
- a "provisioning" mode. There, host <-> guest mechanisms are utilized
-- to execute code in the guest and provision it.
-+ to execute code in the guest and configure it. The configuration
-+ includes configuring the system network and possibly installing
-+ packages and other software stack.
-
-- Cloud-init will disable itself when it detects that it is in the
-- provisioning mode. It detects this by the presence of
-- a file '/root/provisioningConfiguration.cfg'.
--
-- When provided with user-data, the "first boot" will contain a
-- ConfigDrive-like disk labeled with 'METADATA'. If there is no user-data
-- provided, then there is no data-source.
--
-- Cloud-init never does any network configuration in this mode.
-+ After the provisioning is finished, the system reboots.
-
- * os_code: Essentially "launch by OS Code" (Operating System Code).
- This is a more modern approach. There is no specific "provisioning" boot.
-@@ -138,8 +132,30 @@ def _is_xen():
- return os.path.exists("/proc/xen")
-
-
--def _is_ibm_provisioning():
-- return os.path.exists("/root/provisioningConfiguration.cfg")
-+def _is_ibm_provisioning(
-+ prov_cfg="/root/provisioningConfiguration.cfg",
-+ inst_log="/root/swinstall.log",
-+ boot_ref="/proc/1/environ"):
-+ """Return boolean indicating if this boot is ibm provisioning boot."""
-+ if os.path.exists(prov_cfg):
-+ msg = "config '%s' exists." % prov_cfg
-+ result = True
-+ if os.path.exists(inst_log):
-+ if os.path.exists(boot_ref):
-+ result = (os.stat(inst_log).st_mtime >
-+ os.stat(boot_ref).st_mtime)
-+ msg += (" log '%s' from %s boot." %
-+ (inst_log, "current" if result else "previous"))
-+ else:
-+ msg += (" log '%s' existed, but no reference file '%s'." %
-+ (inst_log, boot_ref))
-+ result = False
-+ else:
-+ msg += " log '%s' did not exist." % inst_log
-+ else:
-+ result, msg = (False, "config '%s' did not exist." % prov_cfg)
-+ LOG.debug("ibm_provisioning=%s: %s", result, msg)
-+ return result
-
-
- def get_ibm_platform():
-@@ -189,7 +205,7 @@ def get_ibm_platform():
- else:
- return (Platforms.TEMPLATE_LIVE_METADATA, metadata_path)
- elif _is_ibm_provisioning():
-- return (Platforms.TEMPLATE_PROVISIONING_NODATA, None)
-+ return (Platforms.TEMPLATE_PROVISIONING_NODATA, None)
- return not_found
-
-
---- a/cloudinit/tests/helpers.py
-+++ b/cloudinit/tests/helpers.py
-@@ -8,6 +8,7 @@ import os
- import shutil
- import sys
- import tempfile
-+import time
- import unittest
-
- import mock
-@@ -285,7 +286,8 @@ class FilesystemMockingTestCase(Resource
- os.path: [('isfile', 1), ('exists', 1),
- ('islink', 1), ('isdir', 1), ('lexists', 1)],
- os: [('listdir', 1), ('mkdir', 1),
-- ('lstat', 1), ('symlink', 2)]
-+ ('lstat', 1), ('symlink', 2),
-+ ('stat', 1)]
- }
-
- if hasattr(os, 'scandir'):
-@@ -354,6 +356,15 @@ def populate_dir(path, files):
- return ret
-
-
-+def populate_dir_with_ts(path, data):
-+ """data is {'file': ('contents', mtime)}. mtime relative to now."""
-+ populate_dir(path, dict((k, v[0]) for k, v in data.items()))
-+ btime = time.time()
-+ for fpath, (_contents, mtime) in data.items():
-+ ts = btime + mtime if mtime else btime
-+ os.utime(os.path.sep.join((path, fpath)), (ts, ts))
-+
-+
- def dir2dict(startdir, prefix=None):
- flist = {}
- if prefix is None:
---- a/tests/unittests/test_datasource/test_ibmcloud.py
-+++ b/tests/unittests/test_datasource/test_ibmcloud.py
-@@ -259,4 +259,54 @@ class TestReadMD(test_helpers.CiTestCase
- ret['metadata'])
-
-
-+class TestIsIBMProvisioning(test_helpers.FilesystemMockingTestCase):
-+ """Test the _is_ibm_provisioning method."""
-+ inst_log = "/root/swinstall.log"
-+ prov_cfg = "/root/provisioningConfiguration.cfg"
-+ boot_ref = "/proc/1/environ"
-+ with_logs = True
-+
-+ def _call_with_root(self, rootd):
-+ self.reRoot(rootd)
-+ return ibm._is_ibm_provisioning()
-+
-+ def test_no_config(self):
-+ """No provisioning config means not provisioning."""
-+ self.assertFalse(self._call_with_root(self.tmp_dir()))
-+
-+ def test_config_only(self):
-+ """A provisioning config without a log means provisioning."""
-+ rootd = self.tmp_dir()
-+ test_helpers.populate_dir(rootd, {self.prov_cfg: "key=value"})
-+ self.assertTrue(self._call_with_root(rootd))
-+
-+ def test_config_with_old_log(self):
-+ """A config with a log from previous boot is not provisioning."""
-+ rootd = self.tmp_dir()
-+ data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10),
-+ self.inst_log: ("log data\n", -30),
-+ self.boot_ref: ("PWD=/", 0)}
-+ test_helpers.populate_dir_with_ts(rootd, data)
-+ self.assertFalse(self._call_with_root(rootd=rootd))
-+ self.assertIn("from previous boot", self.logs.getvalue())
-+
-+ def test_config_with_new_log(self):
-+ """A config with a log from this boot is provisioning."""
-+ rootd = self.tmp_dir()
-+ data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10),
-+ self.inst_log: ("log data\n", 30),
-+ self.boot_ref: ("PWD=/", 0)}
-+ test_helpers.populate_dir_with_ts(rootd, data)
-+ self.assertTrue(self._call_with_root(rootd=rootd))
-+ self.assertIn("from current boot", self.logs.getvalue())
-+
-+ def test_config_and_log_no_reference(self):
-+ """If the config and log existed, but no reference, assume not."""
-+ rootd = self.tmp_dir()
-+ test_helpers.populate_dir(
-+ rootd, {self.prov_cfg: "key=value", self.inst_log: "log data\n"})
-+ self.assertFalse(self._call_with_root(rootd=rootd))
-+ self.assertIn("no reference file", self.logs.getvalue())
-+
-+
- # vi: ts=4 expandtab
---- a/tests/unittests/test_ds_identify.py
-+++ b/tests/unittests/test_ds_identify.py
-@@ -1,5 +1,6 @@
- # This file is part of cloud-init. See LICENSE file for license information.
-
-+from collections import namedtuple
- import copy
- import os
- from uuid import uuid4
-@@ -7,7 +8,7 @@ from uuid import uuid4
- from cloudinit import safeyaml
- from cloudinit import util
- from cloudinit.tests.helpers import (
-- CiTestCase, dir2dict, populate_dir)
-+ CiTestCase, dir2dict, populate_dir, populate_dir_with_ts)
-
- from cloudinit.sources import DataSourceIBMCloud as dsibm
-
-@@ -66,7 +67,6 @@ P_SYS_VENDOR = "sys/class/dmi/id/sys_ven
- P_SEED_DIR = "var/lib/cloud/seed"
- P_DSID_CFG = "etc/cloud/ds-identify.cfg"
-
--IBM_PROVISIONING_CHECK_PATH = "/root/provisioningConfiguration.cfg"
- IBM_CONFIG_UUID = "9796-932E"
-
- MOCK_VIRT_IS_KVM = {'name': 'detect_virt', 'RET': 'kvm', 'ret': 0}
-@@ -74,11 +74,17 @@ MOCK_VIRT_IS_VMWARE = {'name': 'detect_v
- MOCK_VIRT_IS_XEN = {'name': 'detect_virt', 'RET': 'xen', 'ret': 0}
- MOCK_UNAME_IS_PPC64 = {'name': 'uname', 'out': UNAME_PPC64EL, 'ret': 0}
-
-+shell_true = 0
-+shell_false = 1
-
--class TestDsIdentify(CiTestCase):
-+CallReturn = namedtuple('CallReturn',
-+ ['rc', 'stdout', 'stderr', 'cfg', 'files'])
-+
-+
-+class DsIdentifyBase(CiTestCase):
- dsid_path = os.path.realpath('tools/ds-identify')
-
-- def call(self, rootd=None, mocks=None, args=None, files=None,
-+ def call(self, rootd=None, mocks=None, func="main", args=None, files=None,
- policy_dmi=DI_DEFAULT_POLICY,
- policy_no_dmi=DI_DEFAULT_POLICY_NO_DMI,
- ec2_strict_id=DI_EC2_STRICT_ID_DEFAULT):
-@@ -135,7 +141,7 @@ class TestDsIdentify(CiTestCase):
- mocklines.append(write_mock(d))
-
- endlines = [
-- 'main %s' % ' '.join(['"%s"' % s for s in args])
-+ func + ' ' + ' '.join(['"%s"' % s for s in args])
- ]
-
- with open(wrap, "w") as fp:
-@@ -159,7 +165,7 @@ class TestDsIdentify(CiTestCase):
- cfg = {"_INVALID_YAML": contents,
- "_EXCEPTION": str(e)}
-
-- return rc, out, err, cfg, dir2dict(rootd)
-+ return CallReturn(rc, out, err, cfg, dir2dict(rootd))
-
- def _call_via_dict(self, data, rootd=None, **kwargs):
- # return output of self.call with a dict input like VALID_CFG[item]
-@@ -190,6 +196,8 @@ class TestDsIdentify(CiTestCase):
- _print_run_output(rc, out, err, cfg, files)
- return rc, out, err, cfg, files
-
-+
-+class TestDsIdentify(DsIdentifyBase):
- def test_wb_print_variables(self):
- """_print_info reports an array of discovered variables to stderr."""
- data = VALID_CFG['Azure-dmi-detection']
-@@ -250,7 +258,10 @@ class TestDsIdentify(CiTestCase):
- Template provisioning with user-data has METADATA disk,
- datasource should return not found."""
- data = copy.deepcopy(VALID_CFG['IBMCloud-metadata'])
-- data['files'] = {IBM_PROVISIONING_CHECK_PATH: 'xxx'}
-+ # change the 'is_ibm_provisioning' mock to return 1 (false)
-+ isprov_m = [m for m in data['mocks']
-+ if m["name"] == "is_ibm_provisioning"][0]
-+ isprov_m['ret'] = shell_true
- return self._check_via_dict(data, RC_NOT_FOUND)
-
- def test_ibmcloud_template_userdata(self):
-@@ -265,7 +276,8 @@ class TestDsIdentify(CiTestCase):
-
- no disks attached. Datasource should return not found."""
- data = copy.deepcopy(VALID_CFG['IBMCloud-nodisks'])
-- data['files'] = {IBM_PROVISIONING_CHECK_PATH: 'xxx'}
-+ data['mocks'].append(
-+ {'name': 'is_ibm_provisioning', 'ret': shell_true})
- return self._check_via_dict(data, RC_NOT_FOUND)
-
- def test_ibmcloud_template_no_userdata(self):
-@@ -446,6 +458,47 @@ class TestDsIdentify(CiTestCase):
- self._test_ds_found('Hetzner')
-
-
-+class TestIsIBMProvisioning(DsIdentifyBase):
-+ """Test the is_ibm_provisioning method in ds-identify."""
-+
-+ inst_log = "/root/swinstall.log"
-+ prov_cfg = "/root/provisioningConfiguration.cfg"
-+ boot_ref = "/proc/1/environ"
-+ funcname = "is_ibm_provisioning"
-+
-+ def test_no_config(self):
-+ """No provisioning config means not provisioning."""
-+ ret = self.call(files={}, func=self.funcname)
-+ self.assertEqual(shell_false, ret.rc)
-+
-+ def test_config_only(self):
-+ """A provisioning config without a log means provisioning."""
-+ ret = self.call(files={self.prov_cfg: "key=value"}, func=self.funcname)
-+ self.assertEqual(shell_true, ret.rc)
-+
-+ def test_config_with_old_log(self):
-+ """A config with a log from previous boot is not provisioning."""
-+ rootd = self.tmp_dir()
-+ data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10),
-+ self.inst_log: ("log data\n", -30),
-+ self.boot_ref: ("PWD=/", 0)}
-+ populate_dir_with_ts(rootd, data)
-+ ret = self.call(rootd=rootd, func=self.funcname)
-+ self.assertEqual(shell_false, ret.rc)
-+ self.assertIn("from previous boot", ret.stderr)
-+
-+ def test_config_with_new_log(self):
-+ """A config with a log from this boot is provisioning."""
-+ rootd = self.tmp_dir()
-+ data = {self.prov_cfg: ("key=value\nkey2=val2\n", -10),
-+ self.inst_log: ("log data\n", 30),
-+ self.boot_ref: ("PWD=/", 0)}
-+ populate_dir_with_ts(rootd, data)
-+ ret = self.call(rootd=rootd, func=self.funcname)
-+ self.assertEqual(shell_true, ret.rc)
-+ self.assertIn("from current boot", ret.stderr)
-+
-+
- def blkid_out(disks=None):
- """Convert a list of disk dictionaries into blkid content."""
- if disks is None:
-@@ -639,6 +692,7 @@ VALID_CFG = {
- 'ds': 'IBMCloud',
- 'mocks': [
- MOCK_VIRT_IS_XEN,
-+ {'name': 'is_ibm_provisioning', 'ret': shell_false},
- {'name': 'blkid', 'ret': 0,
- 'out': blkid_out(
- [{'DEVNAME': 'xvda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()},
-@@ -652,6 +706,7 @@ VALID_CFG = {
- 'ds': 'IBMCloud',
- 'mocks': [
- MOCK_VIRT_IS_XEN,
-+ {'name': 'is_ibm_provisioning', 'ret': shell_false},
- {'name': 'blkid', 'ret': 0,
- 'out': blkid_out(
- [{'DEVNAME': 'xvda1', 'TYPE': 'ext3', 'PARTUUID': uuid4(),
-@@ -669,6 +724,7 @@ VALID_CFG = {
- 'ds': 'IBMCloud',
- 'mocks': [
- MOCK_VIRT_IS_XEN,
-+ {'name': 'is_ibm_provisioning', 'ret': shell_false},
- {'name': 'blkid', 'ret': 0,
- 'out': blkid_out(
- [{'DEVNAME': 'xvda1', 'TYPE': 'vfat', 'PARTUUID': uuid4()},
---- a/tools/ds-identify
-+++ b/tools/ds-identify
-@@ -125,6 +125,7 @@ DI_ON_NOTFOUND=""
- DI_EC2_STRICT_ID_DEFAULT="warn"
-
- _IS_IBM_CLOUD=""
-+_IS_IBM_PROVISIONING=""
-
- error() {
- set -- "ERROR:" "$@";
-@@ -1006,7 +1007,25 @@ dscheck_Hetzner() {
- }
-
- is_ibm_provisioning() {
-- [ -f "${PATH_ROOT}/root/provisioningConfiguration.cfg" ]
-+ local pcfg="${PATH_ROOT}/root/provisioningConfiguration.cfg"
-+ local logf="${PATH_ROOT}/root/swinstall.log"
-+ local is_prov=false msg="config '$pcfg' did not exist."
-+ if [ -f "$pcfg" ]; then
-+ msg="config '$pcfg' exists."
-+ is_prov=true
-+ if [ -f "$logf" ]; then
-+ if [ "$logf" -nt "$PATH_PROC_1_ENVIRON" ]; then
-+ msg="$msg log '$logf' from current boot."
-+ else
-+ is_prov=false
-+ msg="$msg log '$logf' from previous boot."
-+ fi
-+ else
-+ msg="$msg log '$logf' did not exist."
-+ fi
-+ fi
-+ debug 2 "ibm_provisioning=$is_prov: $msg"
-+ [ "$is_prov" = "true" ]
- }
-
- is_ibm_cloud() {
diff --git a/debian/patches/series b/debian/patches/series
index 7351c3a2..7e909afc 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,5 +1,3 @@
azure-use-walinux-agent.patch
ds-identify-behavior-xenial.patch
stable-release-no-jsonschema-dep.patch
-cpick-6ef92c98-IBMCloud-recognize-provisioning-environment-during
-cpick-11172924-IBMCloud-Disable-config-drive-and-nocloud-only-if