# Copyright (c) 2012-2013, Mark Peek <mark@peek.org>
# Copyright (c) 2014, Andy Botting <andy.botting@theguardian.com>
# All rights reserved.
#
# See LICENSE file for full license.
from troposphere import AWSObject, AWSProperty
from troposphere.validators import boolean, integer, network_port
[docs]class BlockDeviceMapping(AWSProperty):
props = {
"delete_on_termination": (boolean, False),
"device_name": (str, True),
"snapshot_id": (str, False),
"volume_id": (str, False),
"volume_size": (integer, False),
}
[docs]class BlockDeviceMappingV2(AWSProperty):
props = {
"boot_index": (integer, False),
"delete_on_termination": (boolean, False),
"device_name": (str, False),
"device_type": (str, False),
"disk_bus": (str, False),
"ephemeral_format": (str, False),
"ephemeral_size": (integer, False),
"image_id": (str, False),
"snapshot_id": (str, False),
"swap_size": (integer, False),
"volume_id": (str, False),
"volume_size": (integer, False),
}
[docs] def validate(self):
if "device_type" in self.resource:
device_type = self.resource["device_type"]
if device_type not in ["cdrom", "disk"]:
raise ValueError(
"The device_type attribute " "must be either cdrom or disk"
)
if "disk_bus" in self.resource:
disk_bus = self.resource["disk_bus"]
if disk_bus not in ["ide", "lame_bus", "scsi", "usb", "virtio"]:
raise ValueError(
"The device_bus attribute "
"must be one of ide, lame_bus, scsi, usb or virtio"
)
if "ephemeral_format" in self.resource:
ephemeral_format = self.resource["ephemeral_format"]
if ephemeral_format not in ["ext2", "ext3", "ext4", "xfs", "ntfs"]:
raise ValueError(
"The device_type attribute "
"must be one of ext2, ext3, ext4, xfs, ntfs"
)
[docs]class Network(AWSProperty):
props = {
"fixed_ip": (str, False),
"network": (str, False),
"port": (network_port, False),
}
[docs]class FloatingIP(AWSObject):
resource_type = "OS::Nova::FloatingIP"
props = {
"pool": (str, False),
}
[docs]class FloatingIPAssociation(AWSObject):
resource_type = "OS::Nova::FloatingIPAssociation"
props = {
"floating_ip": (str, True),
"server_ip": (str, True),
}
[docs]class KeyPair(AWSObject):
resource_type = "OS::Nova::KeyPair"
props = {
"name": (str, True),
"public_key": (str, False),
"save_private_key": (boolean, False),
}
[docs]class Server(AWSObject):
resource_type = "OS::Nova::Server"
props = {
"admin_pass": (str, False),
"admin_user": (str, False),
"availability_zone": (str, False),
"block_device_mapping": (list, False),
"block_device_mapping_v2": (list, False),
"config_drive": (str, False),
"diskConfig": (str, False),
"flavor": (str, False),
"flavor_update_policy": (str, False),
"image": (str, True),
"image_update_policy": (str, False),
"key_name": (str, False),
"metadata": (dict, False),
"name": (str, False),
"personality": (dict, False),
"networks": (list, True),
"reservation_id": (str, False),
"scheduler_hints": (dict, False),
"security_groups": (list, False),
"software_config_transport": (str, False),
"user_data": (str, False),
"user_data_format": (str, False),
}
[docs] def validate(self):
if "diskConfig" in self.resource:
diskConfig = self.resource["diskConfig"]
if diskConfig not in ["AUTO", "MANUAL"]:
raise ValueError(
"The diskConfig attribute " "must be either AUTO or MANUAL"
)
if "flavor_update_policy" in self.resource:
flavor_update_policy = self.resource["flavor_update_policy"]
if flavor_update_policy not in ["RESIZE", "REPLACE"]:
raise ValueError(
"The flavor_update_policy attribute "
"must be either RESIZE or REPLACE"
)
if "image_update_policy" in self.resource:
image_update_policy = self.resource["flavor_update_policy"]
if image_update_policy not in [
"REBUILD",
"REPLACE",
"REBUILD_PRESERVE_EPHEMERAL",
]:
raise ValueError(
"The image_update_policy attribute "
"must be either REBUILD, REPLACE or "
"REBUILD_PRESERVE_EPHEMERAL"
)
if "software_config_transport" in self.resource:
sct = self.resource["software_config_transport"]
if sct not in ["POLL_SERVER_CFN", "POLL_SERVER_HEAT"]:
raise ValueError(
"The software_config_transport attribute "
"must be either POLL_SERVER_CFN or POLL_SERVER_HEAT"
)
if "user_data_format" in self.resource:
user_data_format = self.resource["user_data_format"]
if user_data_format not in ["HEAT_CFNTOOLS", "RAW"]:
raise ValueError(
"The user_data_format attribute "
"must be either HEAT_CFNTOOLS or RAW"
)