Merge pull request #292 from marineam/hvm

ami: support for building HVM AMIs along side PV AMIs.
This commit is contained in:
Michael Marineau 2014-07-08 11:31:15 -07:00
commit 3556632035
4 changed files with 129 additions and 73 deletions

View File

@ -102,7 +102,6 @@ fi
size=8 # GB
arch=x86_64
arch2=amd64
ephemeraldev=/dev/sdb
# The name has a limited set of allowed characterrs
name=$(sed -e "s%[^A-Za-z0-9()\\./_-]%_%g" <<< "CoreOS-$GROUP-$VERSION")
description="CoreOS $GROUP $VERSION"
@ -117,19 +116,6 @@ if [ -z "$akiid" ]; then
exit 1
fi
# TODO: Once we sort out a long-term scheme for generating AMIs this likely
# will go away. What if we want to generate AMIs from CoreOS?!?!?
if [ -z "$(which ec2-attach-volume)" ]; then
# Update and install Ubuntu packages
export DEBIAN_FRONTEND=noninteractive
sudo perl -pi -e 's/^# *(deb .*multiverse)$/$1/' /etc/apt/sources.list
sudo apt-get update
sudo -E apt-get upgrade -y
sudo -E apt-get install -y \
ec2-api-tools \
ec2-ami-tools
fi
export EC2_URL="http://ec2.${region}.amazonaws.com"
echo "Building AMI in zone $zone, region id $akiid"
@ -171,27 +157,42 @@ snapshotid=$(ec2-create-snapshot --description "$name" "$volumeid" | cut -f2)
while ec2-describe-snapshots "$snapshotid" | grep -q pending
do sleep 30; done
echo "Created snapshot $snapshotid, deleting $volumeid"
ec2-delete-volume "$volumeid"
echo "Sharing snapshot with Amazon"
ec2-modify-snapshot-attribute "$snapshotid" -c --add 679593333241
echo "Created snapshot $snapshotid, registering as a new AMI"
echo "Registering hvm AMI"
hvm_amiid=$(ec2-register \
--name "${name}-hvm" \
--description "$description (HVM)" \
--architecture "$arch" \
--virtualization-type hvm \
--root-device-name /dev/xvda \
--block-device-mapping /dev/xvda=$snapshotid::true \
--block-device-mapping /dev/xvdb=ephemeral0 |
cut -f2)
echo "Making $hvm_amiid public"
ec2-modify-image-attribute "$hvm_amiid" --launch-permission -a all
echo "Registering paravirtual AMI"
amiid=$(ec2-register \
--name "$name" \
--description "$description" \
--description "$description (PV)" \
--architecture "$arch" \
--virtualization-type paravirtual \
--kernel "$akiid" \
--block-device-mapping /dev/sda=$snapshotid::true \
--block-device-mapping $ephemeraldev=ephemeral0 |
--root-device-name /dev/xvda \
--block-device-mapping /dev/xvda=$snapshotid::true \
--block-device-mapping /dev/xvdb=ephemeral0 |
cut -f2)
echo "Making $amiid public"
ec2-modify-image-attribute "$amiid" --launch-permission -a all
ec2-delete-volume "$volumeid"
cat <<EOF
AMI: $amiid $region $arch2
$description
architecture: $arch ($arch2)
region: $region ($zone)
@ -200,15 +201,6 @@ name: $name
description: $description
EBS volume: $volumeid (deleted)
EBS snapshot: $snapshotid
AMI id: $amiid
bin url: $IMG_URL
Test the new AMI using something like:
export EC2_URL=http://ec2.${region}.amazonaws.com
ec2-run-instances \\
--key \$USER \\
--instance-type t1.micro \\
$amiid
PV AMI id: $amiid
HVM AMI id: $hvm_amiid
EOF

View File

