diff options
author | Nelson,Thomas(tn1381)(arthurdent3) <tn1381@att.com> | 2018-11-14 15:50:17 -0500 |
---|---|---|
committer | Nelson,Thomas(tn1381)(arthurdent3) <tn1381@att.com> | 2018-11-14 16:22:00 -0500 |
commit | b9d442f62385f5e5f0b4c3f8ecf07e74109ffb9a (patch) | |
tree | d9d9b535192c5fd246ed446fe7888b3e932aa131 | |
parent | b6dacb861d588690dd42e972b43752d90ad54dd0 (diff) |
Fix last update for a casablanca release3.0.243.0.0-ONAP
Used wrong commit to cherry-pick into casablanca release.
Pushing a fix.
Also pushed MUSIC-157
Change-Id: I851bc43c79857de2d3d0517918344f7459be9043
Issue-ID: MUSIC-181
Signed-off-by: Nelson,Thomas(tn1381)(arthurdent3) <tn1381@att.com>
-rw-r--r-- | distribution/cassandra_job/runcql.sh | 80 | ||||
-rw-r--r-- | musictrigger/assembly.xml | 2 | ||||
-rwxr-xr-x | musictrigger/src/MusicTrigger.java | 93 | ||||
-rwxr-xr-x | pom.xml | 19 | ||||
-rwxr-xr-x | src/main/java/org/onap/music/rest/RestMusicAdminAPI.java | 353 | ||||
-rwxr-xr-x | src/main/java/org/onap/music/rest/RestMusicDataAPI.java | 25 | ||||
-rw-r--r-- | src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java | 28 | ||||
-rwxr-xr-x | version.properties | 2 |
8 files changed, 239 insertions, 363 deletions
diff --git a/distribution/cassandra_job/runcql.sh b/distribution/cassandra_job/runcql.sh index 687e93b3..2ffd5f2f 100644 --- a/distribution/cassandra_job/runcql.sh +++ b/distribution/cassandra_job/runcql.sh @@ -1,25 +1,41 @@ #! /bin/bash +if [ -z "$TIMEOUT" ]; then + TIMEOUT=10; +fi +if [ -z "$DELAY" ]; then + DELAY=60; +fi +TO="--request-timeout=$TIMEOUT" + if [ $CASS_HOSTNAME ]; then - echo "#############################################" - echo "############## Let run cql's ################" - echo "#############################################" - echo "Current Variales in play" - echo "Default User" - echo "DEF_USER="$DEF_USER - echo "DEF_PASS=***********" - echo "New User" - echo "USERNAME="$USERNAME - echo "PASSWORD=***********" - if cqlsh -u cassandra -p cassandra -e "describe keyspaces;"; + echo "Sleeping for $DELAY seconds before running cql"; + sleep $DELAY; + >&2 echo "#############################################" + >&2 echo "############## Let run cql's ################" + >&2 echo "#############################################" + >&2 echo "Current Variables in play" + >&2 echo "Default User" + >&2 echo "DEF_USER="$DEF_USER + >&2 echo "DEF_PASS=***********" + >&2 echo "New User" + >&2 echo "USERNAME="$USERNAME + >&2 echo "PASSWORD=***********" + >&2 echo "TIMEOUT="$TIMEOUT + >&2 echo "Running cqlsh $TO -u cassandra -p cassandra -e \"describe keyspaces;\" ${CASS_HOSTNAME} ${PORT};" + if cqlsh $TO -u cassandra -p cassandra -e "describe keyspaces;" ${CASS_HOSTNAME} ${PORT}; then >&2 echo "Cassandra user still avalable, will continue as usual"; else - if cqlsh -u $USERNAME -p $PASSWORD -e "describe keyspaces;"; + CASSFAIL=true + >&2 echo "$DEF_USER failed, trying with $USERNAME" + if cqlsh $TO -u $USERNAME -p $PASSWORD -e "describe keyspaces;" ${CASS_HOSTNAME} ${PORT}; then >&2 echo "Password $USERNAME in play, update Variables" DEF_USER=$USERNAME DEF_PASS=$PASSWORD - if cqlsh -u $USERNAME -p $PASSWORD -e "describe keyspaces;" | grep admin1; + >&2 echo "DEF_USER="$DEF_USER + >&2 echo "DEF_PASS=***********" + if cqlsh $TO -u $USERNAME -p $PASSWORD -e "describe keyspaces;" ${CASS_HOSTNAME} ${PORT} | grep admin; then >&2 echo "Admin table exists, everything looks good" exit 0; @@ -28,25 +44,28 @@ if [ $CASS_HOSTNAME ]; then >&2 echo "DEF_USER=" $DEF_USER fi else - >&2 echo "Continue and as usual" + if [ $CASSFAIL ]; then + >&2 echo "$DEF_USER and $USERNAME fail. DB might need to be initialized again. This shouldn't have happend." + exit 1; + else + >&2 echo "Continue and as usual" + fi fi fi - echo "admin.cql file:" - cat /cql/admin.cql + >&2 echo "Running admin.cql file:" >&2 echo "Running cqlsh -u $DEF_USER -p $DEF_PASS -f /cql/admin.cql ${CASS_HOSTNAME} ${PORT}" sleep 1; - if cqlsh -u $DEF_USER -p $DEF_PASS -f /cql/admin.cql ${CASS_HOSTNAME} ${PORT}; + if cqlsh $TO -u $DEF_USER -p $DEF_PASS -f /cql/admin.cql ${CASS_HOSTNAME} ${PORT}; then >&2 echo "Success - admin.cql - Admin keyspace created"; else >&2 echo "Failure - admin.cql"; exit 0; fi - echo "admin_pw.cql file:" - cat /cql/admin_pw.cql + >&2 echo "Running admin_pw.cql file:" >&2 echo "Running cqlsh -u $DEF_USER -p $DEF_PASS -f /cql/admin_pw.cql ${CASS_HOSTNAME} ${PORT}" sleep 1; - if cqlsh -u $DEF_USER -p $DEF_PASS -f /cql/admin_pw.cql ${CASS_HOSTNAME} ${PORT}; + if cqlsh $TO -u $DEF_USER -p $DEF_PASS -f /cql/admin_pw.cql ${CASS_HOSTNAME} ${PORT}; then >&2 echo "Success - admin_pw.cql - Password Changed"; else @@ -54,16 +73,17 @@ if [ $CASS_HOSTNAME ]; then exit 0; fi - for f in /cql/extra/*; do - case "$f" in - *.cql) - echo "$0: running $f" && cqlsh -u ${USERNAME} -p ${PASSWORD} -f "$f" ${CASS_HOSTNAME} ${PORT}; - ;; - *) - echo "$0: ignoring $f" - ;; - esac - done + >&2 echo "Running Test - look for admin keyspace:" + >&2 echo "Running cqlsh -u $USERNAME -p $PASSWORD -e "select * from system_auth.roles;" ${CASS_HOSTNAME} ${PORT}" + sleep 1; + if cqlsh $TO -u $USERNAME -p $PASSWORD -e "select * from system_auth.roles;" ${CASS_HOSTNAME} ${PORT} + then + >&2 echo "Success - running test"; + else + >&2 echo "Failure - running test"; + exit 0; + fi + else >&2 echo "Missing CASS_HOSTNAME"; exit 0; diff --git a/musictrigger/assembly.xml b/musictrigger/assembly.xml index 90178d8f..34451eef 100644 --- a/musictrigger/assembly.xml +++ b/musictrigger/assembly.xml @@ -19,4 +19,4 @@ <outputDirectory>.</outputDirectory> </fileSet> </fileSets> -</assembly> +</assembly>
\ No newline at end of file diff --git a/musictrigger/src/MusicTrigger.java b/musictrigger/src/MusicTrigger.java index b5894da1..eb79cb8c 100755 --- a/musictrigger/src/MusicTrigger.java +++ b/musictrigger/src/MusicTrigger.java @@ -51,15 +51,23 @@ import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; + public class MusicTrigger implements ITrigger { private static final Logger logger = LoggerFactory.getLogger(MusicTrigger.class); - public Collection<Mutation> augment(Partition partition) { + new Thread(new Runnable() { + public void run() { + makeAsyncCall(partition); + } + }).start(); + return Collections.emptyList(); + } + + private void makeAsyncCall(Partition partition) { boolean isDelete = false; - logger.info("Step 1: "+partition.partitionLevelDeletion().isLive()); if(partition.partitionLevelDeletion().isLive()) { } else { @@ -69,6 +77,7 @@ public class MusicTrigger implements ITrigger { logger.info("MusicTrigger isDelete: " + isDelete); String ksName = partition.metadata().ksName; String tableName = partition.metadata().cfName; + String pkValue = partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey()); logger.info("MusicTrigger Table: " + tableName); boolean isInsert = checkQueryType(partition); org.json.simple.JSONObject obj = new org.json.simple.JSONObject(); @@ -121,7 +130,7 @@ public class MusicTrigger implements ITrigger { } } } catch (Exception e) { - + logger.info("Exception while constructing.. "+e.getMessage()); } obj.put("updateList", updateList); } else { @@ -132,11 +141,12 @@ public class MusicTrigger implements ITrigger { logger.info("Sending response: "+obj.toString()); try { notifyMusic(obj.toString()); + logger.info("MUSIC was notified.. "+obj.toString()); } catch(Exception e) { - e.printStackTrace(); logger.error("Notification failed..."+e.getMessage()); + logger.info("Notification failed..."+e.getMessage()); } - return Collections.emptyList(); + } private int fromByteArray(byte[] bytes) { @@ -160,62 +170,41 @@ public class MusicTrigger implements ITrigger { } private void notifyMusic(String request) { - System.out.println("notifyMusic..."); + logger.info("notifyMusic..."); Client client = Client.create(); WebResource webResource = client.resource("http://localhost:8080/MUSIC/rest/v2/admin/callbackOps"); JSONObject data = new JSONObject(); data.setData(request); - - ClientResponse response = webResource.accept("application/json").type("application/json") + ClientResponse response = null; + try { + response = webResource.accept("application/json").type("application/json") .post(ClientResponse.class, data); + } catch (Exception e) { + logger.info("Exception while notifying MUSIC. Retrying.."); + try { + response = webResource.accept("application/json").type("application/json") + .post(ClientResponse.class, data); + } catch (Exception e1) { + logger.info("Exception while notifying MUSIC. Stopping retry attempts.."); + } + } if(response.getStatus() != 200){ - System.out.println("Exception while notifying MUSIC..."); + logger.info("Exception while notifying MUSIC..."); + try { + response = webResource.accept("application/json").type("application/json") + .post(ClientResponse.class, data); + } catch (Exception e) { + logger.info("Exception while notifying MUSIC. Retrying.."); + try { + response = webResource.accept("application/json").type("application/json") + .post(ClientResponse.class, data); + } catch (Exception e1) { + logger.info("Exception while notifying MUSIC. Stopping retry attempts.."); + } + } } - /*response.getHeaders().put(HttpHeaders.CONTENT_TYPE, Arrays.asList(MediaType.APPLICATION_JSON)); - response.bufferEntity(); - String x = response.getEntity(String.class); - System.out.println("Response: "+x);*/ - } - /*public Collection<Mutation> augment(Partition partition) { - - String tableName = partition.metadata().cfName; - System.out.println("Table: " + tableName); - - JSONObject obj = new JSONObject(); - obj.put("message_id", partition.metadata().getKeyValidator().getString(partition.partitionKey().getKey())); - - - try { - UnfilteredRowIterator it = partition.unfilteredIterator(); - while (it.hasNext()) { - Unfiltered un = it.next(); - Clustering clt = (Clustering) un.clustering(); - Iterator<Cell> cls = partition.getRow(clt).cells().iterator(); - Iterator<ColumnDefinition> columns = partition.getRow(clt).columns().iterator(); - - while(cls.hasNext()){ - Cell cell = cls.next(); - String data = new String(cell.value().array()); // If cell type is text - System.out.println(cell + " : " +data); - - } - while(columns.hasNext()){ - ColumnDefinition columnDef = columns.next(); - Cell cell = cls.next(); - String data = new String(cell.value().array()); // If cell type is text - obj.put(columnDef.toString(), data); - } - } - } catch (Exception e) { - } - - System.out.println(obj.toString()); - - return Collections.emptyList(); - }*/ - }
\ No newline at end of file @@ -25,7 +25,7 @@ <groupId>org.onap.music</groupId> <artifactId>MUSIC</artifactId> <packaging>war</packaging> - <version>3.0.22</version> + <version>3.0.24</version> <description> This is the MUSIC REST interface, packaged as a war file. </description> @@ -171,6 +171,12 @@ </build> <dependencies> + <!-- Added to fix MUSIC-157 License Issue --> + <dependency> + <groupId>javax.xml.bind</groupId> + <artifactId>jaxb-api</artifactId> + <version>2.2.3</version> + </dependency> <!-- Development --> <dependency> <groupId>javax.servlet</groupId> @@ -184,12 +190,6 @@ <version>3.0.1</version> <scope>provided</scope> </dependency> - <!-- /Development --> - <!-- <dependency> - <groupId>com.hazelcast</groupId> - <artifactId>hazelcast-client</artifactId> - <version>3.7.1</version> - </dependency> --> <!-- Logging --> <dependency> <groupId>ch.qos.logback</groupId> @@ -338,11 +338,6 @@ <artifactId>jbcrypt</artifactId> <version>0.4</version> </dependency> - <dependency> - <groupId>com.owlike</groupId> - <artifactId>genson</artifactId> - <version>1.3</version> - </dependency> </dependencies> diff --git a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java index 33128f3c..0e365650 100755 --- a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java @@ -22,28 +22,18 @@ package org.onap.music.rest; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; -import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.POST; @@ -76,24 +66,26 @@ import org.onap.music.main.ResultType; import org.onap.music.main.ReturnType; import org.onap.music.response.jsonobjects.JsonResponse; -import com.datastax.driver.core.ColumnDefinitions; -import com.datastax.driver.core.ColumnDefinitions.Definition; import com.datastax.driver.core.DataType; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; -import com.datastax.driver.core.TableMetadata; import com.datastax.driver.core.exceptions.InvalidQueryException; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.json.JSONConfiguration; -import com.sun.jersey.client.urlconnection.HTTPSProperties; import com.sun.jersey.core.util.Base64; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import com.datastax.driver.core.TableMetadata; + +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import com.datastax.driver.core.ColumnDefinitions; +import com.datastax.driver.core.ColumnDefinitions.Definition; +import com.datastax.driver.core.TableMetadata; +//import java.util.Base64.Encoder; +//import java.util.Base64.Decoder; @Path("/v2/admin") // @Path("/v{version: [0-9]+}/admin") @@ -432,7 +424,6 @@ public class RestMusicAdminAPI { Map<String, Object> resultMap = new HashMap<>(); try { logger.info(EELFLoggerDelegate.applicationLogger, "Got notification: " + inputJsonObj.getData()); - logger.info("Got notification: " + inputJsonObj.getData()); String dataStr = inputJsonObj.getData(); JSONCallbackResponse jsonResponse = mapper.readValue(dataStr, JSONCallbackResponse.class); String operation = jsonResponse.getOperation(); @@ -452,6 +443,22 @@ public class RestMusicAdminAPI { if(notifiyList == null || notifiyList.isEmpty()) { logger.info("Is cache empty? reconstructing Object from cache.."); constructJsonCallbackFromCache(); + /*notifiyList = CachingUtil.getCallbackNotifyList(); + if("update".equals(operation)) { + List<String> updateList = jsonResponse.getUpdateList(); + //logger.info("update list from trigger: "+updateList); + for(String element : updateList) { + logger.info("element: "+element); + logger.info("notifiyList: "+notifiyList); + if(notifiyList.contains(element)) { + logger.info("Found the notifyOn property: "+element); + field_value = element; + } + } + } + + baseRequestObj = CachingUtil.getCallBackCache(field_value); + logger.info("Reconstructing Object from cache is Successful.."+baseRequestObj);*/ } notifiyList = CachingUtil.getCallbackNotifyList(); JsonCallback baseRequestObj = null; @@ -474,45 +481,45 @@ public class RestMusicAdminAPI { break; } } - if(baseRequestObj == null || field_value == null) { - for(String element: inputUpdateList) { - String[] elementArr = element.split(":"); - String newElement = null; - if(elementArr.length >= 2) { - newElement = elementArr[0]+":"+elementArr[1]; - } - baseRequestObj = CachingUtil.getCallBackCache(newElement); - if(baseRequestObj != null) { - logger.info("Found the element that was changed... "+newElement); - break; - } - } - for(String element : updateList) { - String[] elementArr = element.split(":"); - String newElement = null; - if(elementArr.length >= 2) { - newElement = elementArr[0]+":"+elementArr[1]; - } - if(notifiyList.contains(newElement)) { - logger.info("Found the notifyOn property: "+newElement); - field_value = newElement; - break; - } - } + if(baseRequestObj == null || field_value == null) { + for(String element: inputUpdateList) { + String[] elementArr = element.split(":"); + String newElement = null; + if(elementArr.length >= 2) { + newElement = elementArr[0]+":"+elementArr[1]; + } + baseRequestObj = CachingUtil.getCallBackCache(newElement); + if(baseRequestObj != null) { + logger.info("Found the element that was changed... "+newElement); + break; + } + } + for(String element : updateList) { + String[] elementArr = element.split(":"); + String newElement = null; + if(elementArr.length >= 2) { + newElement = elementArr[0]+":"+elementArr[1]; + } + if(notifiyList.contains(newElement)) { + logger.info("Found the notifyOn property: "+newElement); + field_value = newElement; + break; + } + } } } else { field_value = jsonResponse.getFull_table(); baseRequestObj = CachingUtil.getCallBackCache(field_value); } - if(baseRequestObj == null || field_value == null) { + if(baseRequestObj == null) { resultMap.put("Exception", "Oops. Something went wrong. Please make sure Callback properties are onboarded."); logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.INCORRECTDATA, ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR); return Response.status(Status.BAD_REQUEST).entity(resultMap).build(); } - logger.info(EELFLoggerDelegate.applicationLogger, "Going through list: "+operation+ " && List: "+jsonResponse.getUpdateList()); + logger.info("Going through list: "+operation+ " && List: "+jsonResponse.getUpdateList()); String key = "admin" + "." + "notification_master" + "." + baseRequestObj.getUuid(); String lockId = MusicCore.createLockReference(key); @@ -521,7 +528,7 @@ public class RestMusicAdminAPI { logger.error(EELFLoggerDelegate.errorLogger, "Some other node is notifying the caller..: "); } - logger.info(EELFLoggerDelegate.applicationLogger, operation+ ": Operation :: changeValue: "+changeValueMap); + logger.info(operation+ ": Operation :: changeValue: "+changeValueMap); if(operation.equals("update")) { String notifyWhenChangeIn = baseRequestObj.getNotifyWhenChangeIn(); // conductor.plans.status if(null!=field_value) { @@ -547,125 +554,28 @@ public class RestMusicAdminAPI { MusicCore.releaseLock(lockId, true); } catch(Exception e) { e.printStackTrace(); - logger.error(EELFLoggerDelegate.errorLogger, "Exception while notifying...."+e.getMessage()); + logger.info("Exception..."); } logger.info(EELFLoggerDelegate.applicationLogger, "callback is completed. Notification was sent from Music..."); return Response.status(Status.OK).entity(resultMap).build(); } - private void notifyCallBackAppl(JSONCallbackResponse jsonResponse, JsonCallback baseRequestObj) throws Exception { + private void notifyCallBackAppl(JSONCallbackResponse jsonResponse, JsonCallback baseRequestObj) { int notifytimeout = MusicUtil.getNotifyTimeout(); int notifyinterval = MusicUtil.getNotifyInterval(); String endpoint = baseRequestObj.getApplicationNotificationEndpoint(); String username = baseRequestObj.getApplicationUsername(); String password = baseRequestObj.getApplicationPassword(); JsonNotification jsonNotification = constructJsonNotification(jsonResponse, baseRequestObj); - jsonNotification.setPassword("************"); jsonNotification.setOperation_type(jsonResponse.getOperation()); - logger.info(EELFLoggerDelegate.applicationLogger, "Notification Response sending is: "+jsonNotification); - logger.info("Notification Response sending is: "+jsonNotification); - jsonNotification.setPassword(baseRequestObj.getApplicationPassword()); + logger.info(EELFLoggerDelegate.applicationLogger, "Notification Response sent is: "+jsonNotification); WebResource webResource = client.resource(endpoint); String authData = username+":"+password; byte[] plainCredsBytes = authData.getBytes(); byte[] base64CredsBytes = Base64.encode(plainCredsBytes); String base64Creds = new String(base64CredsBytes); - ClientConfig config = new DefaultClientConfig(); - config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); + Map<String, String> response_body = baseRequestObj.getResponseBody(); ClientResponse response = null; - WebResource service = null; - boolean ok = false; - try { - Client client = Client.create(config); - TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){ - public X509Certificate[] getAcceptedIssuers(){return null;} - public void checkClientTrusted(X509Certificate[] certs, String authType){} - public void checkServerTrusted(X509Certificate[] certs, String authType){} - }}; - - // Install the all-trusting trust manager - try { - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new SecureRandom()); - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - } catch (Exception e) { - ; - } - - try { - SSLContext sslcontext = SSLContext.getInstance( "TLS" ); - sslcontext.init( null, null, null ); - Map<String, Object> properties = config.getProperties(); - HTTPSProperties httpsProperties = new HTTPSProperties( - new HostnameVerifier() { - @Override - public boolean verify( String s, SSLSession sslSession ) { - return true; - } - }, sslcontext - ); - properties.put( HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, httpsProperties ); - HttpsURLConnection.setDefaultHostnameVerifier (new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } - }); - Client.create( config ); - } - catch ( KeyManagementException | NoSuchAlgorithmException e ) { - throw new RuntimeException( e ); - } - - service = client.resource(endpoint); - - response = service.header("Authorization", "Basic " + base64Creds).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON) - .post(ClientResponse.class, jsonNotification); - - } catch (Exception chf) { - logger.info(EELFLoggerDelegate.applicationLogger, "Is Service down?"); - logger.info("An Exception occured while notifying. "+chf+ " : "+chf.getMessage() +" ...Retrying for: "+notifytimeout); - } - if(response != null && response.getStatus() == 200) ok = true; - if(!ok) { - long now= System.currentTimeMillis(); - long end = now+notifytimeout; - while(! ok) { - logger.info(EELFLoggerDelegate.applicationLogger, "retrying since error in notifying callback for "+notifytimeout+"ms"); - logger.info("retrying since error in notifying callback.. response status: "+ (response == null ? "404" : response.getStatus())); - try { - ok = true; - response = service.header("Authorization", "Basic " + base64Creds).accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON) - .post(ClientResponse.class, jsonNotification); - if(response != null && response.getStatus() == 200) ok = true; - else if(System.currentTimeMillis() < end) { - try{ Thread.sleep(notifyinterval); } catch(Exception e1) {} - ok = false; - } - }catch (Exception e) { - logger.info(EELFLoggerDelegate.applicationLogger, "Retry until "+(end-System.currentTimeMillis())); - if(response == null && System.currentTimeMillis() < end) ok = false; - else ok = true; - try{ Thread.sleep(notifyinterval); } catch(Exception e1) {} - } - } - } - - if(response == null) { - logger.error(EELFLoggerDelegate.errorLogger, "Can NOT notify the caller as caller failed to respond.."); - return; - } - try { - JsonNotifyClientResponse responseStr = response.getEntity(JsonNotifyClientResponse.class); - logger.info(EELFLoggerDelegate.applicationLogger, "Response from Notified client: "+responseStr); - logger.info("Response from Notified client: "+responseStr); - } catch(Exception e) { - logger.info("Exception while reading response from Caller"); - logger.error("Exception while reading response from Caller"); - logger.error(EELFLoggerDelegate.errorLogger, "Can NOT notify the caller as caller failed to respond.."); - } - - /*ClientResponse response = null; try { response = webResource.header("Authorization", "Basic " + base64Creds).accept("application/json").type("application/json") .post(ClientResponse.class, jsonNotification); @@ -704,7 +614,7 @@ public class RestMusicAdminAPI { .post(ClientResponse.class, jsonNotification); } logger.info(EELFLoggerDelegate.applicationLogger, "Exception while notifying.. "+response.getStatus()); - }*/ + } } private JsonNotification constructJsonNotification(JSONCallbackResponse jsonResponse, JsonCallback baseRequestObj) { @@ -725,66 +635,64 @@ public class RestMusicAdminAPI { String primaryId = tableInfo.getPrimaryKey().get(0).getName(); Map<String, String> responseBodyMap = baseRequestObj.getResponseBody(); - for (Entry<String, String> entry : new HashSet<>(responseBodyMap.entrySet())) { - String trimmed = entry.getKey().trim(); - if (!trimmed.equals(entry.getKey())) { - responseBodyMap.remove(entry.getKey()); - responseBodyMap.put(trimmed, entry.getValue()); - } + Map<String, String> newMap = new HashMap<>(); + if(responseBodyMap.size() == 1 && responseBodyMap.containsKey("")) { + jsonNotification.setResponse_body(newMap); + } else { + for (Entry<String, String> entry : new HashSet<>(responseBodyMap.entrySet())) { + String trimmed = entry.getKey().trim(); + if (!trimmed.equals(entry.getKey())) { + responseBodyMap.remove(entry.getKey()); + responseBodyMap.put(trimmed, entry.getValue()); + } + } + + Set<String> keySet = responseBodyMap.keySet(); + String cql = "select *"; + /*for(String keys: keySet) { + cql = cql + keys + ","; + }*/ + //cql = cql.substring(0, cql.length()-1); + cql = cql + " FROM "+fullNotifyArr[0]+" WHERE "+primaryId+" = ?"; + logger.info("CQL in constructJsonNotification: "+cql); + PreparedQueryObject pQuery = new PreparedQueryObject(); + pQuery.appendQueryString(cql); + pQuery.addValue(MusicUtil.convertToActualDataType(primaryIdType, pkValue)); + Row row = MusicCore.get(pQuery).one(); + if(row != null) { + ColumnDefinitions colInfo = row.getColumnDefinitions(); + for (Definition definition : colInfo) { + String colName = definition.getName(); + if(keySet.contains(colName)) { + DataType colType = definition.getType(); + Object valueObj = MusicCore.getDSHandle().getColValue(row, colName, colType); + Object valueString = MusicUtil.convertToActualDataType(colType, valueObj); + logger.info(colName+" : "+valueString); + newMap.put(colName, valueString.toString()); + keySet.remove(colName); + } + } + } + if(! keySet.isEmpty()) { + Iterator<String> iterator = keySet.iterator(); + while (iterator.hasNext()) { + String element = iterator.next(); + if(element != null && element.length() > 0) + newMap.put(element,"COLUMN_NOT_FOUND"); + } + } + + if("delete".equals(jsonResponse.getOperation()) || newMap.isEmpty()) { + newMap.put(primaryId, pkValue); + } + jsonNotification.setResponse_body(newMap); } - - Set<String> keySet = responseBodyMap.keySet(); - Map<String, String> newMap = new HashMap<>(); - if(responseBodyMap.size() == 1 && responseBodyMap.containsKey("")) { - jsonNotification.setResponse_body(newMap); - return jsonNotification; - } - logger.info(EELFLoggerDelegate.applicationLogger, "responseBodyMap is not blank: "+responseBodyMap); - String cql = "select *"; - /*for(String keys: keySet) { - cql = cql + keys + ","; - }*/ - //cql = cql.substring(0, cql.length()-1); - cql = cql + " FROM "+fullNotifyArr[0]+" WHERE "+primaryId+" = ?"; - logger.info(EELFLoggerDelegate.applicationLogger, "CQL in constructJsonNotification: "+cql); - PreparedQueryObject pQuery = new PreparedQueryObject(); - pQuery.appendQueryString(cql); - pQuery.addValue(MusicUtil.convertToActualDataType(primaryIdType, pkValue)); - Row row = MusicCore.get(pQuery).one(); - if(row != null) { - ColumnDefinitions colInfo = row.getColumnDefinitions(); - for (Definition definition : colInfo) { - String colName = definition.getName(); - if(keySet.contains(colName)) { - DataType colType = definition.getType(); - Object valueObj = MusicCore.getDSHandle().getColValue(row, colName, colType); - Object valueString = MusicUtil.convertToActualDataType(colType, valueObj); - logger.info(colName+" : "+valueString); - newMap.put(colName, valueString.toString()); - keySet.remove(colName); - } - } - } - if(! keySet.isEmpty()) { - Iterator<String> iterator = keySet.iterator(); - while (iterator.hasNext()) { - String element = iterator.next(); - newMap.put(element,"COLUMN_NOT_FOUND"); - } - } - - if("delete".equals(jsonResponse.getOperation()) || newMap.isEmpty()) { - newMap.put(primaryId, pkValue); - } - jsonNotification.setResponse_body(newMap); - } catch(Exception e) { - e.printStackTrace(); - } - return jsonNotification; + } catch(Exception e) { + e.printStackTrace(); + } + return jsonNotification; } - - private void constructJsonCallbackFromCache() throws Exception{ PreparedQueryObject pQuery = new PreparedQueryObject(); JsonCallback jsonCallback = null; @@ -794,6 +702,7 @@ public class RestMusicAdminAPI { + " notify_delete_on, notify_update_on, request, notifyon from admin.notification_master allow filtering"; pQuery.appendQueryString(cql); //pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), fullTable)); + logger.info("Query: "+pQuery.getQuery()); ResultSet rs = MusicCore.get(pQuery); Iterator<Row> it = rs.iterator(); @@ -821,7 +730,7 @@ public class RestMusicAdminAPI { jsonCallback.setNotifyWhenDeletesIn(delete); jsonCallback.setNotifyWhenChangeIn(update); jsonCallback.setUuid(uuid); - logger.info(EELFLoggerDelegate.applicationLogger, "From DB. Saved request_body: "+request); + logger.info("From DB. Saved request_body: "+request); request = request.substring(1, request.length()-1); String[] keyValuePairs = request.split(","); Map<String,String> responseBody = new HashMap<>(); @@ -833,9 +742,9 @@ public class RestMusicAdminAPI { val = entry[1]; responseBody.put(entry[0], val); } - logger.info(EELFLoggerDelegate.applicationLogger, "After parsing. Saved request_body: "+responseBody); + logger.info("After parsing. Saved request_body: "+responseBody); jsonCallback.setResponseBody(responseBody); - logger.info(EELFLoggerDelegate.applicationLogger, "Updating Cache with updateCallBackCache: "+notifyon+ " :::: "+jsonCallback); + logger.info("Updating Cache with updateCallBackCache: "+notifyon+ " :::: "+jsonCallback); CachingUtil.updateCallBackCache(notifyon, jsonCallback); } CachingUtil.updateCallbackNotifyList(notifyList); @@ -907,6 +816,7 @@ public class RestMusicAdminAPI { jsonCallback.setNotifyWhenInsertsIn(inserts); jsonCallback.setResponseBody(responseBody); CachingUtil.updateCallBackCache(notify_field, jsonCallback); + logger.info("Cache updated "); pQuery = new PreparedQueryObject(); pQuery.appendQueryString(cql); ResultType nonKeyRelatedPut = MusicCore.nonKeyRelatedPut(pQuery, MusicUtil.EVENTUAL); @@ -923,27 +833,6 @@ public class RestMusicAdminAPI { } return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Callback api successfully registered").toMap()).build(); } - - @DELETE - @Path("/onboardCallback") - @Produces(MediaType.APPLICATION_JSON) - @Consumes(MediaType.APPLICATION_JSON) - public Response deleteCallbackProp(JsonNotification jsonNotification) { - Map<String, Object> resultMap = new HashMap<>(); - ResponseBuilder response = - Response.noContent().header("X-latestVersion", MusicUtil.getVersion()); - String notifyOn = jsonNotification.getNotify_field(); - PreparedQueryObject pQuery = new PreparedQueryObject(); - try { - pQuery.appendQueryString("DELETE FROM admin.notification_master WHERE notifyon = ?"); - pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), notifyOn)); - MusicCore.nonKeyRelatedPut(pQuery, MusicUtil.EVENTUAL); - } catch(Exception e) { - e.printStackTrace(); - return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setMessage("Callback api registration failed").toMap()).build(); - } - return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Callback api successfully deleted").toMap()).build(); - } /*public String encodePwd(String password) { return Base64.getEncoder().encodeToString(password.getBytes()); diff --git a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java b/src/main/java/org/onap/music/rest/RestMusicDataAPI.java index 592b744b..2d1a8836 100755 --- a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicDataAPI.java @@ -157,13 +157,14 @@ public class RestMusicDataAPI { String password = userCredentials.get(MusicUtil.PASSWORD); Map<String, Object> authMap = CachingUtil.verifyOnboarding(ns, userId, password); if (!authMap.isEmpty()) { - logger.error(EELFLoggerDelegate.errorLogger,"authMap has an error. verifyOnboarding may have failed silently", AppMessages.MISSINGDATA ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); + logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGDATA ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); response.status(Status.UNAUTHORIZED); - return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } if(kspObject == null || kspObject.getReplicationInfo() == null) { + authMap.put(ResultType.EXCEPTION.getResult(), ResultType.BODYMISSING.getResult()); response.status(Status.BAD_REQUEST); - return response.entity(new JsonResponse(ResultType.FAILURE).setError(ResultType.BODYMISSING.getResult()).toMap()).build(); + return response.entity(authMap).build(); } @@ -182,7 +183,7 @@ public class RestMusicDataAPI { } else { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGDATA ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); response.status(Status.UNAUTHORIZED); - return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } } @@ -367,7 +368,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } String consistency = MusicUtil.EVENTUAL; // for now this needs only eventual consistency @@ -593,7 +594,7 @@ public class RestMusicDataAPI { if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); response.status(Status.UNAUTHORIZED); - return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } MultivaluedMap<String, String> rowParams = info.getQueryParameters(); String indexName = ""; @@ -661,7 +662,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } Map<String, Object> valuesMap = insObj.getValues(); @@ -871,7 +872,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } long startTime = System.currentTimeMillis(); String operationId = UUID.randomUUID().toString();// just for infoging @@ -1084,7 +1085,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } if(delObj == null) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGDATA ,ErrorSeverity.WARN, ErrorTypes.DATAERROR); @@ -1219,7 +1220,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } String consistency = "eventual";// for now this needs only eventual // consistency @@ -1274,7 +1275,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"Error while authentication... ", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } String lockId = selObj.getConsistencyInfo().get("lockId"); @@ -1357,7 +1358,7 @@ public class RestMusicDataAPI { authMap.remove("aid"); if (!authMap.isEmpty()) { logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.AUTHENTICATIONERROR ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR); - return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Exception"))).toMap()).build(); + return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(authMap.get("Error"))).toMap()).build(); } PreparedQueryObject queryObject = new PreparedQueryObject(); diff --git a/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java b/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java index 44b4a514..895f0abf 100644 --- a/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java +++ b/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java @@ -111,28 +111,10 @@ public class RestMusicHealthCheckAPI { } } - @GET - @Path("/musicHealthCheck") - @ApiOperation(value = "Get Health Status", response = Map.class) - @Produces(MediaType.APPLICATION_JSON) - public Response musicHealthCheck() { - logger.info(EELFLoggerDelegate.applicationLogger,"Replying to request for Health Check status for MUSIC"); - Map<String, Object> resultMap = new HashMap<>(); - MusicHealthCheck healthCheck = new MusicHealthCheck(); - String status = healthCheck.getZookeeperStatus(); - if(status.equals("ACTIVE")) { - resultMap.put("ZooKeeper", "Active"); - }else { - resultMap.put("ZooKeeper", "Inactive"); - } - status = healthCheck.getCassandraStatus(ConsistencyLevel.ANY.toString()); - if(status.equals("ACTIVE")) { - resultMap.put("Cassandra", "Active"); - } else { - resultMap.put("Cassandra", "Inactive"); - } - resultMap.put("MUSIC", "Active"); - return Response.status(Status.OK).entity(resultMap).build(); - } + + + + + } diff --git a/version.properties b/version.properties index ecd85846..36a7f087 100755 --- a/version.properties +++ b/version.properties @@ -4,7 +4,7 @@ major=3 minor=0 -patch=22 +patch=24 base_version=${major}.${minor}.${patch} |