1
2 import os
3 import pickle
4 from optparse import OptionParser
5 from starcluster import awsutils
6 from starcluster import exception
7 from starcluster import utils
8 from starcluster import node
9 from starcluster.logger import log
10 from starcluster.utils import print_timing
11
12 -def create_image(instanceid, image_name, bucket, cfg, **kwargs):
24
26 """
27 Class for creating a new AMI from a running instance
28
29 instance must be a starcluster.node.Node instance
30 """
31 - def __init__(self, instance=None, aws_access_key_id=None,
32 aws_secret_access_key=None, aws_user_id=None,
33 ec2_cert=None, ec2_private_key=None, prefix='image',
34 bucket=None, description=None,
35 kernel_id=None, ramdisk_id=None,
36 remove_image_files=False, **kwargs):
37 self.host = instance
38 self.access_key = aws_access_key_id
39 self.secret_key = aws_secret_access_key
40 self.userid = aws_user_id
41 self.private_key = ec2_private_key
42 self.bucket = bucket
43 self.prefix = prefix
44 self.description = description
45 self.kernel_id = kernel_id
46 self.ramdisk_id = ramdisk_id
47 self.cert = ec2_cert
48 self.remove_image_files = remove_image_files
49 if not utils.is_valid_bucket_name(self.bucket):
50 raise exception.InvalidBucketName(self.bucket)
51 if not utils.is_valid_image_name(self.prefix):
52 raise exception.InvalidImageName(self.prefix)
53 self.ec2 = awsutils.EasyEC2(
54 aws_access_key_id = self.access_key,
55 aws_secret_access_key = self.secret_key,
56 )
57 if not self.cert:
58 try:
59 self.cert = os.environ['EC2_CERT']
60 except KeyError,e:
61 raise exception.EC2CertRequired()
62 if not self.private_key:
63 try:
64 self.private_key = os.environ['EC2_PRIVATE_KEY']
65 except KeyError,e:
66 raise exception.EC2PrivateKeyRequired()
67 if not os.path.exists(self.cert):
68 raise exception.EC2CertDoesNotExist(self.cert)
69 if not os.path.exists(self.private_key):
70 raise exception.EC2PrivateKeyDoesNotExist(self.private_key)
71 self.config_dict = {
72 'access_key': self.access_key,
73 'secret_key': self.secret_key,
74 'private_key': os.path.split(self.private_key)[-1],
75 'userid': self.userid,
76 'cert': os.path.split(self.cert)[-1],
77 'bucket': self.bucket,
78 'prefix': self.prefix,
79 'arch': self.host.arch,
80 }
81
82 @print_timing
93
99
101 """copy pem files to /mnt on image host"""
102 conn = self.host.ssh
103 conn.put(self.private_key, "/mnt/" + os.path.basename(self.private_key))
104 conn.put(self.cert, "/mnt/" + os.path.basename(self.cert))
105
106 @print_timing
119
120 @print_timing
122 log.info('Uploading bundled image:')
123 conn = self.host.ssh
124 config_dict = self.config_dict
125 conn.execute('ec2-upload-bundle -b %(bucket)s \
126 -m /mnt/%(prefix)s.manifest.xml -a %(access_key)s -s %(secret_key)s' % \
127 config_dict, silent=False)
128
133
135 log.info('Cleaning up...')
136
137 conn = self.host.ssh
138 conn.execute('rm -f /mnt/*.pem /mnt/*.pem', silent=False)
139
141
142 conn = self.ec2
143 config_dict = self.config_dict
144 return conn.register_image(
145 self.prefix,
146 description=self.description,
147 image_location= "%(bucket)s/%(prefix)s.manifest.xml" % config_dict,
148 kernel_id=self.kernel_id,
149 ramdisk_id=self.ramdisk_id,
150 architecture=config_dict.get('arch'),
151 )
152
154 log.info('Removing private data...')
155 conn = self.host.ssh
156 conn.execute('find /home -maxdepth 1 -type d -exec rm -rf {}/.ssh \;',
157 silent=False)
158 conn.execute('rm -f /var/log/secure', silent=False)
159 conn.execute('rm -f /var/log/lastlog', silent=False)
160 conn.execute('rm -rf /root/*', silent=False)
161 conn.execute('rm -f ~/.bash_history', silent=False)
162 conn.execute('rm -rf /tmp/*', silent=False)
163 conn.execute('rm -rf /root/*.hist*', silent=False)
164 conn.execute('rm -rf /var/log/*.gz', silent=False)
165