@ -72,6 +72,11 @@ if [[ -z "$VER" ]]; then
exit 1
fi
zoneurl=http://instance-data/latest/meta-data/placement/availability-zone
zone=$(curl --fail -s $zoneurl)
region=$(echo $zone | sed 's/.$//')
export EC2_URL="http://ec2.${region}.amazonaws.com"
if [[ -z "$AMI" ]]; then
AMI=$(ec2-describe-images -F name="CoreOS-$GROUP-$VER" | grep -m1 ^IMAGE \
| cut -f2) || true # Don't die silently, error messages are good
@ -79,6 +84,12 @@ if [[ -z "$AMI" ]]; then
echo "$0: Cannot find an AMI for CoreOS $GROUP $VER" >&2
exit 1
fi
HVM=$(ec2-describe-images -F name="CoreOS-$GROUP-$VER-hvm" \
| grep -m1 ^IMAGE | cut -f2) || true
if [[ -z "$HVM" ]]; then
echo "$0: Cannot find an AMI for CoreOS $GROUP $VER (HVM)" >&2
exit 1
fi
else
# check to make sure this is a valid image
if ! ec2-describe-images -F image-id="$AMI" | grep -q "$AMI"; then
@ -95,19 +106,27 @@ fi
name=$(sed -e "s%[^A-Za-z0-9()\\./_-]%_%g" <<< "CoreOS-$GROUP-$VER")
description="CoreOS $GROUP $VER"
zoneurl=http://instance-data/latest/meta-data/placement/availability-zone
zone=$(curl --fail -s $zoneurl)
region=$(echo $zone | sed 's/.$//')
do_copy() {
local r="$1"
local r_amiid=$(ec2-copy-image \
--source-region "$region" \
--source-ami-id "$AMI" \
--name "$name" \
--description "$description" \
--region "$r" |
local virt_type="$2"
local r_amiid
if [[ "$virt_type" == "hvm" ]]; then
r_amiid=$(ec2-copy-image \
--source-region "$region" \
--source-ami-id "$HVM" \
--name "${name}-hvm" \
--description "$description (HVM)" \
--region "$r" |
cut -f2)
else
r_amiid=$(ec2-copy-image \
--source-region "$region" \
--source-ami-id "$AMI" \
--name "$name" \
--description "$description (PV)" \
--region "$r" |
cut -f2)
fi
echo "AMI copy to $r as $r_amiid in progress"
local r_amidesc=$(ec2-describe-images "$r_amiid" --region="$r")
@ -115,10 +134,10 @@ do_copy() {
sleep 30
r_amidesc=$(ec2-describe-images "$r_amiid" --region="$r")
done
echo "AMI copy to $r as $r_amiid in complete"
echo "AMI $virt_type copy to $r as $r_amiid in complete"
local r_snapshotid=$(echo "$r_amidesc" | \
grep '^BLOCKDEVICEMAPPING.*/dev/sda' | cut -f5)
grep '^BLOCKDEVICEMAPPING.*/dev/xvda' | cut -f5)
echo "Sharing snapshot $r_snapshotid in $r with Amazon"
ec2-modify-snapshot-attribute "$r_snapshotid" \
-c --add 679593333241 --region "$r"
@ -130,8 +149,12 @@ do_copy() {
for r in "${REGIONS[@]}"
do
[ "${r}" == "${region}" ] && continue
echo "Starting copy of $AMI from $region to $r"
do_copy "$r" &
echo "Starting copy of pv $AMI from $region to $r"
do_copy "$r" pv &
if [[ -n "$HVM" ]]; then
echo "Starting copy of hvm $AMI from $region to $r"
do_copy "$r" hvm &
fi
done
wait

View File

@ -24,6 +24,7 @@ This script must be run from an ec2 host with the ec2 tools installed.
"
AMI=
HVM=
VER=
BOARD="amd64-usr"
GROUP="alpha"
@ -46,6 +47,11 @@ if [[ $(id -u) -eq 0 ]]; then
exit 1
fi
zoneurl=http://instance-data/latest/meta-data/placement/availability-zone
zone=$(curl --fail -s $zoneurl)
region=$(echo $zone | sed 's/.$//')
export EC2_URL="http://ec2.${region}.amazonaws.com"
if [[ -z "$AMI" && -n "$VER" ]]; then
AMI=$(ec2-describe-images -F name="CoreOS-$GROUP-$VER" | grep -m1 ^IMAGE \
| cut -f2) || true # Don't die silently, error messages are good
@ -53,6 +59,12 @@ if [[ -z "$AMI" && -n "$VER" ]]; then
echo "$0: Cannot find an AMI for CoreOS $GROUP $VER" >&2
exit 1
fi
HVM=$(ec2-describe-images -F name="CoreOS-$GROUP-$VER-hvm" \
| grep -m1 ^IMAGE | cut -f2) || true
if [[ -z "$HVM" ]]; then
echo "$0: Cannot find an AMI for CoreOS $GROUP $VER (HVM)" >&2
exit 1
fi
elif [[ -n "$AMI" ]]; then
# check to make sure this is a valid image
if ! ec2-describe-images -F image-id="$AMI" | grep -q "$AMI"; then
@ -78,10 +90,6 @@ ec2-authorize "$sg_name" -P tcp -p 7001 > /dev/null
ec2-authorize "$sg_name" -P tcp -p 22 > /dev/null
echo "OK ($key_name)"
# might be needed later for multi-zone tests
zoneurl=http://instance-data/latest/meta-data/placement/availability-zone
zone=$(curl --fail -s $zoneurl)
region=$(echo $zone | sed 's/.$//')
discovery=$(curl --fail -s https://discovery.etcd.io/new)
userdata="#cloud-config
@ -98,13 +106,32 @@ coreos:
"
echo -n "Booting instances... "
instances=$(ec2-run-instances \
# Add in 1 HVM instance if available.
if [[ -z "$HVM" ]]; then
instances=$(ec2-run-instances \
--user-data "$userdata" \
--instance-type "t1.micro" \
--instance-count 3 \
--group "$sg_name" \
--key "$key_name" $AMI | \
grep INSTANCE | cut -f2)
else
instances=$(ec2-run-instances \
--user-data "$userdata" \
--instance-type "t1.micro" \
--instance-count 2 \
--group "$sg_name" \
--key "$key_name" $AMI | \
grep INSTANCE | cut -f2)
instances+=" "
instances+=$(ec2-run-instances \
--user-data "$userdata" \
--instance-type "m3.medium" \
--instance-count 1 \
--group "$sg_name" \
--key "$key_name" $HVM | \
grep INSTANCE | cut -f2)
fi
# little hack to create a describe instances command that only
# pulls data for these instances
ec2_cmd=$(echo $instances | sed 's/ / --filter instance-id=/g')
@ -155,8 +182,9 @@ ec2-terminate-instances $instances > /dev/null
while ! $ec2_cmd | grep INSTANCE | grep -q terminated
do sleep 10; done
sleep 10
ec2-delete-group $sg_name > /dev/null
# The security group may take a little longer to free up
while ! ec2-delete-group $sg_name > /dev/null
do sleep 10; done
ec2-delete-keypair $key_name > /dev/null
rm $key_file
echo "OK"

View File

@ -58,7 +58,7 @@ if [[ ! -n "$VER" ]]; then
exit 1
fi
declare -A AMIS
declare -A AMIS HVM_AMIS
for r in "${!AKI[@]}"; do
AMI=$(ec2-describe-images --region=${r} -F name="CoreOS-$GROUP-$VER" \
| grep -m1 ^IMAGE \
@ -68,25 +68,38 @@ for r in "${!AKI[@]}"; do
continue
fi
AMIS[${r}]=$AMI
HVM=$(ec2-describe-images --region=${r} -F name="CoreOS-$GROUP-$VER-hvm" \
| grep -m1 ^IMAGE | cut -f2) || true
if [[ -z "$HVM" ]]; then
echo "$0: Cannot find ${r} AMI for CoreOS $GROUP $VER (HVM)" >&2
exit 1
fi
HVM_AMIS[${r}]=$HVM
done
OUT=
upload_file() {
local name="$1"
local content="$2"
url="$GS_URL/$GROUP/boards/$BOARD/$VER/${IMAGE}_${name}.txt"
gsutil cp - "$url" <<<"$content"
echo "OK, ${url}=${content}"
}
for r in "${!AMIS[@]}"; do
url="$GS_URL/$GROUP/boards/$BOARD/$VER/${IMAGE}_${r}.txt"
tmp=$(mktemp --suffix=.txt)
trap "rm -f '$tmp'" EXIT
echo "${AMIS[$r]}" > "$tmp"
gsutil cp "$tmp" "$url"
echo "OK, $r ${AMIS[$r]}, $url"
if [[ -z "$OUT" ]]; then
OUT="${r}=${AMIS[$r]}"
else
OUT="${OUT}|${r}=${AMIS[$r]}"
fi
upload_file "$r" "${AMIS[$r]}"
upload_file "pv_$r" "${AMIS[$r]}"
done
url="$GS_URL/$GROUP/boards/$BOARD/$VER/${IMAGE}_all.txt"
tmp=$(mktemp --suffix=.txt)
trap "rm -f '$tmp'" EXIT
echo "$OUT" > "$tmp"
gsutil cp "$tmp" "$url"
echo "OK, all, $url"
for r in "${!HVM_AMIS[@]}"; do
upload_file "hvm_$r" "${HVM_AMIS[$r]}"
done
ofs="$IFS"
IFS="|$IFS"
PV_ALL="${AMIS[*]}"
HVM_ALL="${HVM_AMIS[*]}"
IFS="$ofs"
upload_file "all" "${PV_ALL}"
upload_file "pv" "${PV_ALL}"
upload_file "hvm" "${HVM_ALL}"
echo "Done"