1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from VMBuilder import register_plugin, Plugin, VMBuilderUserError
21 from VMBuilder.util import run_cmd
22 import logging
23
25 name = 'EC2 integration'
26
28 group = self.vm.setting_group('EC2 integation')
29 group.add_option('--ec2', action='store_true', help='Build for EC2')
30 group.add_option('--ec2-name','--ec2-prefix', metavar='EC2_NAME', help='Name for the EC2 image.')
31 group.add_option('--ec2-cert', metavar='CERTFILE', help='PEM encoded public certificate for EC2.')
32 group.add_option('--ec2-key', metavar='KEYFILE', help='PEM encoded private key for EC2.')
33 group.add_option('--ec2-user', metavar='AWS_ACCOUNT', help='EC2 user ID (a.k.a. AWS account number, not AWS access key ID).')
34 group.add_option('--ec2-bucket', metavar='BUCKET', help='S3 bucket to hold the AMI.')
35 group.add_option('--ec2-access-key', metavar='ACCESS_ID', help='AWS access key ID.')
36 group.add_option('--ec2-secret-key', metavar='SECRET_ID', help='AWS secret access key.')
37 group.add_option('--ec2-kernel','--ec2-aki', metavar='AKI', help='EC2 AKI (kernel) to use.')
38 group.add_option('--ec2-ramdisk','--ec2-ari', metavar='ARI', help='EC2 ARI (ramdisk) to use.')
39 self.vm.register_setting_group(group)
40
42 if not self.vm.ec2:
43 return True
44
45 if not self.vm.hypervisor.name == 'Xen':
46 raise VMBuilderUserError('When building for EC2 you must use the xen hypervisor.')
47
48 if not self.vm.ec2_name:
49 raise VMBuilderUserError('When building for EC2 you must supply the name for the instance.')
50
51 if not self.vm.ec2_cert:
52 raise VMBuilderUserError('When building for EC2 you must provide your PEM encoded public key certificate')
53
54 if not self.vm.ec2_key:
55 raise VMBuilderUserError('When building for EC2 you must provide your PEM encoded private key file')
56
57 if not self.vm.ec2_user:
58 raise VMBuilderUserError('When building for EC2 you must provide your EC2 user ID (your AWS account number, not your AWS access key ID)')
59
60 if not self.vm.ec2_kernel:
61 logging.debug('No ec2-aki choosen setting to default. Use --ec2-kernel to change this')
62 if self.vm.arch == 'amd64':
63 self.vm.ec2_kernel = 'aki-a53adfcc'
64 else:
65 self.vm.ec2_kernel = 'aki-a71cf9ce'
66
67 if not self.vm.ec2_ramdisk:
68 logging.debug('No ec2-ari choosen setting to default. Use --ec2-ramdisk to change this.')
69 if self.vm.arch == 'amd64':
70 self.vm.ec2_ramdisk = 'ari-b31cf9da'
71 else:
72 self.vm.ec2_ramdisk = 'ari-a51cf9cc'
73
74 if not self.vm.ec2_bucket:
75 raise VMBuilderUserError('When building for EC2 you must provide an S3 bucket to hold the AMI')
76
77 if not self.vm.ec2_access_key:
78 raise VMBuilderUserError('When building for EC2 you must provide your AWS access key ID.')
79
80 if not self.vm.ec2_secret_key:
81 raise VMBuilderUserError('When building for EC2 you must provide your AWS secret access key.')
82
83
84 if not self.vm.addpkg:
85 self.vm.addpkg = []
86
87 self.vm.addpkg += ['ec2-init']
88
90 if not self.vm.ec2:
91 return False
92
93 bundle_cmdline = ['ec2-bundle-image', '--image', self.vm.filesystems[0].filename, '--cert', self.vm.ec2_cert, '--privatekey', self.vm.ec2_key, '--user', self.vm.ec2_user, '--prefix', self.vm.ec2_name, '-r', ['i386', 'x86_64'][self.vm.arch == 'amd64'], '-d', self.vm.workdir, '--kernel', self.vm.ec2_kernel, '--ramdisk', self.vm.ec2_ramdisk]
94
95 run_cmd(*bundle_cmdline)
96
97 upload_cmdline = ['ec2-upload-bundle', '--manifest', '%s/%s.manifest.xml' % (self.vm.workdir, self.vm.ec2_name), '--bucket', self.vm.ec2_bucket, '--access-key', self.vm.ec2_access_key, '--secret-key', self.vm.ec2_secret_key]
98 run_cmd(*upload_cmdline)
99
100 from boto.ec2.connection import EC2Connection
101 conn = EC2Connection(self.vm.ec2_access_key, self.vm.ec2_secret_key)
102 print conn.register_image('%s/%s.manifest.xml' % (self.vm.ec2_bucket, self.vm.ec2_name))
103
104 return True
105
106 register_plugin(EC2)
107