From 65647bda1e9818d1ae8a1436497326def0d5a486 Mon Sep 17 00:00:00 2001 From: Sebastian Rieger Date: Sat, 2 Apr 2016 12:49:32 +0200 Subject: [PATCH] automatic import of subtype and creation of flavors based on image name, short instructions on how to use the image and hint to default node configuration, removed detection of existing image as new VIRL version supports multiple versions, new subtype to allow >8 front panel interfaces --- .../create-arista-veos-image.sh | 118 ++++++++++++++---- .../dynamic-subtype-vEOS.json | 22 ++-- 2 files changed, 107 insertions(+), 33 deletions(-) diff --git a/create-arista-veos-image/create-arista-veos-image.sh b/create-arista-veos-image/create-arista-veos-image.sh index eb0afb4..ab7fdca 100644 --- a/create-arista-veos-image/create-arista-veos-image.sh +++ b/create-arista-veos-image/create-arista-veos-image.sh @@ -12,6 +12,9 @@ # V1.31 added support for newer glance releases (e.g. kilo) used in VIRL 1.0.0 # V1.32 changed the extension of the bootloader iso to match the size of the partitions to be injected # V1.4 support for variable VEOS image sizes (as requested by @Jade_Deane to use custom VEOS images) +# V1.5 automatic import of subtype and creation of flavors based on image name, +# short instructions on how to use the image and hint to default node configuration, +# removed detection of existing image as new VIRL version supports multiple versions # usage if [ ! $# -eq 3 ] ; then @@ -53,24 +56,6 @@ function safe_unmount() { 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 image-show $GLANCE_IMAGE_NAME 2>&1) -if [ $? == 0 ] ; then - glance 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 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 "===========================================================" @@ -215,14 +200,105 @@ if [ $? == 1 ]; then nova flavor-create --is-public true vEOS.small auto 1024 0 1 fi -CHECKING_FOR_EXISTING_FLAVOR=$(nova flavor-show vEOS.medium 2>&1) +CHECKING_FOR_EXISTING_FLAVOR=$(nova flavor-show $GLANCE_IMAGE_NAME.medium 2>&1) +if [ $? == 1 ]; then + echo "Creating default flavor $GLANCE_IMAGE_NAME.medium..." + echo "===========================================================" + + nova flavor-create --is-public true $GLANCE_IMAGE_NAME.medium auto 2048 0 1 +fi + +CHECKING_FOR_EXISTING_FLAVOR=$(nova flavor-show $GLANCE_IMAGE_NAME.small 2>&1) if [ $? == 1 ]; then - echo "Creating default flavor vEOS.medium..." + echo "Creating default flavor $GLANCE_IMAGE_NAME.small..." echo "===========================================================" - nova flavor-create --is-public true vEOS.medium auto 2048 0 1 + nova flavor-create --is-public true $GLANCE_IMAGE_NAME.small auto 1024 0 1 fi +#CHECKING_FOR_EXISTING_SUBTYPE=$(virl_uwm_client subtype-export 2>/dev/null | grep -Po '"'"plugin_desc"'"\s*:\s*"\K([^"]*)') +CHECKING_FOR_EXISTING_SUBTYPE=$(virl_uwm_client subtype-export 2>/dev/null | grep "\"plugin_name\": \"$GLANCE_IMAGE_NAME\",") +if [ $? == 1 ]; then + # create default subtype + cat << EOF > $TIMESTAMP.default-subtype +{ + "dynamic-subtypes": [ + { + "interface_range": 22, + "config_disk_type": "disk", + "baseline_image": "$GLANCE_IMAGE_NAME", + "baseline_flavor": "$GLANCE_IMAGE_NAME.medium", + "hw_vm_extra": "", + "plugin_desc": "Arista vEOS", + "interface_pattern": "Ethernet{0}", + "interface_management": "Management1", + "gui_visible": true, + "cli_serial": 1, + "hw_ram": 1024, + "plugin_name": "$GLANCE_IMAGE_NAME", + "interface_first": 1, + "config_file": "/veos_config.txt", + "gui_icon": "iosvl2", + "plugin_base": "generic" + } + ] +} +EOF + + echo "Creating default subtype vEOS..." + echo "===========================================================" + + virl_uwm_client subtype-import --dynamic-subtypes @$TIMESTAMP.default-subtype + + rm $TIMESTAMP.default-subtype +fi + +echo +echo "Creation of the image finished successfully" +echo "===========================================================" + +echo "You can import the default Subtype in VM Maestro using" +echo "\"File->Preferences->Node Subtypes->Restore Defaults\"" +echo "followed by clicking on \"Fetch from Server\". Afterwards," +echo "vEOS should appear in the \"Nodes\" section of VM Maestro's" +echo "Topology Palette. The following default config can be used" +echo "by pasting it into the Configuration tab after clicking on" +echo "each vEOS node created in your topology:" + +echo -e " +! device: veos-1 (vEOS, EOS-4.14.2F) +! +! boot system flash:/vEOS.swi +! +transceiver qsfp default-mode 4x10G +! +hostname veos-1 +! +spanning-tree mode mstp +! +no aaa root +! +username admin role network-admin secret 5 \$1\$93LlZesx\$MSqS1D/8NGTSY724FGx1K0 +username cisco role network-admin secret 5 \$1\$rQS0W9wP\$ZUzVG2XoGCCZCJopFp1aV/ +! +interface Ethernet1 +! +interface Ethernet2 +! +interface Management1 + ! ip of ma1 configured on launch +! +no ip routing +! +! +" + +echo "Of course you modify the config (name, version) to your needs." +echo "Otherwise, vEOS will will start with an empty configuration and" +echo "go into Zero-Touch-Provisioning (ZTP) mode. You should also disable" +echo "\"Auto-generate the configuration based on these attributes\" in" +echo "the AutoNetkit tab of the node, as AutoNetkit is only supported" +echo "for the Cisco images in VIRL." #testing: # diff --git a/create-arista-veos-image/dynamic-subtype-vEOS.json b/create-arista-veos-image/dynamic-subtype-vEOS.json index b770705..52b7b8e 100644 --- a/create-arista-veos-image/dynamic-subtype-vEOS.json +++ b/create-arista-veos-image/dynamic-subtype-vEOS.json @@ -1,24 +1,22 @@ { "dynamic-subtypes": [ { - "plugin_name": "vEOS", - "cli_serial": 1, - "plugin_desc": "Arista vEOS", + "interface_range": 22, + "config_disk_type": "disk", "baseline_image": "vEOS", - "hw_ram": 1024, + "baseline_flavor": "vEOS.medium", "hw_vm_extra": "", - "interface_wrap": 7, - "config_disk_type": "disk", + "plugin_desc": "Arista vEOS", "interface_pattern": "Ethernet{0}", + "interface_management": "Management1", "gui_visible": true, - "config_file": "/veos_config.txt", + "cli_serial": 1, + "hw_ram": 1024, + "plugin_name": "vEOS", "interface_first": 1, + "config_file": "/veos_config.txt", "gui_icon": "iosvl2", - "plugin_base": "generic", - "vnc_available": false, - "interface_management": "Management1", - "interface_range": 7, - "baseline_flavor": "vEOS.medium" + "plugin_base": "generic" } ] } \ No newline at end of file