← Back to team overview

curtin-dev team mailing list archive

[Merge] ~gyurco/curtin:vroc into curtin:master

 

György Szombathelyi has proposed merging ~gyurco/curtin:vroc into curtin:master.

Commit message:
Support imsm external metadata RAID containers LP: #1893661

Requested reviews:
  curtin developers (curtin-dev)

For more details, see:
https://code.launchpad.net/~gyurco/curtin/+git/curtin/+merge/390234
-- 
Your team curtin developers is requested to review the proposed merge of ~gyurco/curtin:vroc into curtin:master.
diff --git a/Makefile b/Makefile
index 187132c..b247d9a 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,11 @@ ifeq ($(COVERAGE), 1)
 endif
 CURTIN_VMTEST_IMAGE_SYNC ?= False
 export CURTIN_VMTEST_IMAGE_SYNC
+<<<<<<< Makefile
 noseopts ?= -vv
+=======
+noseopts ?= -vv --nologcapture
+>>>>>>> Makefile
 pylintopts ?= --rcfile=pylintrc --errors-only
 target_dirs ?= curtin tests tools
 
diff --git a/curtin/__init__.py b/curtin/__init__.py
index 092020b..a12381f 100644
--- a/curtin/__init__.py
+++ b/curtin/__init__.py
@@ -34,8 +34,11 @@ FEATURES = [
     'APT_CONFIG_V1',
     # has version module
     'HAS_VERSION_MODULE',
+<<<<<<< curtin/__init__.py
     # uefi_reoder has fallback support if BootCurrent is missing
     'UEFI_REORDER_FALLBACK_SUPPORT',
+=======
+>>>>>>> curtin/__init__.py
 ]
 
 __version__ = "20.1"
diff --git a/curtin/block/__init__.py b/curtin/block/__init__.py
index 10b8b9e..782cb4c 100644
--- a/curtin/block/__init__.py
+++ b/curtin/block/__init__.py
@@ -853,8 +853,11 @@ def _get_dev_disk_by_prefix(prefix):
      '/dev/sda1': '/dev/disk/<prefix>/virtio-aaaa-part1',
     }
     """
+<<<<<<< curtin/block/__init__.py
     if not os.path.exists(prefix):
         return {}
+=======
+>>>>>>> curtin/block/__init__.py
     return {
         os.path.realpath(bypfx): bypfx
         for bypfx in [os.path.join(prefix, path)
diff --git a/curtin/block/clear_holders.py b/curtin/block/clear_holders.py
index 116ee81..b124306 100644
--- a/curtin/block/clear_holders.py
+++ b/curtin/block/clear_holders.py
@@ -165,11 +165,25 @@ def shutdown_mdadm(device):
     """
 
     blockdev = block.sysfs_to_devpath(device)
+<<<<<<< curtin/block/clear_holders.py
 
     LOG.info('Discovering raid devices and spares for %s', device)
     md_devs = (
         mdadm.md_get_devices_list(blockdev) +
         mdadm.md_get_spares_list(blockdev))
+=======
+    query = mdadm.mdadm_query_detail(blockdev)
+
+    if query.get('MD_CONTAINER'):
+        LOG.info('Array is in a container, skip discovering raid devices and spares for %s', device)
+        md_devs = ()
+    else:
+        LOG.info('Discovering raid devices and spares for %s', device)
+        md_devs = (
+            mdadm.md_get_devices_list(blockdev) +
+            mdadm.md_get_spares_list(blockdev))
+
+>>>>>>> curtin/block/clear_holders.py
     mdadm.set_sync_action(blockdev, action="idle")
     mdadm.set_sync_action(blockdev, action="frozen")
 
@@ -186,7 +200,11 @@ def shutdown_mdadm(device):
         LOG.debug('Non-fatal error writing to array device %s, '
                   'proceeding with shutdown: %s', blockdev, e)
 
+<<<<<<< curtin/block/clear_holders.py
     LOG.info('Removing raid array members: %s', md_devs)
+=======
+    LOG.info('Removing raid array members: ', md_devs)
+>>>>>>> curtin/block/clear_holders.py
     for mddev in md_devs:
         try:
             mdadm.fail_device(blockdev, mddev)
@@ -198,7 +216,11 @@ def shutdown_mdadm(device):
     LOG.debug('using mdadm.mdadm_stop on dev: %s', blockdev)
     mdadm.mdadm_stop(blockdev)
 
+<<<<<<< curtin/block/clear_holders.py
     LOG.debug('Wiping mdadm member devices: %s' % md_devs)
+=======
+    LOG.debug('Wiping mdadm member devices: ', md_devs)
+>>>>>>> curtin/block/clear_holders.py
     for mddev in md_devs:
         mdadm.zero_device(mddev, force=True)
 
diff --git a/curtin/block/dasd.py b/curtin/block/dasd.py
index b7008f6..8269321 100644
--- a/curtin/block/dasd.py
+++ b/curtin/block/dasd.py
@@ -269,9 +269,15 @@ def _valid_device_id(device_id):
     if not (0 <= int(dsn, 16) < 256):
         raise ValueError("device_id invalid: dsn not in 0-255: '%s'" % dsn)
 
+<<<<<<< curtin/block/dasd.py
     if not (0 <= int(dev.lower(), 16) <= 65535):
         raise ValueError(
             "device_id invalid: devno not in 0-0xffff: '%s'" % dev)
+=======
+    if not (0 <= int(dev.lower(), 16) < 65535):
+        raise ValueError(
+            "device_id invalid: devno not in 0-0x10000: '%s'" % dev)
+>>>>>>> curtin/block/dasd.py
 
     return True
 
