From 6bd8e73304c8e63b0fe2cbc42ae83a9fea2b81d2 Mon Sep 17 00:00:00 2001
From: Sebastian Rieger <sebastian.rieger@informatik.hs-fulda.de>
Date: Thu, 14 Nov 2019 14:03:57 +0100
Subject: [PATCH] added support for combined vEOS-lab images, esp. vEOS-lab >=
 4.21

---
 .../create-arista-veos-image.sh               | 396 +++++++++++-------
 ...namic-subtype-vEOS-VIRL-Version-1.2.x.json |  24 --
 ...subtype-vEOS-VIRL-Version-above-1.3.x.json |  25 --
 .../minimal-config-vEOS.txt                   |   4 +-
 4 files changed, 247 insertions(+), 202 deletions(-)
 delete mode 100644 create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-1.2.x.json
 delete mode 100644 create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-above-1.3.x.json

diff --git a/create-arista-veos-image/create-arista-veos-image.sh b/create-arista-veos-image/create-arista-veos-image.sh
index cf0b1c6..2375e42 100644
--- a/create-arista-veos-image/create-arista-veos-image.sh
+++ b/create-arista-veos-image/create-arista-veos-image.sh
@@ -16,6 +16,7 @@
 # V1.5    fixed detection of missing loop files for Ubuntu 16.04 in VIRL >=1.3, added default subtype creation
 # V1.51   fixed default subtype creation to use ssh management and max 22 ports, changed ram to 2GB as recommended by Arista
 # V1.52   fixed default subtype creation to support VIRL version <1.3
