fix: change default for hard querystring

- default `hard` to True, which does an actual purge.
- when `hard` is set to False, api does a cache invalidation.

- fix admin api tests, to wait for service deployed
Change-Id: I1e1b4680fb908d734904cd17103d0daf54c93cc3
This commit is contained in:
Sriram Madapusi Vasudevan 2015-08-27 10:36:01 -04:00
parent 29191c6d8c
commit bccf02a2f9
12 changed files with 84 additions and 20 deletions

View File

@ -40,7 +40,6 @@ class PurgeProviderServicesTask(task.Task):
service_obj = service.load_from_json(service_json)
hard = json.loads(hard)
provider_details = json.loads(provider_details)
purge_url = None if purge_url == 'None' else purge_url
responders = []
# try to purge all service from each provider presented

View File

@ -408,8 +408,8 @@ class ServiceController(base.ServiceBase):
else:
return self.responder.deleted(provider_service_id)
def purge(self, provider_service_id, service_obj, hard=False,
purge_url=None):
def purge(self, provider_service_id, service_obj, hard=True,
purge_url='/*'):
if not hard:
if not purge_url.startswith('/'):
purge_url = ('/' + purge_url)
@ -419,7 +419,7 @@ class ServiceController(base.ServiceBase):
try:
# Get the service
if purge_url is None:
if purge_url == '/*':
raise RuntimeError('Akamai purge-all functionality has not'
' been implemented')
else:
@ -444,6 +444,8 @@ class ServiceController(base.ServiceBase):
# purge_url has to be a full path
# with a starting slash,
# e.g: /cdntest.html
if not purge_url.startswith('/'):
purge_url = ('/' + purge_url)
actual_purge_url = ''.join([url_scheme,
policy['policy_name'],
purge_url])

View File

