#!/bin/bash # Export the XRd control-plane Docker image for CML 2.9 import. # # Usage: # ./cml/build-xrd-image.sh # # The XRd image already exists locally (ios-xr/xrd-control-plane:25.1.1). # This script just exports it to a .tar file for CML upload. set -e IMAGE="ios-xr/xrd-control-plane:25.1.1" OUTPUT="/tmp/xrd-control-plane.tar" echo "=== Verifying XRd image exists ===" if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then echo "ERROR: Image $IMAGE not found locally." echo "Check with: docker images | grep xrd" exit 1 fi echo " Image: $IMAGE" SIZE=$(docker image inspect "$IMAGE" --format='{{.Size}}' | numfmt --to=iec 2>/dev/null || echo "unknown") echo " Size: $SIZE" echo "" echo "=== Exporting image to $OUTPUT ===" echo " (This may take a minute for ~1.3GB image...)" docker save -o "$OUTPUT" "$IMAGE" echo "" echo "=== Export complete ===" TAR_SIZE=$(du -h "$OUTPUT" | cut -f1) echo " File: $OUTPUT ($TAR_SIZE)" SHA=$(sha256sum "$OUTPUT" | awk '{print $1}') echo " SHA256: $SHA" echo "" echo "=== Next steps ===" echo "1. Update cml/xrd-image-definition.yaml with:" echo " sha256: $SHA" echo "" echo "2. Upload to CML:" echo " a. Tools > Node and Image Definitions > Import" echo " Upload: cml/xrd-node-definition.yaml" echo " b. Tools > Node and Image Definitions > Import" echo " Upload: cml/xrd-image-definition.yaml" echo " c. Tools > Node and Image Definitions > Image Definitions > Manage Image Uploads" echo " Upload: $OUTPUT" echo " (For large files, consider SCP to CML server instead)" echo "" echo "3. In your CML lab topology:" echo " a. Drag 'XRd Control-Plane (IOS-XR)' from the node palette" echo " b. Draw links to CORE-01 (→Gi0/0/0/0) and CORE-02 (→Gi0/0/0/1)" echo " c. Edit xrd-startup.cfg if needed (IPs, BMP target, etc.)" echo " d. Start the node (allow ~3-5 min for XRd boot)" echo "" echo "4. After boot, verify via XRd console:" echo " show isis adjacency" echo " show bgp summary" echo " show bmp server 1"