Restructure layout of functions, follow alphabetical ordering
diff --git a/ec2stack/providers/cloudstack/images.py b/ec2stack/providers/cloudstack/images.py
index 0b28384..ba1fa2c 100644
--- a/ec2stack/providers/cloudstack/images.py
+++ b/ec2stack/providers/cloudstack/images.py
@@ -6,26 +6,6 @@
@helpers.authentication_required
-def describe_images():
- args = {'templatefilter': 'executable', 'command': 'listTemplates'}
- response = cloudstack.describe_item(
- args, 'template', errors.invalid_image_id, 'ImageId'
- )
-
- return _describe_images_response(
- response
- )
-
-
-def _describe_images_response(response):
- return {
- 'template_name_or_list': 'images.xml',
- 'response_type': 'DescribeImagesResponse',
- 'response': response
- }
-
-
-@helpers.authentication_required
def describe_image_attribute():
image_id = helpers.get('ImageId')
attribute = helpers.get('Attribute')
@@ -55,6 +35,26 @@
}
+@helpers.authentication_required
+def describe_images():
+ args = {'templatefilter': 'executable', 'command': 'listTemplates'}
+ response = cloudstack.describe_item(
+ args, 'template', errors.invalid_image_id, 'ImageId'
+ )
+
+ return _describe_images_response(
+ response
+ )
+
+
+def _describe_images_response(response):
+ return {
+ 'template_name_or_list': 'images.xml',
+ 'response_type': 'DescribeImagesResponse',
+ 'response': response
+ }
+
+
def describe_image_by_id(image_id):
args = {
'id': image_id,
diff --git a/ec2stack/providers/cloudstack/instances.py b/ec2stack/providers/cloudstack/instances.py
index a411f06..479a0b5 100644
--- a/ec2stack/providers/cloudstack/instances.py
+++ b/ec2stack/providers/cloudstack/instances.py
@@ -9,34 +9,6 @@
@helpers.authentication_required
-def describe_instances():
- args = {'command': 'listVirtualMachines'}
- response = cloudstack.describe_item(
- args, 'virtualmachine', errors.invalid_instance_id, 'InstanceId'
- )
-
- return _describe_instances_response(
- response
- )
-
-
-def describe_instance_by_id(instance_id):
- args = {'id': instance_id, 'command': 'listVirtualMachines'}
- response = cloudstack.describe_item_request(
- args, 'virtualmachine', errors.invalid_instance_id
- )
- return response
-
-
-def _describe_instances_response(response):
- return {
- 'template_name_or_list': 'instances.xml',
- 'response_type': 'DescribeInstancesResponse',
- 'response': response
- }
-
-
-@helpers.authentication_required
def describe_instance_attribute():
instance_id = helpers.get('InstanceId')
attribute = helpers.get('Attribute')
@@ -70,6 +42,34 @@
@helpers.authentication_required
+def describe_instances():
+ args = {'command': 'listVirtualMachines'}
+ response = cloudstack.describe_item(
+ args, 'virtualmachine', errors.invalid_instance_id, 'InstanceId'
+ )
+
+ return _describe_instances_response(
+ response
+ )
+
+
+def describe_instance_by_id(instance_id):
+ args = {'id': instance_id, 'command': 'listVirtualMachines'}
+ response = cloudstack.describe_item_request(
+ args, 'virtualmachine', errors.invalid_instance_id
+ )
+ return response
+
+
+def _describe_instances_response(response):
+ return {
+ 'template_name_or_list': 'instances.xml',
+ 'response_type': 'DescribeInstancesResponse',
+ 'response': response
+ }
+
+
+@helpers.authentication_required
def run_instance():
helpers.require_parameters(
['ImageId', 'MinCount', 'MaxCount'])
@@ -159,6 +159,32 @@
@helpers.authentication_required
+def reboot_instance():
+ helpers.require_parameters(['InstanceId.1'])
+ instance_id = helpers.get('InstanceId.1')
+ _reboot_instance_request(instance_id)
+ return _reboot_instance_response()
+
+
+def _reboot_instance_request(instance_id):
+ args = {'command': 'rebootVirtualMachine',
+ 'id': instance_id}
+ response = requester.make_request_async(args)
+ response = response['virtualmachine']
+ return response
+
+
+def _reboot_instance_response():
+ response = {
+ 'template_name_or_list': 'status.xml',
+ 'response_type': 'RebootInstancesResponse',
+ 'return': 'true'
+ }
+
+ return response
+
+
+@helpers.authentication_required
def start_instance():
helpers.require_parameters(['InstanceId.1'])
instance_id = helpers.get('InstanceId.1')
@@ -193,40 +219,6 @@
@helpers.authentication_required
-def terminate_instance():
- helpers.require_parameters(['InstanceId.1'])
- instance_id = helpers.get('InstanceId.1')
- previous_instance_state_description = describe_instance_by_id(instance_id)
- new_instance_state_description = _terminate_instance_request(instance_id)
- return _terminate_instance_response(
- previous_instance_state_description,
- new_instance_state_description
- )
-
-
-def _terminate_instance_request(instance_id):
- args = {'command': 'destroyVirtualMachine',
- 'id': instance_id}
-
- response = requester.make_request_async(args)
-
- response = response['virtualmachine']
-
- return response
-
-
-def _terminate_instance_response(previous_state, new_state):
- response = {
- 'template_name_or_list': 'change_instance_state.xml',
- 'response_type': 'TerminateInstancesResponse',
- 'previous_state': previous_state,
- 'new_state': new_state
- }
-
- return response
-
-
-@helpers.authentication_required
def stop_instance():
helpers.require_parameters(['InstanceId.1'])
instance_id = helpers.get('InstanceId.1')
@@ -258,26 +250,34 @@
@helpers.authentication_required
-def reboot_instance():
+def terminate_instance():
helpers.require_parameters(['InstanceId.1'])
instance_id = helpers.get('InstanceId.1')
- _reboot_instance_request(instance_id)
- return _reboot_instance_response()
+ previous_instance_state_description = describe_instance_by_id(instance_id)
+ new_instance_state_description = _terminate_instance_request(instance_id)
+ return _terminate_instance_response(
+ previous_instance_state_description,
+ new_instance_state_description
+ )
-def _reboot_instance_request(instance_id):
- args = {'command': 'rebootVirtualMachine',
+def _terminate_instance_request(instance_id):
+ args = {'command': 'destroyVirtualMachine',
'id': instance_id}
+
response = requester.make_request_async(args)
+
response = response['virtualmachine']
+
return response
-def _reboot_instance_response():
+def _terminate_instance_response(previous_state, new_state):
response = {
- 'template_name_or_list': 'status.xml',
- 'response_type': 'RebootInstancesResponse',
- 'return': 'true'
+ 'template_name_or_list': 'change_instance_state.xml',
+ 'response_type': 'TerminateInstancesResponse',
+ 'previous_state': previous_state,
+ 'new_state': new_state
}
return response
diff --git a/ec2stack/providers/cloudstack/keypairs.py b/ec2stack/providers/cloudstack/keypairs.py
index ab1e878..8292d48 100644
--- a/ec2stack/providers/cloudstack/keypairs.py
+++ b/ec2stack/providers/cloudstack/keypairs.py
@@ -39,26 +39,6 @@
@helpers.authentication_required
-def describe_keypairs():
- args = {'command': 'listSSHKeyPairs'}
- response = cloudstack.describe_item(
- args, 'sshkeypair', errors.invalid_keypair_name, 'KeyName'
- )
-
- return _describe_keypair_response(
- response
- )
-
-
-def _describe_keypair_response(response):
- return {
- 'template_name_or_list': 'keypairs.xml',
- 'response_type': 'DescribeKeyPairsResponse',
- 'response': response
- }
-
-
-@helpers.authentication_required
def delete_keypair():
helpers.require_parameters(['KeyName'])
_delete_keypair_request()
@@ -82,6 +62,26 @@
@helpers.authentication_required
+def describe_keypairs():
+ args = {'command': 'listSSHKeyPairs'}
+ response = cloudstack.describe_item(
+ args, 'sshkeypair', errors.invalid_keypair_name, 'KeyName'
+ )
+
+ return _describe_keypair_response(
+ response
+ )
+
+
+def _describe_keypair_response(response):
+ return {
+ 'template_name_or_list': 'keypairs.xml',
+ 'response_type': 'DescribeKeyPairsResponse',
+ 'response': response
+ }
+
+
+@helpers.authentication_required
def import_keypair():
helpers.require_parameters(['KeyName', 'PublicKeyMaterial'])
response = _import_keypair_request()
diff --git a/ec2stack/providers/cloudstack/security_groups.py b/ec2stack/providers/cloudstack/security_groups.py
index da8ef02..57282f8 100644
--- a/ec2stack/providers/cloudstack/security_groups.py
+++ b/ec2stack/providers/cloudstack/security_groups.py
@@ -8,6 +8,57 @@
@helpers.authentication_required
+def authenticate_security_group_egress():
+ rule_type = 'egress'
+ response = _authenticate_security_group_request(rule_type)
+ return _authenticate_security_group_response(response, rule_type)
+
+
+def _authenticate_security_group_request(rule_type):
+ args = _parse_security_group_request()
+
+ if rule_type == 'egress':
+ args['command'] = 'authorizeSecurityGroupEgress'
+ elif rule_type == 'ingress':
+ args['command'] = 'authorizeSecurityGroupIngress'
+
+ response = requester.make_request_async(args)
+
+ return response
+
+
+def _authenticate_security_group_response(response, rule_type):
+ if 'errortext' in response:
+ if 'Failed to authorize security group' in response['errortext']:
+ cidrlist = str(helpers.get('CidrIp'))
+ protocol = str(helpers.get('IpProtocol'))
+ from_port = str(helpers.get('FromPort'))
+ to_port = str(helpers.get('toPort'))
+ raise Ec2stackError(
+ '400',
+ 'InvalidPermission.Duplicate',
+ 'the specified rule "peer: ' + cidrlist + ', ' + protocol +
+ ', from port: ' + from_port + ', to port: ' + to_port +
+ ', ALLOW" already exists'
+ )
+ elif 'Unable to find security group' in response['errortext']:
+ errors.invalid_security_group()
+
+ errors.invalid_paramater_value(response['errortext'])
+ else:
+ if rule_type == 'ingress':
+ rule_type = 'AuthorizeSecurityGroupIngressResponse'
+ elif rule_type == 'egress':
+ rule_type = 'AuthorizeSecurityGroupEgressResponse'
+
+ return {
+ 'template_name_or_list': 'status.xml',
+ 'response_type': rule_type,
+ 'return': 'true'
+ }
+
+
+@helpers.authentication_required
def create_security_group():
helpers.require_parameters(['GroupName', 'GroupDescription'])
response = _create_security_group_request()
@@ -99,57 +150,6 @@
@helpers.authentication_required
-def authenticate_security_group_egress():
- rule_type = 'egress'
- response = _authenticate_security_group_request(rule_type)
- return _authenticate_security_group_response(response, rule_type)
-
-
-def _authenticate_security_group_request(rule_type):
- args = _parse_security_group_request()
-
- if rule_type == 'egress':
- args['command'] = 'authorizeSecurityGroupEgress'
- elif rule_type == 'ingress':
- args['command'] = 'authorizeSecurityGroupIngress'
-
- response = requester.make_request_async(args)
-
- return response
-
-
-def _authenticate_security_group_response(response, rule_type):
- if 'errortext' in response:
- if 'Failed to authorize security group' in response['errortext']:
- cidrlist = str(helpers.get('CidrIp'))
- protocol = str(helpers.get('IpProtocol'))
- from_port = str(helpers.get('FromPort'))
- to_port = str(helpers.get('toPort'))
- raise Ec2stackError(
- '400',
- 'InvalidPermission.Duplicate',
- 'the specified rule "peer: ' + cidrlist + ', ' + protocol +
- ', from port: ' + from_port + ', to port: ' + to_port +
- ', ALLOW" already exists'
- )
- elif 'Unable to find security group' in response['errortext']:
- errors.invalid_security_group()
-
- errors.invalid_paramater_value(response['errortext'])
- else:
- if rule_type == 'ingress':
- rule_type = 'AuthorizeSecurityGroupIngressResponse'
- elif rule_type == 'egress':
- rule_type = 'AuthorizeSecurityGroupEgressResponse'
-
- return {
- 'template_name_or_list': 'status.xml',
- 'response_type': rule_type,
- 'return': 'true'
- }
-
-
-@helpers.authentication_required
def revoke_security_group_ingress():
rule_type = 'ingress'
_revoke_security_group_request(rule_type)
diff --git a/ec2stack/providers/cloudstack/volumes.py b/ec2stack/providers/cloudstack/volumes.py
index 82649fa..321fa4b 100644
--- a/ec2stack/providers/cloudstack/volumes.py
+++ b/ec2stack/providers/cloudstack/volumes.py
@@ -22,22 +22,38 @@
@helpers.authentication_required
-def describe_volumes():
- args = {'command': 'listVolumes'}
- response = cloudstack.describe_item(
- args, 'volume', errors.invalid_volume_id, 'VolumeId'
- )
-
- return _describe_volumes_response(
- response
- )
+def attach_volume():
+ helpers.require_parameters(['VolumeId', 'InstanceId', 'Device'])
+ response = _attach_volume_request()
+ return _attach_volume_response(response)
-def _describe_volumes_response(response):
+def _attach_volume_request():
+ args = {}
+
+ volume_id = helpers.get('VolumeId')
+ instance_id = helpers.get('InstanceId')
+ device = helpers.get('Device')
+
+ args['id'] = volume_id
+ args['command'] = 'attachVolume'
+ args['virtualmachineid'] = instance_id
+ args['device'] = device
+
+ response = requester.make_request_async(args)
+
+ return response
+
+
+def _attach_volume_response(response):
+ if 'errortext' in response:
+ helpers.error_to_aws(response, volume_error_to_aws)
+
+ response = response['volume']
return {
- 'template_name_or_list': 'volumes.xml',
- 'response_type': 'DescribeVolumesResponse',
- 'response': response,
+ 'template_name_or_list': 'volume_attachment.xml',
+ 'response_type': 'AttachVolumeResponse',
+ 'response': response
}
@@ -85,38 +101,50 @@
@helpers.authentication_required
-def attach_volume():
- helpers.require_parameters(['VolumeId', 'InstanceId', 'Device'])
- response = _attach_volume_request()
- return _attach_volume_response(response)
+def delete_volume():
+ helpers.require_parameters(['VolumeId'])
+ response = _delete_volume_request()
+
+ return _delete_volume_response(response)
-def _attach_volume_request():
- args = {}
+def _delete_volume_request():
+ args = {'id': helpers.get('VolumeId'), 'command': 'deleteVolume'}
- volume_id = helpers.get('VolumeId')
- instance_id = helpers.get('InstanceId')
- device = helpers.get('Device')
-
- args['id'] = volume_id
- args['command'] = 'attachVolume'
- args['virtualmachineid'] = instance_id
- args['device'] = device
-
- response = requester.make_request_async(args)
+ response = requester.make_request(args)
+ response = response['deletevolumeresponse']
return response
-def _attach_volume_response(response):
+def _delete_volume_response(response):
if 'errortext' in response:
helpers.error_to_aws(response, volume_error_to_aws)
- response = response['volume']
return {
- 'template_name_or_list': 'volume_attachment.xml',
- 'response_type': 'AttachVolumeResponse',
- 'response': response
+ 'template_name_or_list': 'status.xml',
+ 'response_type': 'DeleteVolumeResponse',
+ 'return': 'true'
+ }
+
+
+@helpers.authentication_required
+def describe_volumes():
+ args = {'command': 'listVolumes'}
+ response = cloudstack.describe_item(
+ args, 'volume', errors.invalid_volume_id, 'VolumeId'
+ )
+
+ return _describe_volumes_response(
+ response
+ )
+
+
+def _describe_volumes_response(response):
+ return {
+ 'template_name_or_list': 'volumes.xml',
+ 'response_type': 'DescribeVolumesResponse',
+ 'response': response,
}
@@ -155,31 +183,3 @@
'response_type': 'DetachVolumeResponse',
'response': response
}
-
-
-@helpers.authentication_required
-def delete_volume():
- helpers.require_parameters(['VolumeId'])
- response = _delete_volume_request()
-
- return _delete_volume_response(response)
-
-
-def _delete_volume_request():
- args = {'id': helpers.get('VolumeId'), 'command': 'deleteVolume'}
-
- response = requester.make_request(args)
- response = response['deletevolumeresponse']
-
- return response
-
-
-def _delete_volume_response(response):
- if 'errortext' in response:
- helpers.error_to_aws(response, volume_error_to_aws)
-
- return {
- 'template_name_or_list': 'status.xml',
- 'response_type': 'DeleteVolumeResponse',
- 'return': 'true'
- }
diff --git a/tests/instances_tests.py b/tests/instances_tests.py
index 37ae3c9..5f0a837 100644
--- a/tests/instances_tests.py
+++ b/tests/instances_tests.py
@@ -11,6 +11,50 @@
class InstancesTestCase(Ec2StackAppTestCase):
+ def test_describe_instance_attribute(self):
+ data = self.get_example_data()
+ data['Action'] = 'DescribeInstanceAttribute'
+ data['InstanceId'] = '43791f77-26f8-48ca-b557-3a9392f735ae'
+ data['Attribute'] = 'instanceType'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/valid_describe_instance.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'DescribeInstanceAttributeResponse' in response.data
+
+ def test_describe_invalid_instance_attribute(self):
+ data = self.get_example_data()
+ data['Action'] = 'DescribeInstanceAttribute'
+ data['InstanceId'] = '43791f77-26f8-48ca-b557-3a9392f735ae'
+ data['Attribute'] = 'invalid_attribute'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/valid_describe_instance.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidParameterValue' in response.data
+
def test_describe_instances(self):
data = self.get_example_data()
data['Action'] = 'DescribeInstances'
@@ -31,7 +75,7 @@
self.assert_ok(response)
assert 'DescribeInstancesResponse' in response.data
- def test_empty_response_describe_instances(self):
+ def test_empty_response_describe_instances(self):
data = self.get_example_data()
data['Action'] = 'DescribeInstances'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
@@ -115,16 +159,15 @@
self.assert_bad_request(response)
assert 'InvalidInstanceId.NotFound' in response.data
- def test_describe_instance_attribute(self):
+ def test_reboot_instance(self):
data = self.get_example_data()
- data['Action'] = 'DescribeInstanceAttribute'
- data['InstanceId'] = '43791f77-26f8-48ca-b557-3a9392f735ae'
- data['Attribute'] = 'instanceType'
+ data['Action'] = 'RebootInstances'
+ data['InstanceId.1'] = '076166a1-9f6e-11e3-b8df-3c075456b21a'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
get = mock.Mock()
get.return_value.text = read_file(
- 'tests/data/valid_describe_instance.json'
+ 'tests/data/valid_reboot_instance.json'
)
get.return_value.status_code = 200
@@ -135,29 +178,7 @@
)
self.assert_ok(response)
- assert 'DescribeInstanceAttributeResponse' in response.data
-
- def test_describe_invalid_instance_attribute(self):
- data = self.get_example_data()
- data['Action'] = 'DescribeInstanceAttribute'
- data['InstanceId'] = '43791f77-26f8-48ca-b557-3a9392f735ae'
- data['Attribute'] = 'invalid_attribute'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/valid_describe_instance.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidParameterValue' in response.data
+ assert 'RebootInstancesResponse' in response.data
def test_start_instance(self):
data = self.get_example_data()
@@ -249,26 +270,6 @@
self.assert_ok(response)
assert 'TerminateInstancesResponse' in response.data
- def test_reboot_instance(self):
- data = self.get_example_data()
- data['Action'] = 'RebootInstances'
- data['InstanceId.1'] = '076166a1-9f6e-11e3-b8df-3c075456b21a'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/valid_reboot_instance.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'RebootInstancesResponse' in response.data
# TODO revist this at a later point
# def test_run_instance(self):
diff --git a/tests/security_group_tests.py b/tests/security_group_tests.py
index 0975af8..f2b0853 100644
--- a/tests/security_group_tests.py
+++ b/tests/security_group_tests.py
@@ -11,6 +11,180 @@
class SecurityGroupTestCase(Ec2StackAppTestCase):
+ def test_authorize_security_group_ingress_by_name(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupIngress'
+ data['GroupName'] = 'test'
+ data['FromPort'] = '1000'
+ data['ToPort'] = '1024'
+ data['IpProtocol'] = 'tcp'
+ data['CidrIp'] = '0.0.0.0/0'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/authorize_security_group_ingress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'AuthorizeSecurityGroupIngressResponse' in response.data
+
+ def test_authorize_security_group_ingress_by_id(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupIngress'
+ data['GroupId'] = '7ae5b92f-3a0d-4977-bc33-f1aaecee5776'
+ data['FromPort'] = '-1'
+ data['ToPort'] = '-1'
+ data['IpProtocol'] = 'icmp'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/authorize_security_group_ingress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'AuthorizeSecurityGroupIngressResponse' in response.data
+
+ def test_authorize_security_group_egress_by_name(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupEgress'
+ data['GroupName'] = 'test'
+ data['FromPort'] = '1000'
+ data['ToPort'] = '1024'
+ data['IpProtocol'] = 'tcp'
+ data['CidrIp'] = '0.0.0.0/0'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/authorize_security_group_egress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'AuthorizeSecurityGroupEgressResponse' in response.data
+
+ def test_authorize_security_group_egress_by_id(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupEgress'
+ data['GroupId'] = '7ae5b92f-3a0d-4977-bc33-f1aaecee5776'
+ data['FromPort'] = '-1'
+ data['ToPort'] = '-1'
+ data['IpProtocol'] = 'icmp'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/authorize_security_group_egress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'AuthorizeSecurityGroupEgressResponse' in response.data
+
+ def test_duplicate_authorize_security_group(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupEgress'
+ data['GroupName'] = 'test'
+ data['FromPort'] = '1000'
+ data['ToPort'] = '1024'
+ data['IpProtocol'] = 'tcp'
+ data['CidrIp'] = '0.0.0.0/0'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/duplicate_authorize_security_group_egress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidPermission.Duplicate' in response.data
+
+ def test_invalid_rule_authorize_security_group(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupEgress'
+ data['GroupName'] = 'test'
+ data['FromPort'] = '1000'
+ data['ToPort'] = '99999'
+ data['IpProtocol'] = 'tcp'
+ data['CidrIp'] = '0.0.0.0/24'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/invalid_authorize_security_group_egress.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidParameterValue' in response.data
+
+ def test_invalid_security_group_authorize_security_group(self):
+ data = self.get_example_data()
+ data['Action'] = 'AuthorizeSecurityGroupEgress'
+ data['GroupName'] = 'invalid-security-group'
+ data['FromPort'] = '1000'
+ data['ToPort'] = '1024'
+ data['IpProtocol'] = 'tcp'
+ data['CidrIp'] = '0.0.0.0/24'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/'
+ 'invalid_security_group_authorize_security_group.json'
+ )
+ get.return_value.status_code = 431
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidGroup.NotFound' in response.data
+
def test_create_security_group(self):
data = self.get_example_data()
data['Action'] = 'CreateSecurityGroup'
@@ -258,180 +432,6 @@
self.assert_bad_request(response)
assert 'InvalidGroup.NotFound' in response.data
- def test_authorize_security_group_ingress_by_name(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupIngress'
- data['GroupName'] = 'test'
- data['FromPort'] = '1000'
- data['ToPort'] = '1024'
- data['IpProtocol'] = 'tcp'
- data['CidrIp'] = '0.0.0.0/0'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/authorize_security_group_ingress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'AuthorizeSecurityGroupIngressResponse' in response.data
-
- def test_authorize_security_group_ingress_by_id(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupIngress'
- data['GroupId'] = '7ae5b92f-3a0d-4977-bc33-f1aaecee5776'
- data['FromPort'] = '-1'
- data['ToPort'] = '-1'
- data['IpProtocol'] = 'icmp'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/authorize_security_group_ingress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'AuthorizeSecurityGroupIngressResponse' in response.data
-
- def test_authorize_security_group_egress_by_name(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupEgress'
- data['GroupName'] = 'test'
- data['FromPort'] = '1000'
- data['ToPort'] = '1024'
- data['IpProtocol'] = 'tcp'
- data['CidrIp'] = '0.0.0.0/0'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/authorize_security_group_egress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'AuthorizeSecurityGroupEgressResponse' in response.data
-
- def test_authorize_security_group_egress_by_id(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupEgress'
- data['GroupId'] = '7ae5b92f-3a0d-4977-bc33-f1aaecee5776'
- data['FromPort'] = '-1'
- data['ToPort'] = '-1'
- data['IpProtocol'] = 'icmp'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/authorize_security_group_egress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'AuthorizeSecurityGroupEgressResponse' in response.data
-
- def test_duplicate_authorize_security_group(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupEgress'
- data['GroupName'] = 'test'
- data['FromPort'] = '1000'
- data['ToPort'] = '1024'
- data['IpProtocol'] = 'tcp'
- data['CidrIp'] = '0.0.0.0/0'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/duplicate_authorize_security_group_egress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidPermission.Duplicate' in response.data
-
- def test_invalid_rule_authorize_security_group(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupEgress'
- data['GroupName'] = 'test'
- data['FromPort'] = '1000'
- data['ToPort'] = '99999'
- data['IpProtocol'] = 'tcp'
- data['CidrIp'] = '0.0.0.0/24'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/invalid_authorize_security_group_egress.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidParameterValue' in response.data
-
- def test_invalid_security_group_authorize_security_group(self):
- data = self.get_example_data()
- data['Action'] = 'AuthorizeSecurityGroupEgress'
- data['GroupName'] = 'invalid-security-group'
- data['FromPort'] = '1000'
- data['ToPort'] = '1024'
- data['IpProtocol'] = 'tcp'
- data['CidrIp'] = '0.0.0.0/24'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/'
- 'invalid_security_group_authorize_security_group.json'
- )
- get.return_value.status_code = 431
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidGroup.NotFound' in response.data
-
def test_revoke_security_group_ingress(self):
data = self.get_example_data()
data['Action'] = 'RevokeSecurityGroupIngress'
diff --git a/tests/volume_tests.py b/tests/volume_tests.py
index c94da94..ebd77c0 100644
--- a/tests/volume_tests.py
+++ b/tests/volume_tests.py
@@ -11,14 +11,17 @@
class VolumeTestCase(Ec2StackAppTestCase):
- def test_describe_volumes(self):
+ def test_attach_volume(self):
data = self.get_example_data()
- data['Action'] = 'DescribeVolumes'
+ data['Action'] = 'AttachVolume'
+ data['VolumeId'] = '0896ccff-1b7a-4c17-8390-02a602de2efe'
+ data['InstanceId'] = 'ba918d10-f83a-459d-a5b9-330793c3c6a3'
+ data['Device'] = '/dev/sha'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
get = mock.Mock()
get.return_value.text = read_file(
- 'tests/data/valid_describe_key_pairs.json'
+ 'tests/data/valid_attach_volume.json'
)
get.return_value.status_code = 200
@@ -29,39 +32,19 @@
)
self.assert_ok(response)
- assert 'DescribeVolumesResponse' in response.data
+ assert 'AttachVolumeResponse' in response.data
- def test_describe_volume_by_id(self):
+ def test_attach_volume_invalid_volume(self):
data = self.get_example_data()
- data['Action'] = 'DescribeVolumes'
- data['VolumeId.1'] = 'de2d8297-eaaf-4e81-8ffe-97f37ddbbde5'
+ data['Action'] = 'AttachVolume'
+ data['VolumeId'] = '0896ccff-1b7a-4c17-8390-02a602de2efe'
+ data['InstanceId'] = 'ba918d10-f83a-459d-a5b9-330793c3c6a3'
+ data['Device'] = '/dev/sha'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
get = mock.Mock()
get.return_value.text = read_file(
- 'tests/data/valid_describe_volumes.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'DescribeVolumesResponse' in response.data
- assert 'de2d8297-eaaf-4e81-8ffe-97f37ddbbde5' in response.data
-
- def test_invalid_describe_volume_by_id(self):
- data = self.get_example_data()
- data['Action'] = 'DescribeVolumes'
- data['VolumeId.1'] = 'invalid-volume-id'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/valid_describe_volumes.json'
+ 'tests/data/invalid_attach_volume.json'
)
get.return_value.status_code = 200
@@ -72,28 +55,7 @@
)
self.assert_bad_request(response)
- assert 'InvalidVolume.NotFound' in response.data
-
- def test_empty_response_describe_volume_by_id(self):
- data = self.get_example_data()
- data['Action'] = 'DescribeVolumes'
- data['VolumeId.1'] = 'invalid-volume-id'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get = mock.Mock()
- get.return_value.text = read_file(
- 'tests/data/empty_describe_volumes.json'
- )
- get.return_value.status_code = 200
-
- with mock.patch('requests.get', get):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidVolume.NotFound' in response.data
+ assert 'InvalidVolume.Attached' in response.data
def test_create_volume_by_size(self):
data = self.get_example_data()
@@ -241,17 +203,56 @@
self.assert_bad_request(response)
assert 'InvalidDiskOffering.NotFound' in response.data
- def test_attach_volume(self):
+ def test_delete_volume(self):
data = self.get_example_data()
- data['Action'] = 'AttachVolume'
- data['VolumeId'] = '0896ccff-1b7a-4c17-8390-02a602de2efe'
- data['InstanceId'] = 'ba918d10-f83a-459d-a5b9-330793c3c6a3'
- data['Device'] = '/dev/sha'
+ data['Action'] = 'DeleteVolume'
+ data['VolumeId'] = 'volumeid'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get_request = mock.Mock()
+ get_request.return_value.text = read_file(
+ 'tests/data/delete_volume_response.json'
+ )
+ get_request.return_value.status_code = 200
+
+ with mock.patch('requests.get', get_request):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'DeleteVolumeResponse' in response.data
+
+ def test_delete_volume_invalid_volume_id(self):
+ data = self.get_example_data()
+ data['Action'] = 'DeleteVolume'
+ data['VolumeId'] = 'volumeid'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get_request = mock.Mock()
+ get_request.return_value.text = read_file(
+ 'tests/data/invalid_volume_id.json'
+ )
+ get_request.return_value.status_code = 200
+
+ with mock.patch('requests.get', get_request):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidVolume.NotFound' in response.data
+
+ def test_describe_volumes(self):
+ data = self.get_example_data()
+ data['Action'] = 'DescribeVolumes'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
get = mock.Mock()
get.return_value.text = read_file(
- 'tests/data/valid_attach_volume.json'
+ 'tests/data/valid_describe_key_pairs.json'
)
get.return_value.status_code = 200
@@ -262,19 +263,39 @@
)
self.assert_ok(response)
- assert 'AttachVolumeResponse' in response.data
+ assert 'DescribeVolumesResponse' in response.data
- def test_attach_volume_invalid_volume(self):
+ def test_describe_volume_by_id(self):
data = self.get_example_data()
- data['Action'] = 'AttachVolume'
- data['VolumeId'] = '0896ccff-1b7a-4c17-8390-02a602de2efe'
- data['InstanceId'] = 'ba918d10-f83a-459d-a5b9-330793c3c6a3'
- data['Device'] = '/dev/sha'
+ data['Action'] = 'DescribeVolumes'
+ data['VolumeId.1'] = 'de2d8297-eaaf-4e81-8ffe-97f37ddbbde5'
data['Signature'] = generate_signature(data, 'POST', 'localhost')
get = mock.Mock()
get.return_value.text = read_file(
- 'tests/data/invalid_attach_volume.json'
+ 'tests/data/valid_describe_volumes.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_ok(response)
+ assert 'DescribeVolumesResponse' in response.data
+ assert 'de2d8297-eaaf-4e81-8ffe-97f37ddbbde5' in response.data
+
+ def test_invalid_describe_volume_by_id(self):
+ data = self.get_example_data()
+ data['Action'] = 'DescribeVolumes'
+ data['VolumeId.1'] = 'invalid-volume-id'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/valid_describe_volumes.json'
)
get.return_value.status_code = 200
@@ -285,7 +306,28 @@
)
self.assert_bad_request(response)
- assert 'InvalidVolume.Attached' in response.data
+ assert 'InvalidVolume.NotFound' in response.data
+
+ def test_empty_response_describe_volume_by_id(self):
+ data = self.get_example_data()
+ data['Action'] = 'DescribeVolumes'
+ data['VolumeId.1'] = 'invalid-volume-id'
+ data['Signature'] = generate_signature(data, 'POST', 'localhost')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/empty_describe_volumes.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'InvalidVolume.NotFound' in response.data
def test_detach_volume(self):
data = self.get_example_data()
@@ -372,45 +414,3 @@
self.assert_bad_request(response)
assert 'InvalidVolume.Detached' in response.data
-
- def test_delete_volume(self):
- data = self.get_example_data()
- data['Action'] = 'DeleteVolume'
- data['VolumeId'] = 'volumeid'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get_request = mock.Mock()
- get_request.return_value.text = read_file(
- 'tests/data/delete_volume_response.json'
- )
- get_request.return_value.status_code = 200
-
- with mock.patch('requests.get', get_request):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_ok(response)
- assert 'DeleteVolumeResponse' in response.data
-
- def test_delete_volume_invalid_volume_id(self):
- data = self.get_example_data()
- data['Action'] = 'DeleteVolume'
- data['VolumeId'] = 'volumeid'
- data['Signature'] = generate_signature(data, 'POST', 'localhost')
-
- get_request = mock.Mock()
- get_request.return_value.text = read_file(
- 'tests/data/invalid_volume_id.json'
- )
- get_request.return_value.status_code = 200
-
- with mock.patch('requests.get', get_request):
- response = self.post(
- '/',
- data=data
- )
-
- self.assert_bad_request(response)
- assert 'InvalidVolume.NotFound' in response.data