@ -58,7 +58,7 @@ class ServicesControllerBase(controller.ProviderControllerBase):
raise NotImplementedError
@abc.abstractmethod
def purge(self, provider_service_id, hard=False, purge_url=None):
def purge(self, provider_service_id, hard=True, purge_url='/*'):
"""purge.
:param provider_service_id

View File

@ -84,7 +84,7 @@ class ServiceController(base.ServiceBase):
except Exception as e:
return self.responder.failed(str(e))
def purge(self, distribution_id, hard=False, purge_url=None):
def purge(self, distribution_id, hard=True, purge_url='/*'):
# NOTE(tonytan4ever): boto does not have an API to efficiently
# purge all urls yet
try:

View File

@ -223,10 +223,10 @@ class ServiceController(base.ServiceBase):
except Exception as e:
return self.responder.failed(str(e))
def purge(self, service_id, hard=False, purge_url=None):
def purge(self, service_id, hard=True, purge_url='/*'):
try:
# Get the service
if purge_url is None:
if purge_url == '/*':
self.client.purge_service(service_id)
return self.responder.purged(service_id, purge_url=purge_url)
else:

View File

@ -109,7 +109,7 @@ class ServiceController(base.ServiceBase):
# this exception branch will most likely for a network failure
return self.responder.failed(str(e))
def purge(self, pullzone_id, hard=False, purge_url=None):
def purge(self, pullzone_id, hard=True, purge_url='/*'):
try:
purge_response = self.client.purge(pullzone_id, purge_url)
if purge_response['code'] != 200:

View File

@ -43,7 +43,7 @@ class ServiceController(base.ServiceBase):
def delete(self, provider_service_id):
return self.responder.deleted(provider_service_id)
def purge(self, provider_service_id, hard=False, purge_url=None):
def purge(self, provider_service_id, hard=True, purge_url='/*'):
return self.responder.purged(provider_service_id,
purge_url=purge_url)

View File

@ -54,14 +54,16 @@ class ServiceAssetsController(base.Controller, hooks.HookController):
helpers.abort_with_message)
)
def delete(self, service_id):
purge_url = pecan.request.GET.get('url', None)
purge_url = pecan.request.GET.get('url', '/*')
purge_all = pecan.request.GET.get('all', False)
hard = pecan.request.GET.get('hard', 'False')
hard = pecan.request.GET.get('hard', 'True')
if purge_url:
try:
purge_url.encode('ascii')
except (UnicodeDecodeError, UnicodeEncodeError):
pecan.abort(400, detail='non ascii character present in url')
if hard and hard.lower() == 'false':
hard = 'False'
if hard and hard.lower() == 'true':
hard = 'True'
try:
@ -72,10 +74,7 @@ class ServiceAssetsController(base.Controller, hooks.HookController):
pecan.abort(400, detail='hard can only be set to True or False')
purge_all = (
True if purge_all and purge_all.lower() == 'true' else False)
if purge_url is None and not purge_all:
pecan.abort(400, detail='No purge url provided '
'when not purging all...')
elif purge_all and purge_url is not None:
if purge_all and purge_url != '/*':
pecan.abort(400, detail='Cannot provide all=true '
'and a url at the same time')
services_controller = self._driver.manager.services_controller

View File

@ -384,6 +384,13 @@ class TestGetServiceBySANCertDomain(base.TestBase):
self.service_url = resp.headers["location"]
self.client.wait_for_service_status(
location=self.service_url,
status='deployed',
abort_on_status='failed',
retry_interval=self.test_config.status_check_retry_interval,
retry_timeout=self.test_config.status_check_retry_timeout)
def test_get_service_by_domain(self):
self.skipTest('See https://bugs.launchpad.net/poppy/+bug/1486103')
get_resp = self.client.get_service(self.service_url)

View File

@ -181,6 +181,14 @@ class TestAssets(base.TestBase):
param=url_param)
self.assertEqual(resp.status_code, 400)
@attrib.attr('smoke')
def test_purge_assets_no_url(self):
url_param = {'url': 'myurl.com'}
resp = self.client.purge_assets(location=self.service_url,
param=url_param)
self.assertEqual(resp.status_code, 400)
def tearDown(self):
self.client.delete_service(location=self.service_location)
if self.test_config.generate_flavors:

View File

@ -366,7 +366,7 @@ class ServiceControllerTest(base.FunctionalTest):
},
expect_errors=True)
self.assertEqual(400, response.status_code)
self.assertEqual(202, response.status_code)
response = self.app.delete(
self.service_url + '/assets?all=true&url=/abc',
@ -380,7 +380,7 @@ class ServiceControllerTest(base.FunctionalTest):
def test_purge_all(self):
response = self.app.delete(
self.service_url + '/assets?all=true',
self.service_url + '/assets?all=True',
headers={
"Content-Type": "application/json",
'X-Project-ID': self.project_id
@ -391,6 +391,17 @@ class ServiceControllerTest(base.FunctionalTest):
self.assertEqual(self.service_url,
urlparse.urlparse(response.headers["Location"]).path)
def test_purge_url_and_all(self):
response = self.app.delete(
self.service_url + '/assets?all=True',
headers={
"Content-Type": "application/json",
'X-Project-ID': self.project_id
},
expect_errors=True)
self.assertEqual(202, response.status_code)
def test_purge_single_url(self):
response = self.app.delete(
self.service_url + '/assets?url=/abc',
@ -442,6 +453,28 @@ class ServiceControllerTest(base.FunctionalTest):
self.assertEqual(self.service_url,
urlparse.urlparse(response.headers["Location"]).path)
def test_purge_no_url_with_querystring(self):
response = self.app.delete(
self.service_url + '/assets?hard=True',
headers={
"Content-Type": "application/json",
'X-Project-ID': self.project_id
},
expect_errors=True)
self.assertEqual(202, response.status_code)
def test_purge_no_url(self):
response = self.app.delete(
self.service_url + '/assets',
headers={
"Content-Type": "application/json",
'X-Project-ID': self.project_id
},
expect_errors=True)
self.assertEqual(202, response.status_code)
def test_purge_wildcard_url_and_soft_invalidate(self):
response = self.app.delete(
self.service_url + '/assets?url=/abc/*&hard=False',
@ -465,3 +498,17 @@ class ServiceControllerTest(base.FunctionalTest):
expect_errors=True)
self.assertEqual(400, response.status_code)
@ddt.data(True, False)
def test_purge_none_url(self, hard):
response = self.app.delete(
self.service_url + '/assets?url=None&hard={0}'.format(hard),
headers={
"Content-Type": "application/json",
'X-Project-ID': self.project_id
},
expect_errors=True)
self.assertEqual(202, response.status_code)
self.assertEqual(self.service_url,
urlparse.urlparse(response.headers["Location"]).path)

View File

@ -332,14 +332,16 @@ class TestServices(base.TestCase):
controller = services.ServiceController(self.driver)
exception = fastly.FastlyError(Exception('ding'))
controller.client.purge_service.side_effect = exception
resp = controller.purge(provider_service_id, None)
resp = controller.purge(provider_service_id, hard=True,
purge_url='/*')
self.assertIn('error', resp[self.driver.provider_name])
def test_purge_all(self):
provider_service_id = uuid.uuid1()
controller = services.ServiceController(self.driver)
controller.client.purge_service.return_value = 'some_value'
resp = controller.purge(provider_service_id, None)
resp = controller.purge(provider_service_id, hard=True,
purge_url='/*')
controller.client.purge_service.assert_called_once_with(
provider_service_id
)