summary refs log tree commit diff
path: root/maintainers
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-04-13 11:26:22 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-04-13 11:26:22 +0000
commitbcc24c1b864b124df920fefec1ba7b87f17f8870 (patch)
treef6552865b5c2efbefccdb42500d9f847bda97608 /maintainers
parent2821289aeb809f50ac536577a88b3c8bda43a927 (diff)
downloadnixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar.gz
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar.bz2
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar.lz
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar.xz
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.tar.zst
nixpkgs-bcc24c1b864b124df920fefec1ba7b87f17f8870.zip
* Finish the EBS creation script. It now takes a --region option to
  specify the EC2 region in which the AMI is to be created.  It also
  starts an instance booted from the newly created AMI to test it.

svn path=/nixos/trunk/; revision=33771
Diffstat (limited to 'maintainers')
-rwxr-xr-xmaintainers/scripts/ec2/create-ebs-amis.py75
-rw-r--r--maintainers/scripts/ec2/ebs-creator.nix1
2 files changed, 67 insertions, 9 deletions
diff --git a/maintainers/scripts/ec2/create-ebs-amis.py b/maintainers/scripts/ec2/create-ebs-amis.py
index 3bcd47c7f5e..ee70e69f17a 100755
--- a/maintainers/scripts/ec2/create-ebs-amis.py
+++ b/maintainers/scripts/ec2/create-ebs-amis.py
@@ -4,8 +4,21 @@ import sys
 from charon import deployment
 from boto.ec2.blockdevicemapping import BlockDeviceMapping, BlockDeviceType
 import charon.util
+import time
+import argparse
 
-depl = deployment.Deployment("./ebs-creator.json", create=True, nix_exprs=["./ebs-creator.nix"])
+parser = argparse.ArgumentParser(description='Create an EBS-backed NixOS AMI')
+parser.add_argument('--region', dest='region', required=True, help='EC2 region')
+parser.add_argument('--keep', dest='keep', action='store_true', help='keep Charon machine after use')
+args = parser.parse_args()
+
+# Start a NixOS machine in the given region.
+f = open("ebs-creator-zone.nix", "w")
+f.write('{{ machine.deployment.ec2.region = "{0}"; }}'.format(args.region))
+f.close()
+
+depl = deployment.Deployment("./ebs-creator.json", create=True, nix_exprs=["./ebs-creator.nix", "./ebs-creator-zone.nix"])
+if not args.keep: depl.destroy_vms()
 depl.deploy()
 
 m = depl.machines['machine']
@@ -17,16 +30,22 @@ m.run_command("mkdir -p /mnt")
 m.run_command("mount /dev/xvdg /mnt")
 m.run_command("touch /mnt/.ebs")
 m.run_command("mkdir -p /mnt/etc/nixos")
-m.run_command("cp /etc/nixos/configuration.nix /mnt/etc/nixos/") # FIXME
 m.run_command("nixos-checkout") # FIXME
+m.run_command("cp -f /etc/nixos/nixos/modules/virtualisation/amazon-config.nix /mnt/etc/nixos/configuration.nix")
+m.run_command("echo -n pre$(svnversion -c /etc/nixos/nixos | sed 's/.*://')-$(svnversion -c /etc/nixos/nixpkgs | sed 's/.*://') > /etc/nixos/nixos/.version-suffix")
+version = m.run_command("nixos-option system.nixosVersion", capture_stdout=True).replace('"', '').rstrip()
+print >> sys.stderr, "NixOS version is {0}".format(version)
 m.run_command("nixos-install")
+m.run_command("rm -rf /mnt/etc/nixos/nixos/.svn /mnt/etc/nixos/nixpkgs/.svn")
 m.run_command("umount /mnt")
 
+ami_name = "nixos-{0}-x86_64-ebs".format(version)
+description = "NixOS {0} (x86_64; EBS root)".format(version)
+
 # Create a snapshot.
 m.connect()
 volume = m._conn.get_all_volumes([], filters={'attachment.instance-id': m._instance_id, 'attachment.device': "/dev/sdg"})[0]
