RES_DESCRIPTION: resource.parsed_template().get('Description', ''),
RES_UPDATED_TIME: timeutils.isotime(last_updated_time),
RES_NAME: resource.name,
- RES_PHYSICAL_ID: resource.instance_id or '',
+ RES_PHYSICAL_ID: resource.resource_id or '',
RES_METADATA: resource.metadata,
RES_STATUS: resource.state,
RES_STATUS_DATA: resource.state_description,
def __init__(self, name, json_snippet, stack):
super(AutoScalingGroup, self).__init__(name, json_snippet, stack)
- # instance_id is a list of resources
+ # resource_id is a list of resources
def handle_create(self):
return self.UPDATE_REPLACE
def handle_delete(self):
- if self.instance_id is not None:
+ if self.resource_id is not None:
conf = self.properties['LaunchConfigurationName']
- inst_list = self.instance_id.split(',')
+ inst_list = self.resource_id.split(',')
logger.debug('handle_delete %s' % str(inst_list))
for victim in inst_list:
logger.debug('handle_delete %s' % victim)
def adjust(self, adjustment, adjustment_type='ChangeInCapacity'):
inst_list = []
- if self.instance_id is not None:
- inst_list = sorted(self.instance_id.split(','))
+ if self.resource_id is not None:
+ inst_list = sorted(self.resource_id.split(','))
capacity = len(inst_list)
if adjustment_type == 'ChangeInCapacity':
self.stack.t['Resources'][conf],
self.stack)
inst_list.append(name)
- self.instance_id_set(','.join(inst_list))
+ self.resource_id_set(','.join(inst_list))
inst.create()
else:
# shrink (kill largest numbered first)
self.stack)
inst.destroy()
inst_list.remove(victim)
- self.instance_id_set(','.join(inst_list))
+ self.resource_id_set(','.join(inst_list))
# notify the LoadBalancer to reload it's config to include
# the changes in instances we have just made.
def _ipaddress(self):
if self.ipaddress is None:
- if self.instance_id is not None:
+ if self.resource_id is not None:
try:
- ips = self.nova().floating_ips.get(self.instance_id)
+ ips = self.nova().floating_ips.get(self.resource_id)
except NotFound as ex:
logger.warn("Floating IPs not found: %s" % str(ex))
else:
ips = self.nova().floating_ips.create()
logger.info('ElasticIp create %s' % str(ips))
self.ipaddress = ips.ip
- self.instance_id_set(ips.id)
+ self.resource_id_set(ips.id)
def handle_update(self):
return self.UPDATE_REPLACE
def handle_delete(self):
"""De-allocate a floating IP."""
- if self.instance_id is not None:
- self.nova().floating_ips.delete(self.instance_id)
+ if self.resource_id is not None:
+ self.nova().floating_ips.delete(self.resource_id)
def FnGetRefId(self):
return unicode(self._ipaddress())
def FnGetAtt(self, key):
if key == 'AllocationId':
- return unicode(self.instance_id)
+ return unicode(self.resource_id)
else:
raise exception.InvalidTemplateAttribute(resource=self.name,
key=key)
server = self.nova().servers.get(self.properties['InstanceId'])
server.add_floating_ip(self.properties['EIP'])
- self.instance_id_set(self.properties['EIP'])
+ self.resource_id_set(self.properties['EIP'])
def handle_delete(self):
"""Remove a floating IP address from a server."""
properties_schema = {'InstanceId': {'Type': 'String',
'Required': True}}
- def _find_resource(self, instance_id):
+ def _find_resource(self, resource_id):
'''
Return the resource with the specified instance ID, or None if it
cannot be found.
'''
for resource in self.stack:
- if resource.instance_id == instance_id:
+ if resource.resource_id == resource_id:
return resource
return None
'''
if self.ipaddress is None:
try:
- server = self.nova().servers.get(self.instance_id)
+ server = self.nova().servers.get(self.resource_id)
except NotFound as ex:
logger.warn('Instance IP address not found (%s)' % str(ex))
else:
server.get()
eventlet.sleep(1)
if server.status == 'ACTIVE':
- self.instance_id_set(server.id)
+ self.resource_id_set(server.id)
self._set_ipaddress(server.networks)
else:
raise exception.Error('%s instance[%s] status[%s]' %
'''
Delete an instance, blocking until it is disposed by OpenStack
'''
- if self.instance_id is None:
+ if self.resource_id is None:
return
try:
- server = self.nova().servers.get(self.instance_id)
+ server = self.nova().servers.get(self.resource_id)
except NotFound:
pass
else:
except NotFound:
break
eventlet.sleep(0.2)
- self.instance_id = None
+ self.resource_id = None
props = self.prepare_properties(self.properties, self.name)
fip = self.quantum().create_floatingip({
'floatingip': props})['floatingip']
- self.instance_id_set(fip['id'])
+ self.resource_id_set(fip['id'])
def handle_delete(self):
client = self.quantum()
try:
- client.delete_floatingip(self.instance_id)
+ client.delete_floatingip(self.resource_id)
except:
pass
def FnGetAtt(self, key):
attributes = self.quantum().show_floatingip(
- self.instance_id)['floatingip']
+ self.resource_id)['floatingip']
return self.handle_get_attributes(self.name, key, attributes)
self.quantum().update_floatingip(floatingip_id, {
'floatingip': props})['floatingip']
- self.instance_id_set('%s:%s' % (floatingip_id, props['port_id']))
+ self.resource_id_set('%s:%s' % (floatingip_id, props['port_id']))
def handle_delete(self):
client = self.quantum()
try:
- (floatingip_id, port_id) = self.instance_id.split(':')
+ (floatingip_id, port_id) = self.resource_id.split(':')
client.update_floatingip(floatingip_id,
{'floatingip': {'port_id': None}})
except:
def handle_create(self):
props = self.prepare_properties(self.properties, self.name)
net = self.quantum().create_network({'network': props})['network']
- self.instance_id_set(net['id'])
+ self.resource_id_set(net['id'])
def handle_delete(self):
client = self.quantum()
try:
- client.delete_network(self.instance_id)
+ client.delete_network(self.resource_id)
except:
pass
def FnGetAtt(self, key):
attributes = self.quantum().show_network(
- self.instance_id)['network']
+ self.resource_id)['network']
return self.handle_get_attributes(self.name, key, attributes)
def handle_create(self):
props = self.prepare_properties(self.properties, self.name)
port = self.quantum().create_port({'port': props})['port']
- self.instance_id_set(port['id'])
+ self.resource_id_set(port['id'])
def handle_delete(self):
client = self.quantum()
try:
- client.delete_port(self.instance_id)
+ client.delete_port(self.resource_id)
except:
pass
def FnGetAtt(self, key):
attributes = self.quantum().show_port(
- self.instance_id)['port']
+ self.resource_id)['port']
return self.handle_get_attributes(self.name, key, attributes)
return self.UPDATE_REPLACE
def FnGetRefId(self):
- return unicode(self.instance_id)
+ return unicode(self.resource_id)
def handle_create(self):
props = self.prepare_properties(self.properties, self.name)
router = self.quantum().create_router({'router': props})['router']
- self.instance_id_set(router['id'])
+ self.resource_id_set(router['id'])
def handle_delete(self):
client = self.quantum()
try:
- client.delete_router(self.instance_id)
+ client.delete_router(self.resource_id)
except:
pass
def FnGetAtt(self, key):
attributes = self.quantum().show_router(
- self.instance_id)['router']
+ self.resource_id)['router']
return self.handle_get_attributes(self.name, key, attributes)
subnet_id = self.properties.get('subnet_id')
self.quantum().add_interface_router(router_id,
{'subnet_id': subnet_id})
- self.instance_id_set('%s:%s' % (router_id, subnet_id))
+ self.resource_id_set('%s:%s' % (router_id, subnet_id))
def handle_delete(self):
client = self.quantum()
try:
- (router_id, subnet_id) = self.instance_id.split(':')
+ (router_id, subnet_id) = self.resource_id.split(':')
client.remove_interface_router(router_id,
{'subnet_id': subnet_id})
except:
network_id = self.properties.get('network_id')
self.quantum().add_gateway_router(router_id,
{'network_id': network_id})
- self.instance_id_set('%s:%s' % (router_id, network_id))
+ self.resource_id_set('%s:%s' % (router_id, network_id))
def handle_delete(self):
client = self.quantum()
try:
- (router_id, network_id) = self.instance_id.split(':')
+ (router_id, network_id) = self.resource_id.split(':')
client.remove_gateway_router(router_id)
except:
pass
def handle_create(self):
props = self.prepare_properties(self.properties, self.name)
subnet = self.quantum().create_subnet({'subnet': props})['subnet']
- self.instance_id_set(subnet['id'])
+ self.resource_id_set(subnet['id'])
def handle_delete(self):
client = self.quantum()
try:
- client.delete_subnet(self.instance_id)
+ client.delete_subnet(self.resource_id)
except:
pass
def FnGetAtt(self, key):
attributes = self.quantum().show_subnet(
- self.instance_id)['subnet']
+ self.resource_id)['subnet']
return self.handle_get_attributes(self.name, key, attributes)
resource = db_api.resource_get_by_name_and_stack(self.context,
name, stack.id)
if resource:
- self.instance_id = resource.nova_instance
+ self.resource_id = resource.nova_instance
self.state = resource.state
self.state_description = resource.state_description
self.id = resource.id
else:
- self.instance_id = None
+ self.resource_id = None
self.state = None
self.state_description = ''
self.id = None
return 'Resource deletion already in progress'
logger.info('deleting %s (inst:%s db_id:%s)' %
- (str(self), self.instance_id, str(self.id)))
+ (str(self), self.resource_id, str(self.id)))
self.state_set(self.DELETE_IN_PROGRESS)
try:
self.id = None
- def instance_id_set(self, inst):
- self.instance_id = inst
+ def resource_id_set(self, inst):
+ self.resource_id = inst
if self.id is not None:
try:
rs = db_api.resource_get(self.stack.context, self.id)
- rs.update_and_save({'nova_instance': self.instance_id})
+ rs.update_and_save({'nova_instance': self.resource_id})
except Exception as ex:
logger.warn('db error %s' % str(ex))
try:
rs = {'state': self.state,
'stack_id': self.stack.id,
- 'nova_instance': self.instance_id,
+ 'nova_instance': self.resource_id,
'name': self.name,
'rsrc_metadata': self.metadata,
'stack_name': self.stack.name}
def _add_event(self, new_state, reason):
'''Add a state change event to the database'''
ev = {'logical_resource_id': self.name,
- 'physical_resource_id': self.instance_id,
+ 'physical_resource_id': self.resource_id,
'stack_id': self.stack.id,
'stack_name': self.stack.name,
'resource_status': new_state,
rs = db_api.resource_get(self.context, self.id)
rs.update_and_save({'state': self.state,
'state_description': reason,
- 'nova_instance': self.instance_id})
+ 'nova_instance': self.resource_id})
self.stack.updated_time = datetime.utcnow()
except Exception as ex:
http://docs.amazonwebservices.com/AWSCloudFormation/latest/UserGuide/\
intrinsic-function-reference-ref.html
'''
- if self.instance_id is not None:
- return unicode(self.instance_id)
+ if self.resource_id is not None:
+ return unicode(self.resource_id)
else:
return unicode(self.name)
headers['X-Container-Write'] = tenant_username
self.swift().put_container(container, headers)
- self.instance_id_set(container)
+ self.resource_id_set(container)
def handle_update(self):
return self.UPDATE_REPLACE
"""Perform specified delete policy"""
if self.properties['DeletionPolicy'] == 'Retain':
return
- logger.debug('S3Bucket delete container %s' % self.instance_id)
- if self.instance_id is not None:
+ logger.debug('S3Bucket delete container %s' % self.resource_id)
+ if self.resource_id is not None:
try:
- self.swift().delete_container(self.instance_id)
+ self.swift().delete_container(self.resource_id)
except ClientException as ex:
logger.warn("Delete container failed: %s" % str(ex))
def FnGetRefId(self):
- return unicode(self.instance_id)
+ return unicode(self.resource_id)
def FnGetAtt(self, key):
url, token_id = self.swift().get_auth()
return parsed[1].split(':')[0]
elif key == 'WebsiteURL':
return '%s://%s%s/%s' % (parsed[0], parsed[1], parsed[2],
- self.instance_id)
+ self.resource_id)
else:
raise exception.InvalidTemplateAttribute(resource=self.name,
key=key)
self.physical_resource_name(),
self.properties['GroupDescription'])
- self.instance_id_set(sec.id)
+ self.resource_id_set(sec.id)
if self.properties['SecurityGroupIngress']:
rules_client = self.nova().security_group_rules
for i in self.properties['SecurityGroupIngress']:
return self.UPDATE_REPLACE
def handle_delete(self):
- if self.instance_id is not None:
+ if self.resource_id is not None:
try:
- sec = self.nova().security_groups.get(self.instance_id)
+ sec = self.nova().security_groups.get(self.resource_id)
except NotFound:
pass
else:
pass
self.nova().security_groups.delete(sec)
- self.instance_id = None
+ self.resource_id = None
def FnGetRefId(self):
return unicode(self.name)
return p
def nested(self):
- if self._nested is None and self.instance_id is not None:
+ if self._nested is None and self.resource_id is not None:
self._nested = parser.Stack.load(self.context,
- self.instance_id)
+ self.resource_id)
if self._nested is None:
raise exception.NotFound('Nested stack not found in DB')
params)
nested_id = self._nested.store(self.stack)
- self.instance_id_set(nested_id)
+ self.resource_id_set(nested_id)
self._nested.create()
if self._nested.state != self._nested.CREATE_COMPLETE:
raise exception.Error(self._nested.state_description)
self.physical_resource_name(),
tenant_id=tenant_id,
enabled=True)
- self.instance_id_set(user.id)
+ self.resource_id_set(user.id)
# We add the new user to a special keystone role
# This role is designed to allow easier differentiation of the
return self.UPDATE_REPLACE
def handle_delete(self):
- if self.instance_id is None:
+ if self.resource_id is None:
return
try:
- user = self.keystone().users.get(DummyId(self.instance_id))
+ user = self.keystone().users.get(DummyId(self.resource_id))
except Exception as ex:
logger.info('user %s/%s does not exist' %
- (self.physical_resource_name(), self.instance_id))
+ (self.physical_resource_name(), self.resource_id))
return
# tempory hack to work around an openstack bug.
tenant_id = self.context.tenant_id
cred = self.keystone().ec2.create(user.id, tenant_id)
- self.instance_id_set(cred.access)
+ self.resource_id_set(cred.access)
self._secret = cred.secret
def handle_update(self):
def handle_delete(self):
user = self._user_from_name(self.properties['UserName'])
- if user and self.instance_id:
- self.keystone().ec2.delete(user.id, self.instance_id)
+ if user and self.resource_id:
+ self.keystone().ec2.delete(user.id, self.resource_id)
def _secret_accesskey(self):
'''
# This will allow "instance users" to retrieve resource
# metadata but not manipulate user resources in any other way
user_id = self.keystone().auth_user_id
- cred = self.keystone().ec2.get(user_id, self.instance_id)
+ cred = self.keystone().ec2.get(user_id, self.resource_id)
self._secret = cred.secret
- self.instance_id_set(cred.access)
+ self.resource_id_set(cred.access)
except Exception as ex:
logger.warn('could not get secret for %s Error:%s' %
(self.properties['UserName'],
eventlet.sleep(1)
vol.get()
if vol.status == 'available':
- self.instance_id_set(vol.id)
+ self.resource_id_set(vol.id)
else:
raise exception.Error(vol.status)
return self.UPDATE_REPLACE
def handle_delete(self):
- if self.instance_id is not None:
- vol = self.nova('volume').volumes.get(self.instance_id)
+ if self.resource_id is not None:
+ vol = self.nova('volume').volumes.get(self.resource_id)
if vol.status == 'in-use':
logger.warn('cant delete volume when in-use')
raise exception.Error("Volume in use")
- self.nova('volume').volumes.delete(self.instance_id)
+ self.nova('volume').volumes.delete(self.resource_id)
class VolumeAttachment(resource.Resource):
eventlet.sleep(1)
vol.get()
if vol.status == 'in-use':
- self.instance_id_set(va.id)
+ self.resource_id_set(va.id)
else:
raise exception.Error(vol.status)
super(WaitConditionHandle, self).__init__(name, json_snippet, stack)
def handle_create(self):
- self.instance_id = '%s/stacks/%s/resources/%s' % \
+ self.resource_id = '%s/stacks/%s/resources/%s' % \
(cfg.CONF.heat_waitcondition_server_url,
self.stack.id,
self.name)
found = 0
mylist = self.stack.novaclient.floating_ips.list()
for item in mylist:
- if item.instance_id == self.stack.instance_phys_ids()[0]:
+ if item.resource_id == self.stack.instance_phys_ids()[0]:
print 'floating IP found', item.ip
found = 1
break
found = 0
mylist = self.stack.novaclient.floating_ips.list()
for item in mylist:
- if item.instance_id == self.stack.instance_phys_ids()[0]:
+ if item.resource_id == self.stack.instance_phys_ids()[0]:
print 'floating IP found', item.ip
found = 1
break
resource = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup', resource.FnGetRefId())
- self.assertEqual('WebServerGroup-0', resource.instance_id)
+ self.assertEqual('WebServerGroup-0', resource.resource_id)
self.assertEqual(asc.AutoScalingGroup.UPDATE_REPLACE,
resource.handle_update())
properties['DesiredCapacity'] = '3'
resource = self.create_scaling_group(t, stack, 'WebServerGroup')
self.assertEqual('WebServerGroup-0,WebServerGroup-1,WebServerGroup-2',
- resource.instance_id)
+ resource.resource_id)
# reduce to 1
resource.adjust(-2)
- self.assertEqual('WebServerGroup-0', resource.instance_id)
+ self.assertEqual('WebServerGroup-0', resource.resource_id)
# raise to 3
resource.adjust(2)
self.assertEqual('WebServerGroup-0,WebServerGroup-1,WebServerGroup-2',
- resource.instance_id)
+ resource.resource_id)
# set to 2
resource.adjust(2, 'ExactCapacity')
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
- resource.instance_id)
+ resource.resource_id)
# raise above the max
resource.adjust(2)
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
- resource.instance_id)
+ resource.resource_id)
# lower below the min
resource.adjust(-2)
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
- resource.instance_id)
+ resource.resource_id)
# no change
resource.adjust(0)
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
- resource.instance_id)
+ resource.resource_id)
# reduce by 50%
resource.adjust(-50, 'PercentChangeInCapacity')
self.assertEqual('WebServerGroup-0',
- resource.instance_id)
+ resource.resource_id)
# raise by 200%
resource.adjust(200, 'PercentChangeInCapacity')
self.assertEqual('WebServerGroup-0,WebServerGroup-1,WebServerGroup-2',
- resource.instance_id)
+ resource.resource_id)
resource.delete()
resource = self.create_scaling_group(t, stack, 'WebServerGroup')
stack.resources['WebServerGroup'] = resource
- self.assertEqual('WebServerGroup-0', resource.instance_id)
+ self.assertEqual('WebServerGroup-0', resource.resource_id)
up_policy = self.create_scaling_policy(t, stack,
'WebServerScaleUpPolicy')
up_policy.alarm()
self.assertEqual('WebServerGroup-0,WebServerGroup-1',
- resource.instance_id)
+ resource.resource_id)
down_policy = self.create_scaling_policy(t, stack,
'WebServerScaleDownPolicy')
down_policy.alarm()
self.assertEqual('WebServerGroup-0',
- resource.instance_id)
+ resource.resource_id)
resource.delete()
stack.create()
self.assertNotEqual(stack.resources['WebServer'], None)
- self.assertTrue(stack.resources['WebServer'].instance_id > 0)
+ self.assertTrue(stack.resources['WebServer'].resource_id > 0)
self.assertNotEqual(stack.resources['WebServer'].ipaddress, '0.0.0.0')
def test_wordpress_single_instance_stack_delete(self):
self.assertNotEqual(db_s, None)
self.assertNotEqual(stack.resources['WebServer'], None)
- self.assertTrue(stack.resources['WebServer'].instance_id > 0)
+ self.assertTrue(stack.resources['WebServer'].resource_id > 0)
stack.delete()
meta=None).AndReturn(self.fc.servers.list()[1])
self.m.ReplayAll()
- instance.instance_id = 1234
+ instance.resource_id = 1234
instance.create()
# this makes sure the auto increment worked on instance creation
self.assertTrue(instance.id > 0)
instance.delete()
- self.assertTrue(instance.instance_id is None)
+ self.assertTrue(instance.resource_id is None)
self.assertEqual(instance.state, instance.DELETE_COMPLETE)
# allows testing of the test directly, shown below
stack = self.parse_stack(t)
resource = self.create_user(t, stack, 'CfnUser')
- self.assertEqual('1', resource.instance_id)
+ self.assertEqual('1', resource.resource_id)
self.assertEqual('test_stack.CfnUser', resource.FnGetRefId())
self.assertEqual('CREATE_COMPLETE', resource.state)
self.assertEqual(user.User.UPDATE_REPLACE,
resource.handle_update())
- resource.instance_id = None
+ resource.resource_id = None
self.assertEqual(None, resource.delete())
self.assertEqual('DELETE_COMPLETE', resource.state)
- resource.instance_id = '1'
+ resource.resource_id = '1'
resource.state_set('CREATE_COMPLETE')
self.assertEqual('CREATE_COMPLETE', resource.state)
self.assertEqual(user.AccessKey.UPDATE_REPLACE,
resource.handle_update())
self.assertEqual('03a4967889d94a9c8f707d267c127a3d',
- resource.instance_id)
+ resource.resource_id)
self.assertEqual('d5fd0c08f8cc417ead0355c67c529438',
resource._secret)