Source code for bellatrix.burn_instance

#!/usr/bin/python
'''
get a new ami given a running instance 
'''

import datetime
import logging
import sys
import time

import bellatrix
from bellatrix.lib.ec2_lib import Ec2lib
from bellatrix.lib import bellatrix_util
from bellatrix.lib import util


[docs]class Run(): def __init__(self, key, sec, app_name): self.WAIT = 30 self._ec2 = Ec2lib(key, sec) self._app_name = app_name self.out_file = bellatrix_util.getOutFile(__file__)
[docs] def burnInstance(self, instance, config_name): config_name = config_name + "-" + datetime.datetime.now().isoformat() new_ami = self._ec2.createImage(instance, config_name, "generated by " + self._app_name) logging.info("ami: %s is being generated. Name: %s" % (new_ami, config_name)) util.writeFile(self.out_file, new_ami + "," + config_name) return new_ami
[docs] def amiIsReady(self, ami_name): ready = False exceptions = 5 while not ready: try: ami = self._ec2.getImage(ami_name) logging.info("ami state %s" % ami.state) ready = (ami.state == bellatrix.AMI_AVAILABLE) except: #we will swallow the exception a number of times #since the image object might not be ready at the beginning exceptions -= 1 if exceptions < 1: raise Exception("""Error getting information from image: %s. """ """Please check if you have access or if the image name is correct.""" % ami_name) if not ready: logging.info("AMI:%s is not ready yet. Retrying in %s seconds.... " % (ami_name, self.WAIT)) time.sleep(self.WAIT) logging.info("AMI: %s is ready to use!" % ami_name)
[docs]def run(instance, config_name, wait): r = Run(bellatrix_util.getKey(), bellatrix_util.getSecret(), bellatrix.APP) new_ami = r.burnInstance(instance, config_name) if wait: r.amiIsReady(new_ami) return 0
if __name__ == '__main__': sys.exit(run(*sys.argv[1:]))