diff options
12 files changed, 242 insertions, 33 deletions
diff --git a/docs/release-notes.rst b/docs/release-notes.rst index e736d848..d5da2fb7 100644 --- a/docs/release-notes.rst +++ b/docs/release-notes.rst @@ -5,31 +5,33 @@ Release Notes ============= -Initial Release for El Alto +Initial Release for Frankfurt -Version: 3.2.35 +Version: 3.2.40 --------------- -:Release Date: 2019-09-19 +:Release Date: 2020-05-20 **New Features** -- MUSIC features an 'ORM' layer. Applications directly using music will now have a streamlined API that matches the REST API for easier adoption and use. +- MUSIC now runs on a springboot server, instead of a standalone tomcat server -- MUSIC includes deadlock detection when creating and acquiring locks +- HTTPS support for clients through AAF certificates -- Continued adherence to ONAP S3P requirements +- A background lock clean up daemon will periodically check the status of current locks, cleaning up 'stale' references. +Clients should see a performance boost if they were previously dealing with many stale locks. +- Improved error messaging to the user, allowing clients to better debug their applications -**Bug Fixes** +- Continued adherence to ONAP S3P requirements - - `MUSIC-434 <https://jira.onap.org/browse/MUSIC-434>`_ Sonar Fix : JsonDelete.java - - `MUSIC-432 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-432`_ Use try-with resources to handle the resources used in the code +**Bug Fixes** + - `MUSIC-573 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-573`_ Pods still run as root - - `MUSIC-410 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-410>`_ Use logger to log exception + - `MUSIC-557 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-557`_ Test coverage goals met, and migrated to new sonar location - - `MUSIC-408 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-408>`_ fix reduce method parameter + - `MUSIC-530 <https://jira.onap.org/browse/MUSIC-530>`_ Security Vulnerability in pom.xml fix @@ -43,7 +45,7 @@ MUSIC code has been formally scanned during build time using NexusIQ and all Cri Quick Links: - `MUSIC project page <https://wiki.onap.org/display/DW/MUSIC+Project>`_ -- `MUSIC Dublin Release <https://wiki.onap.org/display/DW/MUSIC+El-Alto>`_ +- `MUSIC Frankfurt Release <https://wiki.onap.org/display/DW/MUSIC+Frankfurt>`_ - `Passing Badge information for MUSIC <https://bestpractices.coreinfrastructure.org/en/projects/1722>`_ - `MUSIC Architecture Page <TBD>`_ - `Project Vulnerability Review Table for MUSIC <https://wiki.onap.org/pages/viewpage.action?pageId=64004601>`_ diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java index cd767a44..29fdb1d4 100644 --- a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java +++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java @@ -190,7 +190,6 @@ public class JsonUpdate implements Serializable { } EELFLoggerDelegate.mdcPut("keyspace", "( "+this.getKeyspaceName()+" ) "); - long startTime = System.currentTimeMillis(); String operationId = UUID.randomUUID().toString(); // just for infoging purposes. String consistency = this.getConsistencyInfo().get("type"); @@ -311,9 +310,6 @@ public class JsonUpdate implements Serializable { conditionInfo = new Condition(this.getConditions(), selectQuery); } - ReturnType operationResult = null; - long jsonParseCompletionTime = System.currentTimeMillis(); - if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && this.getConsistencyInfo().get("consistency") != null) { if(MusicUtil.isValidConsistency(this.getConsistencyInfo().get("consistency"))) { queryObject.setConsistency(this.getConsistencyInfo().get("consistency")); @@ -376,7 +372,7 @@ public class JsonUpdate implements Serializable { } public String getRowIdString() { - return this.rowIdString.toString(); + return this.rowIdString; } public void setRowIdString(String rowIdString) { diff --git a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java index 0c5d39c8..9a69a9ba 100644 --- a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java +++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java @@ -503,7 +503,7 @@ public class CassaLockStore { } public List<String> getAllLocksForOwner(String ownerId, String keyspace, String table) throws MusicServiceException, MusicQueryException { - List<String> toRet = new ArrayList<String>(); + List<String> toRet = new ArrayList<>(); String lockTable = table_prepend_name + table; PreparedQueryObject queryObject = new PreparedQueryObject(); queryObject.appendQueryString("SELECT key, lockreference FROM " + keyspace + "." + lockTable); diff --git a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java index 492a48f0..623a07c7 100644 --- a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java +++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java @@ -23,12 +23,10 @@ package org.onap.music.lockingservice.cassandra; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.onap.music.datastore.MusicDataStoreHandle; import org.onap.music.datastore.PreparedQueryObject; import org.onap.music.eelf.logging.EELFLoggerDelegate; -import org.onap.music.exceptions.MusicQueryException; import org.onap.music.exceptions.MusicServiceException; import org.onap.music.main.MusicCore; import org.onap.music.main.MusicUtil; @@ -58,7 +56,8 @@ public class LockCleanUpDaemon extends Thread { try { Thread.sleep(MusicUtil.getLockDaemonSleepTimeMs()); } catch (InterruptedException e) { - e.printStackTrace(); + logger.warn(EELFLoggerDelegate.applicationLogger, "Interrupted exception", e); + } } } @@ -110,12 +109,14 @@ public class LockCleanUpDaemon extends Thread { private void deleteLockIfStale(String lockTable, Row lock) throws MusicServiceException { - if (lock.isNull("createtime") && lock.isNull("acquiretime")) { + final String CREATETIME="createtime"; + final String ACQUIRETIME="acquiretime"; + if (lock.isNull(CREATETIME) && lock.isNull("acquiretime")) { return; } - long createTime = lock.isNull("createtime") ? 0 : Long.parseLong(lock.getString("createtime")); - long acquireTime = lock.isNull("acquiretime") ? 0 : Long.parseLong(lock.getString("acquiretime")); + long createTime = lock.isNull(CREATETIME) ? 0 : Long.parseLong(lock.getString(CREATETIME)); + long acquireTime = lock.isNull(ACQUIRETIME) ? 0 : Long.parseLong(lock.getString(ACQUIRETIME)); long row_access_time = Math.max(createTime, acquireTime); if (System.currentTimeMillis() > row_access_time + MusicUtil.getDefaultLockLeasePeriod()) { logger.info(EELFLoggerDelegate.applicationLogger, "Stale lock detected and being removed: " + lock); diff --git a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java index 00187dc8..14fb8135 100644 --- a/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java +++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java @@ -39,15 +39,18 @@ import org.onap.music.eelf.logging.format.ErrorTypes; // the state variable that will be stored in the locking service, capturing the transitions of public class MusicLockState implements Serializable { + // captures the state of the lock public enum LockStatus { UNLOCKED, BEING_LOCKED, LOCKED - };// captures the state of the lock + } + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicLockState.class); private LockStatus lockStatus; private boolean needToSyncQuorum = false; private String lockHolder; - private long leasePeriod = Long.MAX_VALUE, leaseStartTime = -1; + private long leasePeriod = Long.MAX_VALUE; + private long leaseStartTime = -1; private String errorMessage = null; public MusicLockState(String errorMessage) { diff --git a/music-core/src/main/java/org/onap/music/main/CipherUtil.java b/music-core/src/main/java/org/onap/music/main/CipherUtil.java index 3278dc12..9a8ff69d 100644 --- a/music-core/src/main/java/org/onap/music/main/CipherUtil.java +++ b/music-core/src/main/java/org/onap/music/main/CipherUtil.java @@ -168,7 +168,8 @@ public class CipherUtil { */ public static String encryptPKC(String value, String skey) { Cipher cipher = null; - byte[] iv = null, finalByte = null; + byte[] iv = null; + byte[] finalByte = null; try { cipher = Cipher.getInstance(ALGORYTHM_DETAILS, "SunJCE"); diff --git a/music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java b/music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java index 4de995f7..9260cd92 100644 --- a/music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java +++ b/music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java @@ -80,10 +80,6 @@ public class MusicDataStoreTest { dataStore = new MusicDataStore(cluster, session); } - @Test - public void testMusicDataStore() { - //MusicDataStore mds = new MusicDataStore(); - } @Test public void testMusicDataStoreClusterSession() { diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JSONObjectTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JSONObjectTest.java new file mode 100644 index 00000000..9fb549d2 --- /dev/null +++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JSONObjectTest.java @@ -0,0 +1,54 @@ + +/*- + * ============LICENSE_START========================================== + * ONAP MUSIC + * =================================================================== + * Copyright (C) 2020 IBM Intellectual Property. All rights reserved. + * =================================================================== + * + * Unless otherwise specified, all software contained herein is licensed + * under the Apache License, Version 2.0 (the "License"); + * you may not use this software except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Unless otherwise specified, all documentation contained herein is licensed + * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); + * you may not use this documentation except in compliance with the License. + * You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ============LICENSE_END============================================ + * + * + */ +package org.onap.music.datastore.jsonobjects; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class JSONObjectTest { + + @Test + public void testGetData(){ + JSONObject js=new JSONObject(); + js.setData("test"); + assertEquals(js.getData(),"test"); + + } +} diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java index 0014f823..5b9cef8b 100644 --- a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java +++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java @@ -82,4 +82,32 @@ public class JsonDeleteTest { } + @Test + public void testGetKeyspaceName() { + jd.setKeyspaceName("keyspace"); + assertEquals("keyspace",jd.getKeyspaceName()); + + } + + @Test + public void testGetTableName() { + jd.setTableName("tablename"); + assertEquals("tablename",jd.getTableName()); + + } + + @Test + public void testGetPrimarKeyValue() { + jd.setPrimarKeyValue("primarykey"); + assertEquals("primarykey",jd.getPrimarKeyValue()); + + } + + @Test + public void testRowIdString() { + StringBuilder builder = new StringBuilder("testing"); + jd.setRowIdString(builder); + assertEquals(jd.getRowIdString().toString(),builder.toString()); + } + } diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java index 21c022ab..baada1d5 100644 --- a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java +++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java @@ -33,10 +33,10 @@ import java.util.Map; import org.junit.Test; public class JsonSelectTest { + JsonSelect js = new JsonSelect(); @Test public void testGetConsistencyInfo() { - JsonSelect js = new JsonSelect(); Map<String, String> mapSs = new HashMap<>(); mapSs.put("k1", "one"); js.setConsistencyInfo(mapSs); @@ -45,11 +45,24 @@ public class JsonSelectTest { @Test public void testSerialize() throws IOException { - JsonSelect js = new JsonSelect(); Map<String, String> mapSs = new HashMap<>(); mapSs.put("Key", "Value"); js.setConsistencyInfo(mapSs); js.serialize(); } + @Test + public void testGetKeyspaceName() { + js.setKeyspaceName("testkeyspace"); + assertEquals("testkeyspace",js.getKeyspaceName()); + + } + + @Test + public void testGetTableName() { + js.setTableName("testkeyspace"); + assertEquals("testkeyspace",js.getTableName()); + + } + } diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/RowIdentifierTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/RowIdentifierTest.java new file mode 100644 index 00000000..e29f0377 --- /dev/null +++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/RowIdentifierTest.java @@ -0,0 +1,60 @@ +/*- + * ============LICENSE_START========================================== + * ONAP MUSIC + * =================================================================== + * Copyright (C) 2020 IBM Intellectual Property. All rights reserved. + * =================================================================== + * + * Unless otherwise specified, all software contained herein is licensed + * under the Apache License, Version 2.0 (the "License"); + * you may not use this software except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Unless otherwise specified, all documentation contained herein is licensed + * under the Creative Commons License, Attribution 4.0 Intl. (the "License"); + * you may not use this documentation except in compliance with the License. + * You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ============LICENSE_END============================================ + * + * + */ +package org.onap.music.datastore.jsonobjects; + +import org.onap.music.datastore.PreparedQueryObject; +import org.onap.music.datastore.jsonobjects.JsonUpdate; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class RowIdentifierTest { + String primarykey="primarykey"; + String rowIdString="123"; + PreparedQueryObject queryObject=new PreparedQueryObject("select * from employee"); + JsonUpdate ju=new JsonUpdate(); + JsonUpdate.RowIdentifier rowId= ju.new RowIdentifier(primarykey,rowIdString,queryObject); + @Test + public void testConstructor(){ + rowId.setPrimaryKeyValue(primarykey); + rowId.setRowIdString(rowIdString); + assertEquals(rowId.getPrimaryKeyValue(),"primarykey"); + assertEquals(rowId.getRowIdString(),"123"); + } +} diff --git a/music-rest/src/test/java/org/onap/music/eelf/logging/MusicContainerFilterTest.java b/music-rest/src/test/java/org/onap/music/eelf/logging/MusicContainerFilterTest.java new file mode 100644 index 00000000..cd7a9ca4 --- /dev/null +++ b/music-rest/src/test/java/org/onap/music/eelf/logging/MusicContainerFilterTest.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * ============LICENSE_START========================================== + * org.onap.music + * =================================================================== + * Copyright (c) 2019 AT&T Intellectual Property + * =================================================================== + * Modifications Copyright (C) 2020 IBM. + * =================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * ============LICENSE_END============================================= + * ==================================================================== + *******************************************************************************/ +package org.onap.music.eelf.logging; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; + +import org.springframework.stereotype.Component; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.music.main.MusicUtil; + +public class MusicContainerFilterTest { + MusicContainerFilter filter; + + @Before + public void setup() throws IOException { + filter = new MusicContainerFilter(); + } + + @Test + public void testDoFilter() throws IOException { + ContainerResponseFilter fil=Mockito.mock(ContainerResponseFilter.class); + ContainerRequestContext req=Mockito.mock(ContainerRequestContext.class); + ContainerResponseContext res=Mockito.mock(ContainerResponseContext.class); + filter.filter(req,res); + } + +} |