| Index: boto/cloudformation/stack.py
|
| diff --git a/boto/cloudformation/stack.py b/boto/cloudformation/stack.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8b9e11574bb4b740c7c506b969b0cf5e6e98b150
|
| --- /dev/null
|
| +++ b/boto/cloudformation/stack.py
|
| @@ -0,0 +1,289 @@
|
| +from datetime import datetime
|
| +
|
| +from boto.resultset import ResultSet
|
| +
|
| +class Stack:
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.creation_time = None
|
| + self.description = None
|
| + self.disable_rollback = None
|
| + self.notification_arns = []
|
| + self.outputs = []
|
| + self.parameters = []
|
| + self.stack_id = None
|
| + self.stack_status = None
|
| + self.stack_name = None
|
| + self.stack_name_reason = None
|
| + self.timeout_in_minutes = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + if name == "Parameters":
|
| + self.parameters = ResultSet([('member', Parameter)])
|
| + return self.parameters
|
| + elif name == "Outputs":
|
| + self.outputs = ResultSet([('member', Output)])
|
| + return self.outputs
|
| + else:
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == 'CreationTime':
|
| + self.creation_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
| + elif name == "Description":
|
| + self.description = value
|
| + elif name == "DisableRollback":
|
| + self.disable_rollback = bool(value)
|
| + elif name == "NotificationARNs":
|
| + self.notification_arns = value
|
| + elif name == 'StackId':
|
| + self.stack_id = value
|
| + elif name == 'StackName':
|
| + self.stack_name = value
|
| + elif name == 'StackStatus':
|
| + self.stack_status = value
|
| + elif name == "StackStatusReason":
|
| + self.stack_status_reason = value
|
| + elif name == "TimeoutInMinutes":
|
| + self.timeout_in_minutes = int(value)
|
| + elif name == "member":
|
| + pass
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def delete(self):
|
| + return self.connection.delete_stack(stack_name_or_id=self.stack_id)
|
| +
|
| + def describe_events(self, next_token=None):
|
| + return self.connection.describe_stack_events(
|
| + stack_name_or_id=self.stack_id,
|
| + next_token=next_token
|
| + )
|
| +
|
| + def describe_resource(self, logical_resource_id):
|
| + return self.connection.describe_stack_resource(
|
| + stack_name_or_id=self.stack_id,
|
| + logical_resource_id=logical_resource_id
|
| + )
|
| +
|
| + def describe_resources(self, logical_resource_id=None,
|
| + physical_resource_id=None):
|
| + return self.connection.describe_stack_resources(
|
| + stack_name_or_id=self.stack_id,
|
| + logical_resource_id=logical_resource_id,
|
| + physical_resource_id=physical_resource_id
|
| + )
|
| +
|
| + def list_resources(self, next_token=None):
|
| + return self.connection.list_stack_resources(
|
| + stack_name_or_id=self.stack_id,
|
| + next_token=next_token
|
| + )
|
| +
|
| + def update(self):
|
| + rs = self.connection.describe_stacks(self.stack_id)
|
| + if len(rs) == 1 and rs[0].stack_id == self.stack_id:
|
| + self.__dict__.update(rs[0].__dict__)
|
| + else:
|
| + raise ValueError("%s is not a valid Stack ID or Name" %
|
| + self.stack_id)
|
| +
|
| + def get_template(self):
|
| + return self.connection.get_template(stack_name_or_id=self.stack_id)
|
| +
|
| +class StackSummary:
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.stack_id = None
|
| + self.stack_status = None
|
| + self.stack_name = None
|
| + self.creation_time = None
|
| + self.deletion_time = None
|
| + self.template_description = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == 'StackId':
|
| + self.stack_id = value
|
| + elif name == 'StackStatus':
|
| + self.stack_status = value
|
| + elif name == 'StackName':
|
| + self.stack_name = value
|
| + elif name == 'CreationTime':
|
| + self.creation_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
| + elif name == "DeletionTime":
|
| + self.deletion_time = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
| + elif name == 'TemplateDescription':
|
| + self.template_description = value
|
| + elif name == "member":
|
| + pass
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| +class Parameter:
|
| + def __init__(self, connection=None):
|
| + self.connection = None
|
| + self.key = None
|
| + self.value = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == "ParameterKey":
|
| + self.key = value
|
| + elif name == "ParameterValue":
|
| + self.value = value
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def __repr__(self):
|
| + return "Parameter:\"%s\"=\"%s\"" % (self.key, self.value)
|
| +
|
| +class Output:
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.description = None
|
| + self.key = None
|
| + self.value = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == "Description":
|
| + self.description = value
|
| + elif name == "OutputKey":
|
| + self.key = value
|
| + elif name == "OutputValue":
|
| + self.value = value
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def __repr__(self):
|
| + return "Output:\"%s\"=\"%s\"" % (self.key, self.value)
|
| +
|
| +class StackResource:
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.description = None
|
| + self.logical_resource_id = None
|
| + self.physical_resource_id = None
|
| + self.resource_status = None
|
| + self.resource_status_reason = None
|
| + self.resource_type = None
|
| + self.stack_id = None
|
| + self.stack_name = None
|
| + self.timestamp = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == "Description":
|
| + self.description = value
|
| + elif name == "LogicalResourceId":
|
| + self.logical_resource_id = value
|
| + elif name == "PhysicalResourceId":
|
| + self.physical_resource_id = value
|
| + elif name == "ResourceStatus":
|
| + self.resource_status = value
|
| + elif name == "ResourceStatusReason":
|
| + self.resource_status_reason = value
|
| + elif name == "ResourceType":
|
| + self.resource_type = value
|
| + elif name == "StackId":
|
| + self.stack_id = value
|
| + elif name == "StackName":
|
| + self.stack_name = value
|
| + elif name == "Timestamp":
|
| + self.timestamp = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def __repr__(self):
|
| + return "StackResource:%s (%s)" % (self.logical_resource_id,
|
| + self.resource_type)
|
| +
|
| +class StackResourceSummary:
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.last_updated_timestamp = None
|
| + self.logical_resource_id = None
|
| + self.physical_resource_id = None
|
| + self.resource_status = None
|
| + self.resource_status_reason = None
|
| + self.resource_type = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == "LastUpdatedTimestamp":
|
| + self.last_updated_timestampe = datetime.strptime(value,
|
| + '%Y-%m-%dT%H:%M:%SZ')
|
| + elif name == "LogicalResourceId":
|
| + self.logical_resource_id = value
|
| + elif name == "PhysicalResourceId":
|
| + self.physical_resource_id = value
|
| + elif name == "ResourceStatus":
|
| + self.resource_status = value
|
| + elif name == "ResourceStatusReason":
|
| + self.resource_status_reason = value
|
| + elif name == "ResourceType":
|
| + self.resource_type = value
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def __repr__(self):
|
| + return "StackResourceSummary:%s (%s)" % (self.logical_resource_id,
|
| + self.resource_type)
|
| +
|
| +class StackEvent:
|
| + valid_states = ("CREATE_IN_PROGRESS", "CREATE_FAILED", "CREATE_COMPLETE",
|
| + "DELETE_IN_PROGRESS", "DELETE_FAILED", "DELETE_COMPLETE")
|
| + def __init__(self, connection=None):
|
| + self.connection = connection
|
| + self.event_id = None
|
| + self.logical_resource_id = None
|
| + self.physical_resource_id = None
|
| + self.resource_properties = None
|
| + self.resource_status = None
|
| + self.resource_status_reason = None
|
| + self.resource_type = None
|
| + self.stack_id = None
|
| + self.stack_name = None
|
| + self.timestamp = None
|
| +
|
| + def startElement(self, name, attrs, connection):
|
| + return None
|
| +
|
| + def endElement(self, name, value, connection):
|
| + if name == "EventId":
|
| + self.event_id = value
|
| + elif name == "LogicalResourceId":
|
| + self.logical_resource_id = value
|
| + elif name == "PhysicalResourceId":
|
| + self.physical_resource_id = value
|
| + elif name == "ResourceProperties":
|
| + self.resource_properties = value
|
| + elif name == "ResourceStatus":
|
| + self.resource_status = value
|
| + elif name == "ResourceStatusReason":
|
| + self.resource_status_reason = value
|
| + elif name == "ResourceType":
|
| + self.resource_type = value
|
| + elif name == "StackId":
|
| + self.stack_id = value
|
| + elif name == "StackName":
|
| + self.stack_name = value
|
| + elif name == "Timestamp":
|
| + self.timestamp = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
|
| + else:
|
| + setattr(self, name, value)
|
| +
|
| + def __repr__(self):
|
| + return "StackEvent %s %s %s" % (self.resource_type,
|
| + self.logical_resource_id, self.resource_status)
|
|
|