Skip to content

Commit

Permalink
[Fixes #3947] GeoWebCache Tiled Layer Cache explicit invalidation (#3949
Browse files Browse the repository at this point in the history
)

* [Fixes #3947] GeoWebCache Tiled Layer Cache explicit invalidation

*  - fix integration tests

*  - fix integration tests
  • Loading branch information
Alessio Fabiani committed Oct 9, 2018
1 parent 005ee64 commit a735d7b
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 8 deletions.
3 changes: 3 additions & 0 deletions geonode/geoserver/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
from geonode.layers.models import Layer, Attribute, Style
from geonode.security.views import _perms_info_json
from geonode.utils import set_attributes
from geonode.security.utils import set_geowebcache_invalidate_cache
import xml.etree.ElementTree as ET
from django.utils.module_loading import import_string

Expand Down Expand Up @@ -345,6 +346,7 @@ def set_layer_style(saved_layer, title, sld, base_file=None):
layer.default_style = style
cat.save(layer)
saved_layer.default_style = save_style(style)
set_geowebcache_invalidate_cache(saved_layer.alternate)
except Exception as e:
logger.exception(e)
else:
Expand All @@ -360,6 +362,7 @@ def set_layer_style(saved_layer, title, sld, base_file=None):
layer.default_style = style
cat.save(layer)
saved_layer.default_style = save_style(style)
set_geowebcache_invalidate_cache(saved_layer.alternate)
except Exception as e:
logger.exception(e)

Expand Down
10 changes: 10 additions & 0 deletions geonode/layers/templates/layers/layer_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -655,6 +655,16 @@ <h4>{% trans "Styles" %}</h4>
</li>
{% endif %}

{% if OGC_SERVER.default.BACKEND == 'geonode.geoserver' %}
{% if "change_resourcebase" in perms_list %}
<li class="list-group-item">
<h4>{% trans "Clear the Server Cache of this layer" %}</h4>
<p>{% trans "Click the button below to wipe the tile-cache of this layer." %}</p>
<a href="#" class="btn btn-primary btn-block" data-dismiss="modal" id="tiledlayer_refresh">{% trans "Empty Tiled-Layer Cache" %}</a>
</li>
{% endif %}
{% endif %}

{% if GEONODE_SECURITY_ENABLED %}
{% if "change_resourcebase_permissions" in perms_list %}
<li class="list-group-item">
Expand Down
1 change: 1 addition & 0 deletions geonode/layers/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ def test_upload_layer(self):
# Test redirection to login form when not logged in
response = self.client.get(reverse('layer_upload'))
self.assertEquals(response.status_code, 302)

# Test return of upload form when logged in
self.client.login(username="bobby", password="bob")
response = self.client.get(reverse('layer_upload'))
Expand Down
2 changes: 1 addition & 1 deletion geonode/layers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def layer_upload(request, template='upload/layer_upload.html'):
else:
saved_layer = Layer.objects.get(alternate=title)
if not saved_layer:
msg = 'Failed to process. Could not find matching layer.'
msg = 'Failed to process. Could not find matching layer.'
raise Exception(msg)
sld = open(base_file).read()
set_layer_style(saved_layer, title, base_file, sld)
Expand Down
3 changes: 0 additions & 3 deletions geonode/security/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,9 +299,6 @@ def test_perms_info(self):
'change_resourcebase',
layer.get_self_resource()))

# TODO Much more to do here once jj0hns0n understands the ACL system
# better

# Test with a Map object
# TODO

Expand Down
2 changes: 2 additions & 0 deletions geonode/security/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,6 @@
views.set_bulk_permissions, name='bulk_permissions'),
url(r'^request-permissions/?$',
views.request_permissions, name='request_permissions'),
url(r'^invalidate_tiledlayer_cache/?$',
views.invalidate_tiledlayer_cache, name='invalidate_tiledlayer_cache'),
]
27 changes: 27 additions & 0 deletions geonode/security/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,33 @@ def set_geofence_invalidate_cache():
logger.debug(tb)


@on_ogc_backend(geoserver.BACKEND_PACKAGE)
def set_geowebcache_invalidate_cache(layer_alternate):
"""invalidate GeoWebCache Cache Rules"""
try:
url = settings.OGC_SERVER['default']['LOCATION']
user = settings.OGC_SERVER['default']['USER']
passwd = settings.OGC_SERVER['default']['PASSWORD']
# Check first that the rules does not exist already
"""
curl -v -u admin:geoserver \
-H "Content-type: text/xml" \
-d "<truncateLayer><layerName>{layer_alternate}</layerName></truncateLayer>" \
http://localhost:8080/geoserver/gwc/rest/masstruncate
"""
headers = {'Content-type': 'text/xml'}
payload = "<truncateLayer><layerName>%s</layerName></truncateLayer>" % layer_alternate
r = requests.post(url + 'gwc/rest/masstruncate',
headers=headers,
data=payload,
auth=HTTPBasicAuth(user, passwd))
if (r.status_code < 200 or r.status_code > 201):
logger.warning("Could not Truncate GWC Cache for Layer '%s'." % layer_alternate)
except Exception:
tb = traceback.format_exc()
logger.debug(tb)


