Add tests for tag actions, catch tag related errors
diff --git a/ec2stack/errors.py b/ec2stack/errors.py
index 5ccf38f..bf5040a 100644
--- a/ec2stack/errors.py
+++ b/ec2stack/errors.py
@@ -150,6 +150,19 @@
)
+def invalid_resource_id():
+ """
+ Resource with this ID does not exist.
+
+ @raise Ec2stackError: Defining a bad request and message.
+ """
+ raise Ec2stackError(
+ '400',
+ 'InvalidID',
+ 'The specified ID for the resource you are trying to tag is not valid.'
+ )
+
+
def duplicate_security_group():
"""
Duplicate Security Group.
diff --git a/ec2stack/providers/cloudstack/requester.py b/ec2stack/providers/cloudstack/requester.py
index 0ff4a9a..147b958 100644
--- a/ec2stack/providers/cloudstack/requester.py
+++ b/ec2stack/providers/cloudstack/requester.py
@@ -32,12 +32,8 @@
request_url = _generate_request_url(args, secretkey)
- print request_url
-
response = requests.get(request_url)
- print response.text
-
if response.status_code in [401, 432]:
abort(400)
else:
diff --git a/ec2stack/providers/cloudstack/tags.py b/ec2stack/providers/cloudstack/tags.py
index deeae88..dedea27 100644
--- a/ec2stack/providers/cloudstack/tags.py
+++ b/ec2stack/providers/cloudstack/tags.py
@@ -17,8 +17,8 @@
@return: Response.
"""
- _create_tag_request()
- return _create_tag_response()
+ response = _create_tag_request()
+ return _create_tag_response(response)
def _create_tag_request():
@@ -51,12 +51,16 @@
return response
-def _create_tag_response():
+def _create_tag_response(response):
"""
Generates a response for a create tag request.
@return: Response.
"""
+ if 'errortext' in response:
+ if 'Unable to find resource by id' in response['errortext']:
+ errors.invalid_resource_id()
+
return {
'template_name_or_list': 'status.xml',
'response_type': 'CreateTagsResponse',
@@ -71,8 +75,8 @@
@return: Response.
"""
- _delete_tag_request()
- return _delete_tag_response()
+ response = _delete_tag_request()
+ return _delete_tag_response(response)
def _delete_tag_request():
@@ -102,12 +106,16 @@
return response
-def _delete_tag_response():
+def _delete_tag_response(response):
"""
Generates a response for a delete tag request.
@return: Response.
"""
+ if 'errortext' in response:
+ if 'Unable to find resource by id' in response['errortext']:
+ errors.invalid_resource_id()
+
return {
'template_name_or_list': 'status.xml',
'response_type': 'DeleteTagsResponse',
diff --git a/tests/data/invalid_create_tag.json b/tests/data/invalid_create_tag.json
new file mode 100644
index 0000000..d0defb5
--- /dev/null
+++ b/tests/data/invalid_create_tag.json
@@ -0,0 +1,17 @@
+{
+ "queryasyncjobresultresponse": {
+ "jobprocstatus": 0,
+ "created": "2014-06-01T13:43:16+0200",
+ "cmd": "org.apache.cloudstack.api.command.user.tag.CreateTagsCmd",
+ "userid": "26a772da-dc25-4f2b-b0f1-e095e3717a30",
+ "jobstatus": 2,
+ "jobid": "3cca108f-53df-4a57-8975-3caf29e9d313",
+ "jobresultcode": 530,
+ "jobresulttype": "object",
+ "jobresult": {
+ "errorcode": 530,
+ "errortext": "Unable to find resource by id a0ae3a53-1f4d-42d3-bbb8-7227bb0e0d and type UserVm"
+ },
+ "accountid": "ddbdf378-e8d9-47e0-964b-661d0d8414b8"
+ }
+}
diff --git a/tests/data/invalid_delete_tag.json b/tests/data/invalid_delete_tag.json
new file mode 100644
index 0000000..ba015af
--- /dev/null
+++ b/tests/data/invalid_delete_tag.json
@@ -0,0 +1,17 @@
+{
+ "queryasyncjobresultresponse": {
+ "jobprocstatus": 0,
+ "created": "2014-06-01T13:43:16+0200",
+ "cmd": "org.apache.cloudstack.api.command.user.tag.DeleteTagsCmd",
+ "userid": "26a772da-dc25-4f2b-b0f1-e095e3717a30",
+ "jobstatus": 2,
+ "jobid": "3cca108f-53df-4a57-8975-3caf29e9d313",
+ "jobresultcode": 530,
+ "jobresulttype": "object",
+ "jobresult": {
+ "errorcode": 530,
+ "errortext": "Unable to find resource by id a0ae3a53-1f4d-42d3-bbb8-7227bb0e0d and type UserVm"
+ },
+ "accountid": "ddbdf378-e8d9-47e0-964b-661d0d8414b8"
+ }
+}
diff --git a/tests/tags_tests.py b/tests/tags_tests.py
index 3ab6568..10f4fad 100644
--- a/tests/tags_tests.py
+++ b/tests/tags_tests.py
@@ -61,6 +61,31 @@
self.assert_bad_request(response)
assert ' not found in configuration' in response.data
+ def test_create_tag_resource_id_not_found(self):
+ data = self.get_example_data()
+ data['Action'] = 'CreateTags'
+ data['Tag.1.Key'] = 'examplekey'
+ data['Tag.1.value'] = 'examplevalue'
+ data['ResourceId.1'] = 'exampleresourceid'
+
+
+ data['Signature'] = generate_signature(data, 'POST', 'localhost', '/')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/invalid_create_tag.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ self.assert_bad_request(response)
+ assert 'The specified ID for the resource you are trying to tag is not valid.' in response.data
+
def test_delete_tag(self):
data = self.get_example_data()
data['Action'] = 'DeleteTags'
@@ -109,6 +134,32 @@
self.assert_bad_request(response)
assert ' not found in configuration' in response.data
+ def test_delete_tag_resource_id_not_found(self):
+ data = self.get_example_data()
+ data['Action'] = 'DeleteTags'
+ data['Tag.1.Key'] = 'examplekey'
+ data['ResourceId.1'] = 'exampleresourceid'
+
+
+ data['Signature'] = generate_signature(data, 'POST', 'localhost', '/')
+
+ get = mock.Mock()
+ get.return_value.text = read_file(
+ 'tests/data/invalid_delete_tag.json'
+ )
+ get.return_value.status_code = 200
+
+ with mock.patch('requests.get', get):
+ response = self.post(
+ '/',
+ data=data
+ )
+
+ print response.data
+
+ self.assert_bad_request(response)
+ assert 'The specified ID for the resource you are trying to tag is not valid.' in response.data
+
def test_delete_keypair(self):
data = self.get_example_data()
data['Action'] = 'DeleteKeyPair'