diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 801f789aad5bf3bec30fb8b3beb635bf96e5169f..4ad935d8368aa8e6d3d22bfe3936dd63475eed9f 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -28,7 +28,7 @@ replace = version="{new_version}" search = version="{current_version}" replace = version="{new_version}" -[bumpversion:glob:registrar/setup.py] +[bumpversion:glob:core/setup.py] search = version="{current_version}" replace = version="{new_version}" diff --git a/core/registrar/backend.py b/core/registrar/backend.py index 056017e04464616e16b5520c1a98db0b9ce6b5af..a51d3deeb2aaec649620ace7938ffc5cf6ca3143 100644 --- a/core/registrar/backend.py +++ b/core/registrar/backend.py @@ -7,7 +7,9 @@ import json import django from django.db import transaction +from django.db.models import Count from django.contrib.gis.geos import GEOSGeometry, Polygon +from osgeo import gdal from .exceptions import RegistrationError from .context import Context @@ -129,14 +131,16 @@ class EOxServerBackend(Backend): from eoxserver.resources.coverages.registration.registrators.gdal import GDALRegistrator # get the mapping for this particular item - type_mapping = self.mapping[item.product_type] + try: + type_mapping = self.mapping[item.product_type] + except KeyError: + raise RegistrationError(f'Could not find mapping for {item.product_type} in configuration') mapping = type_mapping.get(item.product_level) or type_mapping.get(None) if not mapping: raise RegistrationError(f'Could not get mapping for {item.product_type} {item.product_level}') _, metadata_file = source.get_container_and_path(item.metadata_files[0]) - # metadata_file = '/'.join(item.metadata_files[0].split('/')[1:]) storage = self._get_storage_from_source(source, item.path) try: @@ -180,9 +184,26 @@ class EOxServerBackend(Backend): storage + [source.get_container_and_path(raster_item)[1]] for raster_item in (raster_items if isinstance(raster_items, list) else [raster_items]) ] - + if isinstance(coverage_type_name, list): + # determine which one to use based on number of bands + gdal_path_prefix = '' + if isinstance(source, SwiftSource): + gdal_path_prefix = '/vsiswift/' + elif isinstance(source, S3Source): + gdal_path_prefix = '/vsis3/' + raster_item_to_check = f'{gdal_path_prefix}{raster_items[0][0]}/{raster_items[0][1]}' + ds = gdal.Open(raster_item_to_check) + logger.debug("Raster has number of bands: '%s'" % ds.RasterCount) + # find covtype that has correct number of bands + try: + coverage_model = models.CoverageType.objects \ + .filter(name__in=coverage_type_name) \ + .annotate(field_count=Count('field_types')) \ + .get(field_count=ds.RasterCount) + except models.CoverageType.DoesNotExist: + raise RegistrationError(f'Coverage Band Count is different than in any of configured CoverageTypes') + coverage_type_name = coverage_model.name logger.info(f"Registering coverage{'s' if len(raster_items) > 1 else ''} {raster_items} as {coverage_type_name}") - report = GDALRegistrator().register( data_locations=raster_items, metadata_locations=[storage + [metadata_file]], diff --git a/core/setup.py b/core/setup.py index 93112025b3dde3f53a4f33ca88c9f6013c33960a..223d0ed5738d4a44a88dc5e5d6233d1ea820725a 100644 --- a/core/setup.py +++ b/core/setup.py @@ -6,7 +6,7 @@ long_description = "" setup( name="registrar", # Replace with your own username - version="1.0.0-rc.2", + version="1.0.0", author="", author_email="", description="registrar for PVS",