Merge "Add API tests for PATCH service endpoint"
This commit is contained in:
24
tests/api/services/data_patch_service.json
Normal file
24
tests/api/services/data_patch_service.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"update_domain_list": {
|
||||
"domains": [{"domain": "woooznewwebsite.com"},
|
||||
{"domain": "woooznewblog.mywebsite.com"}]
|
||||
},
|
||||
"update_origin_list": {
|
||||
"origins": [{"origin": "www.wooozneworigin.com",
|
||||
"port": 443, "ssl": false}]
|
||||
},
|
||||
"update_caching_list": {
|
||||
"caching": [{"newname": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
},
|
||||
"update_multiple_values": {
|
||||
"domains": [{"domain": "wooozymynewwebsite.com"},
|
||||
{"domain": "wooozynewblog.mywebsite.com"}],
|
||||
"origins": [{"origin": "www.wooozyneworigin.com",
|
||||
"port": 443,
|
||||
"ssl": false}]
|
||||
}
|
||||
}
|
||||
24
tests/api/services/data_patch_service_failing_tests.json
Normal file
24
tests/api/services/data_patch_service_failing_tests.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"update_name": {
|
||||
"name": "my_new_name"
|
||||
},
|
||||
"update_domain_list": {
|
||||
"domain_list": [{"domain": "mynewwebsite.com"},
|
||||
{"domain": "newblog.mywebsite.com"}]
|
||||
},
|
||||
"update_origin_list": {
|
||||
"origin_list": [{"origin": "www.neworigin.com",
|
||||
"port": 443,
|
||||
"ssl": false}]
|
||||
},
|
||||
"update_flavorRef": {
|
||||
"flavorRef": "premium"
|
||||
},
|
||||
"update_caching_list": {
|
||||
"caching_list": [{"newname": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
}
|
||||
}
|
||||
89
tests/api/services/data_patch_service_negative.json
Normal file
89
tests/api/services/data_patch_service_negative.json
Normal file
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"empty_domain_list": {
|
||||
"domains": []
|
||||
},
|
||||
"empty_list": {},
|
||||
"too_short_name": {
|
||||
"service_name": "ab"
|
||||
},
|
||||
"too_long_name": {
|
||||
"service_name": "too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name_too_long_name"
|
||||
},
|
||||
"empty_domain_list": {
|
||||
"service_name": "empty_domain_list",
|
||||
"domains": [],
|
||||
"origins": [{"origin": "mywebsite1.com",
|
||||
"port": 443,
|
||||
"ssl": false}],
|
||||
"flavor_ref": "standard",
|
||||
"caching": [{"name": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
},
|
||||
"invalid_domain_value": {
|
||||
"domains": [{"domain": "ftp://BOOOOOOM"},
|
||||
{"domain": "abc://BAAAAAAM"}]
|
||||
},
|
||||
"empty_origin_list": {
|
||||
"origins": []
|
||||
},
|
||||
"invalid_origin_value": {
|
||||
"origins": [{"origin": "^%}invalid_origin_value",
|
||||
"port": 443,
|
||||
"ssl": false}]
|
||||
},
|
||||
"non_numeric_origin_port": {
|
||||
"service_name": "non_numeric_origin_port",
|
||||
"domains": [{"domain": "mywebsite.com"},
|
||||
{"domain": "blog.mywebsite.com"}],
|
||||
"origins": [{"origin": "invalid_origin_value",
|
||||
"port": "fourfourthree",
|
||||
"ssl": false}],
|
||||
"flavor_ref": "standard",
|
||||
"caching_list": [{"name": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
},
|
||||
"non_boolean_origin_ssl": {
|
||||
"service_name": "non_boolean_origin_ssl",
|
||||
"domains": [{"domain": "mywebsite.com"},
|
||||
{"domain": "blog.mywebsite.com"}],
|
||||
"origins": [{"origin": "invalid_origin_value",
|
||||
"port": 443,
|
||||
"ssl": "Arggg"}],
|
||||
"flavor_ref": "standard",
|
||||
"caching": [{"name": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
},
|
||||
"invalid_flavor": {
|
||||
"service_name": "invalid_flavor",
|
||||
"domains": [{"domain": "mywebsite.com"},
|
||||
{"domain": "blog.mywebsite.com"}],
|
||||
"origins": [{"origin": "mywebsite1.com",
|
||||
"port": 443,
|
||||
"ssl": false}],
|
||||
"flavor_ref": "non_exist",
|
||||
"caching": [{"name": "default", "ttl": 3600},
|
||||
{"name": "home",
|
||||
"ttl": 1200,
|
||||
"rules": [{"name" : "index",
|
||||
"request_url" : "/index.htm"}]}]
|
||||
},
|
||||
"caching_list_no_name": {
|
||||
"service_name": "caching_list_no_name",
|
||||
"domains": [{"domain": "mywebsite.com"},
|
||||
{"domain": "blog.mywebsite.com"}],
|
||||
"origins": [{"origin": "mywebsite1.com",
|
||||
"port": 443,
|
||||
"ssl": false}],
|
||||
"flavor_ref": "standard",
|
||||
"caching": [{"ttl": 3600}]
|
||||
}
|
||||
}
|
||||
@@ -207,10 +207,11 @@ class TestServiceActions(base.TestBase):
|
||||
def setUp(self):
|
||||
super(TestServiceActions, self).setUp()
|
||||
self.service_name = str(uuid.uuid1())
|
||||
self.domain_list = [{"domain": "mywebsite.com"},
|
||||
{"domain": "blog.mywebsite.com"}]
|
||||
domain = str(uuid.uuid1()) + '.com'
|
||||
self.domain_list = [{"domain": domain}]
|
||||
|
||||
self.origin_list = [{"origin": "mywebsite.com",
|
||||
origin = str(uuid.uuid1()) + '.com'
|
||||
self.origin_list = [{"origin": origin,
|
||||
"port": 443, "ssl": False}]
|
||||
|
||||
self.caching_list = [{"name": "default", "ttl": 3600},
|
||||
@@ -223,6 +224,64 @@ class TestServiceActions(base.TestBase):
|
||||
origin_list=self.origin_list,
|
||||
caching_list=self.caching_list,
|
||||
flavor_ref='standard')
|
||||
self.client.wait_for_service_status(
|
||||
service_name=self.service_name,
|
||||
status='deployed',
|
||||
retry_interval=self.test_config.status_check_retry_interval,
|
||||
retry_timeout=self.test_config.status_check_retry_timeout)
|
||||
|
||||
@ddt.file_data('data_patch_service.json')
|
||||
def test_patch_service(self, test_data):
|
||||
'''Implemented - PATCH Origins & Domains.'''
|
||||
|
||||
resp = self.client.patch_service(service_name=self.service_name,
|
||||
request_body=test_data)
|
||||
|
||||
self.assertEqual(resp.status_code, 202)
|
||||
|
||||
location = resp.headers['location']
|
||||
resp = self.client.get_service(location=location)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
body = resp.json()
|
||||
self.assertEqual(body['status'], 'updating')
|
||||
self.client.wait_for_service_status(
|
||||
service_name=self.service_name,
|
||||
status='deployed',
|
||||
retry_interval=self.test_config.status_check_retry_interval,
|
||||
retry_timeout=self.test_config.status_check_retry_timeout)
|
||||
|
||||
resp = self.client.get_service(service_name=self.service_name)
|
||||
body = resp.json()
|
||||
|
||||
if 'domain_list' in test_data:
|
||||
self.assertEqual(sorted(test_data['domain_list']),
|
||||
sorted(body['domains']))
|
||||
|
||||
if 'origin_list' in test_data:
|
||||
self.assertEqual(sorted(test_data['origin_list']),
|
||||
sorted(body['origins']))
|
||||
# TODO(malini): Uncomment after caching is implemented
|
||||
# if 'caching_list' in test_data:
|
||||
# self.assertEqual(sorted(test_data['caching_list']),
|
||||
# sorted(body['caching']))
|
||||
|
||||
@ddt.file_data('data_patch_service_negative.json')
|
||||
def test_patch_service_HTTP_400(self, test_data):
|
||||
|
||||
resp = self.client.patch_service(service_name=self.service_name,
|
||||
request_body=test_data)
|
||||
self.assertEqual(resp.status_code, 400)
|
||||
|
||||
resp = self.client.get_service(service_name=self.service_name)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
body = resp.json()
|
||||
self.assertEqual(body['status'], 'deployed')
|
||||
self.assertEqual(sorted(self.domain_list), sorted(body['domains']))
|
||||
self.assertEqual(sorted(self.origin_list), sorted(body['origins']))
|
||||
# TODO(malini): Uncomment below after caching is implemented.
|
||||
# self.assertEqual(sorted(self.caching_list), sorted(body['caching']))
|
||||
|
||||
def test_get_service(self):
|
||||
|
||||
@@ -257,8 +316,7 @@ class TestServiceActions(base.TestBase):
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
|
||||
body = resp.json()
|
||||
# self.assertEqual(body['status'], 'delete_in_progress')
|
||||
self.assertEqual(body['status'], 'deployed')
|
||||
self.assertEqual(body['status'], 'delete_in_progress')
|
||||
|
||||
# TODO(malini): find a better solution
|
||||
# As is, the servvice is still available in the DB till deleted from
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
# limitations under the License.
|
||||
|
||||
import json
|
||||
import time
|
||||
|
||||
from cafe.engine.http import client
|
||||
|
||||
@@ -92,7 +93,20 @@ class PoppyClient(client.AutoMarshallingHTTPClient):
|
||||
return self.request('POST', url, request_entity=request_object,
|
||||
requestslib_kwargs=requestslib_kwargs)
|
||||
|
||||
def get_service(self, service_name):
|
||||
def patch_service(self, service_name=None, request_body=None,
|
||||
requestslib_kwargs=None):
|
||||
"""Updates Service
|
||||
|
||||
:return: Response code 202 with location header
|
||||
PATCH
|
||||
services/{service_name}
|
||||
"""
|
||||
url = '{0}/v1.0/services/{1}'.format(self.url, service_name)
|
||||
request_object = requests.PatchService(request_body=request_body)
|
||||
return self.request('PATCH', url, request_entity=request_object,
|
||||
requestslib_kwargs=requestslib_kwargs)
|
||||
|
||||
def get_service(self, location=None, service_name=None):
|
||||
"""Get Service
|
||||
|
||||
:return: Response Object containing response code 200 and body with
|
||||
@@ -101,7 +115,10 @@ class PoppyClient(client.AutoMarshallingHTTPClient):
|
||||
services/{service_name}
|
||||
"""
|
||||
|
||||
url = '{0}/v1.0/services/{1}'.format(self.url, service_name)
|
||||
if location:
|
||||
url = location
|
||||
else:
|
||||
url = '{0}/v1.0/services/{1}'.format(self.url, service_name)
|
||||
return self.request('GET', url)
|
||||
|
||||
def list_services(self, param=None):
|
||||
@@ -195,3 +212,20 @@ class PoppyClient(client.AutoMarshallingHTTPClient):
|
||||
url = u'{0}/v1.0/flavors/{1}'.format(self.url, flavor_id)
|
||||
|
||||
return self.request('DELETE', url)
|
||||
|
||||
def wait_for_service_status(self, service_name, status, retry_interval=2,
|
||||
retry_timeout=30):
|
||||
"""Waits for a service to reach a given status."""
|
||||
current_status = ''
|
||||
start_time = int(time.time())
|
||||
stop_time = start_time + retry_timeout
|
||||
while current_status != status:
|
||||
time.sleep(retry_interval)
|
||||
service = self.get_service(service_name=service_name)
|
||||
body = service.json()
|
||||
current_status = body['status']
|
||||
if (current_status == status):
|
||||
return
|
||||
current_time = int(time.time())
|
||||
if current_time > stop_time:
|
||||
return
|
||||
|
||||
@@ -42,6 +42,16 @@ class TestConfig(data_interfaces.ConfigSectionInterface):
|
||||
"""Boolean value indicating if tests verify provider side details."""
|
||||
return self.get_boolean('provider_validation')
|
||||
|
||||
@property
|
||||
def status_check_retry_interval(self):
|
||||
"""Int value to set retry intervals for status check."""
|
||||
return int(self.get('status_check_retry_interval'))
|
||||
|
||||
@property
|
||||
def status_check_retry_timeout(self):
|
||||
"""Int value to set timeout for status check."""
|
||||
return int(self.get('status_check_retry_timeout'))
|
||||
|
||||
|
||||
class AuthConfig(data_interfaces.ConfigSectionInterface):
|
||||
"""Defines the auth config values."""
|
||||
|
||||
@@ -40,6 +40,19 @@ class CreateService(base.AutoMarshallingModel):
|
||||
return json.dumps(create_service_request)
|
||||
|
||||
|
||||
class PatchService(base.AutoMarshallingModel):
|
||||
"""Marshalling for Patch Service requests."""
|
||||
|
||||
def __init__(self, request_body=None):
|
||||
super(PatchService, self).__init__()
|
||||
|
||||
self.request_body = request_body
|
||||
|
||||
def _obj_to_json(self):
|
||||
patch_service_request = self.request_body
|
||||
return json.dumps(patch_service_request)
|
||||
|
||||
|
||||
class CreateFlavor(base.AutoMarshallingModel):
|
||||
"""Marshalling for Create Flavor requests."""
|
||||
|
||||
|
||||
@@ -14,6 +14,8 @@ flavor = {"flavor1": ["provider_1"], "flavor2": ["provider_2", "provider_3"]}
|
||||
|
||||
[test_configuration]
|
||||
provider_validation=False
|
||||
status_check_retry_interval=2
|
||||
status_check_retry_timeout=30
|
||||
|
||||
[provider_1]
|
||||
api_key=INSERT_YOUR_API_KEY
|
||||
|
||||
Reference in New Issue
Block a user