# License for the specific language governing permissions and limitations
# under the License.
+import eventlet
import json
import logging
if not resource.name in order_list:
order_list.append(resource.name)
- def get_start_order(self):
+ def get_create_order(self):
'''
return a list of Resource names in the correct order
for startup.
return order
- def start(self):
+ def create_blocking(self):
'''
- start all the resources in the order specified by get_start_order
+ create all the resources in the order specified by get_create_order
'''
- order = self.get_start_order()
+ order = self.get_create_order()
+ failed = False
for r in order:
- self.resources[r].start()
+ if not failed:
+ try:
+ self.resources[r].create()
+ except:
+ failed = True
+ self.resources[r].state_set(self.resources[r].CREATE_FAILED)
+ else:
+ self.resources[r].state_set(self.resources[r].CREATE_FAILED)
+
+
+ def create(self):
+
+ pool = eventlet.GreenPool()
+ pool.spawn_n(self.create_blocking)
- def stop(self):
+ def delete_blocking(self):
'''
- stop all the resources in the reverse order specified by get_start_order
+ delete all the resources in the reverse order specified by get_create_order
'''
- order = self.get_start_order()
+ order = self.get_create_order()
order.reverse()
for r in order:
- self.resources[r].stop()
+ try:
+ self.resources[r].delete()
+ except:
+ self.resources[r].state_set(self.resources[r].DELETE_FAILED)
+
+ def delete(self):
+ pool = eventlet.GreenPool()
+ pool.spawn_n(self.delete_blocking)
def get_outputs(self):
self.resolve_static_refs(self.outputs)
service_type=service_type, service_name=service_name)
return self._nova[service_type]
- def start(self):
- print 'starting %s name:%s' % (self.t['Type'], self.name)
+ def create(self):
+ print 'createing %s name:%s' % (self.t['Type'], self.name)
self.stack.resolve_attributes(self.t)
self.stack.resolve_joins(self.t)
db_api.event_create(None, ev)
self.state = new_state
- def stop(self):
- print 'stopping %s name:%s id:%s' % (self.t['Type'], self.name, self.instance_id)
+ def delete(self):
+ print 'deleteping %s name:%s id:%s' % (self.t['Type'], self.name, self.instance_id)
def reload(self):
pass
def __init__(self, name, json_snippet, stack):
super(GenericResource, self).__init__(name, json_snippet, stack)
- def start(self):
+ def create(self):
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- super(GenericResource, self).start()
- print 'Starting GenericResource %s' % self.name
+ super(GenericResource, self).create()
+ print 'createing GenericResource %s' % self.name
class ElasticIp(Resource):
if self.t.has_key('Properties') and self.t['Properties'].has_key('Domain'):
logger.warn('*** can\'t support Domain %s yet' % (self.t['Properties']['Domain']))
- def start(self):
+ def create(self):
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- super(ElasticIp, self).start()
+ super(ElasticIp, self).create()
self.instance_id = 'eip-000003'
def FnGetRefId(self):
else:
return unicode(self.t['Properties']['EIP'])
- def start(self):
+ def create(self):
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- super(ElasticIpAssociation, self).start()
+ super(ElasticIpAssociation, self).create()
logger.info('$ euca-associate-address -i %s %s' % (self.t['Properties']['InstanceId'],
self.t['Properties']['EIP']))
def __init__(self, name, json_snippet, stack):
super(Volume, self).__init__(name, json_snippet, stack)
- def start(self):
+ def create(self):
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- super(Volume, self).start()
+ super(Volume, self).create()
vol = self.nova('volume').volumes.create(self.t['Properties']['Size'],
display_name=self.name,
else:
self.state_set(self.CREATE_FAILED)
- def stop(self):
+ def delete(self):
if self.state == self.DELETE_IN_PROGRESS or self.state == self.DELETE_COMPLETE:
return
return
self.state_set(self.DELETE_IN_PROGRESS)
- Resource.stop(self)
+ Resource.delete(self)
if self.instance_id != None:
self.nova('volume').volumes.delete(self.instance_id)
def __init__(self, name, json_snippet, stack):
super(VolumeAttachment, self).__init__(name, json_snippet, stack)
- def start(self):
+ def create(self):
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- super(VolumeAttachment, self).start()
+ super(VolumeAttachment, self).create()
print 'Attaching InstanceId %s VolumeId %s Device %s' % (self.t['Properties']['InstanceId'],
self.t['Properties']['VolumeId'],
else:
self.state_set(self.CREATE_FAILED)
- def stop(self):
+ def delete(self):
if self.state == self.DELETE_IN_PROGRESS or self.state == self.DELETE_COMPLETE:
return
self.state_set(self.DELETE_IN_PROGRESS)
- Resource.stop(self)
+ Resource.delete(self)
print 'VolumeAttachment un-attaching %s %s' % (self.t['Properties']['InstanceId'],
self.instance_id)
return unicode(res)
- def start(self):
+ def create(self):
def _null_callback(p, n, out):
"""
Method to silence the default M2Crypto.RSA.gen_key output.
if self.state != None:
return
self.state_set(self.CREATE_IN_PROGRESS)
- Resource.start(self)
+ Resource.create(self)
props = self.t['Properties']
if not props.has_key('KeyName'):
for st in con['services']:
for s in con['services'][st]:
pass
- #print 'service start %s_%s' % (self.name, s)
+ #print 'service create %s_%s' % (self.name, s)
except KeyError as e:
# if there is no config then no services.
pass
else:
self.state_set(self.CREATE_FAILED)
- def stop(self):
+ def delete(self):
if self.state == self.DELETE_IN_PROGRESS or self.state == self.DELETE_COMPLETE:
return
self.state_set(self.DELETE_IN_PROGRESS)
- Resource.stop(self)
+ Resource.delete(self)
if self.instance_id == None:
self.state_set(self.DELETE_COMPLETE)