@on_ogc_backend(geoserver.BACKEND_PACKAGE)
def set_geofence_all(instance):
"""assign access permissions to all users
Expand Down
25 changes: 24 additions & 1 deletion geonode/security/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,31 @@ def resource_permissions(request, resource_id):


@require_POST
def set_bulk_permissions(request):
def invalidate_tiledlayer_cache(request):
from .utils import set_geowebcache_invalidate_cache
uuid = request.POST['uuid']
resource = get_object_or_404(ResourceBase, uuid=uuid)
can_change_data = request.user.has_perm(
'change_resourcebase',
resource)
layer = Layer.objects.get(id=resource.id)
if layer and can_change_data:
set_geowebcache_invalidate_cache(layer.alternate)
return HttpResponse(
json.dumps({'success': 'ok', 'message': 'GeoWebCache Tiled Layer Emptied!'}),
status=200,
content_type='text/plain'
)
else:
return HttpResponse(
json.dumps({'success': 'false', 'message': 'You cannot modify this resource!'}),
status=200,
content_type='text/plain'
)


@require_POST
def set_bulk_permissions(request):
permission_spec = json.loads(request.POST.get('permissions', None))
resource_ids = request.POST.getlist('resources', [])
if permission_spec is not None:
Expand Down
41 changes: 38 additions & 3 deletions geonode/templates/_permissions_form_js.html
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@
};

$(function() {

$('#permissions-body').ready(function(){
{% if resource %}
$.ajax(
Expand Down Expand Up @@ -294,7 +293,6 @@
return group.name;
}


var perms_submit = function() {
var form = $(this);
var action = form.attr("action");
Expand Down Expand Up @@ -339,9 +337,46 @@
});

{% if resource %}
$("#permission_form").submit(perms_submit);
$("#permission_form").submit(perms_submit);
{% endif %}


$("#tiledlayer_refresh").click(function(){
$.ajax(
{
type: "POST",
url: "{% url 'invalidate_tiledlayer_cache' %}",
dataType: 'json',
data: { uuid: "{{ resource.uuid }}" },
success: function(data) {
$("#modal_perms").modal("hide");
message = data;
title = "";
body = message.message;
if (message.success) {
title = "OK";
} else {
title = "Warning";
}
$("#_permissions_feedbacks").find('.modal-title').text(title);
$("#_permissions_feedbacks").find('.modal-body').text(body);
$("#_permissions_feedbacks").modal("show");
},
cache: false
}
).fail(function (jqXHR, textStatus, error) {
// Handle error here
$("#modal_perms").modal("hide");
message = JSON.parse(jqXHR.responseText);
body = message.message;
title = "Error";
$("#_permissions_feedbacks").find('.modal-title').text(title);
$("#_permissions_feedbacks").find('.modal-body').text(body);
$("#_permissions_feedbacks").modal("show");
});
return false;
});

$("#_bulk_permissions").on('hidden.bs.modal', function (e) {
$('#bulk_perms_message').addClass("hidden");
});
Expand Down
18 changes: 18 additions & 0 deletions geonode/tests/integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,24 @@ def test_layer_upload(self):
user=norman,
overwrite=True,
)

# Test that layer owner can wipe GWC Cache
if check_ogc_backend(geoserver.BACKEND_PACKAGE):
from geonode.security.utils import set_geowebcache_invalidate_cache
set_geowebcache_invalidate_cache(saved_layer.alternate)

url = settings.OGC_SERVER['default']['LOCATION']
user = settings.OGC_SERVER['default']['USER']
passwd = settings.OGC_SERVER['default']['PASSWORD']

import requests
from requests.auth import HTTPBasicAuth
r = requests.get(url + 'gwc/rest/seed/%s.json' % saved_layer.alternate,
auth=HTTPBasicAuth(user, passwd))
self.assertEquals(r.status_code, 200)
o = json.loads(r.text)
self.assertTrue('long-array-array' in o)
self.assertTrue(len(o['long-array-array']) > 0)
try:
saved_layer.set_default_permissions()
url = reverse('layer_metadata', args=[saved_layer.service_typename])
Expand Down

0 comments on commit a735d7b

Please sign in to comment.