EOX GitLab Instance

Skip to content
Snippets Groups Projects
Commit ecbc3907 authored by Lubomir Dolezal's avatar Lubomir Dolezal
Browse files

registrar get up to date with DEM updates in vhr_image_2018 reg

parent 62efea08
No related branches found
No related tags found
No related merge requests found
...@@ -36,6 +36,7 @@ import textwrap ...@@ -36,6 +36,7 @@ import textwrap
import logging import logging
import traceback import traceback
import redis import redis
import subprocess
import lxml.etree import lxml.etree
from swiftclient.service import SwiftService from swiftclient.service import SwiftService
...@@ -43,6 +44,7 @@ from swiftclient.service import SwiftService ...@@ -43,6 +44,7 @@ from swiftclient.service import SwiftService
import django import django
from django.db import transaction from django.db import transaction
from django.contrib.gis.geos import GEOSGeometry from django.contrib.gis.geos import GEOSGeometry
from osgeo import gdal
path = os.path.join(os.getenv('INSTALL_DIR', "/var/www/pvs"), "pvs_instance") path = os.path.join(os.getenv('INSTALL_DIR', "/var/www/pvs"), "pvs_instance")
if path not in sys.path: if path not in sys.path:
...@@ -52,6 +54,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pvs_instance.settings") ...@@ -52,6 +54,7 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pvs_instance.settings")
django.setup() django.setup()
from eoxserver.backends import access from eoxserver.backends import access
from eoxserver.contrib import vsi
from eoxserver.backends import models as backends from eoxserver.backends import models as backends
from eoxserver.resources.coverages import models from eoxserver.resources.coverages import models
from eoxserver.resources.coverages.registration.product import ( from eoxserver.resources.coverages.registration.product import (
...@@ -87,6 +90,16 @@ def setup_logging(verbosity): ...@@ -87,6 +90,16 @@ def setup_logging(verbosity):
# finished logging setup # finished logging setup
def set_gdal_swift_auth():
# parsing command line output of swift auth
auth_keys = subprocess.check_output(["swift", "auth"]).split("\n")
storage_url = auth_keys[0].split("OS_STORAGE_URL=")[1]
auth_token = auth_keys[1].split("OS_AUTH_TOKEN=")[1]
# setting gdal config
gdal.SetConfigOption("SWIFT_STORAGE_URL", storage_url)
gdal.SetConfigOption("SWIFT_AUTH_TOKEN", auth_token)
def add_mask(product): def add_mask(product):
metadata_item = product.metadata_items.all()[0] metadata_item = product.metadata_items.all()[0]
with access.vsi_open(metadata_item) as f: with access.vsi_open(metadata_item) as f:
...@@ -141,13 +154,49 @@ def get_product_type_and_level(metadata_item): ...@@ -141,13 +154,49 @@ def get_product_type_and_level(metadata_item):
return product_type_name, level return product_type_name, level
def get_product_collection(metadata_file):
# in case collection needs to be determined from metadata
try:
if metadata_file.startswith("/vsiswift"):
set_gdal_swift_auth()
with vsi.open(metadata_file, "r") as f:
tree = lxml.etree.parse(f)
root = tree.getroot()
xp = '//gml:metaDataProperty/gsc:EarthObservationMetaData/eop:parentIdentifier/text()'
product_type_name = tree.xpath(xp, namespaces=root.nsmap)
extracted = product_type_name[0].split('/')[0]
return extracted
except Exception as e:
logger.debug(
'Failed to determine product collection for metadata file %s, error was %s'
% (metadata_file, e)
)
def get_product_type_from_band_count(product_type_name, file_path):
# get raster band count via gdal
logger.debug("Opening file using GDAL: %s" % file_path)
if file_path.startswith("/vsiswift"):
set_gdal_swift_auth()
src_ds = gdal.Open(file_path)
if src_ds is None:
raise RegistrationError("Band check: failed to open dataset: %s " % file_path)
# try to fetch product model with _bandcount
product_type_name_upd = "%s_%s" % (product_type_name, src_ds.RasterCount)
try:
product_type_model = models.ProductType.objects.get(name=product_type_name_upd)
return product_type_model
except models.ProductType.DoesNotExist:
raise RegistrationError("Product Type: '%s' was not found" % product_type_name_upd)
class RegistrationError(Exception): class RegistrationError(Exception):
pass pass
@transaction.atomic @transaction.atomic
def registrar( def registrar(
collection, collection_stack,
objects_prefix, upload_container=None, replace=False, client=None, registered_set_key=None objects_prefix, upload_container=None, replace=False, client=None, registered_set_key=None
): ):
logger.info("Starting registration of product '%s'." % objects_prefix) logger.info("Starting registration of product '%s'." % objects_prefix)
...@@ -187,38 +236,72 @@ def registrar( ...@@ -187,38 +236,72 @@ def registrar(
"Product with objects prefix '%s' has missing content." "Product with objects prefix '%s' has missing content."
% objects_prefix % objects_prefix
) )
logger.debug("Found objects '%s' and '%s'." % (data_package, metadata_package))
storage = backends.Storage.objects.get(name=upload_container) storage = backends.Storage.objects.get(name=upload_container)
metadata_item = models.MetaDataItem(storage=storage, location=metadata_package) metadata_item = models.MetaDataItem(storage=storage, location=metadata_package)
product_type, level = get_product_type_and_level(metadata_item) product_type, level = get_product_type_and_level(metadata_item)
if collection_stack == 'DEM':
# special for DEM files, collection name === product_type
gdal_metadata_file_path = "/vsiswift/%s/%s" % (upload_container, metadata_package)
product_type = get_product_collection(gdal_metadata_file_path)
logger.debug("Registering product") logger.debug("Registering product")
product_type_name = "%s_Product_%s" % (collection_stack, product_type)
try:
# first find product type by name from path
product_type_model = models.ProductType.objects.get(name=product_type_name)
except models.ProductType.DoesNotExist:
# if not found, maybe there are more product types with _bandcount suffix
gdal_file_path = "/vsiswift/%s/%s" % (upload_container, data_package)
product_type_model = get_product_type_from_band_count(product_type_name, gdal_file_path)
product_type_name = product_type_model.name
coverage_type_names = product_type_model.allowed_coverage_types.all()
if len(coverage_type_names) > 1:
logger.warning("More available 'CoverageType' found, selecting the first one.")
coverage_type_name = coverage_type_names[0].name
product, replaced = ProductRegistrator().register( product, replaced = ProductRegistrator().register(
metadata_locations=[[upload_container, metadata_locations=[[upload_container,
metadata_package, ], ], metadata_package, ], ],
type_name="%s_Product_%s" % (collection, product_type), type_name=product_type_name,
replace=replace, replace=replace,
extended_metadata=True, extended_metadata=True,
mask_locations=None, mask_locations=None,
package_path=None, package_path=None,
simplify_footprint_tolerance=0.0001, # ~10meters
overrides={}, overrides={},
) )
if product.footprint.empty:
product.delete()
raise RegistrationError("No footprint was extracted. full product: %s" % product)
collection = models.Collection.objects.get( collection = models.Collection.objects.get(
identifier=collection identifier=collection_stack
) )
logger.debug("Inserting product into collection") logger.debug("Inserting product into collection %s" % collection_stack)
models.collection_insert_eo_object(collection, product) models.collection_insert_eo_object(collection, product)
if collection_stack == "DEM":
# also insert it to its own collection
collection_own = models.Collection.objects.get(
identifier="%s_%s" % (collection, product_type)
)
logger.debug("Inserting product to collection %s_%s" % (collection, product_type))
models.collection_insert_eo_object(collection_own, product)
if level == 'Level_1': if level == 'Level_1':
collection_level_1 = models.Collection.objects.get( collection_level_1 = models.Collection.objects.get(
identifier="%s_Level_1" % collection identifier="%s_Level_1" % collection
) )
logger.debug("Inserting product to collection %s_Level_1" % collection)
models.collection_insert_eo_object(collection_level_1, product) models.collection_insert_eo_object(collection_level_1, product)
elif level == 'Level_3': elif level == 'Level_3':
collection_level_3 = models.Collection.objects.get( collection_level_3 = models.Collection.objects.get(
identifier="%s_Level_3" % collection identifier="%s_Level_3" % collection
) )
logger.debug("Inserting product to collection %s_Level_3" % collection)
models.collection_insert_eo_object(collection_level_3, product) models.collection_insert_eo_object(collection_level_3, product)
logger.debug("Registering coverage") logger.debug("Registering coverage")
...@@ -226,7 +309,7 @@ def registrar( ...@@ -226,7 +309,7 @@ def registrar(
data_locations=[[upload_container, data_package, ], ], data_locations=[[upload_container, data_package, ], ],
metadata_locations=[[upload_container, metadata_locations=[[upload_container,
metadata_package, ], ], metadata_package, ], ],
coverage_type_name="RGBNir", coverage_type_name=coverage_type_name,
overrides={ overrides={
"identifier": "%s__coverage" % product.identifier, "identifier": "%s__coverage" % product.identifier,
"footprint": None, "footprint": None,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment