184 lines
7.1 KiB
Python
184 lines
7.1 KiB
Python
# Copyright (c) 2014 Rackspace, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import random
|
|
import string
|
|
import uuid
|
|
|
|
from cafe.drivers.unittest import fixtures
|
|
import jsonschema
|
|
|
|
from tests.api.utils import client
|
|
from tests.api.utils import config
|
|
|
|
|
|
class TestBase(fixtures.BaseTestFixture):
|
|
"""Child class of fixtures.BaseTestFixture for testing CDN.
|
|
|
|
Inherit from this and write your test methods. If the child class defines
|
|
a prepare(self) method, this method will be called before executing each
|
|
test method.
|
|
"""
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
|
|
super(TestBase, cls).setUpClass()
|
|
|
|
import requests.packages.urllib3
|
|
requests.packages.urllib3.disable_warnings()
|
|
|
|
cls.auth_config = config.AuthConfig()
|
|
if cls.auth_config.auth_enabled:
|
|
cls.auth_client = client.AuthClient()
|
|
auth_token, cls.user_project_id = \
|
|
cls.auth_client.authenticate_user(
|
|
cls.auth_config.base_url,
|
|
cls.auth_config.user_name,
|
|
cls.auth_config.api_key)
|
|
else:
|
|
auth_token = str(uuid.uuid4())
|
|
cls.user_project_id = str(uuid.uuid4())
|
|
|
|
cls.test_config = config.TestConfig()
|
|
|
|
cls.config = config.PoppyConfig()
|
|
if cls.test_config.project_id_in_url:
|
|
cls.url = cls.config.base_url + '/v1.0/' + cls.user_project_id
|
|
else:
|
|
cls.url = cls.config.base_url + '/v1.0'
|
|
|
|
cls.client = client.PoppyClient(cls.url, auth_token,
|
|
cls.user_project_id,
|
|
serialize_format='json',
|
|
deserialize_format='json')
|
|
|
|
if cls.auth_config.multi_user:
|
|
alt_auth_token, alt_project_id = cls.auth_client.authenticate_user(
|
|
cls.auth_config.base_url,
|
|
cls.auth_config.alt_user_name,
|
|
cls.auth_config.alt_api_key)
|
|
if cls.test_config.project_id_in_url:
|
|
alt_url = cls.config.base_url + '/v1.0/' + alt_project_id
|
|
else:
|
|
alt_url = cls.config.base_url + '/v1.0'
|
|
|
|
cls.alt_user_client = client.PoppyClient(
|
|
alt_url, alt_auth_token,
|
|
alt_project_id,
|
|
serialize_format='json',
|
|
deserialize_format='json')
|
|
|
|
if cls.test_config.run_operator_tests:
|
|
operator_auth_token, operator_project_id = \
|
|
cls.auth_client.authenticate_user(
|
|
cls.auth_config.base_url,
|
|
cls.auth_config.operator_user_name,
|
|
cls.auth_config.operator_api_key)
|
|
if cls.test_config.project_id_in_url:
|
|
cls.operator_url = cls.config.base_url + '/v1.0/' + \
|
|
operator_project_id
|
|
else:
|
|
cls.operator_url = cls.config.base_url + '/v1.0'
|
|
cls.operator_client = client.PoppyClient(
|
|
cls.operator_url, operator_auth_token, operator_project_id,
|
|
serialize_format='json',
|
|
deserialize_format='json')
|
|
|
|
cls.dns_config = config.DNSConfig()
|
|
cls.dns_client = client.DNSClient(cls.dns_config.dns_username,
|
|
cls.dns_config.dns_api_key)
|
|
|
|
cls.akamai_config = config.AkamaiConfig()
|
|
|
|
def generate_random_string(self, prefix='API-Tests', length=12):
|
|
"""Generates a random string of given prefix & length"""
|
|
random_string = ''.join(random.choice(
|
|
string.ascii_lowercase + string.digits)
|
|
for _ in range(length))
|
|
random_string = prefix + random_string
|
|
return random_string
|
|
|
|
def assertSchema(self, response_json, expected_schema):
|
|
"""Verify response schema aligns with the expected schema."""
|
|
try:
|
|
jsonschema.validate(response_json, expected_schema)
|
|
except jsonschema.ValidationError as message:
|
|
assert False, message
|
|
|
|
@property
|
|
def test_flavor(self):
|
|
if self.test_config.generate_flavors:
|
|
provider_name = self.test_config.generated_provider
|
|
# create the flavor
|
|
flavor_id = str(uuid.uuid1())
|
|
self.client.create_flavor(
|
|
flavor_id=flavor_id,
|
|
provider_list=[{
|
|
"provider": provider_name,
|
|
"links": [{"href": "www.{0}.com".format(provider_name),
|
|
"rel": "provider_url"}]}])
|
|
else:
|
|
flavor_id = self.test_config.default_flavor
|
|
|
|
return flavor_id
|
|
|
|
def setup_service(self, service_name, domain_list, origin_list,
|
|
caching_list=[], restrictions_list=[], flavor_id=None,
|
|
log_delivery=False):
|
|
resp = self.client.create_service(
|
|
service_name=service_name,
|
|
domain_list=domain_list,
|
|
origin_list=origin_list,
|
|
caching_list=caching_list,
|
|
restrictions_list=restrictions_list,
|
|
flavor_id=flavor_id,
|
|
log_delivery=log_delivery)
|
|
|
|
self.assertEqual(resp.status_code, 202)
|
|
self.service_location = resp.headers['location']
|
|
self.client.wait_for_service_status(
|
|
location=self.service_location,
|
|
status='DEPLOYED',
|
|
abort_on_status='FAILED',
|
|
retry_interval=self.test_config.status_check_retry_interval,
|
|
retry_timeout=self.test_config.status_check_retry_timeout)
|
|
|
|
return resp
|
|
|
|
def assert_patch_service_details(self, actual_response, expected_response):
|
|
self.assertEqual(actual_response['name'],
|
|
expected_response['name'])
|
|
self.assertEqual(sorted(actual_response['origins']),
|
|
sorted(expected_response['origins']))
|
|
self.assertEqual(sorted(actual_response['caching']),
|
|
sorted(expected_response['caching']))
|
|
self.assertEqual(sorted(actual_response['restrictions']),
|
|
sorted(expected_response['restrictions']))
|
|
self.assertEqual(actual_response['flavor_id'],
|
|
expected_response['flavor_id'])
|
|
|
|
for item in actual_response['domains']:
|
|
if (('certificate' in item) and
|
|
(item['certificate'] == 'shared')):
|
|
item['domain'] = item['domain'].split('.')[0]
|
|
self.assertEqual(sorted(actual_response['domains']),
|
|
sorted(expected_response['domains']))
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
"""Deletes the added resources."""
|
|
super(TestBase, cls).tearDownClass()
|