class CloudServer(instance.Instance):
"""Resource for Rackspace Cloud Servers."""
- properties_schema = {'Flavor': {'Type': 'String', 'Required': True},
- 'ImageName': {'Type': 'String', 'Required': True},
- 'UserData': {'Type': 'String'},
+ properties_schema = {'flavor': {'Type': 'String', 'Required': True},
+ 'image': {'Type': 'String', 'Required': True},
+ 'user_data': {'Type': 'String'},
'key_name': {'Type': 'String'},
'Volumes': {'Type': 'List'},
'name': {'Type': 'String'}}
# Template keys supported for handle_update. Properties not
# listed here trigger an UpdateReplace
update_allowed_keys = ('Metadata', 'Properties')
- update_allowed_properties = ('Flavor', 'name')
+ update_allowed_properties = ('flavor', 'name')
def __init__(self, name, json_snippet, stack):
super(CloudServer, self).__init__(name, json_snippet, stack)
@property
def image_id(self):
- """Get the image ID corresponding to the ImageName property."""
- image_name = self.properties['ImageName']
+ """Get the image ID corresponding to the image property."""
+ image_name = self.properties['image']
if image_name in self.__class__._image_id_map:
return self.__class__._image_id_map[image_name]
else:
"""Return the IP of the Cloud Server."""
def ip_not_found():
exc = exception.Error("Could not determine the %s IP of %s." %
- (ip_type, self.properties['ImageName']))
+ (ip_type, self.properties['image']))
raise exception.ResourceFailure(exc)
if ip_type not in self.server.addresses:
@property
def has_userdata(self):
- if self.properties['UserData'] or self.metadata != {}:
+ if self.properties['user_data'] or self.metadata != {}:
return True
else:
return False
def validate(self):
"""Validate user parameters."""
- if self.properties['Flavor'] not in self.flavors:
- return {'Error': "Flavor not found."}
+ if self.properties['flavor'] not in self.flavors:
+ return {'Error': "flavor not found."}
- # It's okay if there's no script, as long as UserData and
- # MetaData are empty
+ # It's okay if there's no script, as long as user_data and
+ # metadata are empty
if not self.script and self.has_userdata:
- return {'Error': "UserData/MetaData are not supported with %s." %
- self.properties['ImageName']}
+ return {'Error': "user_data/metadata are not supported with %s." %
+ self.properties['image']}
def _run_ssh_command(self, command):
"""Run a shell command on the Cloud Server via SSH."""
server and then trigger cloud-init.
"""
# Retrieve server creation parameters from properties
- flavor = self.properties['Flavor']
+ flavor = self.properties['flavor']
# Generate SSH public/private keypair
if self._private_key is not None:
if self.has_userdata:
# Create heat-script and userdata files on server
- raw_userdata = self.properties['UserData'] or ''
+ raw_userdata = self.properties['user_data'] or ''
userdata = self._build_userdata(raw_userdata)
files = [{'path': "/tmp/userdata", 'data': userdata},
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
"""Try to update a Cloud Server's parameters.
- If the Cloud Server's Metadata or Flavor changed, update the
+ If the Cloud Server's Metadata or flavor changed, update the
Cloud Server. If any other parameters changed, re-create the
Cloud Server with the new parameters.
"""
"/root/cfn-userdata.log 2>&1"
self._run_ssh_command(command)
- if 'Flavor' in prop_diff:
- self.flavor = json_snippet['Properties']['Flavor']
+ if 'flavor' in prop_diff:
+ self.flavor = json_snippet['Properties']['flavor']
self.server.resize(self.flavor)
resize = scheduler.TaskRunner(self._check_resize,
self.server,
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "WordPress",
"Parameters" : {
- "Flavor" : {
+ "flavor" : {
"Description" : "Rackspace Cloud Server flavor",
"Type" : "String",
"Default" : "2",
"WebServer": {
"Type": "Rackspace::Cloud::Server",
"Properties": {
- "ImageName" : "Fedora 17 (Beefy Miracle)",
- "Flavor" : "2",
- "UserData" : "wordpress"
+ "image" : "Fedora 17 (Beefy Miracle)",
+ "flavor" : "2",
+ "user_data" : "wordpress"
}
}
}
t = template_format.parse(wp_template)
template = parser.Template(t)
stack = parser.Stack(dummy_context(), stack_name, template,
- environment.Environment({'Flavor': '2'}),
+ environment.Environment({'flavor': '2'}),
stack_id=uuidutils.generate_uuid())
return (t, stack)
(t, stack) = self._setup_test_stack(stack_name)
cs_name = 'Fedora 17 (Beefy Miracle)'
- t['Resources']['WebServer']['Properties']['ImageName'] = cs_name
- t['Resources']['WebServer']['Properties']['Flavor'] = '2'
+ t['Resources']['WebServer']['Properties']['image'] = cs_name
+ t['Resources']['WebServer']['Properties']['flavor'] = '2'
cs = cloud_server.CloudServer('%s_name' % name,
t['Resources']['WebServer'], stack)
cs._private_key = rsa_key
cs.t = cs.stack.resolve_runtime_data(cs.t)
- flavor = t['Resources']['WebServer']['Properties']['Flavor']
+ flavor = t['Resources']['WebServer']['Properties']['flavor']
self.m.StubOutWithMock(self.fc.servers, 'create')
self.fc.servers.create(utils.PhysName(stack_name, cs.name),
(t, stack) = self._setup_test_stack(stack_name)
# create a cloud server with non exist image name
- t['Resources']['WebServer']['Properties']['ImageName'] = 'Slackware'
+ t['Resources']['WebServer']['Properties']['image'] = 'Slackware'
# Mock flavors
self.m.StubOutWithMock(cloud_server.CloudServer, "flavors")
cs = cloud_server.CloudServer('cs_create_image_err',
t['Resources']['WebServer'], stack)
- self.assertEqual({'Error': "UserData/MetaData are not supported with "
+ self.assertEqual({'Error': "user_data/metadata are not supported with "
"Slackware."},
cs.validate())
self.m.VerifyAll()
(t, stack) = self._setup_test_stack(stack_name)
# create a cloud server with non exist image name
- t['Resources']['WebServer']['Properties']['ImageName'] = 'Slackware'
- t['Resources']['WebServer']['Properties']['UserData'] = ''
+ t['Resources']['WebServer']['Properties']['image'] = 'Slackware'
+ t['Resources']['WebServer']['Properties']['user_data'] = ''
# Mock flavors
self.m.StubOutWithMock(cloud_server.CloudServer, "flavors")
self.m.VerifyAll()
def test_cs_create_flavor_err(self):
- """validate() should throw an if the Flavor is invalid."""
+ """validate() should throw an if the flavor is invalid."""
stack_name = 'test_cs_create_flavor_err_stack'
(t, stack) = self._setup_test_stack(stack_name)
# create a cloud server with non exist image name
- t['Resources']['WebServer']['Properties']['Flavor'] = '1'
+ t['Resources']['WebServer']['Properties']['flavor'] = '1'
# Mock flavors
self.m.StubOutWithMock(cloud_server.CloudServer, "flavors")
cs = cloud_server.CloudServer('cs_create_flavor_err',
t['Resources']['WebServer'], stack)
- self.assertEqual({'Error': "Flavor not found."}, cs.validate())
+ self.assertEqual({'Error': "flavor not found."}, cs.validate())
self.m.VerifyAll()
cs = self._create_test_cs(return_server, 'test_cs_update')
update_template = copy.deepcopy(cs.t)
- update_template['Properties']['UserData'] = 'mustreplace'
+ update_template['Properties']['user_data'] = 'mustreplace'
self.assertRaises(resource.UpdateReplace,
cs.update, update_template)