Package VMBuilder :: Package plugins :: Package ec2
[frames] | no frames]

Source Code for Package VMBuilder.plugins.ec2

  1  # 
  2  #    Uncomplicated VM Builder 
  3  #    Copyright (C) 2007-2008 Canonical Ltd. 
  4  #     
  5  #    See AUTHORS for list of contributors 
  6  # 
  7  #    This program is free software: you can redistribute it and/or modify 
  8  #    it under the terms of the GNU General Public License as published by 
  9  #    the Free Software Foundation, either version 3 of the License, or 
 10  #    (at your option) any later version. 
 11  # 
 12  #    This program is distributed in the hope that it will be useful, 
 13  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
 14  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 15  #    GNU General Public License for more details. 
 16  # 
 17  #    You should have received a copy of the GNU General Public License 
 18  #    along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 19  # 
 20  from VMBuilder import register_plugin, Plugin, VMBuilderUserError 
 21  from VMBuilder.util import run_cmd 
 22  import logging 
 23   
24 -class EC2(Plugin):
25 name = 'EC2 integration' 26
27 - def register_options(self):
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
41 - def preflight_check(self):
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 image.') 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-d314f0ba' 64 else: 65 self.vm.ec2_kernel = 'aki-af14f0c6' 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-d014f0b9' 71 else: 72 self.vm.ec2_ramdisk = 'ari-ac14f0c5' 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 += ['openssh-server'] 88 self.vm.addpkg += ['ec2-init'] 89 self.vm.addpkg += ['openssh-server'] 90 self.vm.addpkg += ['ec2-modules'] 91 self.vm.addpkg += ['server^'] 92 self.vm.addpkg += ['standard^'] 93 94 if not self.vm.ppa: 95 self.vm.ppa = [] 96 97 self.vm.ppa += ['ubuntu-ec2']
98
99 - def post_install(self):
100 if not self.vm.ec2: 101 return 102 103 logging.info("Running ec2 postinstall") 104 self.install_from_template('/etc/event.d/xvc0', 'upstart') 105 self.run_in_target('passwd', '-l', self.vm.user)
106
107 - def deploy(self):
108 if not self.vm.ec2: 109 return False 110 111 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] 112 113 run_cmd(*bundle_cmdline) 114 115 upload_cmdline = ['ec2-upload-bundle', '--retry', '--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] 116 run_cmd(*upload_cmdline) 117 118 from boto.ec2.connection import EC2Connection 119 conn = EC2Connection(self.vm.ec2_access_key, self.vm.ec2_secret_key) 120 print conn.register_image('%s/%s.manifest.xml' % (self.vm.ec2_bucket, self.vm.ec2_name)) 121 122 return True
123 124 register_plugin(EC2) 125