diff --git a/curtin/block/mdadm.py b/curtin/block/mdadm.py
index 32b467c..5ffb8fb 100644
--- a/curtin/block/mdadm.py
+++ b/curtin/block/mdadm.py
@@ -26,6 +26,10 @@ from curtin.log import LOG
 
 NOSPARE_RAID_LEVELS = [
     'linear', 'raid0', '0', 0,
+<<<<<<< curtin/block/mdadm.py
+=======
+    'container'
+>>>>>>> curtin/block/mdadm.py
 ]
 
 SPARE_RAID_LEVELS = [
@@ -145,7 +149,11 @@ def mdadm_assemble(md_devname=None, devices=[], spares=[], scan=False,
     udev.udevadm_settle()
 
 
+<<<<<<< curtin/block/mdadm.py
 def mdadm_create(md_devname, raidlevel, devices, spares=None, md_name="",
+=======
+def mdadm_create(md_devname, raidlevel, devices, spares=None, container_devcnt=None, md_name="",
+>>>>>>> curtin/block/mdadm.py
                  metadata=None):
     LOG.debug('mdadm_create: ' +
               'md_name=%s raidlevel=%s ' % (md_devname, raidlevel) +
@@ -159,8 +167,14 @@ def mdadm_create(md_devname, raidlevel, devices, spares=None, md_name="",
         raise ValueError('Invalid raidlevel: [{}]'.format(raidlevel))
 
     min_devices = md_minimum_devices(raidlevel)
+<<<<<<< curtin/block/mdadm.py
     if len(devices) < min_devices:
         err = 'Not enough devices for raidlevel: ' + str(raidlevel)
+=======
+    devcnt = len(devices) if not container_devcnt else container_devcnt
+    if devcnt < min_devices:
+        err = 'Not enough devices (' + str(devcnt) + ') for raidlevel: ' + str(raidlevel)
+>>>>>>> curtin/block/mdadm.py
         err += ' minimum devices needed: ' + str(min_devices)
         raise ValueError(err)
 
@@ -171,19 +185,40 @@ def mdadm_create(md_devname, raidlevel, devices, spares=None, md_name="",
     (hostname, _err) = util.subp(["hostname", "-s"], rcs=[0], capture=True)
 
     cmd = ["mdadm", "--create", md_devname, "--run",
+<<<<<<< curtin/block/mdadm.py
            "--metadata=%s" % metadata,
            "--homehost=%s" % hostname.strip(),
            "--level=%s" % raidlevel,
            "--raid-devices=%s" % len(devices)]
+=======
+           "--homehost=%s" % hostname.strip(),
+           "--raid-devices=%s" % devcnt]
+
+    if raidlevel == 'container' or not container_devcnt:
+        cmd.append("--metadata=%s" % metadata)
+    if raidlevel != 'container':
+        cmd.append("--level=%s" % raidlevel)
+
+>>>>>>> curtin/block/mdadm.py
     if md_name:
         cmd.append("--name=%s" % md_name)
 
     for device in devices:
+<<<<<<< curtin/block/mdadm.py
         holders = get_holders(device)
         if len(holders) > 0:
             LOG.warning('Detected holders during mdadm creation: %s', holders)
             raise OSError('Failed to remove holders from %s', device)
         zero_device(device)
+=======
+        if not container_devcnt:
+            # clear non-container devices
+            holders = get_holders(device)
+            if len(holders) > 0:
+                LOG.warning('Detected holders during mdadm creation: %s', holders)
+                raise OSError('Failed to remove holders from %s', device)
+            zero_device(device)
+>>>>>>> curtin/block/mdadm.py
         cmd.append(device)
 
     if spares:
@@ -508,7 +543,11 @@ def md_sysfs_attr(md_devname, attrname):
 
 
 def md_raidlevel_short(raidlevel):
+<<<<<<< curtin/block/mdadm.py
     if isinstance(raidlevel, int) or raidlevel in ['linear', 'stripe']:
+=======
+    if isinstance(raidlevel, int) or raidlevel in ['linear', 'stripe', 'container']:
+>>>>>>> curtin/block/mdadm.py
         return raidlevel
 
     return int(raidlevel.replace('raid', ''))
@@ -517,7 +556,11 @@ def md_raidlevel_short(raidlevel):
 def md_minimum_devices(raidlevel):
     ''' return the minimum number of devices for a given raid level '''
     rl = md_raidlevel_short(raidlevel)
+<<<<<<< curtin/block/mdadm.py
     if rl in [0, 1, 'linear', 'stripe']:
+=======
+    if rl in [0, 1, 'linear', 'stripe', 'container']:
+>>>>>>> curtin/block/mdadm.py
         return 2
     if rl in [5]:
         return 3
@@ -603,6 +646,14 @@ def __mdadm_detail_to_dict(input):
     # start after the first newline
     remainder = input[input.find('\n')+1:]
 
+<<<<<<< curtin/block/mdadm.py
+=======
+    # keep only the first section (imsm)
+    arraysection = remainder.find('\n[');
+    if arraysection != -1:
+        remainder = remainder[:arraysection]
+
+>>>>>>> curtin/block/mdadm.py
     #  FIXME: probably could do a better regex to match the LHS which
     #         has one, two or three words
     rem = r'(\w+|\w+\ \w+|\w+\ \w+\ \w+)\ \:\ ([a-zA-Z0-9\-\.,: \(\)=\']+)'
diff --git a/curtin/commands/block_meta.py b/curtin/commands/block_meta.py
index dee73b1..f599a17 100644
--- a/curtin/commands/block_meta.py
+++ b/curtin/commands/block_meta.py
@@ -1486,6 +1486,7 @@ def raid_handler(info, storage_config):
     raidlevel = info.get('raidlevel')
     spare_devices = info.get('spare_devices')
     md_devname = block.md_path(info.get('name'))
+<<<<<<< curtin/commands/block_meta.py
     preserve = config.value_as_boolean(info.get('preserve'))
     if not devices:
         raise ValueError("devices for raid must be specified")
@@ -1493,14 +1494,41 @@ def raid_handler(info, storage_config):
                          'raid4', 4, 'raid5', 5, 'raid6', 6, 'raid10', 10]:
         raise ValueError("invalid raidlevel '%s'" % raidlevel)
     if raidlevel in ['linear', 'raid0', 0, 'stripe']:
+=======
+    container = info.get('container')
+    metadata = info.get('metadata')
+    preserve = config.value_as_boolean(info.get('preserve'))
+    if not devices and not container:
+        raise ValueError("devices or container for raid must be specified")
+    if raidlevel not in ['linear', 'raid0', 0, 'stripe', 'raid1', 1, 'mirror',
+                         'raid4', 4, 'raid5', 5, 'raid6', 6, 'raid10', 10, 'container']:
+        raise ValueError("invalid raidlevel '%s'" % raidlevel)
+    if raidlevel in ['linear', 'raid0', 0, 'stripe', 'container']:
+>>>>>>> curtin/commands/block_meta.py
         if spare_devices:
             raise ValueError("spareunsupported in raidlevel '%s'" % raidlevel)
 
     LOG.debug('raid: cfg: %s', util.json_dumps(info))
+<<<<<<< curtin/commands/block_meta.py
     device_paths = list(get_path_to_storage_volume(dev, storage_config) for
                         dev in devices)
     LOG.debug('raid: device path mapping: %s',
               list(zip(devices, device_paths)))
+=======
+
+    devcnt = None
+    if container:
+        parent = storage_config.get(container)
+        if not parent:
+            raise ValueError("container with id '%s' not found" % parant)
+        device_paths = [parent.get('name')]
+        devcnt = len(parent.get('devices'))
+    else:
+        device_paths = list(get_path_to_storage_volume(dev, storage_config) for
+                    dev in devices)
+        LOG.debug('raid: device path mapping: {}'.format(
+            zip(devices, device_paths)))
+>>>>>>> curtin/commands/block_meta.py
 
     spare_device_paths = []
     if spare_devices:
@@ -1517,8 +1545,13 @@ def raid_handler(info, storage_config):
 
     if create_raid:
         mdadm.mdadm_create(md_devname, raidlevel,
+<<<<<<< curtin/commands/block_meta.py
                            device_paths, spare_device_paths,
                            info.get('mdname', ''))
+=======
+                           device_paths, spare_device_paths, devcnt,
+                           info.get('mdname', ''), metadata)
+>>>>>>> curtin/commands/block_meta.py
 
     wipe_mode = info.get('wipe')
     if wipe_mode:
diff --git a/curtin/commands/curthooks.py b/curtin/commands/curthooks.py
index 92230fc..20b4e7d 100644
--- a/curtin/commands/curthooks.py
+++ b/curtin/commands/curthooks.py
@@ -85,8 +85,11 @@ do_initrd = yes
 link_in_boot = {inboot}
 """
 
+<<<<<<< curtin/commands/curthooks.py
 UEFI_BOOT_ENTRY_IS_NETWORK = r'.*(Network|PXE|NIC|Ethernet|LAN|IP4|IP6)+.*'
 
+=======
+>>>>>>> curtin/commands/curthooks.py
 
 def do_apt_config(cfg, target):
     cfg = apt_config.translate_old_apt_features(cfg)
@@ -413,7 +416,10 @@ def install_kernel(cfg, target):
 def uefi_remove_old_loaders(grubcfg, target):
     """Removes the old UEFI loaders from efibootmgr."""
     efi_output = util.get_efibootmgr(target)
+<<<<<<< curtin/commands/curthooks.py
     LOG.debug('UEFI remove old olders efi output:\n%s', efi_output)
+=======
+>>>>>>> curtin/commands/curthooks.py
     current_uefi_boot = efi_output.get('current', None)
     old_efi_entries = {
         entry: info
@@ -440,6 +446,7 @@ def uefi_remove_old_loaders(grubcfg, target):
                     "should be removed.", info['name'])
 
 
+<<<<<<< curtin/commands/curthooks.py
 def uefi_boot_entry_is_network(boot_entry_name):
     """
     Return boolean if boot entry name looks like a known network entry.
@@ -504,11 +511,15 @@ def _reorder_new_entry(boot_order, efi_output, efi_orig=None, variant=None):
 
 
 def uefi_reorder_loaders(grubcfg, target, efi_orig=None, variant=None):
+=======
+def uefi_reorder_loaders(grubcfg, target):
+>>>>>>> curtin/commands/curthooks.py
     """Reorders the UEFI BootOrder to place BootCurrent first.
 
     The specifically doesn't try to do to much. The order in which grub places
     a new EFI loader is up to grub. This only moves the BootCurrent to the
     front of the BootOrder.
+<<<<<<< curtin/commands/curthooks.py
 
     In some systems, BootCurrent may not be set/present.  In this case
     curtin will attempt to place the new boot entry created when grub
@@ -524,6 +535,14 @@ def uefi_reorder_loaders(grubcfg, target, efi_orig=None, variant=None):
         force_fallback_reorder = config.value_as_boolean(
             grubcfg.get('reorder_uefi_force_fallback', False))
         if currently_booted and force_fallback_reorder is False:
+=======
+    """
+    if grubcfg.get('reorder_uefi', True):
+        efi_output = util.get_efibootmgr(target=target)
+        currently_booted = efi_output.get('current', None)
+        boot_order = efi_output.get('order', [])
+        if currently_booted:
+>>>>>>> curtin/commands/curthooks.py
             if currently_booted in boot_order:
                 boot_order.remove(currently_booted)
             boot_order = [currently_booted] + boot_order
@@ -531,6 +550,7 @@ def uefi_reorder_loaders(grubcfg, target, efi_orig=None, variant=None):
             LOG.debug(
                 "Setting currently booted %s as the first "
                 "UEFI loader.", currently_booted)
+<<<<<<< curtin/commands/curthooks.py
         else:
             reason = (
                 "config 'reorder_uefi_force_fallback' is True" if
@@ -548,6 +568,8 @@ def uefi_reorder_loaders(grubcfg, target, efi_orig=None, variant=None):
             else:
                 LOG.debug("UEFI No changes to boot order.")
         if new_boot_order:
+=======
+>>>>>>> curtin/commands/curthooks.py
             LOG.debug(
                 "New UEFI boot order: %s", new_boot_order)
             with util.ChrootableTarget(target) as in_chroot:
@@ -684,7 +706,11 @@ def uefi_find_grub_device_ids(sconfig):
     return grub_device_ids
 
 
+<<<<<<< curtin/commands/curthooks.py
 def setup_grub(cfg, target, osfamily=DISTROS.debian, variant=None):
+=======
+def setup_grub(cfg, target, osfamily=DISTROS.debian):
+>>>>>>> curtin/commands/curthooks.py
     # target is the path to the mounted filesystem
 
     # FIXME: these methods need moving to curtin.block
@@ -784,14 +810,22 @@ def setup_grub(cfg, target, osfamily=DISTROS.debian, variant=None):
 
     update_nvram = grubcfg.get('update_nvram', True)
     if uefi_bootable and update_nvram:
+<<<<<<< curtin/commands/curthooks.py
         efi_orig_output = util.get_efibootmgr(target)
+=======
+>>>>>>> curtin/commands/curthooks.py
         uefi_remove_old_loaders(grubcfg, target)
 
     install_grub(instdevs, target, uefi=uefi_bootable, grubcfg=grubcfg)
 
     if uefi_bootable and update_nvram:
+<<<<<<< curtin/commands/curthooks.py
         uefi_reorder_loaders(grubcfg, target, efi_orig_output, variant)
         uefi_remove_duplicate_entries(grubcfg, target)
+=======
+        uefi_remove_duplicate_entries(grubcfg, target)
+        uefi_reorder_loaders(grubcfg, target)
+>>>>>>> curtin/commands/curthooks.py
 
 
 def update_initramfs(target=None, all_kernels=False):
@@ -1827,8 +1861,12 @@ def builtin_curthooks(cfg, target, state):
                 name=stack_prefix + '/install-grub',
                 reporting_enabled=True, level="INFO",
                 description="installing grub to target devices"):
+<<<<<<< curtin/commands/curthooks.py
             setup_grub(cfg, target, osfamily=osfamily,
                        variant=distro_info.variant)
+=======
+            setup_grub(cfg, target, osfamily=osfamily)
+>>>>>>> curtin/commands/curthooks.py
 
 
 def curthooks(args):
diff --git a/curtin/commands/install_grub.py b/curtin/commands/install_grub.py
index 5f8311f..3317474 100644
--- a/curtin/commands/install_grub.py
+++ b/curtin/commands/install_grub.py
@@ -346,7 +346,11 @@ def install_grub(devices, target, uefi=None, grubcfg=None):
 
     LOG.debug("installing grub to target=%s devices=%s [replace_defaults=%s]",
               target, devices, grubcfg.get('replace_default'))
+<<<<<<< curtin/commands/install_grub.py
     update_nvram = config.value_as_boolean(grubcfg.get('update_nvram', True))
+=======
+    update_nvram = config.value_as_boolean(grubcfg.get('update_nvram', False))
+>>>>>>> curtin/commands/install_grub.py
     distroinfo = distro.get_distroinfo(target=target)
     target_arch = distro.get_architecture(target=target)
     rhel_ver = (distro.rpm_get_dist_id(target)
diff --git a/debian/README.source b/debian/README.source
new file mode 100644
index 0000000..ccf4119
--- /dev/null
+++ b/debian/README.source
@@ -0,0 +1,5 @@
+To pull a new upstream snapshot, given lp:curtin in ../trunk:
+
+ ./debian/new-upstream-snapshot ../trunk
+
+Then, edit changelog and look at entries in 'new-changes.log'.
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..d21b3ba
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,1339 @@
+curtin (20.1-20-g1304d3ea-0ubuntu1) groovy; urgency=medium
+
+  * New upstream snapshot.
+    - curthooks: uefi_find_grub_device_ids handle type:mount without path
+      (LP: #1892242)
+    - netplan openvswitch yaml changed (LP: #1891608)
+    - tools/curtainer: do not wait for snapd.seeded.service
+    - tools/curtainer: enable using ubuntu-minimal images
+    - vmtests: add Groovy [Paride Legovini]
+    - Drop the Eoan vmtests (EOL) [Paride Legovini]
+    - tools: rename remove-vmtest-release to vmtest-remove-release
+    - Snooze the tests failing because of LP: #1861941 for two more months
+      [Paride Legovini]
+    - LP: #1671951 is Fix Released => Drop the PPA [Paride Legovini]
+    - swaps: handle swapfiles on btrfs (LP: #1884161)
+    - curtainer: fail is masking of zfs-mount or zfs-share fails
+      [Paride Legovini]
+    - multipath: handle multipath nvme name fields correctly (LP: #1878041)
+    - curtainer: mask the zfs-mount and zfs-share services [Paride Legovini]
+    - tools/jenkins-runner: shuffle test-cases to randomize load
+      [Paride Legovini]
+    - Add Trusty/UEFI/HWE-X vmtest, drop realpath add, drop shell code
+    - LP: #1881977 - Install realpath on Trusty UEFI. [Lee Trager]
+    - vmtests: fix PreservePartitionWipeVg storage config
+    - Fix mdraid name creates broken configuration
+      [James Falcon] (LP: #1803933)
+    - vmtests: update skiptests
+    - vmtest: allow installed centos images to reboot (LP: #1881011)
+
+ -- Ryan Harper <rharper@xxxxxxxxxxx>  Thu, 20 Aug 2020 09:10:33 -0500
+
+curtin (20.1-0ubuntu1) groovy; urgency=medium
+
+  * New upstream release.
+    - Release 20.1 (LP: #1880741)
+    - Handle multiple separators which were found in TestAllindata vmtest
+    - verify_ptable_flag: dos primary partitions use ptable_uuid map for flag
+      (LP: #1878890)
+    - net_meta: add disabled mode to skip writing any network config
+      [Lucas Moura]
+    - vmtest: trigger guest panic to fail fast
+    - Replace grub-shell-helper with install_grub command
+    - vmtest-sync-images: update the URL of the maas streams [Paride Legovini]
+    - Replace references to old team manager with new team manager
+      [James Falcon]
+    - tox: pin flake8 to version and add a tip-flake8 environment
+      [Paride Legovini]
+    - Fix flake8 E741 warning [Lucas Moura]
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Tue, 26 May 2020 16:31:39 -0500
+
+curtin (19.3-68-g6cbdc02d-0ubuntu1) groovy; urgency=medium
+
+  * New upstream snapshot.
+    - Makefile: make adjustments to call lint/style tools via python module
+    - block-discover: ignore invalid id_serial/id_wwn values (LP: #1876848)
+    - Fix handing of reusing msdos partitions and flags (LP: #1875903)
+    - block.detect_multipath: ignore fake "devices" from /proc/mounts
+      [Michael Hudson-Doyle] (LP: #1876626)
+    - udev: use shlex.quote when shlex.split errors on shell-escape chars
+      (LP: #1875085)
+    - lvm: don't use vgscan --mknodes
+    - vmtest: rsync don't cross filesystem boundaries when copying
+      (LP: #1873909)
+    - vmtest: basic/basic_scsi adjust collect/tests for unstable device names
+      (LP: #1874100)
+    - Add unittests for partition_handler calc_[dm]_part_info and kpartx paths
+    - multipath: attempt to enforce /dev/mapper/mpath files are symlinks
+    - block-meta: device mapper partitions may be block devices not links
+    - Default to dm_name being id if empty earlier in dm_crypt_handler()
+      [Łukasz 'sil2100' Zemczak] (LP: #1874243)
+    - storage: correct declared schema draft version for storage schema
+    - test_clear_holders: add missing zfs mock
+    - Mock out zfs_supported to prevent attempting to load kernel modules
+    - block-meta: skip wipe device paths if not present (LP: #1869075)
+    - unittest: do not allow util.subp by default (LP: #1873913)
+    - curthooks: support multiple ESP on UEFI bootable systems
+    - block-discover: handle missing multipath 'path' data, use DM_NAME
+      (LP: #1873728)
+    - lvm-over-multipath: handle lookups of multipath members (LP: #1869075)
+    - block-meta: don't filter preserve=true devices, select by wipe
+      (LP: #1837214)
+    - vmtest: basic use dname to lookup disk with multiple partitions
+    - block-meta: Don't check the ptable type of a disk with no ptable
+    - curthooks: always use ChrootableTarget.subp when calling efibootmgr
+    - storage: enable and use multipath during storage configuration
+      (LP: #1869075)
+    - block-discover: detect nvme multipath devices (LP: #1868109)
+    - clear-holders: Tolerate vgchange errors during discovery (LP: #1870037)
+    - block-meta: handle preserve with vtoc ptable (LP: #1871158)
+    - vmtest: use -partition file for TestReuseRAIDMemberPartition class
+    - format: extra_options should be a list type
+    - tox: add pyflakes to the default tox run [Paride Legovini]
+    - storage_config: Add 'extra_options' parameter to allow custom mkfs
+      (LP: #1869069)
+    - Add support for installing Ubuntu Core 20 images
+    - tox.ini: Fix issues with newer tox on focal
+    - vmtest: Fix test_basic.py to run on s390x (LP: #1866663)
+    - vmtest: use util.load_file for loading collect files
+    - block-meta: refactor storage_config preserve and wipe settings
+      (LP: #1837214)
+    - block-discover: skip 'multipath' key in blockdevice if mpath name is None
+    - tox: all py27 environments should use the base py27 deps
+    - uefi: refactor efibootmg handling to support removing duplicate entries
+      (LP: #1864257)
+    - tox: pin setuptools < 45 to allow installing py27 in virtenv
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 07 May 2020 15:43:37 -0500
+
+curtin (19.3-27-g437caaa9-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - block-discover: add dasd parser and emit dasd storage config
+      (LP: #1862849)
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 27 Feb 2020 13:11:46 -0600
+
+curtin (19.3-26-g82f23e3d-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - install-grub: refactor uefi partition/disk searching (LP: #1862846)
+    - doc: update Canonical contributors URL [Paul Tobias]
+    - block-discover: detect additional "extended" partition types in MBR
+      (LP: #1861251)
+    - vmtests: skip focal bcache tests due to kernel bug
+    - net/deps.py: detect openvswitch cfg and install openvswitch packages
+    - vmtest: collection of vmtest related fixes to make things triple green
+    - clear-holders: umap the parent mpath to wipe the underlying partitions
+    - vmtests: bump fixby date out and fix false positive when date passes
+      (LP: #1855148)
+    - vmtests: drop disco tests using a tool to automate the process
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 13 Feb 2020 21:08:59 -0600
+
+curtin (19.3-17-g50ffca46-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - clear-holders: ensure we wipe device even if multipath enabled not not mp
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 30 Jan 2020 12:52:02 -0600
+
+curtin (19.3-16-g941c43ff-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - block_meta: use reliable fs_spec entries for block devices (LP: #1851899)
+    - multipath: handle removal of multipath partitions correctly
+      (LP: #1857042)
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 30 Jan 2020 12:49:27 -0600
+
+curtin (19.3-14-ga45a54ca-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - vmtests: skip Focal deploying Centos70 ScsiBasic
+    - vmtests: fix network mtu tests, separating ifupdown vs networkd
+    - doc: Fix kexec documentation bug. [Mike Pontillo]
+    - vmtests: Add Focal Fossa
+    - centos: Add centos/rhel 8 support, enable UEFI Secure Boot
+      [Lee Trager] (LP: #1788088)
+    - Bump XFS /boot skip-by date out a while
+    - vmtest: Fix a missing unset of OUTPUT_FSTAB
+    - curthooks: handle s390x/aarch64 kernel install hooks (LP: #1856038)
+    - clear-holders: handle arbitrary order of devices to clear
+    - curthooks: only run update-initramfs in target once (LP: #1842264)
+    - test_network_mtu: bump fixby date for MTU tests
+    - block-discover: don't skip partitions on virtual devices (LP: #1853018)
+    - block-discover: handle partial probe data (LP: #1852351)
+    - Fix parsing of squashfs: uri prefix for installation sources
+      [Daniel Fox] (LP: #1851271)
+    - Release 19.3 (LP: #1851390)
+    - Update HACKING.rst with Josh Powers contact info.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 16 Jan 2020 15:17:41 -0600
+
+curtin (19.2-44-g8e618b34-0ubuntu1) focal; urgency=medium
+
+  * New upstream snapshot.
+    - t/jenkins-runner: replace $EPOCHSECONDS with 'date +%s' [Paride Legovini]
+    - curthooks: skip setup_kernel_img_conf on eoan and newer (LP: #1847257)
+    - block_meta: use lookup for wwn, fix fallback from wwn, serial, path
+      (LP: #1849322)
+    - vmtest: Adjust TestScsiBasic to use dnames to find correct disk
+    - schema: Add ptable value 'unsupported' (LP: #1848535)
+    - tools/xkvm: add -nographic to speed up devopt query
+    - test_block_dasd: fix random_device_id to only generate valid IDs
+      (LP: #1849549)
+    - vmtest: update skip_if_arch message
+    - Add skip_by_date to eoan ipv6 vlan test
+    - storage_config: interpret value, not presence, of
+      DM_MULTIPATH_DEVICE_PATH [Michael Hudson-Doyle]
+    - vmtest: Add skip_by_date for test_ip_output on eoan + vlans
+    - block-schema: update raid schema for preserve and metadata
+    - dasd: update partition table value to 'vtoc' (LP: #1847073)
+    - clear-holders: increase the level for devices with holders by one
+      (LP: #1844543)
+    - tests: mock timestamp used in collect-log file creation (LP: #1847138)
+    - ChrootableTarget: mount /run to resolve lvm/mdadm issues which
+      require it.
+    - block-discover: handle multipath disks (LP: #1839915)
+    - Handle partial raid on partitions (LP: #1835091)
+    - install: export zpools if present in the storage-config (LP: #1838278)
+    - block-schema: allow 'mac' as partition table type (LP: #1845611)
+    - jenkins-runner: disable the lockfile timeout by default [Paride Legovini]
+    - curthooks: use correct grub-efi package name on i386 (LP: #1845914)
+    - vmtest-sync-images: remove unused imports [Paride Legovini]
+    - vmtests: use file locking on the images [Paride Legovini]
+    - vmtest: enable arm64 [Paride Legovini]
+    - Make the vmtests/test_basic test suite run on ppc64el [Paride Legovini]
+    - vmtests: separate arch and target_arch in tests [Paride Legovini]
+    - vmtests: new decorator: skip_if_arch [Paride Legovini]
+    - vmtests: increase the VM memory for Bionic
+    - vmtests: Skip Eoan ZFS Root tests until bug fix is complete
+    - Merge branch 'fix_merge_conflicts'
+    - util: add support for 'tbz', 'txz' tar format types to sanitize_source
+      (LP: #1843266)
+    - net: ensure eni helper tools install if given netplan config
+      (LP: #1834751)
+    - d/control: update Depends for new probert package names
+      [Dimitri John Ledkov]
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Fri, 01 Nov 2019 14:06:13 -0500
+
+curtin (19.2-9-g38ce22b0-0ubuntu1) eoan; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: fix typo in EoanBcacheBasic test name
+    - storage schema: Update nvme wwn regex to allow for nvme wwid format
+      (LP: #1841321)
+    - Allow EUI-64 formatted WWNs for disks and accept NVMe partition naming
+      [Reed Slaby] (LP: #1840524)
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 28 Aug 2019 11:40:32 -0500
+
+curtin (19.2-6-g88a1a7ec-0ubuntu1) eoan; urgency=medium
+
+  * New upstream snapshot.
+    - Makefile: split Python 2 and Python 3 unittest targets apart
+  * debian/*: drop python-curtin, making the package Python 3-only.
+  * debian/control: drop Build-Depends on linting tools, they haven't been
+    used by the upstream test suite in a while.
+
+ -- Daniel Watkins <oddbloke@xxxxxxxxxx>  Wed, 21 Aug 2019 13:29:50 -0400
+
+curtin (19.2-5-g44997e86-0ubuntu1) eoan; urgency=medium
+
+  * New upstream snapshot.
+    - Switch to the new btrfs-progs package name, with btrfs-tools fallback.
+      [Dimitri John Ledkov]
+    - vmtest: bump ram size on Zfs tests for Disco and Eoan
+    - vmtest: drop Cosmic test cases
+    - unittests: mock subp in ChrootableTarget _exit_ test cases
+    - util.ChrootableTarget: skip rename of resolv.conf if not present in
+      target (LP: #1834382)
+
+ -- Daniel Watkins <oddbloke@xxxxxxxxxx>  Thu, 15 Aug 2019 12:27:10 -0400
+
+curtin (19.2-0ubuntu1) eoan; urgency=medium
+
+  * New upstream release.
+    - Release 19.2 (LP: #1836951)
+    - storage_config: a missing ID_PART_TABLE_TYPE key means no ptable
+      [Michael Hudson-Doyle]
+    - vmtests: drop skip_by_date decorators for bug 1813228
+    - block: Add opportunistic zkey encryption if supported
+    - vmtests: add support for CURTIN_VMTEST_APT_PROXY
+    - vmtests: add use of CURTIN_VMTEST_ prefixed envvars to image sync
+    - vmtest: dont raise SkipTest in class definition
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 17 Jul 2019 15:39:33 -0500
+
+curtin (19.1-7-g37a7a0f4-0ubuntu1) eoan; urgency=medium
+
+  * New upstream snapshot.
+    - vmtests: determine block name via dname when verifying volume groups
+    - vmtest: add Centos66/Centos70 FromBionic release and re-add tests
+    - block-discover: add cli/API for exporting existing storage to config
+    - vmtest: refactor test_network code for Eoan
+    - curthoooks: disable daemons while reconfiguring mdadm
+      [Michael Hudson-Doyle] (LP: #1829325.)
+    - mdadm: fix install to existing raid [Michael Hudson-Doyle] (LP: #1830157)
+    - apt_proxy env var set but empty => do not setup any proxy
+      [Paride Legovini]
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Wed, 05 Jun 2019 10:45:42 -0600
+
+curtin (19.1-0ubuntu1) eoan; urgency=medium
+
+  * New upstream release.
+    - release 19.1
+    - vmtest: add missing skip_by_date on Eoan test_network_mtu
+    - vmtest: remove skip_by_date on Disco Allindata test
+    - block: support multipath devices in lookup and partition_kname
+      (LP: #1813228)
+    - grub: add grub config to control os_prober,terminal settings in target
+    - vmtest: add eoan tests [Paride Legovini]
+    - vmtest: add dependency on python3-jsonschema [Paride Legovini]
+    - Pylint compatibility with Python 3.7 [Paride Legovini] (LP: #1828229)
+    - vmtest: disable disco multipath test
+    - vmtests: bump network mtu tests out a bit
+    - Fix up yaml.load warnings
+    - vmtest: disable trusty, it's dead jim
+
+ -- Daniel Watkins <oddbloke@xxxxxxxxxx>  Wed, 22 May 2019 10:26:52 -0400
+
+curtin (18.2-26-gd8e45d79-0ubuntu1) eoan; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: reenable UEFI 4k tests, which got dropped when fixing
+      subclassing.
+    - vmtests: Add test_kernel_img_conf stub for PsuedoVMBaseClass
+    - curthooks: chzdev_import must encode data if provided (LP: #1825007)
+    - vmtest: test for kernel-img conf on ubuntu only
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Tue, 23 Apr 2019 09:32:56 -0500
+
+curtin (18.2-22-g08bf6ff7-0ubuntu1) disco; urgency=medium
+
+  * New upstream snapshot.
+    - Setup kernel-img.conf like base-installer/live-installer did.
+      [Dimitri John Ledkov] (LP: #1534162)
+    - zfs: pass pool and fs properties to zpool_create
+      [Jean-Baptiste Lallement] (LP: #1823682)
+    - block_meta: pass lvm_partition size through human2bytes
+      [Michael Hudson-Doyle]
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 11 Apr 2019 14:22:33 -0500
+
+curtin (18.2-19-g36351dea-0ubuntu1) disco; urgency=medium
+
+  * New upstream snapshot.
+    - clear-holders: refactor bcache shutdown and add longer timeout
+      (LP: #1796292)
+    - schema-validate-storage: remove unused imports [Paride Legovini]
+    - add subcommand schema for storage-config validation
+    - clear-holders: wipe raid members at data offsets when not assembled
+      (LP: #1815018)
+    - Add support for s390 DASD devices
+    - vmtest: skip DiscoTestAllindata while initrd lacks crypto modules
+    - block_meta: allow passing a dm_crypt key by keyfile
+      [Michael Hudson-Doyle]
+    - ChrootableTarget: add /run to mounts for redhat targets (LP: #1815666)
+    - vmtest: consolidate vm mem config, defaults via release, env override
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 03 Apr 2019 14:46:09 -0500
+
+curtin (18.2-10-g7afd77fa-0ubuntu1) disco; urgency=medium
+
+  * New upstream snapshot.
+    - Support for multi-layers images fsimage-layered:// URI
+      [Jean-Baptiste Lallement]
+    - dname: relax dname req for disk serial/wwn presence for compatibility
+      (LP: #1735839)
+    - flake8: fix some E117 over-indented issues [Paride Legovini]
+    - bcache: ensure partitions on bcache devices are detected as partition
+    - vmtest: bump skip_by_date out a year for trusty bcache bug
+    - Fix typo in doc/topics/integration-testing.rst. [Paride Legovini]
+    - flake8: Fix two issues found with new version of flake8
+    - clear-holders: handle FileNotFound when probing for bcache device slaves
+      (LP: #1811117)
+    - vmtests: network mtu fix-by bump to post 19.04 release
+    - vmtest: Fix bug preventing explicit disabling of system_upgrade.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 27 Feb 2019 16:43:21 -0600
+
+curtin (18.2-0ubuntu1) disco; urgency=medium
+
+  * New upstream release (18.2).
+    - Release 18.2
+    - Adjust helpers/common to edit GRUB_CMDLINE_LINUX_DEFAULT in place.
+      (LP: #1527664)
+    - dname: persistent names based on serial or wwn (LP: #1735839)
+    - Fix bug in is_swap_device if a device was smaller than page_size.
+      (LP: #1803672)
+    - vmtest: add disco tests [Joshua Powers]
+    - unittest: change directory to tmpdir for testing relative files.
+    - Add clear-holders to meta-simple (LP: #1786736)
+    - vmtests: check install log for Out of memory kernel messages and fail
+    - unittest: correctly use tmpdir for my.img [Joshua Powers] (LP: #1803611)
+    - block_meta: use wipe config when clearing partitions (LP: #1800153)
+    - tests: fix vmtests for apt perserve_source_list changes
+    - apt: Use new format apt config when writing preserve_sources_list.
+      (LP: #1735950)
+    - vmtests: multipath mount /home with nofail and validate in unittest
+    - vmtests: fix common collect scripts to not exit failure.
+    - vmtest: handle collect disk unpack failure
+    - vmtests: dont use multiple subclasses in uefi 4k tests
+    - vmtests: disable snapd/seeding to avoid boot hang
+    - jenkins-runner: fix when using --filter only
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 06 Dec 2018 12:11:01 -0600
+
+curtin (18.1-59-g0f993084-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - distro: fix system_upgrade command using string instead of function
+      (LP: #1796968)
+    - Capture stdout when using lxc file push
+    - vmtest: boot ephemeral with 'ro' on the kernel command line.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 10 Oct 2018 11:22:30 -0500
+
+curtin (18.1-56-g3aafe77d-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: Fix typo in skip-by-date.
+    - vmtest: kick skip-by-date for 1671951.
+    - tools/jenkins-runner: Error if both filters and tests are given.
+    - vmtests: prevent tests from modifying cls.collect_scripts
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Tue, 02 Oct 2018 16:07:51 -0600
+
+curtin (18.1-52-g5f0082d1-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - Enable custom storage configuration for centos images
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Fri, 21 Sep 2018 03:04:42 -0500
+
+curtin (18.1-51-gb812ae80-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: ensure we collect /var/log/journal only once
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Tue, 21 Aug 2018 11:44:46 -0600
+
+curtin (18.1-50-g2d9b2c6f-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - clear-holders: handle missing zpool/zfs tools when wiping
+    - clear-holders: rescan for lvm devices after assembling raid arrays
+    - vmtest: enable persistent journal and collect at boot time
+    - Add timing and logging functions.
+    - parse_dpkg_version: support non-numeric in version string.
+    - Don't allow reads of /proc and modprobe zfs through
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Mon, 20 Aug 2018 09:22:06 -0600
+
+curtin (18.1-44-g2b12b8fc-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - Add main so that 'python3 -m curtin' does the right thing.
+    - Add subcommand 'features'.
+    - block: use uuid4 (random) when autogenerating UUIDS for filesystems
+    - vmtests: Increase size of root filesystems.
+    - clear-holders: reread ptable after wiping disks with partitions
+    - vmtest: Skip proposed pocket on dev release when 'proposed' in ADD_REPOS.
+    - tests: remove Ubuntu Artful [Joshua Powers]
+    - vmtests: Let a raised SkipTest go through skip_by_date.
+    - vmtests: Increase root fs to give upgrades to -proposed more space.
+    - vmtest: Order the vmtest_pollinate late_command earlier.
+    - vmtest: always add 'curtin/vmtest' to installed pollinate user_agent.
+    - vmtests: make skip_by_date a decorator that runs and reports.
+    - vmtests: always declare certain attributes and remove redundant tests.
+    - vmtests: Add Cosmic release to tests [Joshua Powers]
+    - vmtests: skip TrustyTestMdadmBcache until 2019-01-22.
+    - tox: use simplestreams from git repository rather than bzr.
+    - document that you can set ptable on raids [Michael Hudson-Doyle]
+    - vmtests: move skip-by date of xfs root and xfs boot out 1 year.
+    - vmtests: network_mtu move fixby date out 4 months from last value
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Fri, 10 Aug 2018 09:22:12 -0600
+
+curtin (18.1-25-g9d0e557e-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - Fix WorkingDir class to support already existing target directory.
+      (LP: #1775622)
+    - Fix extraction of local filesystem image. (LP: #1775630)
+    - Fix tip-pyflakes imported but unused call to util.get_platform_arch
+    - subp: update return value of subp with combine_capture=True.
+    - tox: add a xenial environments, default envlist changes.
+    - tests: Fix race on utcnow during timestamped curtin-log dir creation
+      (LP: #1772481)
+    - curtainer: patch source version from --source.
+    - pyflakes: fix unused variable references identified by pyflakes 2.0.0.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 07 Jun 2018 14:59:20 -0400
+
+curtin (18.1-17-gae48e86f-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - tests: replace usage of mock.assert_called
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 18 May 2018 14:58:06 -0400
+
+curtin (18.1-16-g18835845-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - tools: jenkins-runner show curtin version in output.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 18 May 2018 10:29:17 -0400
+
+curtin (18.1-15-g5313b9e2-0ubuntu1) cosmic; urgency=medium
+
+  * New upstream snapshot.
+    - zfs: implement a supported check to handle i386 (LP: #1768709)
+    - Support mount entries not tied to a device, including bind and tmpfs.
+      (LP: #1767979)
+    - block/clear_holders/mdadm: refactor handling of layered device wiping
+      (LP: #1768893, #1769742)
+    - clear_holders: only export zpools that have been imported (LP: #1770280)
+    - vmtests: allow env control of apt, system_upgrade, package upgrade
+    - util.get_efibootmgr: filter bootorder by found entries (LP: #1767584)
+    - vmtests: adjust lvm_iscsi dnames to match configuration
+    - vmtest: always boot with BOOTIF and ip=:::::BOOTIF:dhcp
+    - make_dname for bcache should use backing device uuid
+    - zfsroot: add additional checks, do not require disk 'serial' attribute
+      (LP: #1760879, #1760880)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 18 May 2018 10:19:45 -0400
+
+curtin (18.1-5-g572ae5d6-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - clear-holders: fix lvm name use when shutting down (LP: #1764602)
+    - install: prevent unmount: disabled from swallowing installation failures
+      (LP: #1764210)
+    - vmtest: bionic images no longer use the vlan package
+    - pycodestyle: Fix invalid escape sequences in string literals.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Wed, 18 Apr 2018 10:15:46 -0500
+
+curtin (18.1-1-g45564eef-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - Drop ubuntu branch management script new-upstream-snapshot.
+    - Release 18.1
+    - zfs/zpool version=28 by default, allow users to override default values.
+      (LP: #1754013)
+
+ -- Chad Smith <chad.smith@xxxxxxxxxxxxx>  Wed, 28 Mar 2018 14:22:58 -0600
+
+curtin (17.1-51-gbd40234f-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - helpers/shell-archive: drop use of tar --sparse flag (LP: #1757565)
+    - vmtest: In Basic install, add entry for swap to fstab and verify its use.
+    - vmtest: skip some bcache tests pending kernel fixes
+    - vmtests: extend skip_by_date for lvmroot_xfsroot and network_mtu
+    - vmtest: fix pollinate re.search to use groupdict()
+    - Add pollinate user-agent configuration support.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Fri, 23 Mar 2018 10:51:50 -0500
+
+curtin (17.1-45-g1a5fe18a-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: Remove xenial and trusty specific workaround for rooturl.
+    - vmtest: Add Filesystem Battery test.
+    - Remove grub2/xenial specific workarounds for zfsroot.
+    - Disable dirty_disks mode for mdadm + iscsi tests
+    - tools/curtainer: Try harder to get source at binary version.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 07 Mar 2018 12:20:40 -0500
+
+curtin (17.1-40-g46f8000f-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - clear_holders: wipe complex devices before disassembly (LP: #1750519)
+    - vmtests: network_mtu: fix bug number and move date out one month
+    - fix /usr/bin/curtin exit code in install failure (LP: #1751176)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 07 Mar 2018 02:55:23 -0500
+
+curtin (17.1-37-g82622f12-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - docs: Document use of format command with fstype: zfsroot
+    - docs: Add HACKING.rst doc to top level dir and readthedocs.
+    - vmtest: fix centos root-tgz image sync
+    - block_meta: Ensure offset input to sgdisk are integers.
+    - Fix error in url_helper and vmtest from previous commit.
+    - tools: fix curtainer to specify source version to apt-get source.
+    - Add support for installing sources that are a filesystem image.
+      (LP: #1746348)
+    - clear-holders: detect and remove devices from kernel swap as needed.
+      (LP: #1743643)
+    - tests: remove xfs filesystem from basic uefi test.
+    - tools: fix curtainer --source with trusty.
+    - apply_net: do not write to stderr directly.
+    - vmtest: Drop use of root-image.gz and maas2roottar.
+    - in-target: use ChrootableTarget so that unshare pid is used.
+    - tools/curtainer: check that binary and source version are the same.
+      (LP: #1747077)
+    - Add zfsroot as a filesystem type
+    - fix modeline for shell syntax files.
+    - error logs: Create error_tarfile path if path does not exist
+      [Chad Smith] (LP: #1746363)
+    - zfs: only load zfs on xenial+ skip artful/bionic zfs env export
+    - error logs: automatically collect and tar curtin logs upon error.
+      [Chad Smith]
+    - vmtests: Support skipping skip_by_date tests based on environment.
+    - Add zpool, zfs storage commands for experimental support of ZFS on root.
+    - tests: revert workaround for bug in overlayroot that is now fixed.
+    - tests: Bump skip_by_dates for bug 1652822 and 1671952.
+    - cli: add curtin collect-logs sub-command [Chad Smith]
+    - vmtest: Do not run tests of unsupported Ubuntu releases.
+    - Make license headers and file footers consistent and simplify.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 21 Feb 2018 12:19:07 -0500
+
+curtin (17.1-11-ga4c9636b-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - tests: cleanup the apt custom sources test.
+    - apt: Be more lenient when replacing mirrors in /etc/apt/sources.list
+      (LP: #1744038)
+    - vmtest: Drop Zesty release
+    - vmtest: initialize logger with class names for easy parsing
+    - packaging: Do not mention primary contributors in debian/changelog.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 18 Jan 2018 16:31:27 -0500
+
+curtin (17.1-6-g8b145067-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - packaging: Update new-upstream-snapshot to work with git.
+    - Bump pylint to 1.8.1.
+    - vmtests: switch to MAAS v3 streams for images and kernels [Ryan Harper]
+    - tests: update pack tests to clear out pyc files more completely.
+    - debian/control: drop conflicts that had bzr version
+    - Switch uses of bzr to git, borrow from cloud-init git workflow.
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Tue, 16 Jan 2018 15:42:36 -0600
+
+curtin (17.1-0ubuntu1) bionic; urgency=medium
+
+  * New upstream release (17.1).
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 15 Dec 2017 16:53:09 -0500
+
+curtin (17.0~bzr552-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - packaging: update debian/build-deb to remove ~bzrREV when using equal tag
+    - pack: fix packing when curtin is installed inside a snap.
+    - tox: move to pylint 1.7.4
+    - vmtests: iscsi minor cleanup.
+    - vmtests: exercise rootfs over an lvm logical volume
+    - Switch network dep filter to test for ifupdown/nplan instead of release
+      name
+    - Allow control of curtin install unmounting
+    - vmtests: Add Bionic release to tests and update classes.
+    - storage: add 'options' key mount type to specify mount parameters for
+      filesystems (LP: #1709284)
+    - Re-add curthooks.write_files method for backwards compat (LP: #1731709)
+    - vmtest: Remove ArtfulTestBridging skip_by_date check, bug fixed
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Fri, 08 Dec 2017 14:48:42 -0600
+
+curtin (0.1.0~bzr541-0ubuntu1) bionic; urgency=medium
+
+  * New upstream snapshot.
+    - Drop Precise from vmtest
+    - clear_holders: bcache log IO/OS exceptions but do not raise
+    - vmtest: Support newer qemu and multipath.
+    - block: enable control over exclusive_open use when wiping volumes
+    - block: handle wiping bcache parts (LP: #1718699)
+    - vmtests: Defer ArtfulNetworkMtu SkipbyDate to 2018
+    - bcache: accept sysfs write failure in shutdown handler if path missing
+      (LP: #1700564)
+    - vmtest: Rephrase a message about no disks to be less scary
+    - block_meta: use block.wipe_volume(mode=superblock) to clear MBR/GPT tables
+      (LP: #1722322)
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Tue, 07 Nov 2017 11:13:00 -0600
+
+curtin (0.1.0~bzr532-0ubuntu1) artful; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: fix artful networking (LP: #1714028, LP: #1718216, LP: #1706744)
+    - docs: Trivial doc fix for enabling proposed.
+    - setup.py: fix to allow installation into a virtualenv (LP: #1703755)
+    - doc: update documentation on curtin-hooks and non-ubuntu installation.
+    - reporter: Add journald reporter to send events to journald
+    - vmtests: add option to tar disk images after test run
+    - install: ensure iscsi service is running to handle shutdown properly
+    - mdadm: handle write failures to sysfs entries when stopping mdadm
+      (LP: #1708052)
+    - vmtest: catch exceptions in curtin-log-print
+    - iscsi: use curtin storage config to disconnect iscsi targets
+      (LP: #1713537)
+    - vmtests: bump skip_by_date values out to give cloud-init SRU more time
+    - vmtest: get info about collected symlinks and then delete them.
+    - Update network cloud-init related skiptest dates, SRU still pending
+
+ -- Ryan Harper <ryan.harper@xxxxxxxxxxxxx>  Thu, 05 Oct 2017 19:15:28 -0500
+
+curtin (0.1.0~bzr519-0ubuntu1) artful; urgency=medium
+
+  * New upstream snapshot.
+    - tests: Add CiTestCase common parent for all curtin tests.
+    - vmtests: Remove force flag for centos curthooks
+    - tools/jenkins-runner: improve tgtd cleanup logic
+    - tests: Drop EOL Wily Vivid and Yakkety tests.
+    - Disable yum plugins when installing packages, update ca-certs for https
+    - Rename centos_network_curthooks -> centos_apply_network_config.
+    - tests: in centos_defaults use write_files for grub serial.
+    - write_files: write files after extract, change write_files signature.
+    - pass network configuration through to target for ubuntu and centos
+    - tests: disable yakkety tests.
+    - tools/launch: automatically pass on proxy settings to curtin
+    - Add top level 'proxy' to config, deprecate top level http_proxy.
+    - tools/curtainer: fix to enable deb-src for -proposed.
+    - Use unshare to put chroot commands in own pid namespace.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 03 Aug 2017 15:51:19 -0400
+
+curtin (0.1.0~bzr505-0ubuntu1) artful; urgency=medium
+
+  * debian/new-upstream-snapshot: fix issue with whitespace at end of line.
+  * New upstream snapshot.
+    - vmtest: let the socket level select a port rather than us picking one.
+    - Fix deb build by mocking call to udevadm settle
+    - Clear and re-order UEFI boot methods during UEFI grub installation.
+    - Resolve bcache race-conditions
+    - tests: clean up usage of collect files
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 12 Jun 2017 15:45:33 -0400
+
+curtin (0.1.0~bzr500-0ubuntu1) artful; urgency=medium
+
+  * New upstream snapshot.
+    - Allow re-use of vmtest output 
+    - Fix stacked storage configurations with iSCSI  (LP: #1683910)
+    - vmtests: enable tests to apply storage config to validate clear_holders path 
+    - mdadm_stop: Add retry and additional steps to halt a resync 
+    - vmtests: Add Artful release and update classes 
+    - clear-holders: mdadm use /proc/mdstat to wait for array to stop  (LP: #1682584)
+    - uc16 curthooks: add 'network' key to config file  (LP: #1685000)
+    - Doc and makefile updates for build and test on new systems. 
+    - clear-holders: make bcache handler wait for device shutdown  (LP: #1680409)
+    - vmtest: Use utf-8 and fix pseudo test collect_output 
+    - vmtest: fix path to install log, and utilize the globally copied paths. 
+    - Copy curtin install log into target.  (LP: #1684128)
+    - vmtest: add in post-test log post-processing 
+    - vmtest: update source.list test 
+    - add recursive flag to do_umount, add --umount to block-meta 
+    - load_command_environment: fix strict flag, and unit tests. 
+    - block_meta: Attempt to mount by UUID= if possible  (LP: #1676991)
+    - Make systems with root on bcache use root=UUID=.  (LP: #1680591)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 19 May 2017 16:57:07 -0400
+
+curtin (0.1.0~bzr482-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - Fix iscsi disks that have a ':' in the target name.  (LP: #1679222)
+    - tests: re-enable ZestyTestMdadmBcache. 
+    - curthooks: fix pylint reported error when using ubuntu_core_curthooks. 
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 05 Apr 2017 15:22:25 -0400
+
+curtin (0.1.0~bzr479-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - Add support for installing Ubuntu-Core 16 images.
+    - Add 'STORAGE_CONFIG_V1_DD' to the feature list.
+    - flake8: fix flake8 issues with previous merge.
+    - Support selection of target disk for dd images install via
+      storage config.  (LP: #1640301)
+    - vmtest: have vmtest-sync-images avoid running when jenkins-runner is.
+    - tools/curtin-from-container: do not use lxc file push --create-dirs
+    - tests: enable curtainer to pull down curtin source locally
+    - tests: make nose output always include class name and method.
+    - tools/curtin-from-container: default to verbosity level 0, not 2.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 23 Mar 2017 13:06:43 -0400
+
+curtin (0.1.0~bzr470-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - vmtest: allow time-based skipping of tests, apply to ZestyMdadmBcache
+      (LP: #1667078)
+    - Add iSCSI disk support. (LP: #1645515)
+    - vmtest: handle change in btrfs-progs when finding fs UUID. (LP: #1665701)
+    - pycodestyle: fix bare except in vmtests
+    - unittests: add subp coverage for retries, and rcs
+    - reporting: Add better descriptions and granularity of events
+    - tox: do not bother with pep8 from trusty in trusty-check
+    - tests: add two scripts used for running vmtest with installed package.
+    - Make add-apt-repository command retry
+    - Add tests for network bridging configuration
+  - debian/rules: remove debug 'find'
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 28 Feb 2017 10:30:43 -0500
+
+curtin (0.1.0~bzr460-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - Install zipl in target on s390x arch.  (LP: #1662346)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 08 Feb 2017 17:09:34 -0500
+
+curtin (0.1.0~bzr459-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - Remove style checking during build and add latest style checks to tox
+    - avoid UnicodeDecode error on passing non-utf8 into shlex
+    - adjustments to version string handling, improved pack unit tests.
+    - helpers/common: Add grub install debugging output
+    - curtin: add version module and display in output and logs
+    - content decoding in load_file, apply_net raise exception on errors
+    - gpg: retry when recv'ing gpg keys fail (LP: #1661337)
+    - Add clear_holders checks to disk and partition handlers (LP: #1659509)
+    - net: add new lines after rendered static routes. (LP: #1649652)
+    - multipath: don't run update-grub; setup_grub will handle this better.
+      (LP: #1656369)
+    - test related changes:
+      - vmtest: Add tests for zesty and Trusty HWE-X kernels. 
+      - tests: fix tox tip-pycodestyle complaints 
+      - image-sync: add debugging output to help diagnose errors 
+      - vmtest: change get_curtin_version to use version subcommand. 
+      - subp doc an unit test improvements. 
+      - vmtest: Add the ability to add extra config files to test execution. 
+      - vmtest: overhaul image sync 
+      - vmtest: skip apt-proxy test if not set 
+      - vmtest: add 'webserv' helper 
+      - vmtest: add CURTIN_VMTEST_CURTIN_EXE variable. 
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 08 Feb 2017 15:29:57 -0500
+
+curtin (0.1.0~bzr435-0ubuntu1) zesty; urgency=medium
+
+  * New upstream snapshot.
+    - pep8: fix pep8 errors found with 'make pep8' on zesty.
+    - Workaround failures caused by gpg2 daemons left running in chroot.
+      (LP: #1645680)
+    - Install u-boot-tools when running on a system with u-boot.
+      (LP: #1640519)
+    - block: fix partition kname for raid devices  (LP: #1641661)
+    - Fix up tox errors that slipped in and new pycodestyle 2.1.0 complaints.
+    - vmtests: adjust vmtest image sync metadata filenames
+    - vmtests: Add centos support
+    - Disable WilyTestRaid5Bcache vmtest
+    - tools/xkvm: fix --netdev=<bridge>
+    - bytes2human: fix for values larger than 32 bit int on 32 bit python2.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 01 Dec 2016 21:05:30 -0500
+
+curtin (0.1.0~bzr425-0ubuntu1) yakkety; urgency=medium
+
+  [ Scott Moser ]
+  * debian/new-upstream-snapshot: add writing of debian changelog entries. 
+
+  [ Ryan Harper ]
+  * New upstream snapshot.
+    - unittest,tox.ini: catch and fix issue with trusty-level mock of open 
+    - block/mdadm: add option to ignore mdadm_assemble errors  (LP: #1618429)
+    - curtin/doc: overhaul curtin documentation for readthedocs.org
+      (LP: #1351085)
+    - curtin.util: re-add support for RunInChroot  (LP: #1617375)
+    - curtin/net: overhaul of eni rendering to handle mixed ipv4/ipv6 configs 
+    - curtin.block: refactor clear_holders logic into block.clear_holders and
+      cli cmd 
+    - curtin.apply_net should exit non-zero upon exception.  (LP: #1615780)
+    - apt: fix bug in disable_suites if sources.list line is blank. 
+    - vmtests: disable Wily in vmtests 
+    - Fix the unittests for test_apt_source. 
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 29 Sep 2016 14:55:29 -0400
+
+curtin (0.1.0~bzr415-0ubuntu1) yakkety; urgency=medium
+
+  * New upstream snapshot.
+    - Add apt configuration features. (LP: #1574113)
+    - mkfs.vfat: add force flag for formating whole disks (LP: #1597923)
+    - block.mkfs: fix sectorsize flag (LP: #1597522)
+    - block_meta: cleanup use of sys_block_path and handle cciss knames
+      (LP: #1562249)
+    - block.get_blockdev_sector_size: handle _lsblock multi result return
+      (LP: #1598310)
+    - util: add target (chroot) support to subp, add target_path helper
+    - block_meta: fallback to parted if blkid does not produce output
+      (LP: #1524031)
+    - commands.block_wipe:  correct default wipe mode to 'superblock'
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 05 Aug 2016 16:51:20 -0400
+
+curtin (0.1.0~bzr399-0ubuntu1) yakkety; urgency=medium
+
+  * debian/new-upstream-snapshot: fix for specifying revision.
+  * New upstream snapshot.
+    - curtin/net: fix inet value for subnets, don't add interface attributes
+      to alias (LP: #1588547)
+    - improve net-meta network configuration (LP: #1592149)
+    - reporting: set webhook handler level to DEBUG, no filtering
+      (LP: #1590846)
+    - tests/vmtests: add yakkety, remove vivid
+    - curtin/net: use post-up for interface alias, resolve 120 second time out
+      on Trusty when using interface aliases
+    - vmtest: provide info on images used
+    - fix multipath configuration and add multipath tests (LP: #1551937)
+    - tools/launch and tools/xkvm: whitespace cleanup and bash -x
+    - tools/launch: boot by root=LABEL=cloudimg-rootfs
+    - Initial vmtest power8 support and TestSimple test.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 12 Jul 2016 12:31:34 -0400
+
+curtin (0.1.0~bzr389-0ubuntu1) yakkety; urgency=medium
+
+  * New upstream snapshot. 
+    * Detect and remove legacy /etc/network/interfaces.d/eth0.cfg from
+      target (LP: #1582410)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 03 Jun 2016 09:34:17 -0400
+
+curtin (0.1.0~bzr387-0ubuntu1) yakkety; urgency=medium
+
+  * New upstream snapshot.
+    * fix timestamp in reporting events.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 10 May 2016 10:19:20 -0400
+
+curtin (0.1.0~bzr385-0ubuntu2) yakkety; urgency=medium
+
+  * debian/control: add bcache-tools dependency to curtin.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 05 May 2016 16:35:37 -0400
+
+curtin (0.1.0~bzr385-0ubuntu1) yakkety; urgency=medium
+
+  * debian/control: drop python from curtin-common Depends.
+     remove unnecessary Depends on util-linux as it is essential.
+     python3-curtin, python-curtin: drop unnecessary 'curl' from Depends. 
+     python3-curtin, python-curtin: list oauthlib and yaml explicitly.
+
+  * New upstream snapshot.
+    * mdadm: resolve mdadm/bcache and trusty+hwe issues
+      (LP: #1569549, LP: #1514094)
+    * fix support for 4k disks (LP: #1436632, LP: #1564977)
+    * emit source /etc/network/interfaces.d/*.cfg in 
+      rendered /etc/network/interfaces
+    * net: introduce 'control' field to network configuration to allow
+      for declaring manual controlled interfaces
+    * disable cloud-init networking as curtin is the source of network config
+    * block: wipe_volume improvements
+    * reporter: enhance reporting events to include levels and
+      improve usefullness of messages
+    * network: add bonding tests and cleanup newline rendering
+    * block: fix partition path issue with nvme devices
+    * fix logic error in kernel installation
+    * block: add debug regarding raid modules being missing on mdadm create
+    * add s390x support to curtin and vmtest
+  
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 05 May 2016 12:43:40 -0400
+
+curtin (0.1.0~bzr365-0ubuntu1) xenial; urgency=medium
+
+  * New upstream snapshot.
+    * mkfs: handle fstype: vfat (LP: #1557334)
+    * save the curtin install config to /root/curtin-install-cfg.yaml
+    * deps: when 'curtin --install-deps' is run, it will now invoke
+      apt-get install with '--no-install-recommends'
+  * debian/control: adjust build dependency as python3-pyflakes in xenial
+    now provides python3 modules for pyflakes.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 18 Mar 2016 10:18:21 -0400
+
+curtin (0.1.0~bzr359-0ubuntu1) xenial; urgency=medium
+
+  * debian/new-upstream-snapshot, debian/README.source: add
+    new-upstream-snapshot and mention it in README.source
+  * New upstream snapshot.
+    * curtin/net: Add bond parsing & improved source, source-directory
+      parsing for ENI
+    * curtin/net: move global dns-* options under auto lo in ENI (LP: #1543263)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 26 Feb 2016 16:28:31 -0500
+
+curtin (0.1.0~bzr351-0ubuntu1) xenial; urgency=medium
+
+  * New upstream snapshot.
+    * partitioning: limited support for odd ordering of partition 
+      numbers (LP: #1543263).  Specifically targetted at MAAS and
+      powerVM support.
+    * many upstream test improvements (LP: #1533770)
+    * general upstream code improvements
+    * use mkfs.vfat rather than mkfs.fat to support precise.
+    * use removable devices for installation if no non-removable devices are
+      found [Robert Clark] (LP: #1532062)
+    * mkfs: fix for lack of uuid in btrfs tools on precise or trusty
+    * added 'curtin mkfs' command for easily making filesystems.
+    * mdadm: fix issues exposed by use via block_meta (LP: #1531520)
+    * improvements and small bug fix for oauth on systems with bad clock
+    * support bcache installation on precise
+    * fix bug in install_grub to partition when storage_config 
+      provided. (LP: #1523779)
+    * url_helper: raise import error on lack of oauth only when oauth used
+    * block_meta: handle 'preserve' flag for raid devices (LP: #1522147)
+    * close file descriptors from --config= arguments
+    * xenial: disable update-motd during an apt-get update (LP: #1527710)
+    * curthooks: know kernel mapping for xenial (4.4.0)
+    * fix python executable selection when 'curtin --help' is called
+    * subp: add decode parameter, defaulting to replace (LP: #1526127)
+    * support passing an integer or valid float to human2bytes
+    * Use /proc/mounts to find missing mountpoints
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 12 Feb 2016 17:07:33 -0500
+
+curtin (0.1.0~bzr314-0ubuntu1) xenial; urgency=medium
+
+  * New upstream snapshot.
+    * support installing .tar.xz, .tar.gz, .tar.bz2 or .tar via smtar helper
+    * improve dependency checking (LP: #1514888)
+    * Allow re-use of bcache cache devices with separate backing devices 
+      (LP: #1514094)
+    * call mkfs.ext3 or mkfs.ext4 with -F (force)
+    * Partition alignment and sizing fixes (LP: #1513085)
+    * Set bcache cache_mode if present in storage config (LP: #1510334)
+    * apt-get update: do not download translation files and source files
+      during installation.
+    * new sub-commands 'system-upgrade' and 'system-install' for package
+      upgrade and installation.
+  * debian/control: do not list unversioned e2fsprogs as it is essential.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 23 Nov 2015 11:28:52 -0500
+
+curtin (0.1.0~bzr276-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * debian/control: add python3-curtin depends to curtin (LP: #1503507)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 07 Oct 2015 09:50:34 -0400
+
+curtin (0.1.0~bzr275-0ubuntu1) wily; urgency=medium
+
+  * debian/README.source: tweak to doc on how to generate snapshot
+  * New upstream snapshot.
+    * add advanced storage layout
+    * add advanced networking configuration
+    * add 'vmtest' framework for automated test.
+    * add 'tox' for unit testing
+    * add reporting framework for reporting status events to MAAS or other
+      webhook listener.
+    * enable configuring of verbosity and stacktrace info in config as opposed
+      to command line only
+    * faster swap creation using fallocate (LP: #1482994)
+    * support specifying kernel without 'mapping' in config
+    * add 'system-upgrade' command and config for enabling upgrading the target
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 02 Oct 2015 16:19:07 -0400
+
+curtin (0.1.0~bzr227-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * support '---' or '--' as token to indicate the subsequent kernel command
+      line parameters should be copied from install envionrment to installed
+      environment.  (LP: #1402042)
+    * partition: when partitioning mbr and boot partition verify that
+      both partitions exist.
+    * partition: when creating mbr table, leave space for secondary gpt header
+    * fix uefi install path on nvme devices (LP: #1471928)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 09 Jul 2015 16:17:20 -0400
+
+curtin (0.1.0~bzr221-0ubuntu1) wily; urgency=medium
+
+  * debian/README.source: minor fixes in doc on merging upstream
+  * New upstream snapshot.
+    * force re-reading of partition information before looking
+      for multipath UUID matches.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 24 Jun 2015 14:08:55 -0400
+
+curtin (0.1.0~bzr220-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * more multipath work. hopefully reliable multipath boot on ppc64 now.
+    * some cleanups to partitioning code.
+    * know expected kernel mapping for wily (4.2)
+    * support UEFI-based ARM64 systems (LP: #1447834)
+    * catch one more usage of lsblk (LP: #1386275)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 18 Jun 2015 14:19:55 -0400
+
+curtin (0.1.0~bzr215-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * multipath: Generate /etc/multipath/bindings file during installation.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 16 Jun 2015 15:39:29 -0400
+
+curtin (0.1.0~bzr214-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * Use filesystem uuid rather than scsi_id to avoid false positives
+      when detecting multipath (LP: #1463043).
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 09 Jun 2015 16:35:21 -0400
+
+curtin (0.1.0~bzr213-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * retry apt-get update to avoid transient failures (LP: #1403133)
+    * detect and handle multipath devices (LP: #1371634)
+    * udevadm settle before unmounting target's /dev (LP: #1462139)
+    * doc/ improved developer doc and tools using maas images for test
+    * use --no-nvram option to grub-install if available (LP: #1311827)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 05 Jun 2015 15:06:31 -0400
+
+curtin (0.1.0~bzr205-0ubuntu1) wily; urgency=medium
+
+  * New upstream snapshot.
+    * improve finding devices and partitions to account for
+      non-standard names (LP: #1401190, LP: #1263181)
+    * do not consider removable devices or devices < 1G as installable
+    * add internal function wipe_partition and use that rather than
+      wipefs for wiping filesystem header data on a partition.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 15 May 2015 16:52:07 -0400
+
+curtin (0.1.0~bzr201-0ubuntu1) vivid; urgency=medium
+
+  * New upstream snapshot.
+    * curtin.deps.install: actually install, rather than --dry-run.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 20 Mar 2015 16:30:11 -0400
+
+curtin (0.1.0~bzr200-0ubuntu1) vivid; urgency=medium
+
+  * New upstream snapshot.
+    * support installation of vivid on vivid via python3 (LP: #1427950)
+    * know kernel mapping for vivid (3.19)
+  * debian/control: update standards versions, wrap-and-sort
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 11 Mar 2015 13:19:43 -0400
+
+curtin (0.1.0~bzr196-0ubuntu1) vivid; urgency=medium
+
+  * New upstream snapshot.
+    * fix bug installing to UEFI systems (LP: #1383727)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 08 Dec 2014 20:01:44 -0500
+
+curtin (0.1.0~bzr195-0ubuntu1) vivid; urgency=medium
+
+  * New upstream snapshot.
+    * move install log from /var/log/curtin_install.log to
+      /var/log/curtin/install.log (LP: #1378910)
+    * to not use '--acl' when extracting tar files (LP: #1382632)
+      as it inadvertently writes default directory acls.
+    * invoke lsblk with '--output' rather than '--out' to avoid
+      ambiguity in newer versions of lsblk (LP: #1386275)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 27 Oct 2014 12:25:27 -0400
+
+curtin (0.1.0~bzr190-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    * add log reporter (LP: #1369129, LP: #1371218)
+    * allow debug messages of helper programs to be seen
+    * fix 'make check'
+    * handle utf-8 output correctly. (LP: #1370249)
+    * set root device correctly on ppc64 (LP: #1371133)
+    * call update-grub to ensure grub.cfg is written (LP: #1373137)
+    * fix dd-tgz mode, only call partprobe on target device.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 26 Sep 2014 17:26:34 -0400
+
+curtin (0.1.0~bzr162-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    * block-meta: fix '--boot' when used with mbr.
+    * human2bytes: support floating point numbers (.5G or 2G).
+    * sanitize_source: fix detection of url prefixes that specify type
+    * fix reference to variable before use (LP: #1361350)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 04 Sep 2014 17:10:14 -0400
+
+curtin (0.1.0~bzr155-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    - fix '--maxsize' argument to 'curtin swap' (LP: #1360318) [Jason Hobbs]
+  * d/README.source: add file describing how snapshot releases are made.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 22 Aug 2014 11:54:49 -0400
+
+curtin (0.1.0~bzr153-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    * support for creating swap file.
+    * fix bug when specifying kernel mapping in config.
+    * install_kernel: run apt-get udpate before searching cache (LP: #1358424)
+    * correctly check for availability of eatmydata (LP: #1358350)
+    * support installation on ppc64 systems (ubuntu ppc64el)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 21 Aug 2014 03:35:53 -0400
+
+curtin (0.1.0~bzr143-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    * better choose a default boot fstype.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 04 Aug 2014 04:57:29 -0400
+
+curtin (0.1.0~bzr142-0ubuntu1) utopic; urgency=medium
+
+  * New upstream snapshot.
+    * add utility for parsing /etc/network/interfaces
+    * aarm64 support [Newell Jensen]
+      * run update-initramfs in aarm64
+      * create boot partition when necessary (LP: #1338851 LP: #1340942)
+    * know kernel mapping for utopic (3.16)
+    * properly write fstype into /etc/fstab per provided fstype
+    * add support for disk images as type 'dd-tgz'
+    * correctly call finalize in target (LP: #1328521)
+    * support invoking tar with --xattrs if available (LP: #1307636)
+    * increase size of uefi partition to 512M (LP: #1306164)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 22 Jul 2014 18:53:38 -0400
+
+curtin (0.1.0~bzr126-0ubuntu1) trusty; urgency=medium
+
+  * New upstream snapshot.
+    * create 500M EFI System Partition (ESP) instead of 100M. (LP: #1306164)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 10 Apr 2014 15:11:18 -0400
+
+curtin (0.1.0~bzr125-0ubuntu1) trusty; urgency=medium
+
+  * New upstream snapshot.
+    * fix regression in installation on pc-bios systems (LP: #1303617)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 07 Apr 2014 10:18:34 -0400
+
+curtin (0.1.0~bzr124-0ubuntu1) trusty; urgency=medium
+
+  * New upstream snapshot.
+    * install correctly on UEFI booted systems (LP: #1300910)
+      [Blake Rouse]
+    * whitespace fixes and other small fixes.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 03 Apr 2014 14:47:01 -0400
+
+curtin (0.1.0~bzr121-0ubuntu1) trusty; urgency=medium
+
+  * New upstream snapshot.
+    * support installing kernel package of booted kernel
+      to enable hardware enablement kernels through maas.
+    * support Calxeda highbank and other ARMv7 systems
+    * fix gpt partitioning.  It wouldn't allow grub installation
+    * support for using kexec to boot into the installed system
+      to avoid a hardware bios post.
+    * support declaring target device via config
+    * support installing from a local url (file:///)
+    * fix bug where 'console=' parms were not removed from image's
+      settings (problematic when image was cloud image)
+    * run apt-get update if installing packages
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 26 Mar 2014 17:34:57 -0400
+
+curtin (0.1.0~bzr95-0ubuntu2) trusty; urgency=medium
+
+  * Rebuild to drop files installed into /usr/share/pyshared.
+
+ -- Matthias Klose <doko@xxxxxxxxxx>  Sun, 23 Feb 2014 13:46:42 +0000
+
+curtin (0.1.0~bzr95-0ubuntu1) trusty; urgency=low
+
+  * New upstream snapshot.
+    * fix bug in block-meta resulting in first disk not always being used
+       (LP: #1244026)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 24 Oct 2013 01:41:47 -0400
+
+curtin (0.1.0~bzr94-0ubuntu1) saucy-proposed; urgency=low
+
+  * New upstream snapshot.
+    * fix bug where /usr/sbin/policy-rc.d was not being removed after
+      being utilized during installation to disable daemons. (LP: #1238915)
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 15 Oct 2013 14:45:16 -0400
+
+curtin (0.1.0~bzr93-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * curtin/commands/in_target.py, curtin/commands/main.py:
+      fix 'curtin -v' and 'curtin in-target' (LP: #1237139)
+    * non-production / development changes:
+      * doc/devel/README.txt: development doc update
+      * tools/build-deb, tools/export-tarball:
+        trunk development changes for creating tarball and building debs.
+      * tools/launch: support '--add' for adding files such as config files
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 08 Oct 2013 20:20:11 -0400
+
+curtin (0.1.0~bzr87-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * fix bug that prevented some systems from booting because
+      'dpkg-reconfigure grub-pc' was not being run.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Wed, 25 Sep 2013 16:35:30 -0400
+
+curtin (0.1.0~bzr86-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * correctly install grub to device rather than partition
+    * correctly write /etc/network/interfaces
+    * get cloud-init configure to work with preseed data.
+    * use tar with --numeric owner when extracting
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Tue, 24 Sep 2013 22:32:08 -0400
+
+curtin (0.1.0~bzr85-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * fix 'pack_install' usage for maas (LP: #1227944)
+    * debian/rules: fix 'curtin' package to install as python2
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Fri, 20 Sep 2013 16:59:25 -0400
+
+curtin (0.1.0~bzr82-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * 'net-meta auto' is now default for interfaces.
+    * power_state config can now cause reboot after install.
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 19 Sep 2013 17:07:17 -0400
+
+curtin (0.1.0~bzr75-0ubuntu1) saucy; urgency=low
+
+  * New upstream snapshot.
+    * change 'curtin' installer to be python2 for better compatibility
+    * split up packaging. Provide curtin, curtin-common, python-curtin and
+      python3-curtin.
+    * add 'curtin in-target' command for chrooting to target
+    * support http_proxy, apt_proxy, and specifying ubuntu mirrors. 
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Thu, 19 Sep 2013 04:07:25 -0400
+
+curtin (0.1.0~bzr54-0ubuntu1) saucy; urgency=low
+
+  * Initial release
+
+ -- Scott Moser <smoser@xxxxxxxxxx>  Mon, 29 Jul 2013 16:12:09 -0400
diff --git a/debian/control b/debian/control
index cea1af8..09e0c53 100644
--- a/debian/control
+++ b/debian/control
@@ -5,6 +5,7 @@ Standards-Version: 3.9.6
 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@xxxxxxxxxxxxxxxx>
 Build-Depends: debhelper (>= 7),
                dh-python,
+<<<<<<< debian/control
                pep8,
                pyflakes,
                python-all,
@@ -14,12 +15,17 @@ Build-Depends: debhelper (>= 7),
                python-oauthlib,
                python-setuptools,
                python-yaml,
+=======
+>>>>>>> debian/control
                python3,
                python3-coverage,
                python3-mock,
                python3-nose,
                python3-oauthlib,
+<<<<<<< debian/control
                python3-pyflakes | pyflakes (<< 1.1.0-2),
+=======
+>>>>>>> debian/control
                python3-setuptools,
                python3-yaml
 Homepage: http://launchpad.net/curtin
@@ -54,6 +60,7 @@ Depends: ${misc:Depends}
 Description: Library and tools for curtin installer
  This package contains utilities for the curtin installer.
 
+<<<<<<< debian/control
 Package: python-curtin
 Section: python
 Architecture: all
@@ -67,6 +74,8 @@ Depends: curtin-common (= ${binary:Version}),
 Description: Library and tools for curtin installer
  This package provides python library for use by curtin.
 
+=======
+>>>>>>> debian/control
 Package: python3-curtin
 Section: python
 Architecture: all
diff --git a/debian/rules b/debian/rules
index af2ebab..f1070c3 100755
--- a/debian/rules
+++ b/debian/rules
@@ -1,6 +1,9 @@
 #!/usr/bin/make -f
 
+<<<<<<< debian/rules
 PYVERS := $(shell pyversions -r)
+=======
+>>>>>>> debian/rules
 PY3VERS := $(shell py3versions -r)
 
 DEB_VERSION := $(shell dpkg-parsechangelog --show-field=Version)
@@ -8,14 +11,29 @@ UPSTREAM_VERSION := $(shell x="$(DEB_VERSION)"; echo "$${x%-*}")
 PKG_VERSION := $(shell x="$(DEB_VERSION)"; echo "$${x\#\#*-}")
 
 %:
+<<<<<<< debian/rules
 	dh $@ --with=python2,python3
 
 override_dh_auto_install:
 	dh_auto_install
 	set -ex; for python in $(PY3VERS) $(PYVERS); do \
+=======
+	dh $@ --with=python3
+
+override_dh_auto_install:
+	dh_auto_install
+	set -ex; for python in $(PY3VERS); do \
+>>>>>>> debian/rules
 		$$python setup.py build --executable=/usr/bin/python && \
 		$$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
 	done
 	chmod 755 $(CURDIR)/debian/tmp/usr/lib/curtin/helpers/*
+<<<<<<< debian/rules
 	find $(CURDIR)/debian/tmp
 	for f in $$(find $(CURDIR)/debian/tmp/usr/lib -type f -name version.py); do [ -f "$$f" ] || continue; sed -i 's,@@PACKAGED_VERSION@@,$(DEB_VERSION),' "$$f"; done
+=======
+	for f in $$(find $(CURDIR)/debian/tmp/usr/lib -type f -name version.py); do [ -f "$$f" ] || continue; sed -i 's,@@PACKAGED_VERSION@@,$(DEB_VERSION),' "$$f"; done
+
+override_dh_auto_test:
+	make unittest3
+>>>>>>> debian/rules
diff --git a/doc/topics/config.rst b/doc/topics/config.rst
index 951f07f..49c9609 100644
--- a/doc/topics/config.rst
+++ b/doc/topics/config.rst
@@ -226,6 +226,7 @@ not provided, Curtin will set the value to 'console'.  If the ``terminal``
 value is 'unmodified' then Curtin will not set any value at all and will
 use Grub defaults.
 
+<<<<<<< doc/topics/config.rst
 **reorder_uefi**: *<boolean: default True>*
 
 Curtin is typically used with MAAS where the systems are configured to boot
@@ -255,6 +256,8 @@ even if BootCurrent is present if *reorder_uefi_force_fallback* is True.
 
 This setting is ignored if *update_nvram* or *reorder_uefi* are False.
 
+=======
+>>>>>>> doc/topics/config.rst
 
 **Example**::
 
@@ -293,12 +296,15 @@ This setting is ignored if *update_nvram* or *reorder_uefi* are False.
      probe_additional_os: True
      terminal: unmodified
 
+<<<<<<< doc/topics/config.rst
 **Enable Fallback UEFI Reordering**::
 
   grub:
      reorder_uefi: true
      reorder_uefi_force_fallback: true
 
+=======
+>>>>>>> doc/topics/config.rst
 
 http_proxy
 ~~~~~~~~~~
diff --git a/tests/unittests/helpers.py b/tests/unittests/helpers.py
index 64a79ca..a243c71 100644
--- a/tests/unittests/helpers.py
+++ b/tests/unittests/helpers.py
@@ -2,13 +2,19 @@
 
 import imp
 import importlib
+<<<<<<< tests/unittests/helpers.py
 import logging
+=======
+>>>>>>> tests/unittests/helpers.py
 import mock
 import os
 import random
 import shutil
 import string
+<<<<<<< tests/unittests/helpers.py
 import sys
+=======
+>>>>>>> tests/unittests/helpers.py
 import tempfile
 from unittest import TestCase, skipIf
 from contextlib import contextmanager
@@ -57,7 +63,10 @@ def skipUnlessJsonSchema():
 class CiTestCase(TestCase):
     """Common testing class which all curtin unit tests subclass."""
 
+<<<<<<< tests/unittests/helpers.py
     with_logs = False
+=======
+>>>>>>> tests/unittests/helpers.py
     allowed_subp = False
     SUBP_SHELL_TRUE = "shell=True"
 
@@ -72,6 +81,7 @@ class CiTestCase(TestCase):
 
     def setUp(self):
         super(CiTestCase, self).setUp()
+<<<<<<< tests/unittests/helpers.py
         if self.with_logs:
             # Create a log handler so unit tests can search expected logs.
             self.logger = logging.getLogger()
@@ -87,6 +97,8 @@ class CiTestCase(TestCase):
             self.old_handlers = self.logger.handlers
             self.logger.handlers = [handler]
 
+=======
+>>>>>>> tests/unittests/helpers.py
         if self.allowed_subp is True:
             util.subp = _real_subp
         else:
diff --git a/tests/unittests/test_block.py b/tests/unittests/test_block.py
index 78e331d..50a5850 100644
--- a/tests/unittests/test_block.py
+++ b/tests/unittests/test_block.py
@@ -179,6 +179,7 @@ class TestBlock(CiTestCase):
         byid_path = block.disk_to_byid_path('/dev/sdb')
         self.assertEqual(mapping.get('/dev/sdb'), byid_path)
 
+<<<<<<< tests/unittests/test_block.py
     @mock.patch("curtin.block.os.path.exists")
     def test__get_dev_disk_by_prefix_returns_empty_dict(self, m_exists):
         """ _get_disk_by_prefix returns empty dict prefix dir does not exit """
@@ -191,6 +192,8 @@ class TestBlock(CiTestCase):
         m_exists.return_value = False
         self.assertEqual(None, block.disk_to_byid_path('/dev/sdb'))
 
+=======
+>>>>>>> tests/unittests/test_block.py
 
 class TestSysBlockPath(CiTestCase):
     @mock.patch("curtin.block.get_blockdev_for_partition")
diff --git a/tests/unittests/test_block_mdadm.py b/tests/unittests/test_block_mdadm.py
index dba0f74..1a9acba 100644
--- a/tests/unittests/test_block_mdadm.py
+++ b/tests/unittests/test_block_mdadm.py
@@ -120,10 +120,19 @@ class TestBlockMdadmCreate(CiTestCase):
         side_effects.append(("", ""))  # mdadm create
         # build command how mdadm_create does
         cmd = (["mdadm", "--create", md_devname, "--run",
+<<<<<<< tests/unittests/test_block_mdadm.py
                 "--metadata=%s" % metadata,
                 "--homehost=%s" % hostname, "--level=%s" % raidlevel,
                 "--raid-devices=%s" % len(devices)] +
                devices)
+=======
+                "--homehost=%s" % hostname,
+                "--raid-devices=%s" % len(devices),
+                "--metadata=%s" % metadata])
+        if raidlevel != 'container':
+            cmd += ["--level=%s" % raidlevel]
+        cmd += devices
+>>>>>>> tests/unittests/test_block_mdadm.py
         if spares:
             cmd += ["--spare-devices=%s" % len(spares)] + spares
 
@@ -228,6 +237,25 @@ class TestBlockMdadmCreate(CiTestCase):
                            devices=devices, spares=spares)
         self.mock_util.subp.assert_has_calls(expected_calls)
 
+<<<<<<< tests/unittests/test_block_mdadm.py
+=======
+    def test_mdadm_create_imsm_container(self):
+        md_devname = "/dev/md/imsm"
+        raidlevel = 'container'
+        devices = ['/dev/nvme0n1', '/dev/nvme1n1', '/dev/nvme2n1']
+        metadata = 'imsm'
+        spares = []
+        (side_effects, expected_calls) = self.prepare_mock(md_devname,
+                                                           raidlevel,
+                                                           devices,
+                                                           spares,
+                                                           metadata)
+
+        self.mock_util.subp.side_effect = side_effects
+        mdadm.mdadm_create(md_devname=md_devname, raidlevel=raidlevel,
+                           devices=devices, spares=spares, metadata=metadata)
+        self.mock_util.subp.assert_has_calls(expected_calls)
+>>>>>>> tests/unittests/test_block_mdadm.py
 
 class TestBlockMdadmExamine(CiTestCase):
     def setUp(self):
@@ -315,6 +343,73 @@ class TestBlockMdadmExamine(CiTestCase):
         self.mock_util.subp.assert_has_calls(expected_calls)
         self.assertEqual(data, {})
 
+<<<<<<< tests/unittests/test_block_mdadm.py
+=======
+    def test_mdadm_examine_no_export_imsm(self):
+        self.mock_util.subp.return_value = ("""/dev/nvme0n1:
+          Magic : Intel Raid ISM Cfg Sig.
+        Version : 1.3.00
+    Orig Family : 6f8c68e3
+         Family : 6f8c68e3
+     Generation : 00000112
+     Attributes : All supported
+           UUID : 7ec12162:ee5cd20b:0ac8b069:cfbd93ec
+       Checksum : 4a5cebe2 correct
+    MPB Sectors : 2
+          Disks : 4
+   RAID Devices : 1
+
+  Disk03 Serial : LJ910504Q41P0FGN
+          State : active
+             Id : 00000000
+    Usable Size : 1953514766 (931.51 GiB 1000.20 GB)
+
+[126]:
+           UUID : f9792759:7f61d0c7:e7313d5a:2e7c2e22
+     RAID Level : 5
+        Members : 4
+          Slots : [UUUU]
+    Failed disk : none
+      This Slot : 3
+    Sector Size : 512
+     Array Size : 5860540416 (2794.52 GiB 3000.60 GB)
+   Per Dev Size : 1953515520 (931.51 GiB 1000.20 GB)
+  Sector Offset : 0
+    Num Stripes : 7630912
+     Chunk Size : 128 KiB
+       Reserved : 0
+  Migrate State : idle
+      Map State : normal
+    Dirty State : dirty
+     RWH Policy : off
+
+  Disk00 Serial : LJ91040H2Y1P0FGN
+          State : active
+             Id : 00000003
+    Usable Size : 1953514766 (931.51 GiB 1000.20 GB)
+
+  Disk01 Serial : LJ916308CZ1P0FGN
+          State : active
+             Id : 00000002
+    Usable Size : 1953514766 (931.51 GiB 1000.20 GB)
+
+  Disk02 Serial : LJ916308RF1P0FGN
+          State : active
+             Id : 00000001
+    Usable Size : 1953514766 (931.51 GiB 1000.20 GB)
+        """, "")   # mdadm --examine /dev/nvme0n1
+
+        device = "/dev/nvme0n1"
+        data = mdadm.mdadm_examine(device, export=False)
+
+        expected_calls = [
+            call(["mdadm", "--examine", device], capture=True),
+        ]
+        self.mock_util.subp.assert_has_calls(expected_calls)
+        self.assertEqual(data['uuid'],
+                         '7ec12162:ee5cd20b:0ac8b069:cfbd93ec')
+
+>>>>>>> tests/unittests/test_block_mdadm.py
 
 class TestBlockMdadmStop(CiTestCase):
     def setUp(self):
diff --git a/tests/unittests/test_clear_holders.py b/tests/unittests/test_clear_holders.py
index 25e9e79..6e14050 100644
--- a/tests/unittests/test_clear_holders.py
+++ b/tests/unittests/test_clear_holders.py
@@ -238,6 +238,10 @@ class TestClearHolders(CiTestCase):
         mock_mdadm.md_present.return_value = False
         mock_mdadm.md_get_devices_list.return_value = devices
         mock_mdadm.md_get_spares_list.return_value = spares
+<<<<<<< tests/unittests/test_clear_holders.py
+=======
+        mock_mdadm.mdadm_query_detail.return_value = {}
+>>>>>>> tests/unittests/test_clear_holders.py
 
         clear_holders.shutdown_mdadm(self.test_syspath)
 
@@ -256,6 +260,40 @@ class TestClearHolders(CiTestCase):
         mock_mdadm.md_present.assert_called_with(self.test_blockdev)
         self.assertTrue(mock_log.debug.called)
 
+<<<<<<< tests/unittests/test_clear_holders.py
+=======
+    @mock.patch('curtin.block.wipe_volume')
+    @mock.patch('curtin.block.path_to_kname')
+    @mock.patch('curtin.block.sysfs_to_devpath')
+    @mock.patch('curtin.block.clear_holders.time')
+    @mock.patch('curtin.block.clear_holders.util')
+    @mock.patch('curtin.block.clear_holders.LOG')
+    @mock.patch('curtin.block.clear_holders.mdadm')
+    def test_shutdown_mdadm_in_container(self, mock_mdadm, mock_log, mock_util,
+                            mock_time, mock_sysdev, mock_path, mock_wipe):
+        """test clear_holders.shutdown_mdadm"""
+        devices = ['/dev/wda1', '/dev/wda2']
+        spares = ['/dev/wdb1']
+        md_devs = (devices + spares)
+        mock_sysdev.return_value = self.test_blockdev
+        mock_path.return_value = self.test_blockdev
+        mock_mdadm.md_present.return_value = False
+        mock_mdadm.md_get_devices_list.return_value = devices
+        mock_mdadm.md_get_spares_list.return_value = spares
+        mock_mdadm.mdadm_query_detail.return_value = {'MD_CONTAINER':'/dev/md/imsm0'}
+
+        clear_holders.shutdown_mdadm(self.test_syspath)
+
+        mock_wipe.assert_called_with(self.test_blockdev, exclusive=False,
+                                     mode='superblock', strict=True)
+        mock_mdadm.set_sync_action.assert_has_calls([
+                mock.call(self.test_blockdev, action="idle"),
+                mock.call(self.test_blockdev, action="frozen")])
+        mock_mdadm.mdadm_stop.assert_called_with(self.test_blockdev)
+        mock_mdadm.md_present.assert_called_with(self.test_blockdev)
+        self.assertTrue(mock_log.debug.called)
+
+>>>>>>> tests/unittests/test_clear_holders.py
     @mock.patch('curtin.block.clear_holders.os')
     @mock.patch('curtin.block.clear_holders.time')
     @mock.patch('curtin.block.clear_holders.util')
@@ -271,6 +309,10 @@ class TestClearHolders(CiTestCase):
         mock_mdadm.md_present.return_value = True
         mock_util.subp.return_value = ("", "")
         mock_os.path.exists.return_value = True
+<<<<<<< tests/unittests/test_clear_holders.py
+=======
+        mock_mdadm.mdadm_query_detail.return_value = {}
+>>>>>>> tests/unittests/test_clear_holders.py
 
         with self.assertRaises(OSError):
             clear_holders.shutdown_mdadm(self.test_syspath)
@@ -295,6 +337,10 @@ class TestClearHolders(CiTestCase):
         mock_block.path_to_kname.return_value = self.test_blockdev
         mock_mdadm.md_present.return_value = True
         mock_os.path.exists.return_value = False
+<<<<<<< tests/unittests/test_clear_holders.py
+=======
+        mock_mdadm.mdadm_query_detail.return_value = {}
+>>>>>>> tests/unittests/test_clear_holders.py
 
         with self.assertRaises(OSError):
             clear_holders.shutdown_mdadm(self.test_syspath)
diff --git a/tests/unittests/test_commands_block_meta.py b/tests/unittests/test_commands_block_meta.py
index d954296..ed45fbe 100644
--- a/tests/unittests/test_commands_block_meta.py
+++ b/tests/unittests/test_commands_block_meta.py
@@ -1892,7 +1892,11 @@ class TestRaidHandler(CiTestCase):
         self.m_getpath.side_effect = iter(devices)
         block_meta.raid_handler(self.storage_config['mddevice'],
                                 self.storage_config)
+<<<<<<< tests/unittests/test_commands_block_meta.py
         self.assertEqual([call(md_devname, 5, devices, [], '')],
+=======
+        self.assertEqual([call(md_devname, 5, devices, [], None, '', None)],
+>>>>>>> tests/unittests/test_commands_block_meta.py
                          self.m_mdadm.mdadm_create.call_args_list)
 
     @patch('curtin.commands.block_meta.raid_verify')
diff --git a/tests/unittests/test_curthooks.py b/tests/unittests/test_curthooks.py
index ddae280..3af5290 100644
--- a/tests/unittests/test_curthooks.py
+++ b/tests/unittests/test_curthooks.py
@@ -1,6 +1,9 @@
 # This file is part of curtin. See LICENSE file for copyright and license info.
 
+<<<<<<< tests/unittests/test_curthooks.py
 import copy
+=======
+>>>>>>> tests/unittests/test_curthooks.py
 import os
 from mock import call, patch
 import textwrap
@@ -11,7 +14,11 @@ from curtin import distro
 from curtin import util
 from curtin import config
 from curtin.reporter import events
+<<<<<<< tests/unittests/test_curthooks.py
 from .helpers import CiTestCase, dir2dict, populate_dir, random
+=======
+from .helpers import CiTestCase, dir2dict, populate_dir
+>>>>>>> tests/unittests/test_curthooks.py
 
 
 class TestGetFlashKernelPkgs(CiTestCase):
@@ -532,6 +539,7 @@ class TestSetupZipl(CiTestCase):
             content)
 
 
+<<<<<<< tests/unittests/test_curthooks.py
 class EfiOutput(object):
 
     def __init__(self, current=None, order=None, entries=None):
@@ -576,11 +584,18 @@ class TestSetupGrub(CiTestCase):
 
     with_logs = True
 
+=======
+class TestSetupGrub(CiTestCase):
+
+>>>>>>> tests/unittests/test_curthooks.py
     def setUp(self):
         super(TestSetupGrub, self).setUp()
         self.target = self.tmp_dir()
         self.distro_family = distro.DISTROS.debian
+<<<<<<< tests/unittests/test_curthooks.py
         self.variant = 'ubuntu'
+=======
+>>>>>>> tests/unittests/test_curthooks.py
         self.add_patch('curtin.distro.lsb_release', 'mock_lsb_release')
         self.mock_lsb_release.return_value = {'codename': 'xenial'}
         self.add_patch('curtin.util.is_uefi_bootable',
@@ -600,8 +615,12 @@ class TestSetupGrub(CiTestCase):
         updated_cfg = {
             'install_devices': ['/dev/vdb']
         }
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+>>>>>>> tests/unittests/test_curthooks.py
         self.m_install_grub.assert_called_with(
             ['/dev/vdb'], self.target, uefi=False, grubcfg=updated_cfg)
 
@@ -633,8 +652,12 @@ class TestSetupGrub(CiTestCase):
             },
         }
         m_exists.return_value = True
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+>>>>>>> tests/unittests/test_curthooks.py
         self.m_install_grub.assert_called_with(
             ['/dev/vdb'], self.target, uefi=False,
             grubcfg={'install_devices': ['/dev/vdb']})
@@ -684,8 +707,12 @@ class TestSetupGrub(CiTestCase):
         }
         m_exists.return_value = True
         m_is_valid_device.side_effect = (False, True, False, True)
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=distro.DISTROS.redhat,
                              variant='centos')
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=distro.DISTROS.redhat)
+>>>>>>> tests/unittests/test_curthooks.py
         self.m_install_grub.assert_called_with(
             ['/dev/vdb1'], self.target, uefi=True,
             grubcfg={'update_nvram': False, 'install_devices': ['/dev/vdb1']}
@@ -697,8 +724,12 @@ class TestSetupGrub(CiTestCase):
                 'install_devices': None,
             },
         }
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+>>>>>>> tests/unittests/test_curthooks.py
         self.m_install_grub.assert_called_with(
             ['none'], self.target, uefi=False,
             grubcfg={'install_devices': None}
@@ -729,8 +760,12 @@ class TestSetupGrub(CiTestCase):
                 }
             }
         }
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+>>>>>>> tests/unittests/test_curthooks.py
         self.m_install_grub.assert_called_with(
             ['/dev/vdb'], self.target, uefi=True, grubcfg=cfg.get('grub')
         )
@@ -770,8 +805,12 @@ class TestSetupGrub(CiTestCase):
             }
         }
         self.mock_haspkg.return_value = False
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+>>>>>>> tests/unittests/test_curthooks.py
 
         expected_calls = [
             call(['efibootmgr', '-B', '-b', '0001'],
@@ -812,6 +851,7 @@ class TestSetupGrub(CiTestCase):
             }
         }
         self.mock_haspkg.return_value = False
+<<<<<<< tests/unittests/test_curthooks.py
         curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family,
                              variant=self.variant)
         self.assertEquals([
@@ -1023,6 +1063,12 @@ class TestSetupGrub(CiTestCase):
         self.assertIn("found netboot entries: ['0002', '0003', '0004']", logs)
         self.assertIn("found other entries: ['0001', '0000']", logs)
         self.assertIn("found target entry: ['0007']", logs)
+=======
+        curthooks.setup_grub(cfg, self.target, osfamily=self.distro_family)
+        self.assertEquals([
+            call(['efibootmgr', '-o', '0001,0000'], target=self.target)],
+            self.mock_subp.call_args_list)
+>>>>>>> tests/unittests/test_curthooks.py
 
 
 class TestUefiRemoveDuplicateEntries(CiTestCase):
diff --git a/tests/unittests/test_feature.py b/tests/unittests/test_feature.py
index 8690ad8..ce67a12 100644
--- a/tests/unittests/test_feature.py
+++ b/tests/unittests/test_feature.py
@@ -27,7 +27,10 @@ class TestExportsFeatures(CiTestCase):
     def test_has_btrfs_swapfile_support(self):
         self.assertIn('BTRFS_SWAPFILE', curtin.FEATURES)
 
+<<<<<<< tests/unittests/test_feature.py
     def test_has_uefi_reorder_fallback_support(self):
         self.assertIn('UEFI_REORDER_FALLBACK_SUPPORT', curtin.FEATURES)
 
+=======
+>>>>>>> tests/unittests/test_feature.py
 # vi: ts=4 expandtab syntax=python