+# V2.0    added support for new partition layout of vEOS-lab >= 4.21 images, using an integrated bootloader (as the earlier combined versions)
 
 # usage
 if [ ! $# -eq 3 ] ; then
@@ -39,104 +40,79 @@ GLANCE_IMAGE_RELEASE=$VEOS_VMDK_BASENAME-$ABOOT_SERIAL_ISO_BASENAME
 TMP_NAME="vEOS-$GLANCE_IMAGE_RELEASE"
 TIMESTAMP=$(date +%Y%m%d%H%M%S)
 
+function wait_for_loop_dev_partitions() {
+  LOOPDEV_PARTITION_1=$1
+  LOOPDEV_PARTITION_2=$2
+
+  echo -n "waiting for loop devs from kpartx ($LOOPDEV_PARTITION_1 and $LOOPDEV_PARTITION_2)"
+  LOOP_DEV_RETRIES=0
+  until dd if=/dev/mapper/$LOOPDEV_PARTITION_1 of=/dev/null bs=1k count=1 &>/dev/null && dd if=/dev/mapper/$LOOPDEV_PARTITION_2 of=/dev/null bs=1k count=1 &>/dev/null ; do
+    echo -n "."
+    LOOP_DEV_RETRIES=$(expr $LOOP_DEV_RETRIES + 1)
+    if [ $LOOP_DEV_RETRIES -eq 10 ]; then
+      echo
+      echo "ERROR: timeout waiting for loop devs from kpartx"
+      exit -1
+    fi
+    sleep 1
+  done
+  return 0
+}
+
+function remove_loop_devs() {
+  LOOP_DEV_IMAGE=$1
+
+  LOOP_DEV_DEL_RETRIES=0
+  echo "removing loop devs from kpartx ($LOOP_DEV_IMAGE)"
+  until kpartx -vd $LOOP_DEV_IMAGE ; do
+    echo -n "."
+    LOOP_DEV_DEL_RETRIES=$(expr $LOOP_DEV_DEL_RETRIES + 1)
+    if [ $LOOP_DEV_DEL_RETRIES -eq 10 ]; then
+      echo
+      echo "ERROR: timeout waiting for loop dev removal from kpartx"
+      exit -1
+    fi
+    sleep 1
+  done
+  echo
+  return 0
+}
+
 function safe_unmount() {
-  echo -n "Unmounting $1..."
+  MOUNTPOINT=$1
+
+  echo -n "Unmounting $MOUNTPOINT..."
   RETRY=0
-  until umount $1 &>/dev/null
+  until umount $MOUNTPOINT &>/dev/null
   do
     echo -n "."
     sleep 1
     RETRY=$((RETRY+1))
     if [ "$RETRY" -ge "5" ] ; then
       echo
-      echo "ERROR: unable to unmount working directory $1"
-      exit 1
+      echo "ERROR: unable to unmount working directory $MOUNTPOINT"
+      exit -1
     fi
   done
   echo
   return 0
 }
 
-# check for an existing image with the same name and offer to delete it prior to creating a new one
-CHECK_FOR_EXISTING_IMAGE=$(glance --os-image-api-version 1 image-show $GLANCE_IMAGE_NAME 2>&1)
-if [ $? == 0 ] ; then
-  glance --os-image-api-version 1 image-show $GLANCE_IMAGE_NAME
-  echo
+function inject_rc_eos() {
   echo
-  read -r -p "There is already an image with the same name in glance. Do you want to overwrite it? [y/N] " RESPONSE
-  if [[ $RESPONSE =~ ^([yY][eE][sS]|[yY])$ ]] ; then
-    echo "Deleting existing image $GLANCE_IMAGE_NAME..."
-    echo "==========================================================="
-
-    glance --os-image-api-version 1 image-delete $GLANCE_IMAGE_NAME
-  else
-    echo "An image with the same name already exists. Either delete this image or choose another name."
-    exit 1
-  fi
-fi
-
-echo
-echo "Creating vEOS image..."
-echo "==========================================================="
-
-# create a copy of Aboot bootloader and extend it to 3G
-echo "Creating a copy of Aboot bootloader in $TMP_NAME.raw..."
-cp $1 $TMP_NAME.raw
-
-echo
-echo "Extracting partitions from vEOS vmdk..."
-echo "==========================================================="
-
-# convert vmdk to raw and extract two partitions in it
-echo "Converting vmdk image to raw..."
-qemu-img convert -O raw $2 $VEOS_VMDK_BASENAME.raw
-LOOPDEV=$(kpartx -av $VEOS_VMDK_BASENAME.raw)
-LOOPDEV_PART1=$(echo "$LOOPDEV" | sed '1q;d' | cut -d " " -f 3)
-LOOPDEV_PART2=$(echo "$LOOPDEV" | sed '2q;d' | cut -d " " -f 3)
-echo "Output from kpartx: $LOOPDEV"
-echo "PART1: $LOOPDEV_PART1"
-echo "PART2: $LOOPDEV_PART2"
-echo -n "waiting for loop devs from kpartx"
-LOOP_DEV_RETRIES=0
-until dd if=/dev/mapper/$LOOPDEV_PART1 of=/dev/null bs=1k count=1 &>/dev/null && dd if=/dev/mapper/$LOOPDEV_PART2 of=/dev/null bs=1k count=1 &>/dev/null ; do
-  echo -n "."
-  LOOP_DEV_RETRIES=$(expr $LOOP_DEV_RETRIES + 1)
-  if [ $LOOP_DEV_RETRIES -eq 10 ]; then
-    echo
-    echo "ERROR: timeout waiting for loop devs from kaprtx"
-    exit
-  fi
-  sleep 1
-done
-echo
-echo "using dd to extract partitions..."
-dd if=/dev/mapper/$LOOPDEV_PART1 of=$VEOS_VMDK_BASENAME-p1.raw
-dd if=/dev/mapper/$LOOPDEV_PART2 of=$VEOS_VMDK_BASENAME-p2.raw
-LOOP_DEV_DEL_RETRIES=0
-echo "removing loop devs from kpartx"
-until kpartx -vd $VEOS_VMDK_BASENAME.raw ; do
-  echo -n "."
-  LOOP_DEV_DEL_RETRIES=$(expr $LOOP_DEV_DEL_RETRIES + 1)
-  if [ $LOOP_DEV_DEL_RETRIES -eq 10 ]; then
-    echo
-    echo "ERROR: timeout waiting for loop dev removal from kaprtx"
-    exit
-  fi
-  sleep 1
-done
-echo
+  echo "Injecting rc.eos startup script to get switch config..."
+  echo "==========================================================="
 
-echo
-echo "Injecting rc.eos startup script to get switch config..."
-echo "==========================================================="
+  # inject rc.eos script to get switch config defined in VM Maestro (config-drive)
+  INJECTION_TIMESTAMP=$1
+  VEOS_VMDK_BASENAME_RC_EOS_PART=$2
 
-# inject rc.eos script in first partition of the image, to get switch config defined in VM Maestro (config-drive)
-mkdir swi-$TIMESTAMP
-echo "loop mounting image..."
-mount -o loop $VEOS_VMDK_BASENAME-p1.raw swi-$TIMESTAMP
-cd swi-$TIMESTAMP
-echo "injecting rc.eos..."
-cat << EOF > rc.eos
+  mkdir swi-$INJECTION_TIMESTAMP
+  echo "loop mounting image..."
+  mount -o loop $VEOS_VMDK_BASENAME_RC_EOS_PART swi-$INJECTION_TIMESTAMP
+  cd swi-$INJECTION_TIMESTAMP
+  echo "injecting rc.eos..."
+  cat << EOF > rc.eos
 #!/bin/sh
 #
 # startup script to get node configs from VM Maestro
@@ -145,7 +121,16 @@ cat << EOF > rc.eos
 echo "Getting switch config from config drive..."
 echo "=========================================="
 mkdir /config-drive
-mount /dev/sdb1 /config-drive
+
+# check if config drive is CDROM or DISK, CDROM is required for vEOS >=4.21 combined images
+blkid | grep /dev/sr0 | grep CDROM
+if [ \$? -eq 0 ]; then
+  # config_disk_type is cdrom
+  mount /dev/sr0 /config-drive
+else
+  # config_disk_type is disk
+  mount /dev/sdb1 /config-drive
+fi
 
 echo "Getting ip address for ma1 via dhcp..."
 echo "=========================================="
@@ -167,45 +152,110 @@ echo "Copying switch config from config drive..."
 echo "=========================================="
 cp /mnt/flash/startup-config.tmp /mnt/flash/startup-config
 EOF
-chmod 755 rc.eos
-cd ..
+  chmod 755 rc.eos
+  cd ..
 
-echo "unmounting image..."
-safe_unmount swi-$TIMESTAMP
+  echo "unmounting image..."
+  safe_unmount swi-$INJECTION_TIMESTAMP
 
-rm -rf swi-$TIMESTAMP
+  rm -rf swi-$INJECTION_TIMESTAMP
+  return 0
+}
+
+# check for an existing image with the same name and offer to delete it prior to creating a new one
+CHECK_FOR_EXISTING_IMAGE=$(glance --os-image-api-version 1 image-show $GLANCE_IMAGE_NAME 2>&1)
+if [ $? == 0 ] ; then
+  glance --os-image-api-version 1 image-show $GLANCE_IMAGE_NAME
+  echo
+  echo
+  read -r -p "There is already an image with the same name in glance. Do you want to overwrite it? [y/N] " RESPONSE
+  if [[ $RESPONSE =~ ^([yY][eE][sS]|[yY])$ ]] ; then
+    echo "Deleting existing image $GLANCE_IMAGE_NAME..."
+    echo "==========================================================="
+
+    glance --os-image-api-version 1 image-delete $GLANCE_IMAGE_NAME
+  else
+    echo "An image with the same name already exists. Either delete this image or choose another name."
+    exit -1
+  fi
+fi
 
 echo
-echo "Injecting new partitions from vEOS vmdk in Aboot image..."
+echo "Detecting partition layout..."
 echo "==========================================================="
 
-echo "$VEOS_VMDK_BASENAME.raw (original vEOS vmdk layout):"
+# convert vmdk to raw
+echo "Converting vmdk image to raw..."
+qemu-img convert -O raw $2 $VEOS_VMDK_BASENAME.raw
+
+echo
+echo "vEOS image partition layout:"
 fdisk -l $VEOS_VMDK_BASENAME.raw
 
-echo "$TMP_NAME.raw (original ABoot bootloader layout):"
-fdisk -l $TMP_NAME.raw
+PARTITION_LAYOUT=$(fdisk -l $VEOS_VMDK_BASENAME.raw -l -o device,id | tail -2 | tr -s " " | cut -d " " -f 2)
+PARTITION_TYPE_PART1=$(echo "$PARTITION_LAYOUT" | sed '1q;d')
+PARTITION_TYPE_PART2=$(echo "$PARTITION_LAYOUT" | sed '2q;d')
+
+if [ "$PARTITION_TYPE_PART1" == "c" ] && [ "$PARTITION_TYPE_PART2" == "12" ]; then
+  PARTITION_LAYOUT_TYPE="old"
+  CONFIG_DISK_TYPE="disk"
+  echo
+  echo "Detected old partition layout. Bootloader partition needs to be injected in vEOS image..."
 
-# calulate size of the two partitions
-PART1_START=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw1" | tr -s " " | cut -d ' ' -f 3)
-PART1_END=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw1" | tr -s " " | cut -d ' ' -f 4)
-PART1_LENGTH=$(expr $PART1_END - $PART1_START)
+  # create a copy of Aboot bootloader and extend it to vEOS image size
+  echo "Creating a copy of Aboot bootloader in $TMP_NAME.raw..."
+  cp $1 $TMP_NAME.raw
 
-echo "raw1 start=$PART1_START,end=$PART1_END,length=$PART1_LENGTH"
+  LOOPDEV=$(kpartx -av $VEOS_VMDK_BASENAME.raw)
+  LOOPDEV_PART1=$(echo "$LOOPDEV" | sed '1q;d' | cut -d " " -f 3)
+  LOOPDEV_PART2=$(echo "$LOOPDEV" | sed '2q;d' | cut -d " " -f 3)
+  echo "Output from kpartx: $LOOPDEV"
+  echo "PART1: $LOOPDEV_PART1"
+  echo "PART2: $LOOPDEV_PART2"
 
-PART2_START=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw2" | tr -s " " | cut -d ' ' -f 2)
-PART2_END=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw2" | tr -s " " | cut -d ' ' -f 3)
-PART2_LENGTH=$(expr $PART2_END - $PART2_START)
+  wait_for_loop_dev_partitions $LOOPDEV_PART1 $LOOPDEV_PART2
 
-echo "raw2 start=$PART2_START,end=$PART2_END,length=$PART2_LENGTH"
+  echo
+  echo "using dd to extract partitions..."
+  dd if=/dev/mapper/$LOOPDEV_PART1 of=$VEOS_VMDK_BASENAME-p1.raw
+  dd if=/dev/mapper/$LOOPDEV_PART2 of=$VEOS_VMDK_BASENAME-p2.raw
 
-# extend the bootloader iso to be able to append the two partitions
-EXTENSION_SIZE=$(ls -lk $VEOS_VMDK_BASENAME.raw | tr -s " " | cut -d " " -f 5)
-echo "extending image $TMP_NAME.raw to +$EXTENSION_SIZE"
-truncate -s +$EXTENSION_SIZE $TMP_NAME.raw
+  remove_loop_devs $VEOS_VMDK_BASENAME.raw
 
-echo "appending partitions from vmdk in the bootloader iso in $TMP_NAME.raw..."
-# append the two partitions from vmdk in the bootloader iso
-echo -e "n
+  # inject rc.eos file to allow configuration from VM Maestro
+  inject_rc_eos $TIMESTAMP $VEOS_VMDK_BASENAME-p1.raw
+
+  echo
+  echo "Injecting new partitions from vEOS vmdk in Aboot image..."
+  echo "==========================================================="
+
+  echo "$VEOS_VMDK_BASENAME.raw (original vEOS vmdk layout):"
+  fdisk -l $VEOS_VMDK_BASENAME.raw
+
+  echo "$TMP_NAME.raw (original ABoot bootloader layout):"
+  fdisk -l $TMP_NAME.raw
+
+  # calulate size of the two partitions
+  PART1_START=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw1" | tr -s " " | cut -d ' ' -f 3)
+  PART1_END=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw1" | tr -s " " | cut -d ' ' -f 4)
+  PART1_LENGTH=$(expr $PART1_END - $PART1_START)
+
+  echo "raw1 start=$PART1_START,end=$PART1_END,length=$PART1_LENGTH"
+
+  PART2_START=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw2" | tr -s " " | cut -d ' ' -f 2)
+  PART2_END=$(fdisk -l $VEOS_VMDK_BASENAME.raw | grep "\.raw2" | tr -s " " | cut -d ' ' -f 3)
+  PART2_LENGTH=$(expr $PART2_END - $PART2_START)
+
+  echo "raw2 start=$PART2_START,end=$PART2_END,length=$PART2_LENGTH"
+
+  # extend the bootloader iso to be able to append the two partitions
+  EXTENSION_SIZE=$(ls -lk $VEOS_VMDK_BASENAME.raw | tr -s " " | cut -d " " -f 5)
+  echo "extending image $TMP_NAME.raw to +$EXTENSION_SIZE"
+  truncate -s +$EXTENSION_SIZE $TMP_NAME.raw
+
+  echo "appending partitions from vmdk in the bootloader iso in $TMP_NAME.raw..."
+  # append the two partitions from vmdk in the bootloader iso
+  echo -e "n
 p
 
 
@@ -225,45 +275,90 @@ t
 12
 w" | fdisk $TMP_NAME.raw
 
-echo "$TMP_NAME.raw (new combined image layout):"
-fdisk -l $TMP_NAME.raw
-
-# copy the partitions from vEOS vmdk to new image
-LOOPDEV=$(kpartx -av $TMP_NAME.raw)
-LOOPDEV_PART2=$(echo "$LOOPDEV" | sed '2q;d' | cut -d " " -f 3)
-LOOPDEV_PART3=$(echo "$LOOPDEV" | sed '3q;d' | cut -d " " -f 3)
-echo "Output from kpartx: $LOOPDEV"
-echo "PART1: $LOOPDEV_PART1"
-echo "PART2: $LOOPDEV_PART2"
-echo -n "waiting for loop devs from kpartx"
-LOOP_DEV_RETRIES=0
-until dd if=/dev/mapper/$LOOPDEV_PART2 of=/dev/null bs=1k count=1 &>/dev/null && dd if=/dev/mapper/$LOOPDEV_PART3 of=/dev/null bs=1k count=1 &>/dev/null ; do
-  echo -n "."
-  LOOP_DEV_RETRIES=$(expr $LOOP_DEV_RETRIES + 1)
-  if [ $LOOP_DEV_RETRIES -eq 10 ]; then
-    echo
-    echo "ERROR: timeout waiting for loop devs from kaprtx"
-    exit
-  fi
-  sleep 1
-done
-echo
-echo "copying the partitions from vEOS vmdk to new image..."
-dd if=$VEOS_VMDK_BASENAME-p1.raw of=/dev/mapper/$LOOPDEV_PART2
-dd if=$VEOS_VMDK_BASENAME-p2.raw of=/dev/mapper/$LOOPDEV_PART3
-LOOP_DEV_DEL_RETRIES=0
-echo "removing loop devs from kpartx"
-until kpartx -vd $TMP_NAME.raw ; do
-  echo -n "."
-  LOOP_DEV_DEL_RETRIES=$(expr $LOOP_DEV_DEL_RETRIES + 1)
-  if [ $LOOP_DEV_DEL_RETRIES -eq 10 ]; then
-    echo
-    echo "ERROR: timeout waiting for loop dev removal from kaprtx"
-    exit
-  fi
+  echo "$TMP_NAME.raw (new combined image layout):"
+  fdisk -l $TMP_NAME.raw
+
+  # copy the partitions from vEOS vmdk to new image
+  LOOPDEV=$(kpartx -av $TMP_NAME.raw)
+  LOOPDEV_FIRST_PART=$(echo "$LOOPDEV" | sed '2q;d' | cut -d " " -f 3)
+  LOOPDEV_SECOND_PART=$(echo "$LOOPDEV" | sed '3q;d' | cut -d " " -f 3)
+  echo "Output from kpartx: $LOOPDEV"
+  echo "PART2: $LOOPDEV_FIRST_PART"
+  echo "PART3: $LOOPDEV_SECOND_PART"
+
+  wait_for_loop_dev_partitions $LOOPDEV_FIRST_PART $LOOPDEV_SECOND_PART
+
+  echo
+  echo "copying the partitions from vEOS vmdk to new image..."
+  dd if=$VEOS_VMDK_BASENAME-p1.raw of=/dev/mapper/$LOOPDEV_FIRST_PART
+  dd if=$VEOS_VMDK_BASENAME-p2.raw of=/dev/mapper/$LOOPDEV_SECOND_PART
+
+  remove_loop_devs $TMP_NAME.raw
+
+  rm $VEOS_VMDK_BASENAME-p1.raw
+  rm $VEOS_VMDK_BASENAME-p2.raw
+
+elif [ "$PARTITION_TYPE_PART1" == "17" ] && [ "$PARTITION_TYPE_PART2" == "83" ]; then
+  PARTITION_LAYOUT_TYPE="new"
+  CONFIG_DISK_TYPE="cdrom"
+  echo
+  echo "Detected new combined partition layout. Bootloader already integrated in vEOS image ..."
+
+  # extract bootloader partition
+  LOOPDEV=$(kpartx -av $ABOOT_SERIAL_ISO)
+  LOOPDEV_FIRST_PART=$(echo "$LOOPDEV" | sed '1q;d' | cut -d " " -f 3)
+  echo "Output from kpartx: $LOOPDEV"
+  echo "PART1: $LOOPDEV_FIRST_PART"
+
+  # waiting for loop parts can be improved, using only one arg, better solution: get rid of kpartx completely and extract parts using dd etc.
+  wait_for_loop_dev_partitions $LOOPDEV_FIRST_PART $LOOPDEV_FIRST_PART
+
+  echo
+  echo "copying the bootloader partition..."
+  dd if=/dev/mapper/$LOOPDEV_FIRST_PART of=$ABOOT_SERIAL_ISO_BASENAME-p1.raw 
+
+  remove_loop_devs $ABOOT_SERIAL_ISO
+
+  # create a copy of vEOS image
+  echo "Creating a copy of vEOS image in $TMP_NAME.raw..."
+  cp $VEOS_VMDK_BASENAME.raw $TMP_NAME.raw
+
+  # modify the content of the partitions of the image
+
+  LOOPDEV=$(kpartx -av $TMP_NAME.raw)
+  LOOPDEV_FIRST_PART=$(echo "$LOOPDEV" | sed '1q;d' | cut -d " " -f 3)
+  LOOPDEV_SECOND_PART=$(echo "$LOOPDEV" | sed '2q;d' | cut -d " " -f 3)
+  echo "Output from kpartx: $LOOPDEV"
+  echo "PART1: $LOOPDEV_FIRST_PART"
+  echo "PART2: $LOOPDEV_SECOND_PART"
+
+  wait_for_loop_dev_partitions $LOOPDEV_FIRST_PART $LOOPDEV_SECOND_PART
+
+  # inject rc.eos file to allow configuration from VM Maestro
+  inject_rc_eos $TIMESTAMP /dev/mapper/$LOOPDEV_SECOND_PART
+
+  # next lines currently commented out to use supplied bootloader in image
+
+  # boot process can maybe be improved as Aboot is looking for /mnt/flash.conf and fails in new images
+
+  #echo
+  #echo "Overwrite Aboot bootloader in vEOS image..."
+  #echo "==========================================================="
+  #dd if=$ABOOT_SERIAL_ISO_BASENAME-p1.raw of=/dev/mapper/$LOOPDEV_FIRST_PART
+
   sleep 1
-done
-echo
+
+  remove_loop_devs $TMP_NAME.raw
+
+  rm $ABOOT_SERIAL_ISO_BASENAME-p1.raw 
+
+else
+
+  echo
+  echo "ERROR: Provided vEOS image uses unknown partition layout. Unable to extract and modify partitions."
+  exit -1
+
+fi
 
 echo
 echo "Convert new image to qcow2..."
@@ -278,8 +373,6 @@ echo "==========================================================="
 
 #cleanup
 rm $TMP_NAME.raw
-rm $VEOS_VMDK_BASENAME-p1.raw
-rm $VEOS_VMDK_BASENAME-p2.raw
 rm $VEOS_VMDK_BASENAME.raw
 
 echo
@@ -287,7 +380,7 @@ echo "Importing image into glance..."
 echo "==========================================================="
 glance image-create --container-format bare --disk-format qcow2 --visibility public --name $GLANCE_IMAGE_NAME \
   --file $TMP_NAME.qcow2 --property hw_disk_bus=ide --property serial=1 \
-  --property hw_vif_model=e1000 --property hw_cdrom_type=ide --property release="$GLANCE_IMAGE_RELEASE" --property subtype=IOSv --property config_disk_type=disk
+  --property hw_vif_model=e1000 --property hw_cdrom_type=ide --property release="$GLANCE_IMAGE_RELEASE" --property subtype=$GLANCE_IMAGE_NAME --property config_disk_type=$CONFIG_DISK_TYPE
 
 # create default flavor
 CHECKING_FOR_EXISTING_FLAVOR=$(nova flavor-show $GLANCE_IMAGE_NAME.tiny 2>&1)
@@ -333,7 +426,7 @@ cat << EOF > dynamic-subtype-$GLANCE_IMAGE_NAME.json.default.virl-above-1.3
       "gui_visible": true,
       "interface_pattern": "Ethernet{0}",
       "baseline_image": "$GLANCE_IMAGE_NAME",
-      "config_disk_type": "disk",
+      "config_disk_type": "$CONFIG_DISK_TYPE",
       "hw_ram": 2048,
       "hw_vm_extra": "",
       "gui_icon": "iosvl2",
@@ -359,7 +452,7 @@ cat << EOF > dynamic-subtype-$GLANCE_IMAGE_NAME.json.default.virl-below-1.3
       "gui_visible": true,
       "interface_pattern": "Ethernet{0}",
       "baseline_image": "$GLANCE_IMAGE_NAME",
-      "config_disk_type": "disk",
+      "config_disk_type": "$CONFIG_DISK_TYPE",
       "hw_ram": 2048,
       "hw_vm_extra": "",
       "gui_icon": "iosvl2",
@@ -380,7 +473,7 @@ if [ $? == 255 ]; then
   CHECKING_FOR_EXISTING_DEVICE_TYPE=$(virl_uwm_client subtype-info 2>&1 | grep u\'device_type\':)
   if [ $? == 1 ]; then
     # device_type attribute is not available in VIRL < 1.3, use JSON definition of subtype without this attribute
-    echo "detected VIRL version < 1.3, selecting appropriate subtype to import"
+    echo "detected VIRL version < 1.3.0, selecting appropriate subtype to import"
     virl_uwm_client subtype-import --dynamic-subtypes @dynamic-subtype-$GLANCE_IMAGE_NAME.json.default.virl-below-1.3
   else
     echo "detected VIRL version > 1.3.0, selecting appropriate subtype to import"
@@ -404,3 +497,4 @@ echo "You can import and use the subtype $GLANCE_IMAGE_NAME in VM Maestro..."
 #  nova boot --image "Arista vEOS Disk" --flavor m1.small veos --nic net-id=abc7ad47-55fd-4396-8d31-91dd4d41a18a --nic net-id=abc7ad47-55fd-4396-8d31-91dd4d41a18a --nic net-id=abc7ad47-55fd-4396-8d31-91dd4d41a18a --nic net-id=abc7ad47-55fd-4396-8d31-91dd4d41a18a --nic net-id=abc7ad47-55fd-4396-8d31-91dd4d41a18a
 #
 #  using VM Maestro, the image can be chosen as "VM image", e.g., for an IOSv or IOSvL2 node
+
diff --git a/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-1.2.x.json b/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-1.2.x.json
deleted file mode 100644
index 21efd44..0000000
--- a/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-1.2.x.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "dynamic-subtypes": [
-    {
-      "cli_protocol": "ssh", 
-      "gui_icon": "iosvl2", 
-      "plugin_desc": "Arista vEOS", 
-      "interface_first": 1, 
-      "baseline_flavor": "vEOS.medium", 
-      "plugin_base": "generic", 
-      "interface_management": "Management1", 
-      "interface_pattern": "Ethernet{0}", 
-      "config_file": "/veos_config.txt", 
-      "hw_ram": 1024, 
-      "deprecated_use": "", 
-      "hw_vm_extra": "", 
-      "cli_serial": 1, 
-      "interface_range": 22, 
-      "config_disk_type": "disk", 
-      "plugin_name": "vEOS", 
-      "gui_visible": true, 
-      "baseline_image": "vEOS"
-    }
-  ]
-}
\ No newline at end of file
diff --git a/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-above-1.3.x.json b/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-above-1.3.x.json
deleted file mode 100644
index 180919e..0000000
--- a/create-arista-veos-image/dynamic-subtype-vEOS-VIRL-Version-above-1.3.x.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "dynamic-subtypes": [
-    {
-      "plugin_base": "generic",
-      "device_type": "switch",
-      "plugin_desc": "Arista vEOS",
-      "cli_protocol": "ssh",
-      "plugin_name": "vEOS",
-      "cli_serial": 1,
-      "interface_range": 22,
-      "gui_visible": true,
-      "interface_pattern": "Ethernet{0}",
-      "baseline_image": "vEOS",
-      "config_disk_type": "disk",
-      "hw_ram": 2048,
-      "hw_vm_extra": "",
-      "gui_icon": "iosvl2",
-      "config_file": "/veos_config.txt",
-      "interface_first": 1,
-      "deprecated_use": "",
-      "baseline_flavor": "vEOS.medium",
-      "interface_management": "Management1"
-    }
-  ]
-}
diff --git a/create-arista-veos-image/minimal-config-vEOS.txt b/create-arista-veos-image/minimal-config-vEOS.txt
index 0595238..c5e4d48 100644
--- a/create-arista-veos-image/minimal-config-vEOS.txt
+++ b/create-arista-veos-image/minimal-config-vEOS.txt
@@ -1,4 +1,4 @@
-! device: veos-1 (vEOS, EOS-4.14.2F)
+! device: veos-1 (vEOS)
 !
 ! boot system flash:/vEOS.swi
 !
@@ -23,4 +23,4 @@ interface Management1
 no ip routing
 !
 !
-end
\ No newline at end of file
+end
-- 
GitLab