From eca3d130c829b55ae9fba4bedce38a726dc04af5 Mon Sep 17 00:00:00 2001 From: Luca Frosini Date: Tue, 22 Feb 2022 09:34:07 +0100 Subject: [PATCH] Improving configuration on IS --- gcube/extra-resources/WEB-INF/gcube-app.xml | 2 +- pom.xml | 1 - .../GCoreISConfigurationProxy.java | 145 +++++++----------- .../GCoreISConfigurationProxyTest.java | 16 +- 4 files changed, 73 insertions(+), 91 deletions(-) diff --git a/gcube/extra-resources/WEB-INF/gcube-app.xml b/gcube/extra-resources/WEB-INF/gcube-app.xml index 44b06dc..f77abc3 100644 --- a/gcube/extra-resources/WEB-INF/gcube-app.xml +++ b/gcube/extra-resources/WEB-INF/gcube-app.xml @@ -2,7 +2,7 @@ ${project.artifactId} - ${serviceClass} + ${project.groupId} ${project.version} ${project.description} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3d282e6..fee96c9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,6 @@ UTF-8 ${project.basedir}${file.separator}src${file.separator}main${file.separator}webapp${file.separator}WEB-INF - data-catalogue diff --git a/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java b/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java index 9bcd28b..4922d2c 100644 --- a/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java +++ b/src/main/java/org/gcube/gcat/configuration/GCoreISConfigurationProxy.java @@ -3,6 +3,7 @@ package org.gcube.gcat.configuration; import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -52,19 +53,36 @@ public class GCoreISConfigurationProxy { public final static String DEFAULT_ORGANIZATION_PROPERTY_KEY = "DEFAULT_ORGANIZATION"; public final static String SUPPORTED_ORGANIZATION_PROPERTY_KEY = "SUPPORTED_ORGANIZATION"; + public final static String API_KEY_PROPERTY_KEY = "API_KEY"; public final static String SOLR_INDEX_ADDRESS_PROPERTY_KEY = "SOLR_INDEX_ADDRESS"; public final static String SOCIAL_POST_PROPERTY_KEY = "SOCIAL_POST"; public final static String ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY = "ALERT_USERS_ON_POST_CREATION"; public final static String MODERATION_ENABLED_KEY_PROPERTY_KEY = "MODERATION_ENABLED"; - - public final static String CKAN_DB_URL_PROPERTY_KEY = "CKAN_DB_URL"; - public final static String CKAN_DB_USERNAME_PROPERTY_KEY = "CKAN_DB_USERNAME"; - public final static String CKAN_DB_PASSWORD_PROPERTY_KEY = "CKAN_DB_PASSWORD"; + public static final Map gCoreToConfigurationMapping; + public static final Map configurationToGCoreMapping; + + static { + gCoreToConfigurationMapping = new HashMap<>(); + configurationToGCoreMapping = new HashMap<>(); + + gCoreToConfigurationMapping.put(API_KEY_PROPERTY_KEY, CatalogueConfiguration.SYS_ADMIN_TOKEN_KEY); + + gCoreToConfigurationMapping.put(SOLR_INDEX_ADDRESS_PROPERTY_KEY, CatalogueConfiguration.SOLR_URL_KEY); + + gCoreToConfigurationMapping.put(SOCIAL_POST_PROPERTY_KEY, CatalogueConfiguration.SOCIAL_POST_ENABLED_KEY); + gCoreToConfigurationMapping.put(ALERT_USERS_ON_POST_CREATION_PROPERTY_KEY, CatalogueConfiguration.NOTIFICATION_TO_USER_ENABLED_KEY); + gCoreToConfigurationMapping.put(MODERATION_ENABLED_KEY_PROPERTY_KEY, CatalogueConfiguration.MODERATION_ENABLED_KEY); + + for(String key : gCoreToConfigurationMapping.keySet()) { + configurationToGCoreMapping.put(gCoreToConfigurationMapping.get(key), key); + } + } + // CKAN Instance info - private final static String CATEGORY = "Application"; - private final static String NAME = "CKanDataCatalogue"; + private final static String OLD_CATEGORY = "Application"; + private final static String OLD_NAME = "CKanDataCatalogue"; protected final String context; protected ServiceCatalogueConfiguration catalogueConfiguration; @@ -81,7 +99,7 @@ public class GCoreISConfigurationProxy { public ServiceCatalogueConfiguration getCatalogueConfiguration() { if (catalogueConfiguration == null) { - catalogueConfiguration = getCatalogueConfigurationFromIS(); + catalogueConfiguration = getOLDCatalogueConfigurationFromIS(); } return catalogueConfiguration; } @@ -102,11 +120,15 @@ public class GCoreISConfigurationProxy { } protected ServiceCatalogueConfiguration getCatalogueConfigurationFromIS() { + return getOLDCatalogueConfigurationFromIS(); + } + + protected ServiceCatalogueConfiguration getOLDCatalogueConfigurationFromIS() { ServiceCatalogueConfiguration catalogueConfiguration = new ServiceCatalogueConfiguration(context); try { - boolean mustBeUpdated = false; + // boolean mustBeUpdated = false; - ServiceEndpoint serviceEndpoint = getServiceEndpoint(); + ServiceEndpoint serviceEndpoint = getOldServiceEndpoint(); if (serviceEndpoint == null) { throw new InternalServerErrorException("No CKAN configuration on IS"); } @@ -127,17 +149,7 @@ public class GCoreISConfigurationProxy { catalogueConfiguration.setEncryptedSysAdminToken(encryptedSysAdminToken); - String defaultOrganization = CatalogueConfiguration.getOrganizationName(context);; - if (propertyMap.containsKey(DEFAULT_ORGANIZATION_PROPERTY_KEY)) { - String org = propertyMap.get(DEFAULT_ORGANIZATION_PROPERTY_KEY).value().trim(); - if(org!=null && org.compareTo("")==0) { - mustBeUpdated = true; - }else { - catalogueConfiguration.setDefaultOrganization(org); - } - }else { - mustBeUpdated = true; - } + String defaultOrganization = CatalogueConfiguration.getOrganizationName(context); String solrURL = null; @@ -154,8 +166,6 @@ public class GCoreISConfigurationProxy { if (propertyMap.get(SOCIAL_POST_PROPERTY_KEY).value().trim().equalsIgnoreCase("false")) { socialPostEnabled = false; } - }else { - mustBeUpdated = true; } catalogueConfiguration.setSocialPostEnabled(socialPostEnabled); @@ -166,8 +176,6 @@ public class GCoreISConfigurationProxy { .equalsIgnoreCase("true")) { notificationToUsersEnabled = true; } - }else { - mustBeUpdated = true; } catalogueConfiguration.setNotificationToUsersEnabled(notificationToUsersEnabled); @@ -176,21 +184,10 @@ public class GCoreISConfigurationProxy { if (propertyMap.get(MODERATION_ENABLED_KEY_PROPERTY_KEY).value().trim().equalsIgnoreCase("true")) { moderationEnabled = true; } - }else { - mustBeUpdated = true; } catalogueConfiguration.setModerationEnabled(moderationEnabled); - Set supportedOrganizations = null; - if (propertyMap.containsKey(SUPPORTED_ORGANIZATION_PROPERTY_KEY)) { - String jsonArray = propertyMap.get(SUPPORTED_ORGANIZATION_PROPERTY_KEY).value(); - supportedOrganizations = unmarshallSupportedOrganizations(jsonArray); - removeAllGenericResources(); - }else { - supportedOrganizations = getSupportedOrganizationsFromGenericResource(); - mustBeUpdated = true; - } - + Set supportedOrganizations = getSupportedOrganizationsFromGenericResource(); if (supportedOrganizations != null) { catalogueConfiguration.setSupportedOrganizations(supportedOrganizations); if(defaultOrganization==null) { @@ -199,28 +196,9 @@ public class GCoreISConfigurationProxy { } } - ServiceCKANDB ckanDB = null; - if (propertyMap.containsKey(CKAN_DB_URL_PROPERTY_KEY)) { - String ckanDBURL = propertyMap.get(CKAN_DB_URL_PROPERTY_KEY).value().trim(); - ckanDB = new ServiceCKANDB(); - ckanDB.setUrl(ckanDBURL); - String ckanDBUsername = propertyMap.get(CKAN_DB_USERNAME_PROPERTY_KEY).value().trim(); - ckanDB.setUsername(ckanDBUsername); - // Password is encrypted - String ckanDBPassword = propertyMap.get(CKAN_DB_PASSWORD_PROPERTY_KEY).value().trim(); - ckanDB.setEncryptedPassword(ckanDBPassword); - }else { - mustBeUpdated = true; - ckanDB = getCKANDBFromIS(); - } + ServiceCKANDB ckanDB = getCKANDBFromIS(); catalogueConfiguration.setCkanDB(ckanDB); - - - if(mustBeUpdated) { - logger.warn("The ServiceEndpoint with ID {} in context {} should be updated", serviceEndpoint.id(), context); - } - } catch (WebApplicationException e) { throw e; } catch (Exception e) { @@ -236,22 +214,33 @@ public class GCoreISConfigurationProxy { * @return list of endpoints for ckan data catalogue * @throws Exception */ - private List getServiceEndpoints() { + private List getServiceEndpoints(String category, String name) { SimpleQuery query = queryFor(ServiceEndpoint.class); - query.addCondition("$resource/Profile/Category/text() eq '" + CATEGORY + "'"); - query.addCondition("$resource/Profile/Name/text() eq '" + NAME + "'"); + query.addCondition("$resource/Profile/Category/text() eq '" + category + "'"); + query.addCondition("$resource/Profile/Name/text() eq '" + name + "'"); DiscoveryClient client = clientFor(ServiceEndpoint.class); List serviceEndpoints = client.submit(query); + if(serviceEndpoints.size() == 0) { + String error = String.format("There is no %s having category '%s' and name '%s' in this context.", + ServiceEndpoint.class.getSimpleName(), category, name); + logger.error(error); + throw new InternalServerErrorException(error); + } return serviceEndpoints; } - private ServiceEndpoint getServiceEndpoint() { - List serviceEndpoints = getServiceEndpoints(); + /** + * Retrieve endpoints information from IS for DataCatalogue URL + * @return list of endpoints for ckan data catalogue + * @throws Exception + */ + private ServiceEndpoint getOldServiceEndpoint() { + List serviceEndpoints = getServiceEndpoints(OLD_CATEGORY, OLD_NAME); if (serviceEndpoints.size() == 0) { logger.error("There is no {} having Category {} and Name {} in this context.", - ServiceEndpoint.class.getSimpleName(), CATEGORY, NAME); + ServiceEndpoint.class.getSimpleName(), OLD_CATEGORY, OLD_NAME); return null; } @@ -259,7 +248,7 @@ public class GCoreISConfigurationProxy { if (serviceEndpoints.size() > 1) { logger.info("Too many {} having Category {} and Name {} in this context. Looking for the one that has the property {}", - ServiceEndpoint.class.getSimpleName(), CATEGORY, NAME, IS_ROOT_MASTER_PROPERTY_KEY); + ServiceEndpoint.class.getSimpleName(), OLD_CATEGORY, OLD_NAME, IS_ROOT_MASTER_PROPERTY_KEY); for (ServiceEndpoint se : serviceEndpoints) { Iterator accessPointIterator = se.profile().accessPoints().iterator(); @@ -297,29 +286,9 @@ public class GCoreISConfigurationProxy { private final static String CKAN_DB_SERVICE_ENDPOINT_CATEGORY= "Database"; private final static String CKAN_DB_SERVICE_ENDPOINT_NAME = "CKanDatabase"; - - /** - * Retrieve endpoints information from IS for DataCatalogue URL - * @return list of endpoints for ckan data catalogue - * @throws Exception - */ - protected List getCKANDBServiceEndpoints() { - SimpleQuery query = queryFor(ServiceEndpoint.class); - query.addCondition("$resource/Profile/Category/text() eq '" + CKAN_DB_SERVICE_ENDPOINT_CATEGORY + "'"); - query.addCondition("$resource/Profile/Name/text() eq '" + CKAN_DB_SERVICE_ENDPOINT_NAME + "'"); - DiscoveryClient client = clientFor(ServiceEndpoint.class); - List serviceEndpoints = client.submit(query); - if(serviceEndpoints.size() == 0) { - logger.error("There is no {} having category {} and name {} in this context.", - ServiceEndpoint.class.getSimpleName(), CKAN_DB_SERVICE_ENDPOINT_CATEGORY, CKAN_DB_SERVICE_ENDPOINT_NAME); - throw new InternalServerErrorException("No CKAN configuration on IS"); - } - return serviceEndpoints; - } - protected ServiceCKANDB getCKANDBFromIS() { try { - List serviceEndpoints = getCKANDBServiceEndpoints(); + List serviceEndpoints = getServiceEndpoints(CKAN_DB_SERVICE_ENDPOINT_CATEGORY, CKAN_DB_SERVICE_ENDPOINT_NAME); ServiceEndpoint serviceEndpoint = null; if(serviceEndpoints.size() > 1) { @@ -467,7 +436,7 @@ public class GCoreISConfigurationProxy { public void delete() { RegistryPublisher registryPublisher = RegistryPublisherFactory.create(); - ServiceEndpoint serviceEndpoint = getServiceEndpoint(); + ServiceEndpoint serviceEndpoint = getOldServiceEndpoint(); if(serviceEndpoint!=null) { registryPublisher.remove(serviceEndpoint); } @@ -579,8 +548,8 @@ public class GCoreISConfigurationProxy { * CKanDataCatalogue * gCat Configuration created/updated by the service via REST */ - profile.category(CATEGORY); - profile.name(NAME); + profile.category(OLD_CATEGORY); + profile.name(OLD_NAME); profile.description(String.format("gCat configuration %s by the service via REST", update ? "updated" : "created")); return profile; } @@ -669,7 +638,7 @@ public class GCoreISConfigurationProxy { } public ServiceCatalogueConfiguration createOrUpdateOnIS() throws Exception { - ServiceEndpoint serviceEndpoint = getServiceEndpoint(); + ServiceEndpoint serviceEndpoint = getOldServiceEndpoint(); if(serviceEndpoint!=null) { // It's an update updateOnIS(serviceEndpoint); diff --git a/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java b/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java index aefe9e6..fa84492 100644 --- a/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java +++ b/src/test/java/org/gcube/gcat/configuration/GCoreISConfigurationProxyTest.java @@ -27,7 +27,7 @@ public class GCoreISConfigurationProxyTest extends ContextTest { ContextTest.setContextByName("/gcube/devNext"); String context = SecretManager.instance.get().getContext(); GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context); - ServiceCatalogueConfiguration catalogueConfiguration = gCoreISConfigurationProxy.getCatalogueConfigurationFromIS(); + ServiceCatalogueConfiguration catalogueConfiguration = gCoreISConfigurationProxy.getOLDCatalogueConfigurationFromIS(); String json = catalogueConfiguration.toJsonString(); logger.info("Configuration in context {} is {}", context, json); ServiceCatalogueConfiguration secondCatalogueConfiguration = ServiceCatalogueConfiguration.getServiceCatalogueConfiguration(json); @@ -41,6 +41,20 @@ public class GCoreISConfigurationProxyTest extends ContextTest { logger.info("All as JsonArray [{},{},{},{}]", json, secondJson, decryptedJson, thirdJson); } + @Test + public void updateConfigurationToNewVersion() throws Exception { + ContextTest.setContextByName("/gcube/devsec/devVRE"); + String context = SecretManager.instance.get().getContext(); + GCoreISConfigurationProxy gCoreISConfigurationProxy = new GCoreISConfigurationProxy(context); + ServiceCatalogueConfiguration catalogueConfiguration = gCoreISConfigurationProxy.getOLDCatalogueConfigurationFromIS(); + String json = catalogueConfiguration.toJsonString(); + logger.debug("Read configuration {}", json); + catalogueConfiguration = gCoreISConfigurationProxy.createOrUpdateOnIS(); + json = catalogueConfiguration.toJsonString(); + logger.debug("Updated configuration {}", json); + } + + // protected GenericResource instantiateGenericResource(String secondaryType, String name, String xml) throws Exception { // GenericResource genericResource = new GenericResource();