-snapshot = volume.create_snapshot(description="NixOS EBS root disk")
-#snapshot = m._conn.get_all_snapshots(["snap-f1c9679a"])[0]
+snapshot = volume.create_snapshot(description=description)
 print >> sys.stderr, "created snapshot {0}".format(snapshot.id)
 
 # Wait for the snapshot to finish.
@@ -36,19 +55,59 @@ def check():
     return status == '100%'
 charon.util.check_wait(check, max_tries=120)
 
+m._conn.create_tags([snapshot.id], {'Name': ami_name})
+
+if not args.keep: depl.destroy_vms()
+
 # Register the image.
 aki = m._conn.get_all_images(filters={'manifest-location': '*pv-grub-hd0_1.03-x86_64*'})[0]
-print >> sys.stderr, "using kernel image %s - %s" %(aki.id, aki.location)
+print >> sys.stderr, "using kernel image {0} - {1}".format(aki.id, aki.location)
 
 block_map = BlockDeviceMapping()
 block_map['/dev/sda'] = BlockDeviceType(snapshot_id=snapshot.id, delete_on_termination=True)
 block_map['/dev/sdb'] = BlockDeviceType(ephemeral_name="ephemeral0")
 block_map['/dev/sdc'] = BlockDeviceType(ephemeral_name="ephemeral1")
 block_map['/dev/sdd'] = BlockDeviceType(ephemeral_name="ephemeral2")
-block_map['/dev/sde1'] = BlockDeviceType(ephemeral_name="ephemeral3")
+block_map['/dev/sde'] = BlockDeviceType(ephemeral_name="ephemeral3")
 
 ami_id = m._conn.register_image(
-    name="nixos-x86-64-ebs-test-9", description="NixOS (x86_64) EBS test", architecture="x86_64",
-    root_device_name="/dev/sda", kernel_id=aki.id, block_device_map=block_map)
+    name=ami_name,
+    description=description,
+    architecture="x86_64",
+    root_device_name="/dev/sda",
+    kernel_id=aki.id,
+    block_device_map=block_map)
 
 print >> sys.stderr, "registered AMI {0}".format(ami_id)
+
+time.sleep(5)
+print >> sys.stderr, "making image public..."
+image = m._conn.get_all_images(image_ids=[ami_id])[0]
+image.set_launch_permissions(user_ids=[], group_names=["all"])
+
+m._conn.create_tags([ami_id], {'Name': ami_name})
+
+# Do a test deployment to make sure that the AMI works.
+f = open("ebs-test.nix", "w")
+f.write(
+    '''
+    {{ network.description = "NixOS EBS test";
+       machine.deployment.targetEnv = "ec2";
+       machine.deployment.ec2.region = "{0}";
+       machine.deployment.ec2.instanceType = "m1.small";
+       machine.deployment.ec2.keyPair = "eelco";
+       machine.deployment.ec2.securityGroups = [ "eelco-test" ];
+       machine.deployment.ec2.ami = "{1}";
+    }}
+    '''.format(args.region, ami_id))
+f.close()
+
+test_depl = deployment.Deployment("./ebs-test.json", create=True, nix_exprs=["./ebs-test.nix"])
+test_depl.deploy(create_only=True)
+test_depl.machines['machine'].run_command("nixos-version")
+if not args.keep: test_depl.destroy_vms()
+
+# Log the AMI ID.
+f = open("{0}.ebs.ami-id".format(args.region), "w")
+f.write("{0}".format(ami_id))
+f.close()
diff --git a/maintainers/scripts/ec2/ebs-creator.nix b/maintainers/scripts/ec2/ebs-creator.nix
index bfda4aa4156..f6a60b9d983 100644
--- a/maintainers/scripts/ec2/ebs-creator.nix
+++ b/maintainers/scripts/ec2/ebs-creator.nix
@@ -4,7 +4,6 @@
   machine =
     { config, pkgs, ... }:
     { deployment.targetEnv = "ec2";
-      deployment.ec2.region = "eu-west-1";
       deployment.ec2.instanceType = "m1.small";
       deployment.ec2.keyPair = "eelco";
       deployment.ec2.securityGroups = [ "eelco-test" ];