Skip to content

Commit

Permalink
[Hardening] Finalize async upload: making set style synchronous in re…
Browse files Browse the repository at this point in the history
…spect to "geoserver_finalize_upload" task
  • Loading branch information
afabiani committed Dec 15, 2020
1 parent 099e607 commit 1d007b2
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 26 deletions.
51 changes: 33 additions & 18 deletions geonode/geoserver/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ def geoserver_finalize_upload(
permissions,
created,
xml_file,
sld_file,
sld_uploaded,
tempdir):
"""
Finalize Layer and GeoServer configuration:
Expand Down Expand Up @@ -373,6 +375,11 @@ def geoserver_finalize_upload(
except IntegrityError:
raise

if sld_uploaded:
geoserver_set_style(instance.id, sld_file)
else:
geoserver_create_style(instance.id, instance.name, sld_file, tempdir)

logger.debug('Finalizing (permissions and notifications) Layer {0}'.format(instance))
instance.handle_moderated_uploads()

Expand Down Expand Up @@ -595,33 +602,20 @@ def geoserver_post_save_layers(
except IntegrityError:
raise

# Updating the Catalogue
# Refreshing CSW records
logger.debug(f"... Updating the Catalogue entries for Layer {instance.title}")
catalogue_post_save(instance=instance, sender=instance.__class__)

# Refreshing layer links
logger.debug(f"... Creating Default Resource Links for Layer {instance.title}")
set_resource_default_links(instance, instance, prune=True)

# some thumbnail generators will update thumbnail_url. If so, don't
# immediately re-generate the thumbnail here. use layer#save(update_fields=['thumbnail_url'])
_recreate_thumbnail = False
logger.debug(f"... Creating Thumbnail for Layer {instance.title}")
if 'update_fields' in kwargs and kwargs['update_fields'] is not None and \
'thumbnail_url' in kwargs['update_fields']:
_recreate_thumbnail = True
if not instance.thumbnail_url or \
instance.thumbnail_url == staticfiles.static(settings.MISSING_THUMBNAIL) or \
is_monochromatic_image(instance.thumbnail_url):
_recreate_thumbnail = True
if _recreate_thumbnail:
create_gs_thumbnail(instance, overwrite=True)
logger.debug(f"... Created Thumbnail for Layer {instance.title}")
else:
logger.debug(f"... Thumbnail for Layer {instance.title} already exists: {instance.thumbnail_url}")

# Save layer attributes
logger.debug(f"... Refresh GeoServer attributes list for Layer {instance.title}")
set_attributes_from_geoserver(instance)

# Save layer styles
logger.debug(f"... Refresh Legend links for Layer {instance.title}")
set_styles(instance, gs_catalog)

# Invalidate GeoWebCache for the updated resource
Expand All @@ -631,6 +625,27 @@ def geoserver_post_save_layers(
except Exception:
pass

# Creating Layer Thumbnail
# some thumbnail generators will update thumbnail_url. If so, don't
# immediately re-generate the thumbnail here. use layer#save(update_fields=['thumbnail_url'])
_recreate_thumbnail = False
try:
logger.debug(f"... Creating Thumbnail for Layer {instance.title}")
if 'update_fields' in kwargs and kwargs['update_fields'] is not None and \
'thumbnail_url' in kwargs['update_fields']:
_recreate_thumbnail = True
if not instance.thumbnail_url or \
instance.thumbnail_url == staticfiles.static(settings.MISSING_THUMBNAIL) or \
is_monochromatic_image(instance.thumbnail_url):
_recreate_thumbnail = True
if _recreate_thumbnail:
create_gs_thumbnail(instance, overwrite=True)
logger.debug(f"... Created Thumbnail for Layer {instance.title}")
else:
logger.debug(f"... Thumbnail for Layer {instance.title} already exists: {instance.thumbnail_url}")
except Exception as e:
logger.exception(e)

# Updating HAYSTACK Indexes if needed
if settings.HAYSTACK_SEARCH:
from django.core.management import call_command
Expand Down
20 changes: 12 additions & 8 deletions geonode/upload/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,8 @@
from ..layers.models import Layer, UploadSession
from ..layers.utils import get_valid_layer_name
from ..geoserver.tasks import (
geoserver_set_style,
geoserver_create_style,
# geoserver_set_style,
# geoserver_create_style,
geoserver_finalize_upload
)
from ..geoserver.helpers import (
Expand Down Expand Up @@ -694,6 +694,8 @@ def final_step(upload_session, user, charset="UTF-8"):
geonode_upload_session, created = UploadSession.objects.get_or_create(
resource=saved_layer, user=user
)
geonode_upload_session.processed = False
geonode_upload_session.save()

# Add them to the upload session (new file fields are created).
assigned_name = None
Expand Down Expand Up @@ -749,8 +751,6 @@ def _store_file(saved_layer,
geonode_upload_session,
_f,
assigned_name)
geonode_upload_session.processed = False
geonode_upload_session.save()

# @todo if layer was not created, need to ensure upload target is
# same as existing target
Expand All @@ -762,6 +762,7 @@ def _store_file(saved_layer,
_log('Creating style for [%s]', name)
# look for SLD
sld_file = upload_session.base_file[0].sld_files
sld_uploaded = False
if sld_file:
# If it's contained within a zip, need to extract it
if upload_session.base_file.archive:
Expand All @@ -770,16 +771,18 @@ def _store_file(saved_layer,
zf.extract(sld_file[0], os.path.dirname(archive))
# Assign the absolute path to this file
sld_file[0] = os.path.dirname(archive) + '/' + sld_file[0]
geoserver_set_style.apply_async((saved_layer.id, sld_file[0]))
sld_file = sld_file[0]
sld_uploaded = True
# geoserver_set_style.apply_async((saved_layer.id, sld_file))
else:
# get_files will not find the sld if it doesn't match the base name
# so we've worked around that in the view - if provided, it will be here
sld_file = None
if upload_session.import_sld_file:
_log('using provided sld file')
base_file = upload_session.base_file
sld_file = base_file[0].sld_files[0]
geoserver_create_style.apply_async((saved_layer.id, name, sld_file, upload_session.tempdir))
sld_uploaded = False
# geoserver_create_style.apply_async((saved_layer.id, name, sld_file, upload_session.tempdir))

# look for xml and finalize Layer metadata
xml_file = upload_session.base_file[0].xml_files
Expand All @@ -799,6 +802,7 @@ def _store_file(saved_layer,
# Set default permissions on the newly created layer and send notifications
permissions = upload_session.permissions
geoserver_finalize_upload.apply_async(
(import_session.id, saved_layer.id, permissions, created, xml_file, upload_session.tempdir))
(import_session.id, saved_layer.id, permissions, created,
xml_file, sld_file, sld_uploaded, upload_session.tempdir))

return saved_layer

0 comments on commit 1d007b2

Please sign in to comment.