aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore12
-rw-r--r--.readthedocs.yaml20
-rw-r--r--Dockerfile4
-rw-r--r--WebContent/WEB-INF/music.properties.sample2
-rw-r--r--WebContent/WEB-INF/web.xml14
-rw-r--r--distribution/cassandra_job/Dockerfile9
-rw-r--r--distribution/dockermusic/README.md48
-rw-r--r--distribution/dockermusic/logs/README.md1
-rwxr-xr-xdistribution/dockermusic/music.sh101
-rw-r--r--distribution/dockermusic/properties/music.properties24
-rw-r--r--distribution/music/Dockerfile11
-rw-r--r--distribution/music/build.sh10
-rw-r--r--docs/.gitignore3
-rw-r--r--docs/_static/css/ribbon.css63
-rwxr-xr-xdocs/_static/favicon.icobin0 -> 2102 bytes
-rw-r--r--docs/_static/logo_onap_2017.pngbin0 -> 12278 bytes
-rw-r--r--docs/architecture.rst1
-rw-r--r--docs/conf.py15
-rw-r--r--docs/conf.yaml7
-rwxr-xr-xdocs/index.rst1
-rw-r--r--docs/offeredapis.rst1
-rw-r--r--docs/release-notes.rst41
-rw-r--r--docs/requirements-docs.txt15
-rw-r--r--docs/tox.ini22
-rw-r--r--examples/VotingApp/src/main/java/main/MusicConnector.java5
-rwxr-xr-xjar/pom.xml79
-rw-r--r--jar/src/main/java/org/onap/music/datastore/MusicDataStore.java36
-rwxr-xr-xjar/src/main/java/org/onap/music/main/CachingUtil.java2
-rwxr-xr-xjar/src/main/java/org/onap/music/main/MusicUtil.java8
-rwxr-xr-xjar/src/main/java/org/onap/music/main/PropertiesListener.java2
-rwxr-xr-xjar/src/main/java/org/onap/music/rest/RestMusicDataAPI.java14
-rw-r--r--jar/version.properties2
-rwxr-xr-xmusic-core/pom.xml459
-rw-r--r--music-core/src/main/java/LICENSE.txt (renamed from src/main/java/LICENSE.txt)0
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/Condition.java (renamed from src/main/java/org/onap/music/datastore/Condition.java)21
-rwxr-xr-xmusic-core/src/main/java/org/onap/music/datastore/MusicDataStore.java (renamed from src/main/java/org/onap/music/datastore/MusicDataStore.java)344
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java127
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/PreparedQueryObject.java (renamed from src/main/java/org/onap/music/datastore/PreparedQueryObject.java)82
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java (renamed from src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java)2
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java313
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonIndex.java120
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java415
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java163
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java (renamed from src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java)13
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLock.java (renamed from src/main/java/org/onap/music/datastore/jsonobjects/AAFResponse.java)33
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java208
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java363
-rw-r--r--music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java436
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java (renamed from src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java)57
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java (renamed from src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java)9
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/logging/format/AppMessages.java (renamed from src/main/java/org/onap/music/eelf/logging/format/AppMessages.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java (renamed from src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java)2
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java (renamed from src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java (renamed from src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/exceptions/MusicDeadlockException.java75
-rw-r--r--music-core/src/main/java/org/onap/music/exceptions/MusicLockingException.java (renamed from src/main/java/org/onap/music/exceptions/MusicLockingException.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java (renamed from src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/exceptions/MusicQueryException.java (renamed from src/main/java/org/onap/music/exceptions/MusicQueryException.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/exceptions/MusicServiceException.java (renamed from src/main/java/org/onap/music/exceptions/MusicServiceException.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java613
-rw-r--r--music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java133
-rw-r--r--music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockType.java (renamed from src/main/java/org/onap/music/datastore/jsonobjects/NameSpace.java)34
-rw-r--r--music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java (renamed from src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java)22
-rw-r--r--music-core/src/main/java/org/onap/music/main/CipherUtil.java279
-rw-r--r--music-core/src/main/java/org/onap/music/main/CorePropertiesLoader.java120
-rw-r--r--music-core/src/main/java/org/onap/music/main/DeadlockDetectionUtil.java152
-rw-r--r--music-core/src/main/java/org/onap/music/main/MusicCore.java264
-rw-r--r--[-rwxr-xr-x]music-core/src/main/java/org/onap/music/main/MusicUtil.java (renamed from src/main/java/org/onap/music/main/MusicUtil.java)649
-rw-r--r--music-core/src/main/java/org/onap/music/main/ResultType.java (renamed from src/main/java/org/onap/music/main/ResultType.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/main/ReturnType.java (renamed from src/main/java/org/onap/music/main/ReturnType.java)0
-rw-r--r--music-core/src/main/java/org/onap/music/service/MusicCoreService.java189
-rw-r--r--music-core/src/main/java/org/onap/music/service/impl/MusicCassaCore.java1236
-rw-r--r--music-core/src/main/resources/LICENSE.txt (renamed from src/main/resources/LICENSE.txt)0
-rw-r--r--music-core/src/main/resources/Resources.properties (renamed from src/main/resources/Resources.properties)0
-rw-r--r--music-core/src/main/resources/logback.xml273
-rw-r--r--music-core/src/main/resources/project.properties5
-rw-r--r--music-core/src/main/webapp/WEB-INF/.gitignore1
-rw-r--r--music-core/src/test/java/LICENSE.txt (renamed from src/test/java/LICENSE.txt)0
-rw-r--r--music-core/src/test/java/org/onap/music/cassandra/MusicUtilTest.java (renamed from src/test/java/org/onap/music/unittests/MusicUtilTest.java)244
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/ConditionTest.java61
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java436
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/PreparedQueryObjectTest.java101
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JSONObjectTest.java54
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonDeleteTest.java)31
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonIndexTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonOnboardTest.java)65
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonInsertTest.java176
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonKeySpaceTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonKeySpaceTest.java)3
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonLockTest.java50
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonSelectTest.java)20
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonTableTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonTableTest.java)57
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonUpdateTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonUpdateTest.java)59
-rw-r--r--music-core/src/test/java/org/onap/music/datastore/jsonobjects/RowIdentifierTest.java60
-rw-r--r--music-core/src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java (renamed from src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorSeverityTest.java41
-rw-r--r--music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorTypesTest.java48
-rw-r--r--music-core/src/test/java/org/onap/music/exceptions/MusicDeadlockExceptionTest.java135
-rw-r--r--music-core/src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java (renamed from src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java (renamed from src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java (renamed from src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java (renamed from src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/lockingservice/cassandra/CassaLockStoreTest.java311
-rw-r--r--music-core/src/test/java/org/onap/music/lockingservice/cassandra/MusicLockStateTest.java86
-rw-r--r--music-core/src/test/java/org/onap/music/main/CipherUtilTest.java55
-rw-r--r--music-core/src/test/java/org/onap/music/main/DeadlockDetectionUtilTest.java87
-rw-r--r--music-core/src/test/java/org/onap/music/main/MusicCoreTest.java391
-rw-r--r--music-core/src/test/java/org/onap/music/main/ResultTypeTest.java (renamed from src/test/java/org/onap/music/unittests/ResultTypeTest.java)3
-rw-r--r--music-core/src/test/java/org/onap/music/main/ReturnTypeTest.java (renamed from src/test/java/org/onap/music/unittests/ReturnTypeTest.java)4
-rw-r--r--music-core/src/test/java/org/onap/music/service/impl/MusicCassaCoreTest.java485
-rw-r--r--music-core/src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java)0
-rw-r--r--music-core/src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java)7
-rw-r--r--music-core/src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java)0
-rw-r--r--music-core/src/test/resources/LICENSE.txt24
-rw-r--r--music-core/src/test/resources/Resources.properties50
-rw-r--r--[-rwxr-xr-x]music-core/src/test/resources/application.properties (renamed from src/main/resources/application.properties)0
-rw-r--r--music-core/src/test/resources/cache.ccf (renamed from src/main/resources/cache.ccf)0
-rw-r--r--music-core/src/test/resources/logback.xml (renamed from src/main/resources/logback.xml)0
-rw-r--r--music-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker (renamed from src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker)0
-rw-r--r--music-core/src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider (renamed from src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider)0
-rw-r--r--music-core/src/test/resources/project.properties (renamed from src/main/resources/project.properties)0
-rw-r--r--music-rest/distribution/README.md (renamed from distribution/README.md)0
-rw-r--r--music-rest/distribution/cassandra/Dockerfile (renamed from distribution/cassandra/Dockerfile)0
-rw-r--r--music-rest/distribution/cassandra/cassandra.yaml (renamed from distribution/cassandra/cassandra.yaml)0
-rw-r--r--music-rest/distribution/cassandra/docker-entrypoint.sh (renamed from distribution/cassandra/docker-entrypoint.sh)46
-rw-r--r--music-rest/distribution/cassandra_job/Dockerfile30
-rw-r--r--music-rest/distribution/cassandra_job/admin.cql (renamed from distribution/cassandra_job/admin.cql)0
-rw-r--r--music-rest/distribution/cassandra_job/admin_pw.cql (renamed from distribution/cassandra_job/admin_pw.cql)0
-rw-r--r--music-rest/distribution/cassandra_job/runcql.sh (renamed from distribution/cassandra_job/runcql.sh)21
-rw-r--r--music-rest/distribution/cassandra_job/test.cql (renamed from distribution/cassandra_job/test.cql)0
-rw-r--r--music-rest/distribution/music/Dockerfile35
-rw-r--r--music-rest/distribution/music/startup.sh68
-rwxr-xr-xmusic-rest/pom.xml385
-rw-r--r--music-rest/src/main/java/LICENSE.txt24
-rwxr-xr-xmusic-rest/src/main/java/org/onap/music/JerseyConfig.java87
-rwxr-xr-xmusic-rest/src/main/java/org/onap/music/MusicApplication.java (renamed from src/main/java/org/onap/music/MusicApplication.java)146
-rw-r--r--music-rest/src/main/java/org/onap/music/authentication/AuthUtil.java276
-rw-r--r--music-rest/src/main/java/org/onap/music/authentication/AuthorizationError.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/AAFResponseTest.java)59
-rw-r--r--music-rest/src/main/java/org/onap/music/authentication/CadiAuthFilter.java65
-rw-r--r--music-rest/src/main/java/org/onap/music/authentication/MusicAuthorizationFilter.java122
-rw-r--r--music-rest/src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java (renamed from src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java)0
-rw-r--r--music-rest/src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java (renamed from src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java)98
-rw-r--r--music-rest/src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java (renamed from src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java)131
-rw-r--r--music-rest/src/main/java/org/onap/music/conductor/conditionals/UpdateDataObject.java119
-rw-r--r--music-rest/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java138
-rw-r--r--music-rest/src/main/java/org/onap/music/eelf/logging/MusicContainerFilter.java68
-rw-r--r--music-rest/src/main/java/org/onap/music/eelf/logging/MusicLoggingServletFilter.java207
-rw-r--r--music-rest/src/main/java/org/onap/music/exceptions/MusicAuthenticationException.java (renamed from src/main/java/org/onap/music/main/MusicDigest.java)60
-rw-r--r--music-rest/src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java (renamed from src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java)22
-rw-r--r--music-rest/src/main/java/org/onap/music/main/PropertiesLoader.java373
-rw-r--r--music-rest/src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java (renamed from src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java)93
-rw-r--r--music-rest/src/main/java/org/onap/music/rest/Application.java (renamed from src/main/java/org/onap/music/rest/Application.java)0
-rwxr-xr-xmusic-rest/src/main/java/org/onap/music/rest/RestMusicDataAPI.java1052
-rw-r--r--music-rest/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java (renamed from src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java)28
-rw-r--r--music-rest/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java632
-rwxr-xr-xmusic-rest/src/main/java/org/onap/music/rest/RestMusicQAPI.java443
-rw-r--r--music-rest/src/main/java/org/onap/music/rest/RestMusicTestAPI.java (renamed from src/main/java/org/onap/music/rest/RestMusicTestAPI.java)2
-rw-r--r--music-rest/src/main/java/org/onap/music/rest/RestMusicVersionAPI.java (renamed from src/main/java/org/onap/music/rest/RestMusicVersionAPI.java)32
-rwxr-xr-xmusic-rest/src/main/resources/application.properties9
-rw-r--r--music-rest/src/main/resources/key.properties1
-rw-r--r--music-rest/src/test/java/LICENSE.txt24
-rw-r--r--music-rest/src/test/java/org/onap/music/JerseyConfigTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/NameSpaceTest.java)43
-rw-r--r--music-rest/src/test/java/org/onap/music/conductor/conditionals/JsonConditionalTest.java82
-rw-r--r--music-rest/src/test/java/org/onap/music/conductor/conditionals/UpdateDataObjectTest.java98
-rw-r--r--music-rest/src/test/java/org/onap/music/eelf/healthcheck/MusicHealthCheckTest.java61
-rw-r--r--music-rest/src/test/java/org/onap/music/eelf/logging/MusicContainerFilterTest.java55
-rw-r--r--music-rest/src/test/java/org/onap/music/eelf/logging/MusicLoggingServletFilterTest.java64
-rw-r--r--music-rest/src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java (renamed from src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java)0
-rw-r--r--music-rest/src/test/java/org/onap/music/main/PropertiesLoaderTest.java146
-rw-r--r--music-rest/src/test/java/org/onap/music/rest/ApplicationTest.java94
-rw-r--r--music-rest/src/test/java/org/onap/music/rest/RestMusicTestAPITest.java66
-rw-r--r--music-rest/src/test/java/org/onap/music/rest/RestMusicVersionAPITest.java63
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/CassandraCQL.java (renamed from src/test/java/org/onap/music/unittests/CassandraCQL.java)6
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/JsonResponseTest.java (renamed from src/test/java/org/onap/music/unittests/JsonResponseTest.java)39
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/MusicDataStoreTest.java (renamed from src/test/java/org/onap/music/unittests/MusicDataStoreTest.java)3
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java (renamed from src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java)193
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java116
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java (renamed from src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java)3
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java (renamed from src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java)378
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java768
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/authentication/AuthUtilTest.java123
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/authentication/AuthorizationErrorTest.java (renamed from src/test/java/org/onap/music/unittests/jsonobjects/MusicDigestTest.java)39
-rw-r--r--music-rest/src/test/java/org/onap/music/unittests/authentication/CadiAuthFilterTest.java63
-rw-r--r--music-rest/src/test/resources/logback.xml302
-rwxr-xr-xpom.xml578
-rw-r--r--postman/MusicLocal.postman_collection.json2
-rw-r--r--releases/3.2.34.yaml5
-rw-r--r--releases/3.2.35.yaml5
-rw-r--r--releases/3.2.38-container.yaml8
-rw-r--r--releases/3.2.38.yaml5
-rw-r--r--releases/3.2.39-container.yaml8
-rw-r--r--releases/3.2.39.yaml5
-rw-r--r--releases/3.2.40-container.yaml8
-rw-r--r--releases/3.2.40.yaml5
-rwxr-xr-xsrc/main/java/org/onap/music/JerseyConfig.java68
-rwxr-xr-xsrc/main/java/org/onap/music/authentication/CachingUtil.java445
-rw-r--r--src/main/java/org/onap/music/authentication/CadiAuthFilter.java110
-rw-r--r--src/main/java/org/onap/music/authentication/MusicAAFAuthentication.java183
-rw-r--r--src/main/java/org/onap/music/authentication/MusicAuthenticator.java62
-rw-r--r--src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java112
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java90
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java140
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java78
-rwxr-xr-xsrc/main/java/org/onap/music/datastore/jsonobjects/JsonOnboard.java94
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java61
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java135
-rw-r--r--src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java141
-rw-r--r--src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java254
-rw-r--r--src/main/java/org/onap/music/main/MusicCore.java162
-rw-r--r--src/main/java/org/onap/music/main/PropertiesLoader.java187
-rwxr-xr-xsrc/main/java/org/onap/music/rest/RestMusicAdminAPI.java496
-rwxr-xr-xsrc/main/java/org/onap/music/rest/RestMusicDataAPI.java1531
-rw-r--r--src/main/java/org/onap/music/rest/RestMusicLocksAPI.java457
-rwxr-xr-xsrc/main/java/org/onap/music/rest/RestMusicQAPI.java452
-rw-r--r--src/main/java/org/onap/music/service/MusicCoreService.java110
-rw-r--r--src/main/java/org/onap/music/service/impl/MusicCassaCore.java709
-rw-r--r--src/test/java/org/onap/music/unittests/TestsUsingCassandra.java113
-rw-r--r--src/test/java/org/onap/music/unittests/TstCachingUtil.java167
-rw-r--r--src/test/java/org/onap/music/unittests/TstRestMusicAdminAPI.java449
-rw-r--r--src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java491
-rw-r--r--src/test/java/org/onap/music/unittests/jsonobjects/JsonInsertTest.java86
-rwxr-xr-xversion.properties2
220 files changed, 16975 insertions, 9669 deletions
diff --git a/.gitignore b/.gitignore
index 0631baac..62501cf8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,7 +15,11 @@ src/main/webapp
.DS_Store
._*
+# Ignore jars
+**/*.jar
*.jar
+
+
.metadata
# Eclipse stuff
.settings/
@@ -29,3 +33,11 @@ debug-logs/
docs/Makefile
docs/_build
docs/conf.py
+
+#VSCODE
+.VSCODE
+.attach_pid*
+
+
+#jmeter
+jmeter.log
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 00000000..3797dc8b
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,20 @@
+---
+# .readthedocs.yml
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+# Required
+version: 2
+
+formats:
+ - htmlzip
+
+build:
+ image: latest
+
+python:
+ version: 3.7
+ install:
+ - requirements: docs/requirements-docs.txt
+
+sphinx:
+ configuration: docs/conf.py
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 0c06fba5..00000000
--- a/Dockerfile
+++ /dev/null
@@ -1,4 +0,0 @@
-FROM busybox:latest
-RUN mkdir -p app
-COPY maven/ app/
-CMD ["tail", "-f", "/dev/null"]
diff --git a/WebContent/WEB-INF/music.properties.sample b/WebContent/WEB-INF/music.properties.sample
index 871b0c3f..41b919fe 100644
--- a/WebContent/WEB-INF/music.properties.sample
+++ b/WebContent/WEB-INF/music.properties.sample
@@ -14,5 +14,7 @@ all.public.ips=12.13.14.45:12.13.14.46:12.13.14.47
# Cassandra Username and password
cassandra.user=cassandra
cassandra.password=cassandra
+cassandra.connecttimeoutms=5000
+cassandra.readtimeoutms=5000
# AAF Endpoint
aaf.endpoint.url=http://aafendpoint/proxy/authz/nss/ \ No newline at end of file
diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml
index 1d18ab8f..f6c4986e 100644
--- a/WebContent/WEB-INF/web.xml
+++ b/WebContent/WEB-INF/web.xml
@@ -1,15 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MUSIC</display-name>
+ <!--
<listener>
- <listener-class>
- org.onap.music.main.PropertiesListener
- </listener-class>
+ <listener-class>
+ org.onap.music.main.PropertiesListener
+ </listener-class>
</listener>
+ -->
<listener>
- <listener-class>
- org.onap.music.main.CronJobManager
- </listener-class>
+ <listener-class>
+ org.onap.music.main.CronJobManager
+ </listener-class>
</listener>
<servlet>
<servlet-name>music-servlet</servlet-name>
diff --git a/distribution/cassandra_job/Dockerfile b/distribution/cassandra_job/Dockerfile
deleted file mode 100644
index 528c3bf4..00000000
--- a/distribution/cassandra_job/Dockerfile
+++ /dev/null
@@ -1,9 +0,0 @@
-#registry.hub.docker.com/
-FROM library/cassandra:3.11
-ENV DEF_USER=cassandra
-ENV DEF_PASS=cassandra
-COPY runcql.sh /
-RUN mkdir -p cql/extra && \
- chmod 755 runcql.sh && \
- chown cassandra runcql.sh
-CMD ["/runcql.sh"]
diff --git a/distribution/dockermusic/README.md b/distribution/dockermusic/README.md
deleted file mode 100644
index a645ce70..00000000
--- a/distribution/dockermusic/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-### Docker Setup for Single instance of MUSIC
-
-<p>Please update the <b>properties/music.properties</b> file to fit your env.<br/>
-Update the music.sh file.<br/>
-The beginning of the <b>music.sh</b> file contains various variables.<br/></p>
-NEXUS_DOCKER_REPO - default REPO - Will read /opt/config/nexus_docker_repo.txt if other is needed.<br/>
-CASS_IMG - Cassandra Image<br/>
-TOMCAT_IMG - Tomcat Image<br/>
-ZK_IMG - Zookeeper Image<br/>
-MUSIC_IMG - Music Image containing the MUSIC war file.<br/>
-WORK_DIR - Default to PWD.<br/>
-CASS_USERNAME - Username for Cassandra - should match cassandra.user in music.properties
-file<br/>
-CASS_PASSWORD - Password for Cassandra - should match cassandra.password in music.properties.<br/>
-
-MUSIC Logs will be saved in logs/MUSIC after start of tomcat.<br/>
-
-```bash
-# Start containers
-./music.sh start
-# Stop containers
-./music.sh stop
-```
-
-If you want to check out Cassandra db with cqlsh.
-```bash
-docker exec –it music-db bash
-#at the prompt youcan run cqlsh as:
-cqlsh –u <user> -p <password>
-```
-
-Zookeeper:
-
-```bash
-docker exec –it music-zk bash
-#and then run:
-zkCli.sh
-```
-
-For other logs do <br/>
-```bash
-docker logs music-tomcat (tomcat)<br/>
-```
-to have rolling logs use –f as docker logs –f music-tomcat<br/>
-```bash
-docker logs music-zk (zookeeper)<br/>
-docker logs music-db (Cassandra )<br/>
-``` \ No newline at end of file
diff --git a/distribution/dockermusic/logs/README.md b/distribution/dockermusic/logs/README.md
deleted file mode 100644
index 88c252a7..00000000
--- a/distribution/dockermusic/logs/README.md
+++ /dev/null
@@ -1 +0,0 @@
-This folder is where the logs will be stored for MUSIC. \ No newline at end of file
diff --git a/distribution/dockermusic/music.sh b/distribution/dockermusic/music.sh
deleted file mode 100755
index e4c2af8c..00000000
--- a/distribution/dockermusic/music.sh
+++ /dev/null
@@ -1,101 +0,0 @@
-#
-# -------------------------------------------------------------------------
-# Copyright (c) 2017 AT&T Intellectual Property
-#
-# 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.
-#
-# -------------------------------------------------------------------------
-# In this example we are building a docker bridge network(music-net) for all
-# the containers
-# Then we connect the host bridge network(bridge) to the internal network(music-net)
-#
-#
-#
-SS=0
-if [ -e /opt/config/nexus_docker_repo.txt ]
-then
- NEXUS_DOCKER_REPO=$(cat /opt/config/nexus_docker_repo.txt)
-else
- NEXUS_DOCKER_REPO=nexus3.onap.org:10001
-fi
-echo "Using ${NEXUS_DOCKER_REPO} for docker Repo"
-
-CASS_IMG=${NEXUS_DOCKER_REPO}/onap/music/cassandra_music:latest
-MUSIC_IMG=${NEXUS_DOCKER_REPO}/onap/music/music:latest
-TOMCAT_IMG=library/tomcat:8.5
-ZK_IMG=library/zookeeper:3.4
-WORK_DIR=${PWD}
-CASS_USERNAME=cassandra1
-CASS_PASSWORD=cassandra1
-
-if [ "$1" = "start" ]; then
-
-# Create Volume for mapping war file and tomcat
-docker volume create music-vol;
-
-# Create a network for all the containers to run in.
-docker network create music-net;
-
-# Start Cassandra
-docker run -d --rm --name music-db --network music-net \
--p "7000:7000" -p "7001:7001" -p "7199:7199" -p "9042:9042" -p "9160:9160" \
--e CASSUSER=${CASS_USERNAME} \
--e CASSPASS=${CASS_PASSWORD} \
-${CASS_IMG};
-
-# Start Music war
-docker run -d --rm --name music-war \
--v music-vol:/app \
-${MUSIC_IMG};
-
-# Start Zookeeper
-docker run -d --rm --name music-zk --network music-net \
--p "2181:2181" -p "2888:2888" -p "3888:3888" \
-${ZK_IMG};
-
-# Delay for Cassandra
-sleep 20;
-
-# Start Up tomcat - Needs to have properties,logs dir and war file volume mapped.
-docker run -d --rm --name music-tomcat --network music-net -p "8080:8080" \
--v music-vol:/usr/local/tomcat/webapps \
--v ${WORK_DIR}/properties:/opt/app/music/etc:ro \
--v ${WORK_DIR}/logs:/opt/app/music/logs \
-${TOMCAT_IMG};
-
-# Connect tomcat to host bridge network so that its port can be seen.
-docker network connect bridge music-tomcat;
-SS=1;
-fi
-
-
-# Shutdown and clean up.
-if [ "$1" = "stop" ]; then
-docker stop music-war;
-docker stop music-db;
-docker stop music-zk;
-docker stop music-tomcat;
-docker network rm music-net;
-sleep 5;
-docker volume rm music-vol;
-SS=1
-fi
-
-if [ $SS = 0 ]; then
- echo "Please type ${0} start or ${0} stop"
-fi
-
-
-
-
-
diff --git a/distribution/dockermusic/properties/music.properties b/distribution/dockermusic/properties/music.properties
deleted file mode 100644
index d0c50400..00000000
--- a/distribution/dockermusic/properties/music.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-my.public.ip=localhost
-all.public.ips=localhost
-my.id=0
-all.ids=0
-#######################################
-# Optional current values are defaults
-#######################################
-zookeeper.host=music-zk
-cassandra.host=music-db
-#music.ip=localhost
-#debug=true
-#music.rest.ip=localhost
-#lock.lease.period=6000
-cassandra.user=cassandra1
-cassandra.password=cassandra1
-# AAF Endpoint if using AAF
-aaf.endpoint.url=https://aafist.test.att.com:8095/proxy/authz/nss/
-#aaf.endpoint.url=https://aaf.api.simpledemo.onap.org
-# Admin API
-aaf.admin.url=https://aafist.test.att.com:8095/proxy/authz/users/
-admin.aaf.role=com.att.music.api.admin_api
-music.namespace=com.att.music.api
-
-
diff --git a/distribution/music/Dockerfile b/distribution/music/Dockerfile
deleted file mode 100644
index b82b72a4..00000000
--- a/distribution/music/Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-FROM openjdk:8
-LABEL purpose="Springboot for MUSIC"
-RUN apt update && apt install -y netcat telnet vim vim-common
-RUN groupadd --gid 1000 music && useradd --gid 1000 --uid 1000 music
-RUN mkdir -p /opt/app/music
-COPY MUSIC.jar /opt/app/music
-RUN mkdir -p /opt/app/music/logs && \
- chown -R music:music /opt/app/music/
-USER music:music
-WORKDIR /opt/app/music
-CMD ["/bin/bash","-c","java -jar MUSIC.jar >> /opt/app/music/logs/music-sb.log 2>&1"]
diff --git a/distribution/music/build.sh b/distribution/music/build.sh
deleted file mode 100644
index 21e45268..00000000
--- a/distribution/music/build.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-if [ "${1}" ]; then
-
-docker build -t dockercentral.it.att.com:5100/com.att.music/music-sb:${1} .
-docker tag dockercentral.it.att.com:5100/com.att.music/music-sb:${1} dockercentral.it.att.com:5100/com.att.music/music-sb:latest
-docker push dockercentral.it.att.com:5100/com.att.music/music-sb:latest
-docker push dockercentral.it.att.com:5100/com.att.music/music-sb:${1}
-else
-echo "Missing version"
-
-fi
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000..43ca5b67
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,3 @@
+/.tox
+/_build/*
+/__pycache__/*
diff --git a/docs/_static/css/ribbon.css b/docs/_static/css/ribbon.css
new file mode 100644
index 00000000..6008cb1a
--- /dev/null
+++ b/docs/_static/css/ribbon.css
@@ -0,0 +1,63 @@
+.ribbon {
+ z-index: 1000;
+ background-color: #a00;
+ overflow: hidden;
+ white-space: nowrap;
+ position: fixed;
+ top: 25px;
+ right: -50px;
+ -webkit-transform: rotate(45deg);
+ -moz-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ -o-transform: rotate(45deg);
+ transform: rotate(45deg);
+ -webkit-box-shadow: 0 0 10px #888;
+ -moz-box-shadow: 0 0 10px #888;
+ box-shadow: 0 0 10px #888;
+
+}
+
+.ribbon a {
+ border: 1px solid #faa;
+ color: #fff;
+ display: block;
+ font: bold 81.25% 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ margin: 1px 0;
+ padding: 10px 50px;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 0 5px #444;
+ transition: 0.5s;
+}
+
+.ribbon a:hover {
+ background: #c11;
+ color: #fff;
+}
+
+
+/* override table width restrictions */
+@media screen and (min-width: 767px) {
+
+ .wy-table-responsive table td, .wy-table-responsive table th {
+ /* !important prevents the common CSS stylesheets from overriding
+ this as on RTD they are loaded after this stylesheet */
+ white-space: normal !important;
+ }
+
+ .wy-table-responsive {
+ overflow: visible !important;
+ }
+}
+
+@media screen and (max-width: 767px) {
+ .wy-table-responsive table td {
+ white-space: nowrap;
+ }
+}
+
+/* fix width of the screen */
+
+.wy-nav-content {
+ max-width: none;
+}
diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico
new file mode 100755
index 00000000..cb712ebd
--- /dev/null
+++ b/docs/_static/favicon.ico
Binary files differ
diff --git a/docs/_static/logo_onap_2017.png b/docs/_static/logo_onap_2017.png
new file mode 100644
index 00000000..5d064f43
--- /dev/null
+++ b/docs/_static/logo_onap_2017.png
Binary files differ
diff --git a/docs/architecture.rst b/docs/architecture.rst
index 74cb0c40..73cfbc2d 100644
--- a/docs/architecture.rst
+++ b/docs/architecture.rst
@@ -1,5 +1,6 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
+.. _architecture:
Architecture
============
diff --git a/docs/conf.py b/docs/conf.py
new file mode 100644
index 00000000..96a85251
--- /dev/null
+++ b/docs/conf.py
@@ -0,0 +1,15 @@
+from docs_conf.conf import *
+
+branch = 'latest'
+master_doc = 'index'
+
+linkcheck_ignore = [
+ 'http://localhost',
+]
+
+intersphinx_mapping = {}
+
+html_last_updated_fmt = '%d-%b-%y %H:%M'
+
+def setup(app):
+ app.add_stylesheet("css/ribbon.css") \ No newline at end of file
diff --git a/docs/conf.yaml b/docs/conf.yaml
new file mode 100644
index 00000000..ab592813
--- /dev/null
+++ b/docs/conf.yaml
@@ -0,0 +1,7 @@
+---
+project_cfg: onap
+project: onap
+
+# Change this to ReleaseBranchName to modify the header
+default-version: latest
+#
diff --git a/docs/index.rst b/docs/index.rst
index 437a50d8..19822636 100755
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,6 +1,7 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright 2017 AT&T Intellectual Property. All rights reserved.
+.. _master_index:
Music Developer Documentation
=============================
diff --git a/docs/offeredapis.rst b/docs/offeredapis.rst
index a9a59650..c75bd0c0 100644
--- a/docs/offeredapis.rst
+++ b/docs/offeredapis.rst
@@ -1,6 +1,7 @@
.. This work is licensed under a
Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
+.. _offeredapis:
Offered APIs
============
diff --git a/docs/release-notes.rst b/docs/release-notes.rst
index 0d1e1794..5e8885da 100644
--- a/docs/release-notes.rst
+++ b/docs/release-notes.rst
@@ -1,40 +1,41 @@
-.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. This work is licensed under a
+.. Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
+.. _release_notes:
Release Notes
=============
-Initial Release for Casablanca
+Initial Release for Frankfurt
-Version: 3.0.24
+Version: 3.2.40
---------------
-:Release Date: 2018-11-30
+:Release Date: 2020-05-20
**New Features**
-- MUSIC as a Service: while MUSIC was consumed internally by components in the Beijing release, in Casablanca MUSIC can be deployed as an independent multi-site clustered service
+- MUSIC now runs on a springboot server, instead of a standalone tomcat server
-- Designed MUSIC to be a fully sharded, scale out system, where as many ONAP sites/component replicas can be added as required for performance
+- HTTPS support for clients through AAF certificates
-- Automated failure detection and consistent failover across sites for ONAP components using MUSIC through the PROM recipe
+- 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
- Continued adherence to ONAP S3P requirements
**Bug Fixes**
+ - `MUSIC-573 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-573>`_ Pods still run as root
- - `MUSIC-176 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-176>`_ nc: bad address
-
- - `MUSIC-154 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-154>`_ Helm charts using latest tag name
-
- - `MUSIC-152 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-152>`_ MUSIC tomcat returning HTTP 401
-
- - `MUSIC-147 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-147>`_ Cassandra-job is failing
-
- - `MUSIC-143 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-143>`_ Translator Service not picking records from controller
+ - `MUSIC-557 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-557>`_ Test coverage goals met, and migrated to new sonar location
- - `MUSIC-78 <https://jira.onap.org/projects/MUSIC/issues/MUSIC-78>`_ Build failed to find artifact org.onap.music:MUSIC:jar:2.5.5
+ - `MUSIC-530 <https://jira.onap.org/browse/MUSIC-530>`_ Security Vulnerability in pom.xml fix
@@ -48,10 +49,10 @@ 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 Casablanca Release <https://wiki.onap.org/display/DW/MUSIC+Casablanca+Release>`_
+- `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 <https://onap.readthedocs.io/en/casablanca/submodules/music.git/docs/architecture.html>`_
-- `Project Vulnerability Review Table for MUSIC <https://wiki.onap.org/pages/viewpage.action?pageId=45285410>`_
+- `MUSIC Architecture Page <TBD>`_
+- `Project Vulnerability Review Table for MUSIC <https://wiki.onap.org/pages/viewpage.action?pageId=64004601>`_
**Upgrade Notes**
diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt
new file mode 100644
index 00000000..b3188ddd
--- /dev/null
+++ b/docs/requirements-docs.txt
@@ -0,0 +1,15 @@
+tox
+Sphinx
+doc8
+docutils
+setuptools
+six
+sphinx_rtd_theme>=0.4.3
+sphinxcontrib-blockdiag
+sphinxcontrib-needs>=0.2.3
+sphinxcontrib-nwdiag
+sphinxcontrib-seqdiag
+sphinxcontrib-swaggerdoc
+sphinxcontrib-plantuml
+sphinx_bootstrap_theme
+lfdocs-conf
diff --git a/docs/tox.ini b/docs/tox.ini
new file mode 100644
index 00000000..edac8c35
--- /dev/null
+++ b/docs/tox.ini
@@ -0,0 +1,22 @@
+[tox]
+minversion = 1.6
+envlist = docs,
+skipsdist = true
+
+[testenv:docs]
+basepython = python3
+deps = -r{toxinidir}/requirements-docs.txt
+commands =
+ sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html
+ echo "Generated docs available in {toxinidir}/_build/html"
+whitelist_externals =
+ echo
+ git
+ sh
+
+[testenv:docs-linkcheck]
+basepython = python3
+#deps = -r{toxinidir}/requirements-docs.txt
+commands = echo "Link Checking not enforced"
+#commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck
+whitelist_externals = echo
diff --git a/examples/VotingApp/src/main/java/main/MusicConnector.java b/examples/VotingApp/src/main/java/main/MusicConnector.java
index ab4d895d..7772c9f2 100644
--- a/examples/VotingApp/src/main/java/main/MusicConnector.java
+++ b/examples/VotingApp/src/main/java/main/MusicConnector.java
@@ -26,8 +26,7 @@ package main;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
-import java.util.Random;
-
+import java.security.SecureRandom;
public class MusicConnector {
//change this to point to relevant cluster
@@ -38,7 +37,7 @@ public class MusicConnector {
}
private String getMusicNodeIp(){
- Random r = new Random();
+ SecureRandom r = new SecureRandom();
int index = r.nextInt(musicNodes.length);
return musicNodes[index];
}
diff --git a/jar/pom.xml b/jar/pom.xml
index 6aef40eb..af4bdb6d 100755
--- a/jar/pom.xml
+++ b/jar/pom.xml
@@ -1,4 +1,4 @@
-<!--
+<!--
============LICENSE_START==========================================
org.onap.music
===================================================================
@@ -7,25 +7,25 @@
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=============================================
====================================================================
--->
+-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.onap.music</groupId>
<artifactId>MUSIC</artifactId>
<packaging>jar</packaging>
- <version>2.5.8</version>
+ <version>2.5.10-SNAPSHOT</version>
<description>
This is the MUSIC REST interface, packaged as a war file.
</description>
@@ -33,7 +33,7 @@
<parent>
<groupId>org.onap.oparent</groupId>
<artifactId>oparent</artifactId>
- <version>0.1.1</version>
+ <version>2.0.0</version>
<relativePath />
</parent>
@@ -44,6 +44,7 @@
<jaxrs.version>2.0.1</jaxrs.version>
<cassandra.version>3.4.0</cassandra.version>
<zookeeper.version>3.4.11</zookeeper.version>
+ <onap.nexus.url>https://nexus.onap.org</onap.nexus.url>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -214,15 +215,15 @@
<version>1.0.1-oss</version>
</dependency>
<!-- End Logging -->
-
- <!-- Cassandra -->
+
+ <!-- Cassandra -->
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>${cassandra.version}</version>
</dependency>
- <!-- /Cassandra -->
-
+ <!-- /Cassandra -->
+
<!-- Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
@@ -236,7 +237,7 @@
</exclusions>
</dependency>
<!-- /Zookeeper -->
-
+
<!-- Jersey -->
<dependency>
<groupId>com.sun.jersey</groupId>
@@ -253,10 +254,10 @@
<artifactId>jersey-json</artifactId>
<version>${jersey1.version}</version>
</dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-servlet</artifactId>
- <version>${jersey1.version}</version>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-servlet</artifactId>
+ <version>${jersey1.version}</version>
</dependency>
<!-- /Jersey -->
@@ -310,7 +311,32 @@
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-handler</artifactId>
- <version>4.0.56.Final</version>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-buffer</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-codec</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-common</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-resolver</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-transport</artifactId>
+ <version>4.1.33.Final</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@@ -333,10 +359,15 @@
<version>19.0</version>
</dependency>
<dependency>
+ <groupId>de.svenkubiak</groupId>
+ <artifactId>jBCrypt</artifactId>
+ <version>0.4.1</version>
+ </dependency>
+ <!-- <dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
- </dependency>
+ </dependency>-->
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
@@ -416,14 +447,14 @@
</build>
</image>
<!-- Zookeeper -->
- <!-- <image> <name>onap/music/zookeeper_music</name>
- <alias>docker_zookeeper</alias> <build> <cleanup>true</cleanup> <tags> <tag>3.4-${timestamp}</tag>
- <tag>3.4-latest</tag> </tags> <dockerFileDir>${project.basedir}/distribution/zookeeper</dockerFileDir>
+ <!-- <image> <name>onap/music/zookeeper_music</name>
+ <alias>docker_zookeeper</alias> <build> <cleanup>true</cleanup> <tags> <tag>3.4-${timestamp}</tag>
+ <tag>3.4-latest</tag> </tags> <dockerFileDir>${project.basedir}/distribution/zookeeper</dockerFileDir>
</build> </image> -->
<!-- tomcat 8.5 -->
- <!-- <image> <name>onap/music/tomcat_music</name>
- <alias>docker_tomcat</alias> <build> <cleanup>true</cleanup> <tags> <tag>8.5-${timestamp}</tag>
- <tag>8.5-latest</tag> </tags> <dockerFileDir>${project.basedir}/distribution/tomcat</dockerFileDir>
+ <!-- <image> <name>onap/music/tomcat_music</name>
+ <alias>docker_tomcat</alias> <build> <cleanup>true</cleanup> <tags> <tag>8.5-${timestamp}</tag>
+ <tag>8.5-latest</tag> </tags> <dockerFileDir>${project.basedir}/distribution/tomcat</dockerFileDir>
</build> </image>\ -->
</images>
</configuration>
diff --git a/jar/src/main/java/org/onap/music/datastore/MusicDataStore.java b/jar/src/main/java/org/onap/music/datastore/MusicDataStore.java
index 2fbca444..3cd8baeb 100644
--- a/jar/src/main/java/org/onap/music/datastore/MusicDataStore.java
+++ b/jar/src/main/java/org/onap/music/datastore/MusicDataStore.java
@@ -168,20 +168,18 @@ public class MusicDataStore {
.setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
while (it.hasNext()) {
try {
- if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
+ if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
+ .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
//.withLoadBalancingPolicy(new RoundRobinPolicy())
- .withoutJMXReporting()
- .withPoolingOptions(poolingOptions)
- .addContactPoints(addresses).build();
+ .withoutJMXReporting()
+ .withPoolingOptions(poolingOptions)
+ .addContactPoints(addresses).build();
}
else
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
//.withLoadBalancingPolicy(new RoundRobinPolicy())
- .addContactPoints(addresses).build();
+ .addContactPoints(addresses).build();
Metadata metadata = cluster.getMetadata();
logger.info(EELFLoggerDelegate.applicationLogger, "Connected to cassa cluster "
@@ -213,19 +211,15 @@ public class MusicDataStore {
addresses = address.split(",");
PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions
- .setConnectionsPerHost(HostDistance.LOCAL, 4, 10)
- .setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
+ .setConnectionsPerHost(HostDistance.LOCAL, 4, 10)
+ .setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
- //.withLoadBalancingPolicy(new RoundRobinPolicy())
- .withoutJMXReporting()
- .withPoolingOptions(poolingOptions)
- .addContactPoints(addresses).build();
- }
- else {
+ .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
+ .withoutJMXReporting()
+ .withPoolingOptions(poolingOptions)
+ .addContactPoints(addresses).build();
+ } else {
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
//.withLoadBalancingPolicy(new RoundRobinPolicy())
.withoutJMXReporting()
@@ -238,7 +232,9 @@ public class MusicDataStore {
try {
session = cluster.connect();
} catch (Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),AppMessages.CASSANDRACONNECTIVITY, ErrorSeverity.ERROR, ErrorTypes.SERVICEUNAVAILABLE);
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),
+ AppMessages.CASSANDRACONNECTIVITY,
+ ErrorSeverity.ERROR, ErrorTypes.SERVICEUNAVAILABLE);
throw new MusicServiceException(
"Error while connecting to Cassandra cluster.. " + ex.getMessage());
}
diff --git a/jar/src/main/java/org/onap/music/main/CachingUtil.java b/jar/src/main/java/org/onap/music/main/CachingUtil.java
index f0dc06fc..4b293bbb 100755
--- a/jar/src/main/java/org/onap/music/main/CachingUtil.java
+++ b/jar/src/main/java/org/onap/music/main/CachingUtil.java
@@ -319,7 +319,7 @@ public class CachingUtil implements Runnable {
Map<String, Object> resultMap = new HashMap<>();
if (ns == null || userId == null || password == null) {
logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- logger.error(EELFLoggerDelegate.errorLogger,"One or more required headers is missing. userId: "+userId+" :: password: "+password);
+ logger.error(EELFLoggerDelegate.errorLogger,"One or more required headers is missing.");
resultMap.put("Exception",
"One or more required headers appName(ns), userId, password is missing. Please check.");
return resultMap;
diff --git a/jar/src/main/java/org/onap/music/main/MusicUtil.java b/jar/src/main/java/org/onap/music/main/MusicUtil.java
index c36da9d7..4acc3c5a 100755
--- a/jar/src/main/java/org/onap/music/main/MusicUtil.java
+++ b/jar/src/main/java/org/onap/music/main/MusicUtil.java
@@ -82,7 +82,7 @@ public class MusicUtil {
"all.pubic.ips", "cassandra.user", "cassandra.password", "aaf.endpoint.url" };
private static String cassName = "cassandra";
- private static String cassPwd = "cassandra";
+ private static String cassPwd = "";
private static String aafEndpointUrl = null;
private static int cassandraPort = 9042;
@@ -569,12 +569,10 @@ public class MusicUtil {
}
String cassPwd = prop.getProperty("cassandra.password");
String isEncrypted = prop.getProperty("cassandra.password.isencrypted");
- logger.info(EELFLoggerDelegate.applicationLogger,"cassandra.password:" + cassPwd);
- logger.info(EELFLoggerDelegate.applicationLogger,"cassandra.password.isencrypted:" + isEncrypted);
if("true".equals(isEncrypted)) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Decrypting....");
+ logger.debug(EELFLoggerDelegate.applicationLogger,"Decrypting....");
cassPwd = CipherUtil.decryptPKC(cassPwd);
- logger.info(EELFLoggerDelegate.applicationLogger,"Decrypted password: "+cassPwd);
+ logger.debug(EELFLoggerDelegate.applicationLogger,"Password Decrypted");
MusicUtil.setCassPwd(cassPwd);
} else
MusicUtil.setCassPwd(cassPwd);
diff --git a/jar/src/main/java/org/onap/music/main/PropertiesListener.java b/jar/src/main/java/org/onap/music/main/PropertiesListener.java
index beb88af6..724d3d45 100755
--- a/jar/src/main/java/org/onap/music/main/PropertiesListener.java
+++ b/jar/src/main/java/org/onap/music/main/PropertiesListener.java
@@ -81,7 +81,7 @@ public class PropertiesListener implements ServletContextListener {
break;
case "debug":
MusicUtil.setDebug(Boolean
- .getBoolean(prop.getProperty(key).toLowerCase()));
+ .parseBoolean(prop.getProperty(key).toLowerCase()));
break;
case "version":
MusicUtil.setVersion(prop.getProperty(key));
diff --git a/jar/src/main/java/org/onap/music/rest/RestMusicDataAPI.java b/jar/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
index fc31cd9e..4b29f9a1 100755
--- a/jar/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
+++ b/jar/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
@@ -218,12 +218,16 @@ public class RestMusicDataAPI {
try {
queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("CREATE ROLE IF NOT EXISTS '" + userId
- + "' WITH PASSWORD = '" + password + "' AND LOGIN = true;");
+// queryObject.appendQueryString("CREATE ROLE IF NOT EXISTS '" + userId
+// + "' WITH PASSWORD = '" + password + "' AND LOGIN = true;");
+ queryObject.appendQueryString("CREATE ROLE IF NOT EXISTS ? "
+ + " WITH PASSWORD = ? AND LOGIN = true;");
+ queryObject.addValue(userId);
+ queryObject.addValue(password);
MusicCore.nonKeyRelatedPut(queryObject, consistency);
queryObject = new PreparedQueryObject();
queryObject.appendQueryString("GRANT ALL PERMISSIONS on KEYSPACE " + keyspaceName
- + " to '" + userId + "'");
+ + " to '" + userId + "'");
queryObject.appendQueryString(";");
MusicCore.nonKeyRelatedPut(queryObject, consistency);
} catch (Exception e) {
@@ -235,8 +239,8 @@ public class RestMusicDataAPI {
String hashedpwd = BCrypt.hashpw(password, BCrypt.gensalt());
queryObject = new PreparedQueryObject();
queryObject.appendQueryString(
- "INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
+ "INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
+ + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
queryObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), newAid));
queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspaceName));
queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), ns));
diff --git a/jar/version.properties b/jar/version.properties
index 2ffa6347..fbd855ff 100644
--- a/jar/version.properties
+++ b/jar/version.properties
@@ -4,7 +4,7 @@
major=2
minor=5
-patch=6
+patch=9
base_version=${major}.${minor}.${patch}
diff --git a/music-core/pom.xml b/music-core/pom.xml
new file mode 100755
index 00000000..cf7f59e9
--- /dev/null
+++ b/music-core/pom.xml
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START==========================================
+ org.onap.music
+ ===================================================================
+ Copyright (c) 2017 AT&T Intellectual Property
+ ===================================================================
+ Modifications Copyright (c) 2019 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=============================================
+ ====================================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.music</groupId>
+ <artifactId>MUSIC-core</artifactId>
+ <packaging>jar</packaging>
+ <version>3.2.40-SNAPSHOT</version>
+ <description>
+ This is the MUSIC core interface, packaged as a jar file.
+ </description>
+ <name>music-core</name>
+
+ <parent>
+ <groupId>org.onap.music</groupId>
+ <artifactId>MUSIC</artifactId>
+ <version>3.2.40-SNAPSHOT</version>
+ </parent>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <java.version>1.8</java.version>
+ <jaxrs.version>2.0.1</jaxrs.version>
+ <cassandra.version>3.6.0</cassandra.version>
+ </properties>
+
+ <repositories>
+ <repository>
+ <id>onap-releases</id>
+ <name>ONAP - Release Repository</name>
+ <url>${nexusproxy}/${releaseNexusPath}</url>
+ </repository>
+ <repository>
+ <id>onap-staging</id>
+ <name>ONAP - Staging Repository</name>
+ <url>${nexusproxy}/${stagingNexusPath}</url>
+ </repository>
+ <repository>
+ <id>onap-snapshots</id>
+ <name>ONAP - Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </repository>
+ <repository>
+ <id>onap-public</id>
+ <name>ONAP public Repository</name>
+ <url>${nexusproxy}/content/groups/public</url>
+ </repository>
+ </repositories>
+
+ <build>
+ <finalName>${project.artifactId}</finalName>
+ <sourceDirectory>src/main/java</sourceDirectory>
+ <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
+ <testSourceDirectory>src/test/java</testSourceDirectory>
+ <testOutputDirectory>target/test-classes</testOutputDirectory>
+ <defaultGoal>validate</defaultGoal>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.properties</include>
+ <include>**/*.xml</include>
+ <include>**/*.ccf</include>
+ </includes>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>${project.basedir}/src/test/resources</directory>
+ </testResource>
+ </testResources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <skip>${maven.check.skip}</skip>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <executions>
+ <execution>
+ <id>make-a-jar</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ <configuration>
+ <excludes>
+ <exclude>**/Sample*</exclude>
+ </excludes>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.4</version>
+ <executions>
+ <execution>
+ <id>core</id>
+ <phase>install</phase>
+ <goals>
+ <goal>install-file</goal>
+ </goals>
+ <configuration>
+ <packaging>jar</packaging>
+ <artifactId>${project.artifactId}</artifactId>
+ <groupId>${project.groupId}</groupId>
+ <version>${project.version}</version>
+ <file>${project.build.directory}/${project.artifactId}.jar</file>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <!-- Logging -->
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ <version>1.2.3</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ <version>1.2.3</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>1.0.1-oss</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-module-junit4</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <!-- End Logging -->
+ <!-- Cassandra -->
+ <dependency>
+ <groupId>io.dropwizard.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ <version>4.1.0-rc3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.datastax.cassandra</groupId>
+ <artifactId>cassandra-driver-core</artifactId>
+ <version>${cassandra.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.datastax.cassandra</groupId>
+ <artifactId>cassandra-driver-extras</artifactId>
+ <version>${cassandra.version}</version>
+ </dependency>
+ <!-- /Cassandra -->
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-jcs-core</artifactId>
+ <version>2.2</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.11</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ <version>3.8</version>
+ </dependency>
+
+ <!-- Testing -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit-spring</artifactId>
+ <version>3.5.0.1</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>io.dropwizard.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.addthis.metrics</groupId>
+ <artifactId>reporter-config-base</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit-shaded</artifactId>
+ <version>3.5.0.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.23.4</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- /Testing -->
+ <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-jsr310</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.9.9.2</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.swagger</groupId>
+ <artifactId>swagger-jersey-jaxrs</artifactId>
+ <version>1.5.22</version>
+ <exclusions>
+ <exclusion>
+ <groupId>com.sun.jersey.contribs</groupId>
+ <artifactId>jersey-multipart</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.contribs</groupId>
+ <artifactId>jersey-multipart</artifactId>
+ <version>1.19</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ <version>2.0.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>de.svenkubiak</groupId>
+ <artifactId>jBCrypt</artifactId>
+ <version>0.4.1</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-handler</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-buffer</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-codec</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-common</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-resolver</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-transport</artifactId>
+ <version>4.1.33.Final</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.aaf.authz</groupId>
+ <artifactId>aaf-cadi-aaf</artifactId>
+ <version>2.1.7</version>
+ <exclusions>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.aaf.authz</groupId>
+ <artifactId>aaf-cadi-client</artifactId>
+ <version>2.1.7</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.aaf.authz</groupId>
+ <artifactId>aaf-cadi-core</artifactId>
+ <version>2.1.7</version>
+ <exclusions>
+ <exclusion>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ <version>2.8.5</version>
+ </dependency>
+ </dependencies>
+
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.3</version>
+ <configuration>
+ <author>true</author>
+ <breakiterator>true</breakiterator>
+ <version>true</version>
+ <links>
+ <link>https://docs.oracle.com/javase/7/docs/api/</link>
+ <link>https://tomcat.apache.org/tomcat-7.0-doc/jspapi/</link>
+ <link>http://docs.oracle.com/javaee/7/api/</link>
+ </links>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
+
+ <distributionManagement>
+ <repository>
+ <id>ecomp-releases</id>
+ <name>Release Repository</name>
+ <url>${nexusproxy}/${releaseNexusPath}</url>
+ </repository>
+ <snapshotRepository>
+ <id>ecomp-snapshots</id>
+ <name>Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </snapshotRepository>
+ <!-- added for javadoc -->
+ <site>
+ <id>ecomp-site</id>
+ <url>dav:${nexusproxy}${sitePath}</url>
+ </site>
+ </distributionManagement>
+</project>
diff --git a/src/main/java/LICENSE.txt b/music-core/src/main/java/LICENSE.txt
index cc6cdea5..cc6cdea5 100644
--- a/src/main/java/LICENSE.txt
+++ b/music-core/src/main/java/LICENSE.txt
diff --git a/src/main/java/org/onap/music/datastore/Condition.java b/music-core/src/main/java/org/onap/music/datastore/Condition.java
index 2fd4596a..c17d9c07 100644
--- a/src/main/java/org/onap/music/datastore/Condition.java
+++ b/music-core/src/main/java/org/onap/music/datastore/Condition.java
@@ -21,16 +21,17 @@
*/
package org.onap.music.datastore;
-import java.util.Map;
+import java.util.Map;
+import org.onap.music.exceptions.MusicServiceException;
import org.onap.music.main.MusicCore;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
public class Condition {
- Map<String, Object> conditions;
- PreparedQueryObject selectQueryForTheRow;
+ private Map<String, Object> conditions;
+ private PreparedQueryObject selectQueryForTheRow;
public Condition(Map<String, Object> conditions, PreparedQueryObject selectQueryForTheRow) {
this.conditions = conditions;
@@ -39,7 +40,7 @@ public class Condition {
public boolean testCondition() throws Exception {
// first generate the row
- ResultSet results = MusicCore.quorumGet(selectQueryForTheRow);
+ ResultSet results = quorumGet(selectQueryForTheRow);
Row row = null;
if(results != null) {
row = results.one();
@@ -47,6 +48,16 @@ public class Condition {
if(row == null) {
throw new Exception(" No data found to update");
}
- return MusicDataStoreHandle.getDSHandle().doesRowSatisfyCondition(row, conditions);
+ return getDSHandle().doesRowSatisfyCondition(row, conditions);
+ }
+
+ /* For JUnit testing only */
+ public ResultSet quorumGet(PreparedQueryObject selectQueryForTheRow) {
+ return MusicCore.quorumGet(selectQueryForTheRow);
+ }
+
+ /* For JUnit testing only */
+ public MusicDataStore getDSHandle() throws MusicServiceException {
+ return MusicDataStoreHandle.getDSHandle();
}
} \ No newline at end of file
diff --git a/src/main/java/org/onap/music/datastore/MusicDataStore.java b/music-core/src/main/java/org/onap/music/datastore/MusicDataStore.java
index f58bd831..9ce73cc8 100755
--- a/src/main/java/org/onap/music/datastore/MusicDataStore.java
+++ b/music-core/src/main/java/org/onap/music/datastore/MusicDataStore.java
@@ -5,6 +5,7 @@
* Copyright (c) 2017 AT&T Intellectual Property
* ===================================================================
* Modifications Copyright (c) 2018-2019 IBM
+ * Modifications Copyright (c) 2019 Samsung
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,27 +25,19 @@
package org.onap.music.datastore;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import org.apache.commons.jcs.access.CacheAccess;
-import org.onap.music.authentication.CachingUtil;
import org.onap.music.eelf.logging.EELFLoggerDelegate;
import org.onap.music.eelf.logging.format.AppMessages;
import org.onap.music.eelf.logging.format.ErrorSeverity;
import org.onap.music.eelf.logging.format.ErrorTypes;
import org.onap.music.exceptions.MusicQueryException;
import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.main.CipherUtil;
import org.onap.music.main.MusicUtil;
-
-import com.codahale.metrics.JmxReporter;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.ColumnDefinitions;
import com.datastax.driver.core.ColumnDefinitions.Definition;
@@ -54,16 +47,15 @@ import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.KeyspaceMetadata;
import com.datastax.driver.core.Metadata;
import com.datastax.driver.core.PoolingOptions;
-import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.SimpleStatement;
+import com.datastax.driver.core.SocketOptions;
import com.datastax.driver.core.TableMetadata;
import com.datastax.driver.core.exceptions.AlreadyExistsException;
import com.datastax.driver.core.exceptions.InvalidQueryException;
-import com.datastax.driver.core.exceptions.NoHostAvailableException;
-import com.sun.jersey.core.util.Base64;
+import com.datastax.driver.extras.codecs.enums.EnumNameCodec;
/**
* @author nelson24
@@ -73,11 +65,34 @@ public class MusicDataStore {
public static final String CONSISTENCY_LEVEL_ONE = "ONE";
public static final String CONSISTENCY_LEVEL_QUORUM = "QUORUM";
+ public static final String CONSISTENCY_LEVEL_LOCAL_QUORUM = "LOCAL_QUORUM";
private Session session;
private Cluster cluster;
/**
+ * Connect to default Cassandra address
+ */
+ public MusicDataStore() {
+ try {
+ connectToCassaCluster(MusicUtil.getMyCassaHost());
+ } catch (MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
+ }
+ }
+
+
+ /**
+ * @param cluster
+ * @param session
+ */
+ public MusicDataStore(Cluster cluster, Session session) {
+ this.session = session;
+ setCluster(cluster);
+ }
+
+
+ /**
* @param session
*/
public void setSession(Session session) {
@@ -95,28 +110,19 @@ public class MusicDataStore {
* @param cluster
*/
public void setCluster(Cluster cluster) {
+ EnumNameCodec<LockType> lockTypeCodec = new EnumNameCodec<LockType>(LockType.class);
+ cluster.getConfiguration().getCodecRegistry().register(lockTypeCodec);
+
this.cluster = cluster;
}
-
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicDataStore.class);
-
- /**
- *
- */
- public MusicDataStore() {
- connectToCassaCluster();
+ public Cluster getCluster() {
+ return this.cluster;
}
- /**
- * @param cluster
- * @param session
- */
- public MusicDataStore(Cluster cluster, Session session) {
- this.session = session;
- this.cluster = cluster;
- }
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicDataStore.class);
+
/**
*
@@ -127,79 +133,7 @@ public class MusicDataStore {
try {
connectToCassaCluster(remoteIp);
} catch (MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
- }
- }
-
- /**
- *
- * @return
- */
- private ArrayList<String> getAllPossibleLocalIps() {
- ArrayList<String> allPossibleIps = new ArrayList<>();
- try {
- Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces();
- while (en.hasMoreElements()) {
- NetworkInterface ni = en.nextElement();
- Enumeration<InetAddress> ee = ni.getInetAddresses();
- while (ee.hasMoreElements()) {
- InetAddress ia = ee.nextElement();
- allPossibleIps.add(ia.getHostAddress());
- }
- }
- } catch (SocketException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), AppMessages.CONNCECTIVITYERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
- }catch(Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), ErrorSeverity.ERROR, ErrorTypes.GENERALSERVICEERROR);
- }
- return allPossibleIps;
- }
-
- /**
- * This method iterates through all available IP addresses and connects to multiple cassandra
- * clusters.
- */
- private void connectToCassaCluster() {
- Iterator<String> it = getAllPossibleLocalIps().iterator();
- String address = "localhost";
- String[] addresses = null;
- address = MusicUtil.getMyCassaHost();
- addresses = address.split(",");
-
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Connecting to cassa cluster: Iterating through possible ips:"
- + getAllPossibleLocalIps());
- PoolingOptions poolingOptions = new PoolingOptions();
- poolingOptions
- .setConnectionsPerHost(HostDistance.LOCAL, 4, 10)
- .setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
- while (it.hasNext()) {
- try {
- if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
- cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
- //.withLoadBalancingPolicy(new RoundRobinPolicy())
- .withoutJMXReporting()
- .withPoolingOptions(poolingOptions)
- .addContactPoints(addresses).build();
- }
- else
- cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- //.withLoadBalancingPolicy(new RoundRobinPolicy())
- .addContactPoints(addresses).build();
-
- Metadata metadata = cluster.getMetadata();
- logger.info(EELFLoggerDelegate.applicationLogger, "Connected to cassa cluster "
- + metadata.getClusterName() + " at " + address);
- session = cluster.connect();
-
- break;
- } catch (NoHostAvailableException e) {
- address = it.next();
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.HOSTUNAVAILABLE, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
- }
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
}
}
@@ -222,40 +156,49 @@ public class MusicDataStore {
poolingOptions
.setConnectionsPerHost(HostDistance.LOCAL, 4, 10)
.setConnectionsPerHost(HostDistance.REMOTE, 2, 4);
+
+ Cluster cluster;
if(MusicUtil.getCassName() != null && MusicUtil.getCassPwd() != null) {
+ String cassPwd;
+ if (MusicUtil.getCipherEncKey() != null && !("").equals(MusicUtil.getCipherEncKey())) {
+ cassPwd = CipherUtil.decryptPKC(MusicUtil.getCassPwd());
+ } else {
+ cassPwd = MusicUtil.getCassPwd();
+ }
logger.info(EELFLoggerDelegate.applicationLogger,
- "Building with credentials "+MusicUtil.getCassName()+" & "+MusicUtil.getCassPwd());
+ "Building with credentials "+MusicUtil.getCassName()+" & "+ MusicUtil.getCassPwd());
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- .withCredentials(MusicUtil.getCassName(), MusicUtil.getCassPwd())
- //.withLoadBalancingPolicy(new RoundRobinPolicy())
- .withoutJMXReporting()
- .withPoolingOptions(poolingOptions)
- .addContactPoints(addresses).build();
- }
- else {
+ .withCredentials(MusicUtil.getCassName(), cassPwd)
+ //.withLoadBalancingPolicy(new RoundRobinPolicy())
+ .withoutJMXReporting()
+ .withPoolingOptions(poolingOptions)
+ .withSocketOptions(
+ new SocketOptions().setConnectTimeoutMillis(MusicUtil.getCassandraConnectTimeOutMS())
+ .setReadTimeoutMillis(MusicUtil.getCassandraReadTimeOutMS()))
+ .addContactPoints(addresses).build();
+ } else {
cluster = Cluster.builder().withPort(MusicUtil.getCassandraPort())
- //.withLoadBalancingPolicy(new RoundRobinPolicy())
- .withoutJMXReporting()
- .withPoolingOptions(poolingOptions)
- .addContactPoints(addresses).build();
+ .withoutJMXReporting()
+ .withPoolingOptions(poolingOptions)
+ .withSocketOptions(new SocketOptions()
+ .setConnectTimeoutMillis(MusicUtil.getCassandraConnectTimeOutMS())
+ .setReadTimeoutMillis(MusicUtil.getCassandraReadTimeOutMS()))
+ .addContactPoints(addresses)
+ .build();
}
-
- // JmxReporter reporter =
- // JmxReporter.forRegistry(cluster.getMetrics().getRegistry())
- // .inDomain(cluster.getClusterName() + "-metrics")
- // .build();
-
- // reporter.start();
-
- Metadata metadata = cluster.getMetadata();
+
+ this.setCluster(cluster);
+ Metadata metadata = this.cluster.getMetadata();
logger.info(EELFLoggerDelegate.applicationLogger, "Connected to cassa cluster "
- + metadata.getClusterName() + " at " + address);
+ + metadata.getClusterName() + " at " + address);
+
try {
- session = cluster.connect();
+ session = this.cluster.connect();
} catch (Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),AppMessages.CASSANDRACONNECTIVITY, ErrorSeverity.ERROR, ErrorTypes.SERVICEUNAVAILABLE);
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),AppMessages.CASSANDRACONNECTIVITY,
+ ErrorSeverity.ERROR, ErrorTypes.SERVICEUNAVAILABLE, ex);
throw new MusicServiceException(
- "Error while connecting to Cassandra cluster.. " + ex.getMessage());
+ "Error while connecting to Cassandra cluster.. " + ex.getMessage());
}
}
@@ -284,6 +227,16 @@ public class MusicDataStore {
return ks.getTable(tableName);
}
+ /**
+ *
+ * @param keyspace
+ * @param tableName
+ * @return TableMetadata
+ */
+ public KeyspaceMetadata returnKeyspaceMetadata(String keyspace) {
+ return cluster.getMetadata().getKeyspace(keyspace);
+ }
+
/**
* Utility function to return the Java specific object type.
@@ -348,7 +301,7 @@ public class MusicDataStore {
*/
public Map<String, HashMap<String, Object>> marshalData(ResultSet results) {
Map<String, HashMap<String, Object>> resultMap =
- new HashMap<>();
+ new HashMap<>();
int counter = 0;
for (Row row : results) {
ColumnDefinitions colInfo = row.getColumnDefinitions();
@@ -358,10 +311,10 @@ public class MusicDataStore {
if(definition.getType().toString().toLowerCase().contains("blob")) {
resultOutput.put(definition.getName(),
getBlobValue(row, definition.getName(), definition.getType()));
- }
- else
+ } else {
resultOutput.put(definition.getName(),
- getColValue(row, definition.getName(), definition.getType()));
+ getColValue(row, definition.getName(), definition.getType()));
+ }
}
}
resultMap.put("row " + counter, resultOutput);
@@ -372,7 +325,7 @@ public class MusicDataStore {
// Prepared Statements 1802 additions
-
+
public boolean executePut(PreparedQueryObject queryObject, String consistency)
throws MusicServiceException, MusicQueryException {
return executePut(queryObject, consistency, 0);
@@ -388,36 +341,19 @@ public class MusicDataStore {
* @throws MusicQueryException
*/
public boolean executePut(PreparedQueryObject queryObject, String consistency,long timeSlot)
- throws MusicServiceException, MusicQueryException {
+ throws MusicServiceException, MusicQueryException {
boolean result = false;
long timeOfWrite = System.currentTimeMillis();
if (!MusicUtil.isValidQueryObject(!queryObject.getValues().isEmpty(), queryObject)) {
logger.error(EELFLoggerDelegate.errorLogger, queryObject.getQuery(),AppMessages.QUERYERROR, ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
throw new MusicQueryException("Ill formed queryObject for the request = " + "["
- + queryObject.getQuery() + "]");
+ + queryObject.getQuery() + "]");
}
- logger.info(EELFLoggerDelegate.applicationLogger,
- "In preprared Execute Put: the actual insert query:"
- + queryObject.getQuery() + "; the values"
- + queryObject.getValues());
-/*<<<<<<< HEAD
- PreparedStatement preparedInsert = null;
- try {
-
- preparedInsert = session.prepare(queryObject.getQuery());
-
- } catch(InvalidQueryException iqe) {
- logger.error("Exception", iqe);
- logger.error(EELFLoggerDelegate.errorLogger, iqe.getMessage(),AppMessages.QUERYERROR, ErrorSeverity.CRITICAL, ErrorTypes.QUERYERROR);
- throw new MusicQueryException(iqe.getMessage());
- }catch(Exception e) {
- logger.error("Exception", e);
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.QUERYERROR, ErrorSeverity.CRITICAL, ErrorTypes.QUERYERROR);
- throw new MusicQueryException(e.getMessage());
- }
-
-=======*/
+ logger.debug(EELFLoggerDelegate.applicationLogger,
+ "In preprared Execute Put: the actual insert query:"
+ + queryObject.getQuery() + "; the values"
+ + queryObject.getValues());
SimpleStatement preparedInsert = null;
try {
@@ -429,7 +365,7 @@ public class MusicDataStore {
logger.info(EELFLoggerDelegate.applicationLogger, "Executing simple put query");
if(queryObject.getConsistency() == null)
preparedInsert.setConsistencyLevel(ConsistencyLevel.ONE);
- else
+ else
preparedInsert.setConsistencyLevel(MusicUtil.getConsistencyLevel(queryObject.getConsistency()));
} else if (consistency.equalsIgnoreCase(MusicUtil.ONE)) {
preparedInsert.setConsistencyLevel(ConsistencyLevel.ONE);
@@ -443,23 +379,29 @@ public class MusicDataStore {
ResultSet rs = session.execute(preparedInsert);
result = rs.wasApplied();
-
- }
- catch (AlreadyExistsException ae) {
- logger.error(EELFLoggerDelegate.errorLogger, ae.getMessage(),AppMessages.SESSIONFAILED+ " [" + queryObject.getQuery() + "]", ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
- throw new MusicServiceException(ae.getMessage());
- }
- catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.SESSIONFAILED+ " [" + queryObject.getQuery() + "]", ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
- throw new MusicQueryException("Executing Session Failure for Request = " + "["
- + queryObject.getQuery() + "]" + " Reason = " + e.getMessage());
+ } catch (AlreadyExistsException ae) {
+ throw new MusicServiceException("Already Exists Exception: " + ae.getMessage());
+ } catch (InvalidQueryException e) {
+ if (e.getMessage().contains("unconfigured table")) {
+ throw new MusicServiceException("Invalid Query Exception: " + e.getMessage());
+ } else {
+ logger.info(EELFLoggerDelegate.applicationLogger, "Query Exception: " + e.getMessage(),
+ AppMessages.SESSIONFAILED + " [" + queryObject.getQuery() + "]", ErrorSeverity.INFO,
+ ErrorTypes.QUERYERROR, e);
+ throw new MusicServiceException("Query Exception: " + e.getMessage());
+ }
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),
+ AppMessages.SESSIONFAILED + " [" + queryObject.getQuery() + "]", ErrorSeverity.ERROR,
+ ErrorTypes.QUERYERROR, e);
+ throw new MusicServiceException("Executing Session Failure for Request = " + "[" + queryObject.getQuery()
+ + "]" + " Reason = " + e.getMessage());
}
-
return result;
}
- /* *//**
+ /* *//**
* This method performs DDL operations on Cassandra using consistency level ONE.
*
* @param queryObject Object containing cassandra prepared query and values.
@@ -489,11 +431,10 @@ public class MusicDataStore {
}
if(queryObject.getConsistency() == null) {
preparedEventualGet.setConsistencyLevel(ConsistencyLevel.ONE);
+ } else {
+ preparedEventualGet.setConsistencyLevel(MusicUtil.getConsistencyLevel(queryObject.getConsistency()));
}
- else {
- preparedEventualGet.setConsistencyLevel(MusicUtil.getConsistencyLevel(queryObject.getConsistency()));
- }
- results = session.execute(preparedEventualGet.bind(queryObject.getValues().toArray()));
+ results = session.execute(preparedEventualGet.bind(queryObject.getValues().toArray()));
} catch (Exception ex) {
logger.error("Exception", ex);
@@ -503,15 +444,15 @@ public class MusicDataStore {
return results;
}
- *//**
- *
- * This method performs DDL operation on Cassandra using consistency level QUORUM.
- *
- * @param queryObject Object containing cassandra prepared query and values.
- * @return ResultSet
- * @throws MusicServiceException
- * @throws MusicQueryException
- *//*
+ *//**
+ *
+ * This method performs DDL operation on Cassandra using consistency level QUORUM.
+ *
+ * @param queryObject Object containing cassandra prepared query and values.
+ * @return ResultSet
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ *//*
public ResultSet executeCriticalGet(PreparedQueryObject queryObject)
throws MusicServiceException, MusicQueryException {
if (!MusicUtil.isValidQueryObject(!queryObject.getValues().isEmpty(), queryObject)) {
@@ -534,58 +475,65 @@ public class MusicDataStore {
return results;
}
- */
+ */
public ResultSet executeGet(PreparedQueryObject queryObject,String consistencyLevel) throws MusicQueryException, MusicServiceException {
if (!MusicUtil.isValidQueryObject(!queryObject.getValues().isEmpty(), queryObject)) {
logger.error(EELFLoggerDelegate.errorLogger, "",AppMessages.QUERYERROR+ " [" + queryObject.getQuery() + "]", ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
throw new MusicQueryException("Error processing Prepared Query Object for the request = " + "["
- + queryObject.getQuery() + "]");
+ + queryObject.getQuery() + "]");
}
ResultSet results = null;
try {
SimpleStatement statement = new SimpleStatement(queryObject.getQuery(), queryObject.getValues().toArray());
-
if (consistencyLevel.equalsIgnoreCase(CONSISTENCY_LEVEL_ONE)) {
- if(queryObject.getConsistency() == null) {
statement.setConsistencyLevel(ConsistencyLevel.ONE);
- }
- else {
- statement.setConsistencyLevel(MusicUtil.getConsistencyLevel(queryObject.getConsistency()));
- }
- }
- else if (consistencyLevel.equalsIgnoreCase(CONSISTENCY_LEVEL_QUORUM)) {
+ } else if (consistencyLevel.equalsIgnoreCase(CONSISTENCY_LEVEL_QUORUM)) {
statement.setConsistencyLevel(ConsistencyLevel.QUORUM);
+ } else if (consistencyLevel.equalsIgnoreCase(CONSISTENCY_LEVEL_LOCAL_QUORUM)) {
+ statement.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
}
results = session.execute(statement);
} catch (Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(),AppMessages.UNKNOWNERROR+ "[" + queryObject.getQuery() + "]", ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
- throw new MusicServiceException(ex.getMessage());
+ logger.error(EELFLoggerDelegate.errorLogger, "Execute Get Error" + ex.getMessage(),AppMessages.UNKNOWNERROR+ "[" + queryObject
+ .getQuery() + "]", ErrorSeverity.ERROR, ErrorTypes.QUERYERROR, ex);
+ throw new MusicServiceException("Execute Get Error" + ex.getMessage());
}
-
+
return results;
-
+
}
-
+
/**
* This method performs DDL operations on Cassandra using consistency level ONE.
*
* @param queryObject Object containing cassandra prepared query and values.
*/
public ResultSet executeOneConsistencyGet(PreparedQueryObject queryObject)
- throws MusicServiceException, MusicQueryException {
+ throws MusicServiceException, MusicQueryException {
return executeGet(queryObject, CONSISTENCY_LEVEL_ONE);
}
/**
*
+ * This method performs DDL operation on Cassandra using consistency level LOCAL_QUORUM.
+ *
+ * @param queryObject Object containing cassandra prepared query and values.
+ */
+ public ResultSet executeLocalQuorumConsistencyGet(PreparedQueryObject queryObject)
+ throws MusicServiceException, MusicQueryException {
+ return executeGet(queryObject, CONSISTENCY_LEVEL_LOCAL_QUORUM);
+ }
+
+ /**
+ *
* This method performs DDL operation on Cassandra using consistency level QUORUM.
*
* @param queryObject Object containing cassandra prepared query and values.
*/
public ResultSet executeQuorumConsistencyGet(PreparedQueryObject queryObject)
- throws MusicServiceException, MusicQueryException {
+ throws MusicServiceException, MusicQueryException {
return executeGet(queryObject, CONSISTENCY_LEVEL_QUORUM);
}
diff --git a/music-core/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java b/music-core/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java
new file mode 100644
index 00000000..09fe0d35
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java
@@ -0,0 +1,127 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 IBM.
+ * ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * 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.datastore;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+
+import com.datastax.driver.core.KeyspaceMetadata;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.TableMetadata;
+
+public class MusicDataStoreHandle {
+
+ private static MusicDataStore mDstoreHandle = null;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicDataStoreHandle.class);
+
+ private MusicDataStoreHandle(){
+ throw new IllegalStateException("Utility class");
+ }
+
+ /**
+ *
+ * @param remoteIp
+ * @return
+ */
+ public static MusicDataStore getDSHandle(String remoteIp) {
+ logger.info(EELFLoggerDelegate.metricsLogger,"Acquiring data store handle");
+ long start = System.currentTimeMillis();
+ if (mDstoreHandle == null) {
+ mDstoreHandle = new MusicDataStore(remoteIp);
+ }
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.metricsLogger,"Time taken to acquire data store handle:" + (end - start) + " ms");
+ return mDstoreHandle;
+ }
+
+ /**
+ *
+ * @return
+ * @throws MusicServiceException
+ */
+ public static MusicDataStore getDSHandle() throws MusicServiceException {
+ logger.info(EELFLoggerDelegate.metricsLogger,"Acquiring data store handle");
+ long start = System.currentTimeMillis();
+ if (mDstoreHandle == null) {
+ // Quick Fix - Best to put this into every call to getDSHandle?
+ if (!"localhost".equals(MusicUtil.getMyCassaHost())) {
+ mDstoreHandle = new MusicDataStore(MusicUtil.getMyCassaHost());
+ } else {
+ mDstoreHandle = new MusicDataStore();
+ }
+ }
+ if(mDstoreHandle.getSession() == null) {
+ String message = "Connection to Cassandra has not been enstablished."
+ + " Please check connection properites and reboot.";
+ logger.info(EELFLoggerDelegate.applicationLogger, message);
+ throw new MusicServiceException(message);
+ }
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.metricsLogger,"Time taken to acquire data store handle:" + (end - start) + " ms");
+ return mDstoreHandle;
+ }
+
+ public static void setMDstoreHandle(MusicDataStore dsHandle) {
+ mDstoreHandle = dsHandle;
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @return
+ * @throws MusicServiceException
+ */
+ public static TableMetadata returnColumnMetadata(String keyspace, String tablename) throws MusicServiceException {
+ return getDSHandle().returnColumnMetadata(keyspace, tablename);
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @return
+ * @throws MusicServiceException
+ */
+ public static KeyspaceMetadata returnkeyspaceMetadata(String keyspace) throws MusicServiceException {
+ return getDSHandle().returnKeyspaceMetadata(keyspace);
+ }
+
+ /**
+ *
+ * @param results
+ * @return
+ * @throws MusicServiceException
+ */
+ public static Map<String, HashMap<String, Object>> marshallResults(ResultSet results) throws MusicServiceException {
+ return getDSHandle().marshalData(results);
+ }
+
+}
diff --git a/src/main/java/org/onap/music/datastore/PreparedQueryObject.java b/music-core/src/main/java/org/onap/music/datastore/PreparedQueryObject.java
index 9b109630..fdac50be 100644
--- a/src/main/java/org/onap/music/datastore/PreparedQueryObject.java
+++ b/music-core/src/main/java/org/onap/music/datastore/PreparedQueryObject.java
@@ -2,7 +2,7 @@
* ============LICENSE_START==========================================
* org.onap.music
* ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
+ * Copyright (c) 2017-2019 AT&T Intellectual Property
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -42,6 +42,35 @@ public class PreparedQueryObject {
private String primaryKeyValue;
+ /**
+ * Create PreparedQueryObject
+ */
+ public PreparedQueryObject() {
+ this.values = new ArrayList<>();
+ this.query = new StringBuilder();
+ }
+
+ /**
+ * Create PreparedQueryObject
+ * @param query query portion of the prepared query
+ */
+ public PreparedQueryObject(String query) {
+ this.values = new ArrayList<>();
+ this.query = new StringBuilder(query);
+ }
+
+ /**
+ * Create PreparedQueryObject
+ * @param query query portion of the prepared query
+ * @param values to be added to the query string as prepared query
+ */
+ public PreparedQueryObject(String query, Object...values) {
+ this.query = new StringBuilder(query);
+ this.values = new ArrayList<>();
+ for (Object value: values) {
+ this.values.add(value);
+ }
+ }
public String getKeyspaceName() {
return keyspaceName;
@@ -60,7 +89,28 @@ public class PreparedQueryObject {
}
public String getOperation() {
- return operation;
+ if (operation!=null) return operation;
+ if (query.length()==0) return null;
+ String queryStr = query.toString().toLowerCase();
+ String firstOp = null;
+ int firstOpChar = query.length();
+ if (queryStr.indexOf("insert")>-1 && queryStr.indexOf("insert")<firstOpChar) {
+ firstOp = "insert";
+ firstOpChar = queryStr.indexOf("insert");
+ }
+ if (queryStr.indexOf("update")>-1 && queryStr.indexOf("update")<firstOpChar) {
+ firstOp = "update";
+ firstOpChar = queryStr.indexOf("update");
+ }
+ if (queryStr.indexOf("delete")>-1 && queryStr.indexOf("delete")<firstOpChar) {
+ firstOp = "delete";
+ firstOpChar = queryStr.indexOf("delete");
+ }
+ if (queryStr.indexOf("select")>-1 && queryStr.indexOf("select")<firstOpChar) {
+ firstOp = "select";
+ firstOpChar = queryStr.indexOf("select");
+ }
+ return firstOp;
}
public void setOperation(String operation) {
@@ -84,27 +134,28 @@ public class PreparedQueryObject {
}
/**
- *
- */
- public PreparedQueryObject() {
-
- this.values = new ArrayList<>();
- this.query = new StringBuilder();
- }
-
- /**
- * @return
+ * @return values to be set as part of the prepared query
*/
public List<Object> getValues() {
return values;
}
/**
- * @param o
+ * @param o object to be added as a value to the prepared query, in order
*/
public void addValue(Object o) {
this.values.add(o);
}
+
+ /**
+ * Add values to the preparedQuery
+ * @param objs ordered list of objects to be added as values to the prepared query
+ */
+ public void addValues(Object... objs) {
+ for (Object obj: objs) {
+ this.values.add(obj);
+ }
+ }
/**
* @param s
@@ -117,12 +168,9 @@ public class PreparedQueryObject {
}
/**
- * @return
+ * @return the query
*/
public String getQuery() {
return this.query.toString();
}
-
-
-
}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java
index 2fc4215b..a1524cc6 100644
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JSONObject.java
@@ -5,7 +5,7 @@ package org.onap.music.datastore.jsonobjects;
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
* ===================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
+ * 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
*
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java
new file mode 100644
index 00000000..988ba3a8
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java
@@ -0,0 +1,313 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.TableMetadata;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "JsonTable", description = "Json model for delete")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonDelete {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonDelete.class);
+
+ private List<String> columns = null;
+ private Map<String, String> consistencyInfo;
+ private Map<String, Object> conditions;
+ private String ttl;
+ private String timestamp;
+ private String keyspaceName;
+ private String tableName;
+ private StringBuilder rowIdString;
+ private String primarKeyValue;
+
+
+ @ApiModelProperty(value = "Conditions")
+ public Map<String, Object> getConditions() {
+ return conditions;
+ }
+
+ public void setConditions(Map<String, Object> conditions) {
+ this.conditions = conditions;
+ }
+
+ @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ @ApiModelProperty(value = "Column values")
+ public List<String> getColumns() {
+ return columns;
+ }
+
+ public void setColumns(List<String> columns) {
+ this.columns = columns;
+ }
+
+
+ @ApiModelProperty(value = "Time to live information")
+ public String getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(String ttl) {
+ this.ttl = ttl;
+ }
+
+ @ApiModelProperty(value = "Time stamp")
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ public StringBuilder getRowIdString() {
+ return rowIdString;
+ }
+
+ public void setRowIdString(StringBuilder rowIdString) {
+ this.rowIdString = rowIdString;
+ }
+
+ public String getPrimarKeyValue() {
+ return primarKeyValue;
+ }
+
+ public void setPrimarKeyValue(String primarKeyValue) {
+ this.primarKeyValue = primarKeyValue;
+ }
+
+
+ public PreparedQueryObject genDeletePreparedQueryObj(MultivaluedMap<String, String> rowParams) throws MusicQueryException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Coming inside genUpdatePreparedQueryObj method " + this.getKeyspaceName());
+ logger.debug("Coming inside genUpdatePreparedQueryObj method " + this.getTableName());
+ }
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ if((this.getKeyspaceName() == null || this.getKeyspaceName().isEmpty())
+ || (this.getTableName() == null || this.getTableName().isEmpty())){
+
+
+ throw new MusicQueryException("one or more path parameters are not set, please check and try again",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+this.getKeyspaceName()+" ) ");
+
+ if(this == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"Required HTTP Request body is missing.", AppMessages.MISSINGDATA ,ErrorSeverity.WARN, ErrorTypes.DATAERROR);
+
+ throw new MusicQueryException("Required HTTP Request body is missing.",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ StringBuilder columnString = new StringBuilder();
+
+ int counter = 0;
+ List<String> columnList = this.getColumns();
+ if (columnList != null) {
+ for (String column : columnList) {
+ columnString.append(column);
+ if (counter != columnList.size() - 1)
+ columnString.append(",");
+ counter = counter + 1;
+ }
+ }
+
+ // get the row specifier
+ RowIdentifier rowId = null;
+ try {
+ rowId = getRowIdentifier(this.getKeyspaceName(), this.getTableName(), rowParams, queryObject);
+ this.setRowIdString(rowId.rowIdString);
+ this.setPrimarKeyValue(rowId.primarKeyValue);
+ if(rowId == null || rowId.primarKeyValue.isEmpty()) {
+
+ throw new MusicQueryException("Mandatory WHERE clause is missing. Please check the input request.",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes
+ .GENERALSERVICEERROR, ex);
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();*/
+ throw new MusicQueryException(AppMessages.UNKNOWNERROR.toString(), Status.BAD_REQUEST.getStatusCode());
+ }
+ String rowSpec = rowId.rowIdString.toString();
+
+ if ((columnList != null) && (!rowSpec.isEmpty())) {
+ queryObject.appendQueryString("DELETE " + columnString + " FROM " + this.getKeyspaceName() + "."
+ + this.getTableName() + " WHERE " + rowSpec + ";");
+ }
+
+ if ((columnList == null) && (!rowSpec.isEmpty())) {
+ queryObject.appendQueryString("DELETE FROM " + this.getKeyspaceName() + "." + this.getTableName() + " WHERE "
+ + rowSpec + ";");
+ }
+
+ if ((columnList != null) && (rowSpec.isEmpty())) {
+ queryObject.appendQueryString(
+ "DELETE " + columnString + " FROM " + this.getKeyspaceName() + "." + rowSpec + ";");
+ }
+ // get the conditional, if any
+ Condition conditionInfo;
+ if (this.getConditions() == null) {
+ conditionInfo = null;
+ } else {
+ // to avoid parsing repeatedly, just send the select query to
+ // obtain row
+ PreparedQueryObject selectQuery = new PreparedQueryObject();
+ selectQuery.appendQueryString("SELECT * FROM " + this.getKeyspaceName() + "." + this.getTableName() + " WHERE "
+ + rowId.rowIdString + ";");
+ selectQuery.addValue(rowId.primarKeyValue);
+ conditionInfo = new Condition(this.getConditions(), selectQuery);
+ }
+
+ String consistency = this.getConsistencyInfo().get("type");
+
+
+ if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && this.getConsistencyInfo().get("consistency")!=null) {
+ if(MusicUtil.isValidConsistency(this.getConsistencyInfo().get("consistency"))) {
+ queryObject.setConsistency(this.getConsistencyInfo().get("consistency"));
+ } else {
+ throw new MusicQueryException("Invalid Consistency type", Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+
+ queryObject.setOperation("delete");
+
+ return queryObject;
+ }
+
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param rowParams
+ * @param queryObject
+ * @return
+ * @throws MusicServiceException
+ */
+ private RowIdentifier getRowIdentifier(String keyspace, String tablename,
+ MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
+ throws MusicServiceException {
+ StringBuilder rowSpec = new StringBuilder();
+ int counter = 0;
+ TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ throw new MusicServiceException(
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ }
+ StringBuilder primaryKey = new StringBuilder();
+ for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
+ String keyName = entry.getKey();
+ List<String> valueList = entry.getValue();
+ String indValue = valueList.get(0);
+ DataType colType = null;
+ Object formattedValue = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey())) {
+ primaryKey.append(indValue);
+ }
+ rowSpec.append(keyName + "= ?");
+ queryObject.addValue(formattedValue);
+ if (counter != rowParams.size() - 1) {
+ rowSpec.append(" AND ");
+ }
+ counter = counter + 1;
+ }
+ return new RowIdentifier(primaryKey.toString(), rowSpec, queryObject);
+ }
+
+ private class RowIdentifier {
+ private String primarKeyValue;
+ private StringBuilder rowIdString;
+ @SuppressWarnings("unused")
+ public PreparedQueryObject queryObject; // the string with all the row
+ // identifiers separated by AND
+
+ public RowIdentifier(String primaryKeyValue, StringBuilder rowIdString,
+ PreparedQueryObject queryObject) {
+ this.primarKeyValue = primaryKeyValue;
+ this.rowIdString = rowIdString;
+ this.queryObject = queryObject;
+ }
+ }
+}
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonIndex.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonIndex.java
new file mode 100644
index 00000000..a06e8ea9
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonIndex.java
@@ -0,0 +1,120 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (c) 2019 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.datastore.jsonobjects;
+
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@ApiModel(value = "JsonIndex", description = "Index Object")
+public class JsonIndex {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonIndex.class);
+
+ private String indexName;
+ private String keyspaceName;
+ private String tableName;
+ private String fieldName;
+
+ public JsonIndex(String indexName,String keyspaceName,String tableName,String fieldName) {
+ this.indexName = indexName;
+ this.keyspaceName= keyspaceName;
+ this.tableName = tableName;
+ this.fieldName = fieldName;
+ }
+
+ @ApiModelProperty(value = "Index Name")
+ public String getIndexName() {
+ return indexName;
+ }
+
+ public JsonIndex setIndexName(String indexName) {
+ this.indexName = indexName;
+ return this;
+ }
+
+ @ApiModelProperty(value = "Keyspace name")
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public JsonIndex setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ return this;
+ }
+
+ public JsonIndex setTableName(String tableName) {
+ this.tableName = tableName;
+ return this;
+ }
+
+ @ApiModelProperty(value = "Table name")
+ public String getTableName() {
+ return tableName;
+ }
+
+ public JsonIndex setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ @ApiModelProperty(value = "Field name")
+ public String getFieldName() {
+ return fieldName;
+ }
+
+ public PreparedQueryObject genCreateIndexQuery() {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Came inside genCreateIndexQuery method");
+ }
+
+ logger.info("genCreateIndexQuery indexName ::" + indexName);
+ logger.info("genCreateIndexQuery keyspaceName ::" + keyspaceName);
+ logger.info("genCreateIndexQuery tableName ::" + tableName);
+ logger.info("genCreateIndexQuery fieldName ::" + fieldName);
+
+ long start = System.currentTimeMillis();
+
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString("Create index if not exists " + this.getIndexName() + " on " + this.getKeyspaceName() + "."
+ + this.getTableName() + " (" + this.getFieldName() + ");");
+
+ long end = System.currentTimeMillis();
+
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Time taken for setting up query in create index:" + (end - start));
+
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ " create index query :" + query.getQuery());
+
+ return query;
+ }
+
+}
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java
new file mode 100644
index 00000000..2f685cfe
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java
@@ -0,0 +1,415 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.TableMetadata;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "InsertTable", description = "Json model for table vlaues insert")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonInsert implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private String keyspaceName;
+ private String tableName;
+ private transient Map<String, Object> values;
+ private String ttl;
+ private String timestamp;
+ private transient Map<String, Object> rowSpecification;
+ private Map<String, String> consistencyInfo;
+ private Map<String, byte[]> objectMap;
+ private String primaryKeyVal;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonInsert.class);
+
+ @ApiModelProperty(value = "objectMap",hidden = true)
+ public Map<String, byte[]> getObjectMap() {
+ return objectMap;
+ }
+
+ public void setObjectMap(Map<String, byte[]> objectMap) {
+ this.objectMap = objectMap;
+ }
+
+ @ApiModelProperty(value = "keyspace")
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ @ApiModelProperty(value = "Table name")
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ @ApiModelProperty(value = "Columns and tables support an optional "
+ + "expiration period called TTL (time-to-live) in seconds.",
+ notes="TTL precision is one second, which is calculated by the coordinator "
+ + "node. When using TTL, ensure that all nodes in the cluster have synchronized clocks.",allowEmptyValue = true)
+ public String getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(String ttl) {
+ this.ttl = ttl;
+ }
+
+ @ApiModelProperty(value = "Time stamp (epoch_in_microseconds)",
+ notes = "Marks inserted data (write time) with TIMESTAMP. "
+ + "Enter the time since epoch (January 1, 1970) in microseconds."
+ + "By default, the actual time of write is used.", allowEmptyValue = true)
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ @ApiModelProperty(value = "Json Object of key/values", notes="Where key is the column name and value is the data value for that column.",
+ example = "{'emp_id': 'df98a3d40cd6','emp_name': 'john',"
+ + "'emp_salary': 50,'address':{'street' : '1 Some way','city' : 'New York'}}")
+ public Map<String, Object> getValues() {
+ return values;
+ }
+
+ public void setValues(Map<String, Object> values) {
+ this.values = values;
+ }
+
+ @ApiModelProperty(value = "Information for selecting specific rows for insert",hidden = true)
+ public Map<String, Object> getRowSpecification() {
+ return rowSpecification;
+ }
+
+ public void setRowSpecification(Map<String, Object> rowSpecification) {
+ this.rowSpecification = rowSpecification;
+ }
+
+ public String getPrimaryKeyVal() {
+ return primaryKeyVal;
+ }
+
+ public void setPrimaryKeyVal(String primaryKeyVal) {
+ this.primaryKeyVal = primaryKeyVal;
+ }
+
+ public byte[] serialize() {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutput out = null;
+ try {
+ out = new ObjectOutputStream(bos);
+ out.writeObject(this);
+ } catch (IOException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.DATAERROR);
+ }
+ return bos.toByteArray();
+ }
+
+ /**
+ * Generate TableInsertQuery
+ * @return
+ * @throws MusicQueryException
+ */
+ public PreparedQueryObject genInsertPreparedQueryObj() throws MusicQueryException {
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ TableMetadata tableInfo = null;
+ try {
+ tableInfo = MusicDataStoreHandle.returnColumnMetadata(this.getKeyspaceName(), this.getTableName());
+ if(tableInfo == null) {
+ throw new MusicQueryException("Table name doesn't exists. Please check the table name.",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ } catch (MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ throw new MusicQueryException(e.getMessage(),Status.BAD_REQUEST.getStatusCode());
+
+ }
+ String primaryKeyName = tableInfo.getPrimaryKey().get(0).getName();
+ StringBuilder fieldsString = new StringBuilder("(vector_ts,");
+ String vectorTs =
+ String.valueOf(Thread.currentThread().getId() + System.currentTimeMillis());
+ StringBuilder valueString = new StringBuilder("(" + "?" + ",");
+ queryObject.addValue(vectorTs);
+
+ Map<String, Object> valuesMap = this.getValues();
+ if (valuesMap==null) {
+ throw new MusicQueryException("Nothing to insert. No values provided in request.",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ int counter = 0;
+ String primaryKey = "";
+ for (Map.Entry<String, Object> entry : valuesMap.entrySet()) {
+ fieldsString.append("" + entry.getKey());
+ Object valueObj = entry.getValue();
+ if (primaryKeyName.equals(entry.getKey())) {
+ primaryKey = entry.getValue() + "";
+ primaryKey = primaryKey.replace("'", "''");
+ }
+ DataType colType = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ } catch(NullPointerException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() +" Invalid column name : "+entry.getKey
+ (), AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR, ex);
+ throw new MusicQueryException("Invalid column name : " + entry.getKey(),
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ Object formattedValue = null;
+ try {
+ formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ valueString.append("?");
+
+ queryObject.addValue(formattedValue);
+
+ if (counter == valuesMap.size() - 1) {
+ fieldsString.append(")");
+ valueString.append(")");
+ } else {
+ fieldsString.append(",");
+ valueString.append(",");
+ }
+ counter = counter + 1;
+ }
+
+ //blobs..
+ Map<String, byte[]> objectMap = this.getObjectMap();
+ if(objectMap != null) {
+ for (Map.Entry<String, byte[]> entry : objectMap.entrySet()) {
+ if(counter > 0) {
+ fieldsString.replace(fieldsString.length()-1, fieldsString.length(), ",");
+ valueString.replace(valueString.length()-1, valueString.length(), ",");
+ }
+ fieldsString.append("" + entry.getKey());
+ byte[] valueObj = entry.getValue();
+ if (primaryKeyName.equals(entry.getKey())) {
+ primaryKey = entry.getValue() + "";
+ primaryKey = primaryKey.replace("'", "''");
+ }
+ DataType colType = tableInfo.getColumn(entry.getKey()).getType();
+ ByteBuffer formattedValue = null;
+ if(colType.toString().toLowerCase().contains("blob")) {
+ formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
+ }
+ valueString.append("?");
+ queryObject.addValue(formattedValue);
+ counter = counter + 1;
+ fieldsString.append(",");
+ valueString.append(",");
+ }
+ }
+ this.setPrimaryKeyVal(primaryKey);
+ if(primaryKey == null || primaryKey.length() <= 0) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Some required partition key parts are missing: "+primaryKeyName );
+ throw new MusicQueryException("Some required partition key parts are missing: " + primaryKeyName,
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ fieldsString.replace(fieldsString.length()-1, fieldsString.length(), ")");
+ valueString.replace(valueString.length()-1, valueString.length(), ")");
+
+ queryObject.appendQueryString("INSERT INTO " + this.getKeyspaceName() + "." + this.getTableName() + " "
+ + fieldsString + " VALUES " + valueString);
+
+ String ttl = this.getTtl();
+ String timestamp = this.getTimestamp();
+
+ if ((ttl != null) && (timestamp != null)) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "both there");
+ queryObject.appendQueryString(" USING TTL ? AND TIMESTAMP ?");
+ queryObject.addValue(Integer.parseInt(ttl));
+ queryObject.addValue(Long.parseLong(timestamp));
+ }
+
+ if ((ttl != null) && (timestamp == null)) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "ONLY TTL there");
+ queryObject.appendQueryString(" USING TTL ?");
+ queryObject.addValue(Integer.parseInt(ttl));
+ }
+
+ if ((ttl == null) && (timestamp != null)) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "ONLY timestamp there");
+ queryObject.appendQueryString(" USING TIMESTAMP ?");
+ queryObject.addValue(Long.parseLong(timestamp));
+ }
+
+ queryObject.appendQueryString(";");
+
+ String consistency = this.getConsistencyInfo().get("type");
+ if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && this.getConsistencyInfo().get("consistency") != null) {
+ if(MusicUtil.isValidConsistency(this.getConsistencyInfo().get("consistency"))) {
+ queryObject.setConsistency(this.getConsistencyInfo().get("consistency"));
+ } else {
+ throw new MusicQueryException("Invalid Consistency type", Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+ queryObject.setOperation("insert");
+
+ logger.info("Data insert Query ::::: " + queryObject.getQuery());
+
+ return queryObject;
+ }
+
+ /**
+ *
+ * @param rowParams
+ * @return
+ * @throws MusicQueryException
+ */
+ public PreparedQueryObject genSelectCriticalPreparedQueryObj(MultivaluedMap<String, String> rowParams) throws MusicQueryException {
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ if((this.getKeyspaceName() == null || this.getKeyspaceName().isEmpty())
+ || (this.getTableName() == null || this.getTableName().isEmpty())){
+ throw new MusicQueryException("one or more path parameters are not set, please check and try again",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+this.getKeyspaceName()+" ) ");
+ RowIdentifier rowId = null;
+ try {
+ rowId = getRowIdentifier(this.getKeyspaceName(), this.getTableName(), rowParams, queryObject);
+ this.setPrimaryKeyVal(rowId.primarKeyValue);
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes
+ .GENERALSERVICEERROR, ex);
+ throw new MusicQueryException(ex.getMessage(), Status.BAD_REQUEST.getStatusCode());
+ }
+
+ queryObject.appendQueryString(
+ "SELECT * FROM " + this.getKeyspaceName() + "." + this.getTableName() + " WHERE " + rowId.rowIdString + ";");
+
+ return queryObject;
+ }
+
+ private class RowIdentifier {
+ public String primarKeyValue;
+ public StringBuilder rowIdString;
+ @SuppressWarnings("unused")
+ public PreparedQueryObject queryObject; // the string with all the row
+ // identifiers separated by AND
+
+ public RowIdentifier(String primaryKeyValue, StringBuilder rowIdString,
+ PreparedQueryObject queryObject) {
+ this.primarKeyValue = primaryKeyValue;
+ this.rowIdString = rowIdString;
+ this.queryObject = queryObject;
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param rowParams
+ * @param queryObject
+ * @return
+ * @throws MusicServiceException
+ */
+ private RowIdentifier getRowIdentifier(String keyspace, String tablename,
+ MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
+ throws MusicServiceException {
+ StringBuilder rowSpec = new StringBuilder();
+ int counter = 0;
+ TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ throw new MusicServiceException(
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ }
+ StringBuilder primaryKey = new StringBuilder();
+ for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
+ String keyName = entry.getKey();
+ List<String> valueList = entry.getValue();
+ String indValue = valueList.get(0);
+ DataType colType = null;
+ Object formattedValue = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey())) {
+ primaryKey.append(indValue);
+ }
+ rowSpec.append(keyName + "= ?");
+ queryObject.addValue(formattedValue);
+ if (counter != rowParams.size() - 1) {
+ rowSpec.append(" AND ");
+ }
+ counter = counter + 1;
+ }
+ return new RowIdentifier(primaryKey.toString(), rowSpec, queryObject);
+ }
+
+
+}
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java
new file mode 100644
index 00000000..cada1c00
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java
@@ -0,0 +1,163 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.util.Map;
+
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.main.MusicUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "JsonTable", description = "Json model creating new keyspace")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonKeySpace {
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonKeySpace.class);
+ private String keyspaceName;
+ private Map<String, Object> replicationInfo;
+ private String durabilityOfWrites;
+ private Map<String, String> consistencyInfo;
+
+ @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ @ApiModelProperty(value = "Replication information")
+ public Map<String, Object> getReplicationInfo() {
+ return replicationInfo;
+ }
+
+ public void setReplicationInfo(Map<String, Object> replicationInfo) {
+ this.replicationInfo = replicationInfo;
+ }
+
+ @ApiModelProperty(value = "Durability", allowableValues = "true,false")
+ public String getDurabilityOfWrites() {
+ return durabilityOfWrites;
+ }
+
+ public void setDurabilityOfWrites(String durabilityOfWrites) {
+ this.durabilityOfWrites = durabilityOfWrites;
+ }
+
+ @ApiModelProperty(value = "Keyspace name")
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ /**
+ * Will generate query to create Keyspacce.
+ *
+ * @throws MusicQueryException
+ */
+ @SuppressWarnings("deprecation")
+ public PreparedQueryObject genCreateKeyspaceQuery() throws MusicQueryException {
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Came inside createKeyspace method");
+ }
+
+ String keyspaceName = this.getKeyspaceName();
+ String durabilityOfWrites = this.getDurabilityOfWrites();
+ String consistency = MusicUtil.EVENTUAL;
+
+ logger.info("genCreateKeyspaceQuery keyspaceName ::" + keyspaceName);
+ logger.info("genCreateKeyspaceQuery class :: " + this.getReplicationInfo().get("class"));
+ logger.info("genCreateKeyspaceQuery replication_factor :: " + this.getReplicationInfo().get("replication_factor"));
+ logger.info("genCreateKeyspaceQuery durabilityOfWrites :: " + durabilityOfWrites);
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && this.getConsistencyInfo().get("consistency") != null) {
+ if(MusicUtil.isValidConsistency(this.getConsistencyInfo().get("consistency"))) {
+ queryObject.setConsistency(this.getConsistencyInfo().get("consistency"));
+ }else {
+ throw new MusicQueryException("Invalid Consistency type",Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+
+ long start = System.currentTimeMillis();
+ Map<String, Object> replicationInfo = this.getReplicationInfo();
+ String repString = null;
+ try {
+ repString = "{" + MusicUtil.jsonMaptoSqlString(replicationInfo, ",") + "}";
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ }
+ queryObject.appendQueryString("CREATE KEYSPACE " + keyspaceName + " WITH replication = " + repString);
+ if (this.getDurabilityOfWrites() != null) {
+ queryObject.appendQueryString(" AND durable_writes = " + this.getDurabilityOfWrites());
+ }
+ queryObject.appendQueryString(";");
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Time taken for setting up query in create keyspace:" + (end - start));
+
+ return queryObject;
+ }
+
+ /**
+ * Will generate Query to drop a keyspace.
+ *
+ * @return
+ */
+ public PreparedQueryObject genDropKeyspaceQuery() {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Coming inside genDropKeyspaceQuery method "+this.getKeyspaceName());
+ }
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString("DROP KEYSPACE " + this.getKeyspaceName() + ";");
+
+ return queryObject;
+ }
+
+ @Override
+ public String toString() {
+ return "CassaKeyspaceObject [keyspaceName=" + keyspaceName + ", replicationInfo=" + replicationInfo
+ + "durabilityOfWrites=" + durabilityOfWrites + "]";
+ }
+
+}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java
index 06a76f57..86bbe3dc 100644
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLeasedLock.java
@@ -27,11 +27,10 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
-@ApiModel(value = "JsonTable", description = "model for leased lock")
+@ApiModel(value = "Json Leasesd Lock", description = "model for leased lock")
@JsonIgnoreProperties(ignoreUnknown = true)
public class JsonLeasedLock {
- long leasePeriod;
- String notifyUrl;
+ private long leasePeriod;
@ApiModelProperty(value = "Lease period")
public long getLeasePeriod() {
@@ -42,12 +41,4 @@ public class JsonLeasedLock {
this.leasePeriod = leasePeriod;
}
- @ApiModelProperty(value = "URL to be notified")
- public String getNotifyUrl() {
- return notifyUrl;
- }
-
- public void setNotifyUrl(String notifyUrl) {
- this.notifyUrl = notifyUrl;
- }
}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/AAFResponse.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLock.java
index 3544e068..f353c018 100644
--- a/src/main/java/org/onap/music/datastore/jsonobjects/AAFResponse.java
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonLock.java
@@ -2,9 +2,7 @@
* ============LICENSE_START==========================================
* org.onap.music
* ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * Modifications Copyright (c) 2018 IBM
+ * Copyright (c) 2017 AT&T Intellectual Property
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,23 +22,28 @@
package org.onap.music.datastore.jsonobjects;
-import java.util.List;
+import org.onap.music.lockingservice.cassandra.LockType;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
-@ApiModel(value = "JsonTable", description = "Reponse class for AAF request")
-public class AAFResponse {
-
- private List<NameSpace> ns = null;
-
- @ApiModelProperty(value = "Namespace value")
- public List<NameSpace> getNs() {
- return ns;
+@ApiModel(value = "Json Lock Type", description = "Model for Lock Type")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonLock {
+ private LockType locktype;
+
+ @ApiModelProperty(
+ value = "Type of music lock",
+ name = "lockType",
+ allowEmptyValue = false,
+ allowableValues = "READ|WRITE")
+ public LockType getLocktype() {
+ return this.locktype;
}
- public void setNs(List<NameSpace> ns) {
- this.ns = ns;
+ public void setLockType(LockType locktype) {
+ this.locktype = locktype;
}
-
}
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java
new file mode 100644
index 00000000..e354b4b0
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java
@@ -0,0 +1,208 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.TableMetadata;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonSelect implements Serializable {
+ private Map<String, String> consistencyInfo;
+ private String keyspaceName;
+ private String tableName;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonSelect.class);
+
+
+
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ public byte[] serialize() {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutput out = null;
+ try {
+ out = new ObjectOutputStream(bos);
+ out.writeObject(this);
+ } catch (IOException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
+ }
+ return bos.toByteArray();
+ }
+
+ /**
+ * genSelectQuery
+ *
+ * @return
+ * @throws MusicQueryException
+ */
+ public PreparedQueryObject genSelectQuery(MultivaluedMap<String, String> rowParams) throws MusicQueryException {
+
+ if((this.getKeyspaceName() == null || this.getKeyspaceName().isEmpty())
+ || (this.getTableName() == null || this.getTableName().isEmpty())){
+ throw new MusicQueryException("one or more path parameters are not set, please check and try again",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + this.getKeyspaceName() + " ) ");
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ if (rowParams.isEmpty()) { // select all
+ queryObject.appendQueryString("SELECT * FROM " + this.getKeyspaceName() + "." + this.getTableName() + ";");
+ } else {
+ int limit = -1; // do not limit the number of results
+ try {
+ queryObject = selectSpecificQuery(this.getKeyspaceName(), this.getTableName(), rowParams, limit);
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN,
+ ErrorTypes.GENERALSERVICEERROR, ex);
+
+ throw new MusicQueryException(ex.getMessage(), Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+
+ return queryObject;
+ }
+
+ public PreparedQueryObject selectSpecificQuery(String keyspace,
+ String tablename, MultivaluedMap<String, String> rowParams, int limit)
+ throws MusicServiceException {
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ StringBuilder rowIdString = getRowIdentifier(keyspace,
+ tablename,rowParams,queryObject).rowIdString;
+ queryObject.appendQueryString(
+ "SELECT * FROM " + keyspace + "." + tablename + " WHERE " + rowIdString);
+ if (limit != -1) {
+ queryObject.appendQueryString(" LIMIT " + limit);
+ }
+ queryObject.appendQueryString(";");
+ return queryObject;
+ }
+
+ private class RowIdentifier {
+ public String primarKeyValue;
+ public StringBuilder rowIdString;
+ @SuppressWarnings("unused")
+ public PreparedQueryObject queryObject; // the string with all the row
+ // identifiers separated by AND
+
+ public RowIdentifier(String primaryKeyValue, StringBuilder rowIdString,
+ PreparedQueryObject queryObject) {
+ this.primarKeyValue = primaryKeyValue;
+ this.rowIdString = rowIdString;
+ this.queryObject = queryObject;
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param rowParams
+ * @param queryObject
+ * @return
+ * @throws MusicServiceException
+ */
+ private RowIdentifier getRowIdentifier(String keyspace, String tablename,
+ MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
+ throws MusicServiceException {
+ StringBuilder rowSpec = new StringBuilder();
+ int counter = 0;
+ TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ throw new MusicServiceException(
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ }
+ StringBuilder primaryKey = new StringBuilder();
+ for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
+ String keyName = entry.getKey();
+ List<String> valueList = entry.getValue();
+ String indValue = valueList.get(0);
+ DataType colType = null;
+ Object formattedValue = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey())) {
+ primaryKey.append(indValue);
+ }
+ rowSpec.append(keyName + "= ?");
+ queryObject.addValue(formattedValue);
+ if (counter != rowParams.size() - 1) {
+ rowSpec.append(" AND ");
+ }
+ counter = counter + 1;
+ }
+ return new RowIdentifier(primaryKey.toString(), rowSpec, queryObject);
+ }
+
+}
diff --git a/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java
new file mode 100644
index 00000000..0ba1a7ef
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java
@@ -0,0 +1,363 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.util.Map;
+
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.main.MusicUtil;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "JsonTable", description = "Defines the Json for Creating a new Table.")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonTable {
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonTable.class);
+
+ private String keyspaceName;
+ private String tableName;
+
+ private Map<String, String> fields;
+ private Map<String, Object> properties;
+ private String primaryKey;
+ private String partitionKey;
+ private String clusteringKey;
+ private String filteringKey;
+ private String clusteringOrder;
+ private Map<String, String> consistencyInfo;
+
+ @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ @ApiModelProperty(value = "Properties")
+ public Map<String, Object> getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Map<String, Object> properties) {
+ this.properties = properties;
+ }
+
+ @ApiModelProperty(value = "Fields")
+ public Map<String, String> getFields() {
+ return fields;
+ }
+
+ public void setFields(Map<String, String> fields) {
+ this.fields = fields;
+ }
+
+ @ApiModelProperty(value = "KeySpace Name")
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ @ApiModelProperty(value = "Table Name")
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ @ApiModelProperty(value = "Clustering Order", notes = "")
+ public String getClusteringOrder() {
+ return clusteringOrder;
+ }
+
+ public void setClusteringOrder(String clusteringOrder) {
+ this.clusteringOrder = clusteringOrder;
+ }
+
+ @ApiModelProperty(value = "Primary Key")
+ public String getPrimaryKey() {
+ return primaryKey;
+ }
+
+ public void setPrimaryKey(String primaryKey) {
+ this.primaryKey = primaryKey;
+ }
+
+ public String getClusteringKey() {
+ return clusteringKey;
+ }
+
+ public void setClusteringKey(String clusteringKey) {
+ this.clusteringKey = clusteringKey;
+ }
+
+ public String getFilteringKey() {
+ return filteringKey;
+ }
+
+ public void setFilteringKey(String filteringKey) {
+ this.filteringKey = filteringKey;
+ }
+
+ public String getPartitionKey() {
+ return partitionKey;
+ }
+
+ public void setPartitionKey(String partitionKey) {
+ this.partitionKey = partitionKey;
+ }
+
+ public PreparedQueryObject genCreateTableQuery() throws MusicQueryException {
+ String primaryKey = null;
+ String partitionKey = this.getPartitionKey();
+ String clusterKey = this.getClusteringKey();
+ String filteringKey = this.getFilteringKey();
+ if (filteringKey != null) {
+ clusterKey = clusterKey + "," + filteringKey;
+ }
+ primaryKey = this.getPrimaryKey(); // get primaryKey if available
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ // first read the information about the table fields
+ Map<String, String> fields = this.getFields();
+ if (fields == null) {
+ throw new MusicQueryException(
+ "Create Table Error: No fields in request", Status.BAD_REQUEST.getStatusCode());
+ }
+ StringBuilder fieldsString = new StringBuilder("(vector_ts text,");
+ int counter = 0;
+ for (Map.Entry<String, String> entry : fields.entrySet()) {
+ if (entry.getKey().equals("PRIMARY KEY")) {
+ primaryKey = entry.getValue(); // replaces primaryKey
+ primaryKey = primaryKey.trim();
+ }
+ else {
+ if (counter == 0 )
+ fieldsString.append("" + entry.getKey() + " " + entry.getValue() + "");
+ else fieldsString.append("," + entry.getKey() + " " + entry.getValue() + "");
+ }
+
+ if (counter != (fields.size() - 1) ) {
+ counter = counter + 1;
+ } else {
+
+ if((primaryKey != null) && (partitionKey == null)) {
+ primaryKey = primaryKey.trim();
+ int count1 = StringUtils.countMatches(primaryKey, ')');
+ int count2 = StringUtils.countMatches(primaryKey, '(');
+ if (count1 != count2) {
+ throw new MusicQueryException(
+ "Create Table Error: primary key '(' and ')' do not match, primary key=" + primaryKey,
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ if ( primaryKey.indexOf('(') == -1 || ( count2 == 1 && (primaryKey.lastIndexOf(')') +1) == primaryKey.length() ) ) {
+ if (primaryKey.contains(",") ) {
+ partitionKey= primaryKey.substring(0,primaryKey.indexOf(','));
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ clusterKey=primaryKey.substring(primaryKey.indexOf(',')+1); // make sure index
+ clusterKey=clusterKey.replaceAll("[)]+", "");
+ } else {
+ partitionKey=primaryKey;
+ partitionKey=partitionKey.replaceAll("[\\)]+","");
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ clusterKey="";
+ }
+ } else { // not null and has ) before the last char
+ partitionKey= primaryKey.substring(0,primaryKey.indexOf(')'));
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ partitionKey = partitionKey.trim();
+ clusterKey= primaryKey.substring(primaryKey.indexOf(')'));
+ clusterKey=clusterKey.replaceAll("[\\(]+","");
+ clusterKey=clusterKey.replaceAll("[\\)]+","");
+ clusterKey = clusterKey.trim();
+ if (clusterKey.indexOf(',') == 0) {
+ clusterKey=clusterKey.substring(1);
+ }
+ clusterKey = clusterKey.trim();
+ if (clusterKey.equals(",") )
+ clusterKey=""; // print error if needed ( ... ),)
+ }
+
+ if (!(partitionKey.isEmpty() || clusterKey.isEmpty())
+ && (partitionKey.equalsIgnoreCase(clusterKey) ||
+ clusterKey.contains(partitionKey) || partitionKey.contains(clusterKey)) ) {
+ logger.error("DataAPI createTable partition/cluster key ERROR: partitionKey="+partitionKey+", clusterKey=" + clusterKey + " and primary key=" + primaryKey );
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(
+ "Create Table primary key error: clusterKey(" + clusterKey + ") equals/contains/overlaps partitionKey(" +partitionKey+ ") of"
+ + " primary key=" + primaryKey)
+ .toMap()).build();*/
+ throw new MusicQueryException("Create Table primary key error: clusterKey(" + clusterKey
+ + ") equals/contains/overlaps partitionKey(" + partitionKey + ") of" + " primary key="
+ + primaryKey, Status.BAD_REQUEST.getStatusCode());
+
+ }
+
+ if (partitionKey.isEmpty() )
+ primaryKey="";
+ else if (clusterKey.isEmpty() )
+ primaryKey=" (" + partitionKey + ")";
+ else
+ primaryKey=" (" + partitionKey + ")," + clusterKey;
+
+
+ if (primaryKey != null)
+ fieldsString.append(", PRIMARY KEY (" + primaryKey + " )");
+
+ } else { // end of length > 0
+
+ if (!(partitionKey.isEmpty() || clusterKey.isEmpty())
+ && (partitionKey.equalsIgnoreCase(clusterKey) ||
+ clusterKey.contains(partitionKey) || partitionKey.contains(clusterKey)) ) {
+ logger.error("DataAPI createTable partition/cluster key ERROR: partitionKey="+partitionKey+", clusterKey=" + clusterKey);
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(
+ "Create Table primary key error: clusterKey(" + clusterKey + ") equals/contains/overlaps partitionKey(" +partitionKey+ ")")
+ .toMap()).build();*/
+ throw new MusicQueryException(
+ "Create Table primary key error: clusterKey(" + clusterKey
+ + ") equals/contains/overlaps partitionKey(" + partitionKey + ")",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ if (partitionKey.isEmpty() )
+ primaryKey="";
+ else if (clusterKey.isEmpty() )
+ primaryKey=" (" + partitionKey + ")";
+ else
+ primaryKey=" (" + partitionKey + ")," + clusterKey;
+
+ if (primaryKey != null)
+ fieldsString.append(", PRIMARY KEY (" + primaryKey + " )");
+ }
+ fieldsString.append(")");
+
+ } // end of last field check
+
+ } // end of for each
+ // information about the name-value style properties
+ Map<String, Object> propertiesMap = this.getProperties();
+ StringBuilder propertiesString = new StringBuilder();
+ if (propertiesMap != null) {
+ counter = 0;
+ for (Map.Entry<String, Object> entry : propertiesMap.entrySet()) {
+ Object ot = entry.getValue();
+ String value = ot + "";
+ if (ot instanceof String) {
+ value = "'" + value + "'";
+ } else if (ot instanceof Map) {
+ @SuppressWarnings("unchecked")
+ Map<String, Object> otMap = (Map<String, Object>) ot;
+ try {
+ value = "{" + MusicUtil.jsonMaptoSqlString(otMap, ",") + "}";
+ } catch (Exception e) {
+ throw new MusicQueryException(e.getMessage(),
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+
+ propertiesString.append(entry.getKey() + "=" + value + "");
+ if (counter != propertiesMap.size() - 1)
+ propertiesString.append(" AND ");
+
+ counter = counter + 1;
+ }
+ }
+
+ String clusteringOrder = this.getClusteringOrder();
+
+ if (clusteringOrder != null && !(clusteringOrder.isEmpty())) {
+ String[] arrayClusterOrder = clusteringOrder.split("[,]+");
+
+ for (int i = 0; i < arrayClusterOrder.length; i++) {
+ String[] clusterS = arrayClusterOrder[i].trim().split("[ ]+");
+ if ( (clusterS.length ==2) && (clusterS[1].equalsIgnoreCase("ASC") || clusterS[1].equalsIgnoreCase("DESC"))) {
+ continue;
+ } else {
+ /*return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("createTable/Clustering Order vlaue ERROR: valid clustering order is ASC or DESC or expecting colname order; please correct clusteringOrder:"+ clusteringOrder+".")
+ .toMap()).build();*/
+
+ throw new MusicQueryException(
+ "createTable/Clustering Order vlaue ERROR: valid clustering order is ASC or DESC or expecting colname order; please correct clusteringOrder:"
+ + clusteringOrder + ".",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ // add validation for column names in cluster key
+ }
+
+ if (!(clusterKey.isEmpty())) {
+ clusteringOrder = "CLUSTERING ORDER BY (" +clusteringOrder +")";
+ //cjc check if propertiesString.length() >0 instead propertiesMap
+ if (propertiesMap != null) {
+ propertiesString.append(" AND "+ clusteringOrder);
+ } else {
+ propertiesString.append(clusteringOrder);
+ }
+ } else {
+ logger.warn("Skipping clustering order=("+clusteringOrder+ ") since clustering key is empty ");
+ }
+ } //if non empty
+
+ queryObject.appendQueryString(
+ "CREATE TABLE " + this.getKeyspaceName() + "." + this.getTableName() + " " + fieldsString);
+
+
+ if (propertiesString != null && propertiesString.length()>0 )
+ queryObject.appendQueryString(" WITH " + propertiesString);
+ queryObject.appendQueryString(";");
+
+ return queryObject;
+ }
+
+ /**
+ * genDropTableQuery
+ *
+ * @return PreparedQueryObject
+ */
+ public PreparedQueryObject genDropTableQuery() {
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString("DROP TABLE " + this.getKeyspaceName() + "." + this.getTableName() + ";");
+ logger.info("Delete Query ::::: " + query.getQuery());
+
+ return query;
+ }
+
+
+}
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
new file mode 100644
index 00000000..29fdb1d4
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java
@@ -0,0 +1,436 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 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.datastore.jsonobjects;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ReturnType;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.TableMetadata;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@ApiModel(value = "JsonTable", description = "Json model for table update")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class JsonUpdate implements Serializable {
+ private String keyspaceName;
+ private String tableName;
+ private transient Map<String, Object> values;
+ private String ttl;
+ private String timestamp;
+ private Map<String, String> consistencyInfo;
+ private transient Map<String, Object> conditions;
+ private transient Map<String, Object> rowSpecification;
+ private String rowIdString;
+ private String primarKeyValue;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonUpdate.class);
+
+ @ApiModelProperty(value = "Conditions")
+ public Map<String, Object> getConditions() {
+ return conditions;
+ }
+
+ public void setConditions(Map<String, Object> conditions) {
+ this.conditions = conditions;
+ }
+
+ @ApiModelProperty(value = "Information for selecting sepcific rows")
+ public Map<String, Object> getRow_specification() {
+ return rowSpecification;
+ }
+
+ public void setRow_specification(Map<String, Object> rowSpecification) {
+ this.rowSpecification = rowSpecification;
+ }
+
+
+ @ApiModelProperty(value = "Keyspace name")
+ public String getKeyspaceName() {
+ return keyspaceName;
+ }
+
+ public void setKeyspaceName(String keyspaceName) {
+ this.keyspaceName = keyspaceName;
+ }
+
+ @ApiModelProperty(value = "Table name")
+ public String getTableName() {
+ return tableName;
+ }
+
+ public void setTableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
+ public Map<String, String> getConsistencyInfo() {
+ return consistencyInfo;
+ }
+
+ public void setConsistencyInfo(Map<String, String> consistencyInfo) {
+ this.consistencyInfo = consistencyInfo;
+ }
+
+ @ApiModelProperty(value = "Time to live value")
+ public String getTtl() {
+ return ttl;
+ }
+
+ public void setTtl(String ttl) {
+ this.ttl = ttl;
+ }
+
+ @ApiModelProperty(value = "Time stamp")
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ @ApiModelProperty(value = "Column values")
+ public Map<String, Object> getValues() {
+ return values;
+ }
+
+ public void setValues(Map<String, Object> values) {
+ this.values = values;
+ }
+
+ public String getRowIdString() {
+ return rowIdString;
+ }
+
+ public void setRowIdString(String rowIdString) {
+ this.rowIdString = rowIdString;
+ }
+
+ public String getPrimarKeyValue() {
+ return primarKeyValue;
+ }
+
+ public void setPrimarKeyValue(String primarKeyValue) {
+ this.primarKeyValue = primarKeyValue;
+ }
+
+ public byte[] serialize() {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutput out = null;
+ try {
+ out = new ObjectOutputStream(bos);
+ out.writeObject(this);
+ } catch (IOException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e,AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.DATAERROR);
+ }
+ return bos.toByteArray();
+ }
+
+ /**
+ * Generate TableInsertQuery
+ * @return
+ * @throws MusicQueryException
+ */
+ public PreparedQueryObject genUpdatePreparedQueryObj(MultivaluedMap<String, String> rowParams) throws MusicQueryException {
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ if((this.getKeyspaceName() == null || this.getKeyspaceName().isEmpty()) ||
+ (this.getTableName() == null || this.getTableName().isEmpty())){
+
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();*/
+
+ throw new MusicQueryException("one or more path parameters are not set, please check and try again",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+this.getKeyspaceName()+" ) ");
+ String operationId = UUID.randomUUID().toString(); // just for infoging purposes.
+ String consistency = this.getConsistencyInfo().get("type");
+
+ logger.info(EELFLoggerDelegate.applicationLogger, "--------------Music " + consistency
+ + " update-" + operationId + "-------------------------");
+ // obtain the field value pairs of the update
+
+ Map<String, Object> valuesMap = this.getValues();
+
+ TableMetadata tableInfo = getColumnMetadata(this.getKeyspaceName(), this.getTableName());
+
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"Table information not found. Please check input for table name= "+this.getTableName(), AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
+
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("Table information not found. Please check input for table name= "
+ + this.getKeyspaceName() + "." + this.getTableName()).toMap()).build();*/
+
+ throw new MusicQueryException("Table information not found. Please check input for table name= "
+ + this.getKeyspaceName() + "." + this.getTableName(), Status.BAD_REQUEST.getStatusCode());
+ }
+
+ String vectorTs = String.valueOf(Thread.currentThread().getId() + System.currentTimeMillis());
+ StringBuilder fieldValueString = new StringBuilder("vector_ts=?,");
+ queryObject.addValue(vectorTs);
+ int counter = 0;
+ for (Map.Entry<String, Object> entry : valuesMap.entrySet()) {
+ Object valueObj = entry.getValue();
+ DataType colType = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ } catch(NullPointerException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex, "Invalid column name : "+entry.getKey(), ex);
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).
+ * setError("Invalid column name : "+entry.getKey()).toMap()).build();*/
+
+ throw new MusicQueryException("Invalid column name : " + entry.getKey(),Status.BAD_REQUEST.getStatusCode());
+ }
+ Object valueString = null;
+ try {
+ valueString = MusicUtil.convertToActualDataType(colType, valueObj);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ fieldValueString.append(entry.getKey() + "= ?");
+ queryObject.addValue(valueString);
+ if (counter != valuesMap.size() - 1) {
+ fieldValueString.append(",");
+ }
+ counter = counter + 1;
+ }
+ String ttl = this.getTtl();
+ String timestamp = this.getTimestamp();
+
+ queryObject.appendQueryString("UPDATE " + this.getKeyspaceName() + "." + this.getTableName() + " ");
+ if ((ttl != null) && (timestamp != null)) {
+ logger.info("both there");
+ queryObject.appendQueryString(" USING TTL ? AND TIMESTAMP ?");
+ queryObject.addValue(Integer.parseInt(ttl));
+ queryObject.addValue(Long.parseLong(timestamp));
+ }
+
+ if ((ttl != null) && (timestamp == null)) {
+ logger.info("ONLY TTL there");
+ queryObject.appendQueryString(" USING TTL ?");
+ queryObject.addValue(Integer.parseInt(ttl));
+ }
+
+ if ((ttl == null) && (timestamp != null)) {
+ logger.info("ONLY timestamp there");
+ queryObject.appendQueryString(" USING TIMESTAMP ?");
+ queryObject.addValue(Long.parseLong(timestamp));
+ }
+
+ // get the row specifier
+ RowIdentifier rowId = null;
+ try {
+ rowId = getRowIdentifier(this.getKeyspaceName(), this.getTableName(), rowParams, queryObject);
+ this.setRowIdString(rowId.rowIdString);
+ this.setPrimarKeyValue(rowId.primarKeyValue);
+ if(rowId == null || rowId.getPrimaryKeyValue().isEmpty()) {
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("Mandatory WHERE clause is missing. Please check the input request.").toMap()).build();*/
+
+ throw new MusicQueryException("Mandatory WHERE clause is missing. Please check the input request.",
+ Status.BAD_REQUEST.getStatusCode());
+ }
+ } catch (MusicQueryException ex) {
+ throw new MusicQueryException("Mandatory WHERE clause is missing. Please check the input request.",
+ Status.BAD_REQUEST.getStatusCode());
+
+ }catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes
+ .GENERALSERVICEERROR, ex);
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();*/
+
+ throw new MusicQueryException(ex.getMessage(), Status.BAD_REQUEST.getStatusCode());
+
+ }
+
+
+
+ queryObject.appendQueryString(
+ " SET " + fieldValueString + " WHERE " + rowId.getRowIdString() + ";");
+
+
+
+ // get the conditional, if any
+ Condition conditionInfo;
+ if (this.getConditions() == null) {
+ conditionInfo = null;
+ } else {
+ // to avoid parsing repeatedly, just send the select query to obtain row
+ PreparedQueryObject selectQuery = new PreparedQueryObject();
+ selectQuery.appendQueryString("SELECT * FROM " + this.getKeyspaceName() + "." + this.getTableName() + " WHERE "
+ + rowId.getRowIdString() + ";");
+ selectQuery.addValue(rowId.primarKeyValue);
+ conditionInfo = new Condition(this.getConditions(), selectQuery);
+ }
+
+ if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && this.getConsistencyInfo().get("consistency") != null) {
+ if(MusicUtil.isValidConsistency(this.getConsistencyInfo().get("consistency"))) {
+ queryObject.setConsistency(this.getConsistencyInfo().get("consistency"));
+ } else {
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR)
+ .setError("Invalid Consistency type").toMap()).build();*/
+
+ logger.error("Invalid Consistency type");
+ throw new MusicQueryException("Invalid Consistency type", Status.BAD_REQUEST.getStatusCode());
+ }
+ }
+
+ queryObject.setOperation("update");
+
+ return queryObject;
+ }
+
+ TableMetadata getColumnMetadata(String keyspaceName, String tableName) throws MusicQueryException {
+ TableMetadata tableInfo;
+ try {
+ tableInfo = returnColumnMetadata(keyspaceName, tableName);
+ } catch (MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes
+ .GENERALSERVICEERROR, e);
+ /*return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();*/
+ throw new MusicQueryException(e.getMessage(), Status.BAD_REQUEST.getStatusCode());
+ }catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.UNKNOWNERROR, ErrorSeverity.CRITICAL,
+ ErrorTypes.GENERALSERVICEERROR);
+ throw new MusicQueryException(e.getMessage(), Status.BAD_REQUEST.getStatusCode());
+ }
+ return tableInfo;
+ }
+
+ /** wrapper around static method for testing */
+ TableMetadata returnColumnMetadata(String keyspace, String tableName) throws MusicServiceException {
+ return MusicDataStoreHandle.returnColumnMetadata(keyspace, tableName);
+ }
+
+ class RowIdentifier {
+ private String primarKeyValue;
+ private String rowIdString;
+ @SuppressWarnings("unused")
+ public PreparedQueryObject queryObject; // the string with all the row
+ // identifiers separated by AND
+
+ public RowIdentifier(String primaryKeyValue, String rowIdString,
+ PreparedQueryObject queryObject) {
+ this.primarKeyValue = primaryKeyValue;
+ this.rowIdString = rowIdString;
+ this.queryObject = queryObject;
+ }
+
+ public String getPrimaryKeyValue() {
+ return this.primarKeyValue;
+ }
+
+ public void setPrimaryKeyValue(String primaryKeyValue) {
+ this.primarKeyValue = primaryKeyValue;
+ }
+
+ public String getRowIdString() {
+ return this.rowIdString;
+ }
+
+ public void setRowIdString(String rowIdString) {
+ this.rowIdString = rowIdString;
+ }
+
+ public PreparedQueryObject getQueryObject() {
+ return this.queryObject;
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param rowParams
+ * @param queryObject
+ * @return
+ * @throws MusicServiceException
+ */
+ RowIdentifier getRowIdentifier(String keyspace, String tablename,
+ MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
+ throws MusicServiceException {
+ StringBuilder rowSpec = new StringBuilder();
+ int counter = 0;
+ TableMetadata tableInfo = returnColumnMetadata(keyspace, tablename);
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ throw new MusicServiceException(
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ }
+ StringBuilder primaryKey = new StringBuilder();
+ for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
+ String keyName = entry.getKey();
+ List<String> valueList = entry.getValue();
+ String indValue = valueList.get(0);
+ DataType colType = null;
+ Object formattedValue = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey())) {
+ primaryKey.append(indValue);
+ }
+ rowSpec.append(keyName + "= ?");
+ queryObject.addValue(formattedValue);
+ if (counter != rowParams.size() - 1) {
+ rowSpec.append(" AND ");
+ }
+ counter = counter + 1;
+ }
+ return new RowIdentifier(primaryKey.toString(), rowSpec.toString(), queryObject);
+ }
+
+}
diff --git a/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java b/music-core/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java
index 079fc579..fbfc0de6 100644
--- a/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java
+++ b/music-core/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java
@@ -26,12 +26,13 @@ package org.onap.music.eelf.healthcheck;
import java.util.UUID;
+import org.onap.music.datastore.MusicDataStoreHandle;
import org.onap.music.datastore.PreparedQueryObject;
import org.onap.music.eelf.logging.EELFLoggerDelegate;
import org.onap.music.eelf.logging.format.AppMessages;
import org.onap.music.eelf.logging.format.ErrorSeverity;
import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
import org.onap.music.exceptions.MusicServiceException;
import org.onap.music.main.MusicUtil;
import org.onap.music.main.ResultType;
@@ -53,24 +54,33 @@ public class MusicHealthCheck {
logger.info(EELFLoggerDelegate.applicationLogger, "Getting Status for Cassandra");
boolean result = false;
+ UUID randomUUID = UUID.randomUUID();
try {
- result = getAdminKeySpace(consistency);
- } catch(Exception e) {
+ result = getAdminKeySpace(consistency, randomUUID);
+ } catch( Exception e) {
if(e.getMessage().toLowerCase().contains("unconfigured table healthcheck")) {
logger.error("Error", e);
logger.debug("Creating table....");
- boolean ksresult = createKeyspace();
- if(ksresult)
- try {
- result = getAdminKeySpace(consistency);
- } catch (MusicServiceException e1) {
- logger.error(EELFLoggerDelegate.errorLogger, e1, AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN);
+ try {
+ boolean ksresult = createKeyspace();
+ if(ksresult) {
+ result = getAdminKeySpace(consistency, randomUUID);
}
+ } catch (MusicServiceException e1) {
+ logger.error(EELFLoggerDelegate.errorLogger, e1.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN, e1);
+ } catch (MusicQueryException e1) {
+ logger.error(EELFLoggerDelegate.errorLogger, e1.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN,e1);
+ }
} else {
logger.error("Error", e);
return "One or more nodes are down or not responding.";
}
}
+ try {
+ cleanHealthCheckId(randomUUID);
+ } catch (MusicServiceException | MusicQueryException e) {
+ logger.error("Error while cleaning healthcheck record id...", e);
+ }
if (result) {
return "ACTIVE";
} else {
@@ -79,24 +89,33 @@ public class MusicHealthCheck {
}
}
- private Boolean getAdminKeySpace(String consistency) throws MusicServiceException {
+ private Boolean getAdminKeySpace(String consistency, UUID randomUUID) throws MusicServiceException,MusicQueryException {
PreparedQueryObject pQuery = new PreparedQueryObject();
pQuery.appendQueryString("insert into admin.healthcheck (id) values (?)");
- pQuery.addValue(UUID.randomUUID());
- ResultType rs = MusicCore.nonKeyRelatedPut(pQuery, consistency);
+ pQuery.addValue(randomUUID);
+ ResultType rs = null;
+ rs = MusicCore.nonKeyRelatedPut(pQuery, consistency);
logger.info(rs.toString());
return null != rs;
+
}
+
+ private void cleanHealthCheckId(UUID randomUUID) throws MusicServiceException, MusicQueryException {
+ String cleanQuery = "delete from admin.healthcheck where id = ?";
+ PreparedQueryObject deleteQueryObject = new PreparedQueryObject();
+ deleteQueryObject.appendQueryString(cleanQuery);
+ deleteQueryObject.addValue(randomUUID);
+ MusicDataStoreHandle.getDSHandle().executePut(deleteQueryObject, "eventual");
+ logger.info(EELFLoggerDelegate.applicationLogger, "Cassandra healthcheck responded and cleaned up.");
+ }
+
- private boolean createKeyspace() {
+
+ private boolean createKeyspace() throws MusicServiceException,MusicQueryException {
PreparedQueryObject pQuery = new PreparedQueryObject();
pQuery.appendQueryString("CREATE TABLE admin.healthcheck (id uuid PRIMARY KEY)");
ResultType rs = null ;
- try {
- rs = MusicCore.nonKeyRelatedPut(pQuery, ConsistencyLevel.ONE.toString());
- } catch (MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN);
- }
+ rs = MusicCore.nonKeyRelatedPut(pQuery, ConsistencyLevel.ONE.toString());
return rs != null && rs.getResult().toLowerCase().contains("success");
}
@@ -108,4 +127,4 @@ public class MusicHealthCheck {
this.cassandrHost = cassandrHost;
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java b/music-core/src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java
index 64960b1e..a8012c82 100644
--- a/src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java
+++ b/music-core/src/main/java/org/onap/music/eelf/logging/EELFLoggerDelegate.java
@@ -44,6 +44,7 @@ public class EELFLoggerDelegate extends SLF4jWrapper implements EELFLogger {
public static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
public static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
public static final EELFLogger debugLogger = EELFManager.getInstance().getDebugLogger();
+ public static final EELFLogger securityLogger = EELFManager.getInstance().getSecurityLogger();
private String className;
private static ConcurrentMap<String, EELFLoggerDelegate> classMap = new ConcurrentHashMap<>();
@@ -230,9 +231,7 @@ public class EELFLoggerDelegate extends SLF4jWrapper implements EELFLogger {
* @param logger
* @param msg
*
- * @deprecated use {@link #error(EELF, Exception)} instead
*/
- @Deprecated
public void error(EELFLogger logger, String msg) {
logger.error(className+ " - " + msg);
}
@@ -254,9 +253,7 @@ public class EELFLoggerDelegate extends SLF4jWrapper implements EELFLogger {
* @param msg
* @param arguments
*
- * @deprecated use {@link #error(EELF, Exception, Object...)} instead
*/
- @Deprecated
public void error(EELFLogger logger, String msg, Object... arguments) {
logger.error(msg, arguments);
}
@@ -289,9 +286,7 @@ public class EELFLoggerDelegate extends SLF4jWrapper implements EELFLogger {
* @param logger
* @param msg
* @param severtiy
- * @deprecated use {@link #error(EELF, Exception)} instead
*/
- @Deprecated
public void error(EELFLogger logger, String msg, Object /* AlarmSeverityEnum */ severtiy) {
logger.error(msg);
}
@@ -309,6 +304,8 @@ public class EELFLoggerDelegate extends SLF4jWrapper implements EELFLogger {
debug(debugLogger, msg);
info(auditLogger, msg);
info(metricsLogger, msg);
+ info(securityLogger, msg);
+
}
/**
diff --git a/src/main/java/org/onap/music/eelf/logging/format/AppMessages.java b/music-core/src/main/java/org/onap/music/eelf/logging/format/AppMessages.java
index 5af3661c..5af3661c 100644
--- a/src/main/java/org/onap/music/eelf/logging/format/AppMessages.java
+++ b/music-core/src/main/java/org/onap/music/eelf/logging/format/AppMessages.java
diff --git a/src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java
index 0afd9eea..91ee3473 100644
--- a/src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java
+++ b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorCodes.java
@@ -67,7 +67,7 @@ public enum ErrorCodes {
* [ERR509E] Lock not destroyed
* [ERR510E] Lock not released
* [ERR511E] Lock not deleted
- * [ERR512E] Failed to get ZK Lock Handle
+ * [ERR512E] Failed to get Lock Handle
*
*
* 600 - 699 - Music Service Errors
diff --git a/src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java
index 4e798239..4e798239 100644
--- a/src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java
+++ b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorSeverity.java
diff --git a/src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java
index 9bdbf20f..9bdbf20f 100644
--- a/src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java
+++ b/music-core/src/main/java/org/onap/music/eelf/logging/format/ErrorTypes.java
diff --git a/music-core/src/main/java/org/onap/music/exceptions/MusicDeadlockException.java b/music-core/src/main/java/org/onap/music/exceptions/MusicDeadlockException.java
new file mode 100644
index 00000000..7a40ed91
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/exceptions/MusicDeadlockException.java
@@ -0,0 +1,75 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.exceptions;
+
+public class MusicDeadlockException extends MusicLockingException {
+
+ private String owner = null;
+ private String keyspace = null;
+ private String table = null;
+ private String key = null;
+
+ public MusicDeadlockException() {
+ super();
+ }
+
+ public MusicDeadlockException(String message) {
+ super(message);
+ }
+
+ public MusicDeadlockException(Throwable cause) {
+ super(cause);
+ }
+
+ public MusicDeadlockException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MusicDeadlockException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+ public void setValues(String owner, String keyspace, String table, String key) {
+ this.owner = owner;
+ this.keyspace = keyspace;
+ this.table = table;
+ this.key = key;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public String getKeyspace() {
+ return keyspace;
+ }
+
+ public String getTable() {
+ return table;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+
+}
diff --git a/src/main/java/org/onap/music/exceptions/MusicLockingException.java b/music-core/src/main/java/org/onap/music/exceptions/MusicLockingException.java
index ab70c54c..ab70c54c 100644
--- a/src/main/java/org/onap/music/exceptions/MusicLockingException.java
+++ b/music-core/src/main/java/org/onap/music/exceptions/MusicLockingException.java
diff --git a/src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java b/music-core/src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java
index f489cd45..f489cd45 100644
--- a/src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java
+++ b/music-core/src/main/java/org/onap/music/exceptions/MusicPolicyVoilationException.java
diff --git a/src/main/java/org/onap/music/exceptions/MusicQueryException.java b/music-core/src/main/java/org/onap/music/exceptions/MusicQueryException.java
index 803f993f..803f993f 100644
--- a/src/main/java/org/onap/music/exceptions/MusicQueryException.java
+++ b/music-core/src/main/java/org/onap/music/exceptions/MusicQueryException.java
diff --git a/src/main/java/org/onap/music/exceptions/MusicServiceException.java b/music-core/src/main/java/org/onap/music/exceptions/MusicServiceException.java
index 76e1f948..76e1f948 100644
--- a/src/main/java/org/onap/music/exceptions/MusicServiceException.java
+++ b/music-core/src/main/java/org/onap/music/exceptions/MusicServiceException.java
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
new file mode 100644
index 00000000..9a69a9ba
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java
@@ -0,0 +1,613 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 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.lockingservice.cassandra;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.DeadlockDetectionUtil;
+import org.onap.music.main.DeadlockDetectionUtil.OwnershipType;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+
+/*
+ * This is the lock store that is built on top of Cassandra that is used by MUSIC to maintain lock state.
+ */
+
+public class CassaLockStore {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CassaLockStore.class);
+ public static final String table_prepend_name = "lockQ_";
+ private MusicDataStore dsHandle;
+
+ public CassaLockStore() {
+ dsHandle = new MusicDataStore();
+ }
+
+ public CassaLockStore(MusicDataStore dsHandle) {
+ this.dsHandle=dsHandle;
+ }
+ public class LockObject{
+ private boolean isLockOwner;
+ private String lockRef;
+ private String createTime;
+ private String acquireTime;
+ private LockType locktype;
+ // Owner is the self-declared client which "owns" this row. It is used for deadlock detection. It is not (directly) related to isLockOwner.
+ private String owner;
+ public LockObject(boolean isLockOwner, String lockRef, String createTime, String acquireTime, LockType locktype, String owner) {
+ this.setIsLockOwner(isLockOwner);
+ this.setLockRef(lockRef);
+ this.setAcquireTime(acquireTime);
+ this.setCreateTime(createTime);
+ this.setLocktype(locktype);
+ this.setOwner(owner);
+ }
+ public boolean getIsLockOwner() {
+ return isLockOwner;
+ }
+ public void setIsLockOwner(boolean isLockOwner) {
+ this.isLockOwner = isLockOwner;
+ }
+ public String getAcquireTime() {
+ return acquireTime;
+ }
+ public void setAcquireTime(String acquireTime) {
+ this.acquireTime = acquireTime;
+ }
+ public String getCreateTime() {
+ return createTime;
+ }
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+ public String getLockRef() {
+ return lockRef;
+ }
+ public void setLockRef(String lockRef) {
+ this.lockRef = lockRef;
+ }
+ public LockType getLocktype() {
+ return locktype;
+ }
+ public void setLocktype(LockType locktype) {
+ this.locktype = locktype;
+ }
+ public String getOwner() {
+ return owner;
+ }
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+ }
+
+ /**
+ *
+ * This method creates a shadow locking table for every main table in Cassandra. This table tracks all information regarding locks.
+ * @param keyspace of the application.
+ * @param table of the application.
+ * @return true if the operation was successful.
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public boolean createLockQueue(String keyspace, String table) throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Create lock queue/table for " + keyspace+"."+table);
+ table = table_prepend_name+table;
+ String tabQuery = "CREATE TABLE IF NOT EXISTS "+keyspace+"."+table
+ + " ( key text, lockReference bigint, createTime text, acquireTime text, guard bigint static, "
+ + "lockType text, leasePeriodTime bigint, owner text, PRIMARY KEY ((key), lockReference) ) "
+ + "WITH CLUSTERING ORDER BY (lockReference ASC);";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ queryObject.appendQueryString(tabQuery);
+ boolean result;
+ result = dsHandle.executePut(queryObject, "eventual");
+ return result;
+ }
+
+ /**
+ * This method creates a lock reference for each invocation. The lock references are monotonically increasing timestamps.
+ * @param keyspace of the locks.
+ * @param table of the locks.
+ * @param lockName is the primary key of the lock table
+ * @param lockType is the type of lock (read/write)
+ * @param owner is the owner of the lock (optional, for deadlock detection)
+ * @return the UUID lock reference.
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public String genLockRefandEnQueue(String keyspace, String table, String lockName, LockType locktype, String owner) throws MusicServiceException, MusicQueryException, MusicLockingException {
+ return genLockRefandEnQueue(keyspace, table, lockName, locktype, owner, 0);
+ }
+
+ private String genLockRefandEnQueue(String keyspace, String table, String lockName, LockType locktype, String owner, int count) throws MusicServiceException, MusicQueryException, MusicLockingException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Create " + locktype + " lock reference for " + keyspace + "." + table + "." + lockName);
+ String lockTable ="";
+ lockTable = table_prepend_name+table;
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ String selectQuery = "SELECT guard FROM " + keyspace + "." + lockTable + " WHERE key=?;";
+
+ queryObject.addValue(lockName);
+ queryObject.appendQueryString(selectQuery);
+ ResultSet gqResult = dsHandle.executeOneConsistencyGet(queryObject);
+ List<Row> latestGuardRow = gqResult.all();
+
+ long prevGuard = 0;
+ long lockRef = 1;
+ if (!latestGuardRow.isEmpty()) {
+ prevGuard = latestGuardRow.get(0).getLong(0);
+ lockRef = prevGuard + 1;
+ }
+
+ long lockEpochMillis = System.currentTimeMillis();
+
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Created lock reference for " + keyspace + "." + lockTable + "." + lockName + ":" + lockRef);
+
+ queryObject = new PreparedQueryObject();
+
+ String insQuery = "BEGIN BATCH" +
+ " UPDATE " + keyspace + "." + lockTable +
+ " SET guard=? WHERE key=? IF guard = " + (prevGuard == 0 ? "NULL" : "?") +";" +
+ " INSERT INTO " + keyspace + "." + lockTable +
+ "(key, lockReference, createTime, acquireTime, lockType, owner) VALUES (?,?,?,?,?,?) IF NOT EXISTS; APPLY BATCH;";
+
+ queryObject.addValue(lockRef);
+ queryObject.addValue(lockName);
+ if (prevGuard != 0)
+ queryObject.addValue(prevGuard);
+
+ queryObject.addValue(lockName);
+ queryObject.addValue(lockRef);
+ queryObject.addValue(String.valueOf(lockEpochMillis));
+ queryObject.addValue("0");
+ queryObject.addValue(locktype);
+ queryObject.addValue(owner);
+ queryObject.appendQueryString(insQuery);
+ boolean pResult = dsHandle.executePut(queryObject, "critical");
+ if (!pResult) {// couldn't create lock ref, retry
+ count++;
+ if (count > MusicUtil.getRetryCount()) {
+ logger.warn(EELFLoggerDelegate.applicationLogger, "Unable to create lock reference");
+ throw new MusicLockingException("Unable to create lock reference");
+ }
+ return genLockRefandEnQueue(keyspace, table, lockName, locktype, owner, count);
+ }
+ return "$" + keyspace + "." + table + "." + lockName + "$" + String.valueOf(lockRef);
+ }
+
+ /**
+ * Returns a result set containing the list of clients waiting for a particular lock
+ *
+ * @param keyspace
+ * @param table
+ * @param key
+ * @return list of lockrefs in the queue
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public List<String> getLockQueue(String keyspace, String table, String key)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Getting the queue for " + keyspace + "." + table + "." + key);
+ table = table_prepend_name + table;
+ String selectQuery = "select * from " + keyspace + "." + table + " where key='" + key + "';";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+ ArrayList<String> lockQueue = new ArrayList<>();
+ for (Row row : rs) {
+ lockQueue.add(Long.toString(row.getLong("lockReference")));
+ }
+ return lockQueue;
+ }
+
+
+ /**
+ * Returns a result set containing the list of clients waiting for a particular lock
+ *
+ * @param keyspace
+ * @param table
+ * @param key
+ * @return size of lockrefs queue
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public long getLockQueueSize(String keyspace, String table, String key)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Getting the queue size for " + keyspace + "." + table + "." + key);
+ table = table_prepend_name + table;
+ String selectQuery = "select count(*) from " + keyspace + "." + table + " where key='" + key + "';";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+ return rs.one().getLong("count");
+ }
+
+
+ /**
+ * This method returns the top of lock table/queue for the key.
+ *
+ * @param keyspace of the application.
+ * @param table of the application.
+ * @param key is the primary key of the application table
+ * @return the UUID lock reference. Returns LockObject.isLockOwner=false if there is no owner or the
+ * lock doesn't exist
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public LockObject peekLockQueue(String keyspace, String table, String key)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Peek in lock table for " + keyspace + "." + table + "." + key);
+ table = table_prepend_name + table;
+ String selectQuery = "select * from " + keyspace + "." + table + " where key='" + key + "' LIMIT 1;";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ ResultSet results = dsHandle.executeOneConsistencyGet(queryObject);
+ Row row = results.one();
+ if (row == null || row.isNull("lockReference")) {
+ return new LockObject(false, null, null, null, null, null);
+ }
+ String lockReference = "" + row.getLong("lockReference");
+ String createTime = row.getString("createTime");
+ String acquireTime = row.getString("acquireTime");
+ LockType locktype = row.get("lockType", LockType.class);
+ String owner = row.getString("owner");
+
+ return new LockObject(true, lockReference, createTime, acquireTime, locktype, owner);
+ }
+
+ public List<String> getCurrentLockHolders(String keyspace, String table, String key)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Getting lockholders in lock table for " + keyspace + "." + table + "." + key);
+ String origTable = table;
+ table = table_prepend_name + table;
+ String selectQuery = "select * from " + keyspace + "." + table + " where key=?;";
+ List<String> lockHolders = new ArrayList<>();
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ queryObject.addValue(key);
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+ boolean topOfQueue = true;
+ StringBuilder lock = new StringBuilder().
+ append("$").append(keyspace).append(".").append(origTable).
+ append(".").append(key).append("$");
+ StringBuilder lockReference = new StringBuilder();
+ for (Row row : rs) {
+ if ( row.isNull("lockReference") ) {
+ return lockHolders;
+ }
+ lockReference.append(lock).append(row.getLong("lockReference"));
+ if (row.get("lockType", LockType.class)!=LockType.WRITE) {
+ if (topOfQueue) {
+ lockHolders.add(lockReference.toString());
+ break;
+ } else {
+ break;
+ }
+ }
+ // read lock
+ lockHolders.add(lockReference.toString());
+
+ topOfQueue = false;
+ lockReference.delete(0,lockReference.length());
+ }
+ return lockHolders;
+ }
+
+ /**
+ * Determine if the lock is a valid current lock holder.
+ *
+ * @param keyspace
+ * @param table
+ * @param key
+ * @param lockRef
+ * @return true if lockRef is a lock owner of key
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public boolean isLockOwner(String keyspace, String table, String key, String lockRef)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Checking in lock table for " + keyspace + "." + table + "." + key);
+ table = table_prepend_name + table;
+ String selectQuery =
+ "select * from " + keyspace + "." + table + " where key=?;";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ queryObject.addValue(key);
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+
+ boolean topOfQueue = true;
+ for (Row row : rs) {
+ String lockReference = "" + row.getLong("lockReference");
+ if (row.get("lockType", LockType.class)==LockType.WRITE) {
+ if (topOfQueue && lockRef.equals(lockReference)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ if (lockRef.equals(lockReference)) {
+ return true;
+ }
+ topOfQueue = false;
+ }
+ logger.info(EELFLoggerDelegate.applicationLogger, "Could not find " + lockRef
+ + " in the lock queue. It has expired and no longer exists.");
+ return false;
+ }
+
+ /**
+ * Determine if the lock is a valid current lock holder.
+ *
+ * @param keyspace
+ * @param table
+ * @param key
+ * @param lockRef
+ * @return true if lockRef is a lock owner of key
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public LockObject getLockInfo(String keyspace, String table, String key, String lockRef)
+ throws MusicServiceException, MusicQueryException {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Checking in lock table for " + keyspace + "." + table + "." + key);
+ String lockQ_table = table_prepend_name + table;
+ String selectQuery =
+ "select * from " + keyspace + "." + lockQ_table + " where key=? and lockReference=?;";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ queryObject.addValue(key);
+ queryObject.addValue(Long.parseLong(lockRef));
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+ Row row = rs.one();
+ if (row == null || row.isNull("lockReference")) {
+ return null;
+ }
+
+ String lockReference = "" + row.getLong("lockReference");
+ String createTime = row.getString("createTime");
+ String acquireTime = row.getString("acquireTime");
+ LockType locktype = row.get("lockType", LockType.class);
+ boolean isLockOwner = isLockOwner(keyspace, table, key, lockRef);
+ String owner = row.getString("owner");
+
+ return new LockObject(isLockOwner, lockReference, createTime, acquireTime, locktype, owner);
+ }
+
+
+
+ /**
+ * This method removes the lock ref from the lock table/queue for the key.
+ *
+ * @param keyspace of the application.
+ * @param table of the application.
+ * @param key is the primary key of the application table
+ * @param lockReference the lock reference that needs to be dequeued.
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ * @throws MusicLockingException
+ */
+ public void deQueueLockRef(String keyspace, String table, String key, String lockReference, int n)
+ throws MusicServiceException, MusicQueryException, MusicLockingException {
+ String prependTable = table_prepend_name + table;
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ Long lockReferenceL = Long.parseLong(lockReference.substring(lockReference.lastIndexOf("$") + 1));
+ String deleteQuery = "delete from " + keyspace + "." + prependTable + " where key='" + key
+ + "' AND lockReference =" + lockReferenceL + " IF EXISTS;";
+ queryObject.appendQueryString(deleteQuery);
+ logger.info(EELFLoggerDelegate.applicationLogger, "Removing lock for key: "+key+ " and reference: "+lockReference);
+ try {
+ dsHandle.executePut(queryObject, "critical");
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Lock removed for key: " + key + " and reference: " + lockReference);
+ } catch (MusicServiceException ex) {
+ logger.error(logger, ex.getMessage(), ex);
+ logger.error(EELFLoggerDelegate.applicationLogger,
+ "Exception while deQueueLockRef for lockname: " + key + " reference:" + lockReference);
+ if (n > 1) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "Trying again...");
+ deQueueLockRef(keyspace, table, key, lockReference, n - 1);
+ } else {
+ logger.error(EELFLoggerDelegate.applicationLogger,
+ "deQueueLockRef failed for lockname: " + key + " reference:" + lockReference);
+ logger.error(logger, ex.getMessage(), ex);
+ throw new MusicLockingException("Error while deQueueLockRef: " + ex.getMessage());
+ }
+ }
+ }
+
+
+ public void updateLockAcquireTime(String keyspace, String table, String key, String lockReference) {
+ table = table_prepend_name + table;
+ Long lockReferenceL = Long.parseLong(lockReference);
+ String updateQuery = "update " + keyspace + "." + table + " set acquireTime='" + System.currentTimeMillis()
+ + "' where key='" + key + "' AND lockReference = " + lockReferenceL + " IF EXISTS;";
+
+ //cannot use executePut because we need to ignore music timestamp adjustments for lock store
+ dsHandle.getSession().execute(updateQuery);
+ }
+
+ public boolean checkForDeadlock(String keyspace, String table, String lockName, LockType locktype, String owner, boolean forAcquire) throws MusicServiceException, MusicQueryException {
+ if (locktype.equals(LockType.READ))
+ return false;
+ if (owner==null || owner.length()==0)
+ return false;
+
+ String lockTable = table_prepend_name + table;
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString("SELECT key, acquiretime, owner FROM " + keyspace + "." + lockTable);
+ queryObject.appendQueryString(" WHERE lockType = ? ALLOW FILTERING");
+ queryObject.addValue(LockType.WRITE);
+
+ DeadlockDetectionUtil ddu = getDeadlockDetectionUtil();
+
+ ResultSet rs = dsHandle.executeLocalQuorumConsistencyGet(queryObject);
+ logger.debug("rs has " + rs.getAvailableWithoutFetching() + (rs.isFullyFetched()?"":" (or more!)") );
+ Iterator<Row> it = rs.iterator();
+ while (it.hasNext()) {
+ Row row = it.next();
+ logger.debug("key = " + row.getString("key") + ", time = " + row.getString("acquiretime") + ", owner = " + row.getString("owner") );
+ ddu.setExisting(row.getString("key"), row.getString("owner"), ("0".equals(row.getString("acquiretime")))?OwnershipType.CREATED:OwnershipType.ACQUIRED);
+ }
+ boolean deadlock = ddu.checkForDeadlock(lockName, owner, forAcquire?OwnershipType.ACQUIRED:OwnershipType.CREATED);
+ if (deadlock)
+ logger.warn("Deadlock detected when " + owner + " tried to create lock on " + keyspace + "." + lockTable + "." + lockName);
+ return deadlock;
+ }
+
+ /**
+ * This is used for testing purpose
+ * @return new DeadlockDetectionUtil object
+ */
+ DeadlockDetectionUtil getDeadlockDetectionUtil() {
+ return new DeadlockDetectionUtil();
+ }
+
+ public List<String> getAllLocksForOwner(String ownerId, String keyspace, String table) throws MusicServiceException, MusicQueryException {
+ List<String> toRet = new ArrayList<>();
+ String lockTable = table_prepend_name + table;
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString("SELECT key, lockreference FROM " + keyspace + "." + lockTable);
+ queryObject.appendQueryString(" WHERE owner = '" + ownerId + "' ALLOW FILTERING");
+
+ ResultSet rs = dsHandle.executeQuorumConsistencyGet(queryObject);
+ Iterator<Row> it = rs.iterator();
+ while (it.hasNext()) {
+ Row row = it.next();
+ toRet.add(row.getString("key") + "$" + row.getLong("lockreference"));
+ }
+ return toRet;
+ }
+
+ public ReturnType promoteLock(String keyspace, String table, String key, String lockRef)
+ throws MusicServiceException, MusicQueryException {
+ String lockqtable = table_prepend_name + table;
+ String selectQuery = "select * from " + keyspace + "." + lockqtable + " where key=?;";
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ queryObject.appendQueryString(selectQuery);
+ queryObject.addValue(key);
+ ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
+
+ long refToPromote = Long.parseLong(lockRef);
+
+ boolean topOfQueue = true;
+ boolean readBlock = false;
+ boolean seenLockToPromote = false;
+ boolean promotionOngoing = false;
+ long readBlockStart = 0;
+ long readBlockEnd = 0;
+
+
+ for (Row row : rs) {
+ long ref = row.getLong("lockreference");
+ LockType lockType = row.get("lockType", LockType.class);
+
+ if (refToPromote==ref) {
+ if (promotionOngoing) {
+ return new ReturnType(ResultType.FAILURE, "Can't promote, already promoting another lockref.");
+ }
+ seenLockToPromote = true;
+ if (!topOfQueue) {
+ readBlockStart = ref;
+ readBlockEnd = ref;
+ break;
+ }
+ } else if (!seenLockToPromote && refToPromote<ref) {
+ return new ReturnType(ResultType.FAILURE, "Lockref does not exist.");
+ }
+
+ if (lockType==LockType.READ || lockType==LockType.PROMOTING) {
+ if (!readBlock) {
+ readBlockStart = ref;
+ readBlock = true;
+ }
+ if (readBlock) {
+ readBlockEnd = ref;
+ }
+ if (lockType==LockType.PROMOTING) {
+ promotionOngoing = true;
+ }
+ }
+
+ if (lockType==LockType.WRITE) {
+ if (refToPromote==ref) {
+ return new ReturnType(ResultType.FAILURE, "Lockref is already write.");
+ }
+ if (readBlock) {
+ readBlock = false;
+ promotionOngoing = false;
+ if (seenLockToPromote) {
+ break;
+ }
+ //can no longer be lock holder after this
+ topOfQueue = false;
+ }
+ }
+ }
+
+ if (readBlockStart<=refToPromote && refToPromote<=readBlockEnd) {
+ if (readBlockStart==refToPromote && refToPromote==readBlockEnd) {
+ promoteLockTo(keyspace, lockqtable, key, lockRef, LockType.WRITE);
+ return new ReturnType(ResultType.SUCCESS, "Lock has successfully been upgraded.");
+ }
+ promoteLockTo(keyspace, lockqtable, key, lockRef, LockType.PROMOTING);
+ return new ReturnType(ResultType.FAILURE, "Your lock upgrade is in progress. Check again to see if successful.");
+ }
+
+ //shouldn't reach here?
+ return new ReturnType(ResultType.FAILURE,"Promotion failed.");
+ }
+
+ private void promoteLockTo(String keyspace, String table, String key, String lockRef, LockType newLockType)
+ throws MusicServiceException, MusicQueryException {
+ PreparedQueryObject queryObject =
+ new PreparedQueryObject("UPDATE " + keyspace + "." + table + " SET lockType=? WHERE key='" + key
+ + "' AND lockReference = " + lockRef + " IF EXISTS;", newLockType);
+
+ //cannot use executePut because we need to ignore music timestamp adjustments for lock store
+ dsHandle.executePut(queryObject, MusicUtil.QUORUM);
+ }
+
+
+
+}
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
new file mode 100644
index 00000000..623a07c7
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockCleanUpDaemon.java
@@ -0,0 +1,133 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.lockingservice.cassandra;
+
+import java.util.HashSet;
+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.MusicServiceException;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+
+public class LockCleanUpDaemon extends Thread {
+
+ boolean terminated = false;
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(LockCleanUpDaemon.class);
+
+
+ public LockCleanUpDaemon() {
+ }
+
+ @Override
+ public void run() {
+ if (MusicUtil.getLockDaemonSleepTimeMs()<0) {
+ terminate();
+ }
+ while (!terminated) {
+ try {
+ cleanupStaleLocks();
+ } catch (MusicServiceException e) {
+ logger.warn(EELFLoggerDelegate.applicationLogger, "Unable to clean up locks", e);
+ }
+ try {
+ Thread.sleep(MusicUtil.getLockDaemonSleepTimeMs());
+ } catch (InterruptedException e) {
+ logger.warn(EELFLoggerDelegate.applicationLogger, "Interrupted exception", e);
+
+ }
+ }
+ }
+
+ private void cleanupStaleLocks() throws MusicServiceException {
+ Set<String> lockQTables = getLockQTables();
+ logger.info(EELFLoggerDelegate.applicationLogger, "Lock q tables found: " + lockQTables);
+ for(String lockTable: lockQTables) {
+ try {
+ cleanUpLocksFromTable(lockTable);
+ } catch (MusicServiceException e) {
+ logger.warn(EELFLoggerDelegate.applicationLogger, "Unable to clear locks on table " + lockTable, e);
+ }
+ }
+ }
+
+
+ private Set<String> getLockQTables() throws MusicServiceException {
+ Set<String> keyspacesToCleanUp = MusicUtil.getKeyspacesToCleanLocks();
+ Set<String> lockQTables = new HashSet<>();
+
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString("SELECT keyspace_name, table_name FROM system_schema.tables;");
+ ResultSet results = MusicCore.get(query);
+
+ for (Row row: results) {
+ if (keyspacesToCleanUp.contains(row.getString("keyspace_name"))
+ && row.getString("table_name").toLowerCase().startsWith(CassaLockStore.table_prepend_name.toLowerCase()) ) {
+ lockQTables.add(row.getString("keyspace_name") + "." + row.getString("table_name"));
+ }
+ }
+ return lockQTables;
+ }
+
+ private void cleanUpLocksFromTable(String lockTable) throws MusicServiceException {
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString("SELECT * from " + lockTable);
+ ResultSet results = MusicCore.get(query);
+ for (Row lock: results) {
+ if (!lock.isNull("lockreference")) {
+ try {
+ deleteLockIfStale(lockTable, lock);
+ } catch (MusicServiceException e) {
+ logger.warn(EELFLoggerDelegate.applicationLogger, "Unable to delete a potentially stale lock " + lock, e);
+ }
+ }
+ }
+ }
+
+
+ private void deleteLockIfStale(String lockTable, Row lock) throws MusicServiceException {
+ 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 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);
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString("DELETE FROM " + lockTable + " WHERE key='" + lock.getString("key") + "' AND " +
+ "lockreference=" + lock.getLong("lockreference") + " IF EXISTS;");
+ MusicDataStoreHandle.getDSHandle().getSession().execute(query.getQuery());
+ }
+ }
+
+ public void terminate() {
+ terminated = true;
+ }
+}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/NameSpace.java b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockType.java
index 3c18c791..432b1c51 100644
--- a/src/main/java/org/onap/music/datastore/jsonobjects/NameSpace.java
+++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/LockType.java
@@ -2,47 +2,29 @@
* ============LICENSE_START==========================================
* org.onap.music
* ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
+ * Copyright (c) 2019 AT&T Intellectual Property
* ===================================================================
* 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.datastore.jsonobjects;
-import java.util.List;
+package org.onap.music.lockingservice.cassandra;
-public class NameSpace {
- private String name;
- private List<String> admin;
-
- public List<String> getAdmin() {
- return admin;
- }
-
- public String getName() {
- return name;
- }
-
- public void setAdmin(List<String> admin) {
- this.admin = admin;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
+public enum LockType {
+ WRITE, READ, PROMOTING;
}
+
diff --git a/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java
index 5128e2cd..14fb8135 100644
--- a/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java
+++ b/music-core/src/main/java/org/onap/music/lockingservice/cassandra/MusicLockState.java
@@ -4,6 +4,8 @@
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
* ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
* 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
@@ -37,16 +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);
- LockStatus lockStatus;
- boolean needToSyncQuorum = false;
- String lockHolder;
- long leasePeriod = Long.MAX_VALUE, leaseStartTime = -1;
-
+ private LockStatus lockStatus;
+ private boolean needToSyncQuorum = false;
+ private String lockHolder;
+ private long leasePeriod = Long.MAX_VALUE;
+ private long leaseStartTime = -1;
private String errorMessage = null;
public MusicLockState(String errorMessage) {
@@ -118,7 +122,8 @@ public class MusicLockState implements Serializable {
out = new ObjectOutputStream(bos);
out.writeObject(this);
} catch (IOException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.CONNECTIONERROR);
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.IOERROR, ErrorSeverity.ERROR,
+ ErrorTypes.CONNECTIONERROR, e);
}
return bos.toByteArray();
}
@@ -131,7 +136,8 @@ public class MusicLockState implements Serializable {
in = new ObjectInputStream(bis);
o = in.readObject();
} catch (ClassNotFoundException | IOException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN);
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity
+ .ERROR, ErrorTypes.UNKNOWN, e);
}
return (MusicLockState) o;
}
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
new file mode 100644
index 00000000..9a8ff69d
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/main/CipherUtil.java
@@ -0,0 +1,279 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modification Copyright (c) 2019 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.main;
+
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Scanner;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang3.ArrayUtils;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+
+public class CipherUtil {
+
+
+ /**
+ * Default key.
+ */
+ private static String keyString = MusicUtil.getCipherEncKey();
+
+ private static final String ALGORITHM = "AES";
+ private static final String ALGORYTHM_DETAILS = ALGORITHM + "/CBC/PKCS5PADDING";
+ private static final int BLOCK_SIZE = 128;
+ @SuppressWarnings("unused")
+ private static SecretKeySpec secretKeySpec;
+ private static IvParameterSpec ivspec;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CipherUtil.class);
+ /**
+ * @deprecated Please use {@link #encryptPKC(String)} to encrypt the text.
+ *
+ * Encrypts the text using the specified secret key.
+ *
+ * @param plainText
+ * Text to encrypt
+ * @param secretKey
+ * Key to use for encryption
+ * @return encrypted version of plain text.
+ * @
+ * if any encryption step fails
+ *
+ */
+ @Deprecated
+ public static String encrypt(String plainText, String secretKey) {
+ String encryptedString = null;
+ try {
+ byte[] encryptText = plainText.getBytes("UTF-8");
+ byte[] rawKey = Base64.decodeBase64(secretKey);
+ SecretKeySpec sKeySpec = new SecretKeySpec(rawKey, "AES");
+ Cipher cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
+ encryptedString = Base64.encodeBase64String(cipher.doFinal(encryptText));
+ } catch (BadPaddingException | IllegalBlockSizeException | InvalidKeyException | NoSuchAlgorithmException
+ | NoSuchPaddingException | UnsupportedEncodingException ex) {
+ }
+ return encryptedString;
+ }
+
+ /**
+ * @deprecated Please use {@link #encryptPKC(String)} to encrypt the text.
+ * Encrypts the text using the secret key in key.properties file.
+ *
+ * @param plainText
+ * Text to encrypt
+ * @return Encrypted Text
+ * @
+ * if any decryption step fails
+ */
+ @Deprecated
+ public static String encrypt(String plainText) {
+ return CipherUtil.encrypt(plainText, keyString);
+ }
+
+ /**
+ * Encrypts the text using a secret key.
+ *
+ * @param plainText
+ * Text to encrypt
+ * @return Encrypted Text
+ * @
+ * if any decryption step fails
+ */
+ public static String encryptPKC(String plainText) {
+ return CipherUtil.encryptPKC(plainText, keyString);
+ }
+
+ /**
+ *
+ * @deprecated Please use {@link #decryptPKC(String)} to Decryption the text.
+ *
+ * Decrypts the text using the specified secret key.
+ *
+ * @param encryptedText
+ * Text to decrypt
+ * @param secretKey
+ * Key to use for decryption
+ * @return plain text version of encrypted text
+ * @
+ * if any decryption step fails
+ *
+ */
+ @Deprecated
+ public static String decrypt(String encryptedText, String secretKey) {
+ String encryptedString = null;
+ try {
+ byte[] rawKey = Base64.decodeBase64(secretKey);
+ SecretKeySpec sKeySpec = new SecretKeySpec(rawKey, "AES");
+ byte[] encryptText = Base64.decodeBase64(encryptedText.getBytes("UTF-8"));
+ Cipher cipher = Cipher.getInstance("AES");
+ cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
+ encryptedString = new String(cipher.doFinal(encryptText));
+ } catch (BadPaddingException | IllegalBlockSizeException | InvalidKeyException | NoSuchAlgorithmException
+ | NoSuchPaddingException | UnsupportedEncodingException ex) {
+ }
+ return encryptedString;
+ }
+
+ private static SecretKeySpec getSecretKeySpec() {
+ byte[] key = Base64.decodeBase64(keyString);
+ return new SecretKeySpec(key, ALGORITHM);
+ }
+
+ private static SecretKeySpec getSecretKeySpec(String keyString) {
+ byte[] key = Base64.decodeBase64(keyString);
+ return new SecretKeySpec(key, ALGORITHM);
+ }
+
+ /**
+ * Encrypt the text using the secret key in key.properties file
+ *
+ * @param value
+ * @return The encrypted string
+ * @throws BadPaddingException
+ * @
+ * In case of issue with the encryption
+ */
+ public static String encryptPKC(String value, String skey) {
+ Cipher cipher = null;
+ byte[] iv = null;
+ byte[] finalByte = null;
+
+ try {
+ cipher = Cipher.getInstance(ALGORYTHM_DETAILS, "SunJCE");
+
+ SecureRandom r = SecureRandom.getInstance("SHA1PRNG");
+ iv = new byte[BLOCK_SIZE / 8];
+ r.nextBytes(iv);
+ ivspec = new IvParameterSpec(iv);
+ cipher.init(Cipher.ENCRYPT_MODE, getSecretKeySpec(skey), ivspec);
+ finalByte = cipher.doFinal(value.getBytes());
+
+ } catch (Exception ex) {
+
+ }
+ return Base64.encodeBase64String(ArrayUtils.addAll(iv, finalByte));
+ }
+
+ /**
+ * Decrypts the text using the secret key in key.properties file.
+ *
+ * @param message
+ * The encrypted string that must be decrypted using the ecomp
+ * Encryption Key
+ * @return The String decrypted
+ * @
+ * if any decryption step fails
+ */
+ public static String decryptPKC(String message, String skey) {
+ byte[] encryptedMessage = Base64.decodeBase64(message);
+ Cipher cipher;
+ byte[] decrypted = null;
+ try {
+ cipher = Cipher.getInstance(ALGORYTHM_DETAILS, "SunJCE");
+ ivspec = new IvParameterSpec(ArrayUtils.subarray(encryptedMessage, 0, BLOCK_SIZE / 8));
+ byte[] realData = ArrayUtils.subarray(encryptedMessage, BLOCK_SIZE / 8, encryptedMessage.length);
+ cipher.init(Cipher.DECRYPT_MODE, getSecretKeySpec(skey), ivspec);
+ decrypted = cipher.doFinal(realData);
+
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Error in decryptPKC", ex);
+
+ }
+
+ return new String(decrypted);
+ }
+
+ /**
+ * @deprecated Please use {@link #decryptPKC(String)} to Decrypt the text.
+ *
+ * Decrypts the text using the secret key in key.properties file.
+ *
+ * @param encryptedText
+ * Text to decrypt
+ * @return Decrypted text
+ * @
+ * if any decryption step fails
+ */
+ @Deprecated
+ public static String decrypt(String encryptedText) {
+ return CipherUtil.decrypt(encryptedText, keyString);
+ }
+
+ /**
+ *
+ * Decrypts the text using the secret key in key.properties file.
+ *
+ * @param encryptedText
+ * Text to decrypt
+ * @return Decrypted text
+ * @
+ * if any decryption step fails
+ */
+ public static String decryptPKC(String encryptedText) {
+ return CipherUtil.decryptPKC(encryptedText, keyString);
+ }
+
+
+ public static void readAndSetKeyString() {
+ try (Scanner in = new Scanner(new FileReader("/opt/app/music/etc/properties.txt"))) {
+
+ StringBuilder sb = new StringBuilder();
+ while(in.hasNext()) {
+ sb.append(in.next());
+ }
+ keyString = sb.toString();
+ } catch (FileNotFoundException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
+ }
+ }
+
+ public static void main(String[] args) {
+
+ if (args.length < 2) {
+ System.out.println("Usage: java -jar CipherUtil <key> <password>");
+ return;
+ }
+
+ keyString = args[0];
+ String password = args[1];
+
+ String enc = encryptPKC(password);
+ System.out.println("Encrypted password: " + enc);
+
+ System.out.println("Decrypted password (to verify): " + decryptPKC(enc));
+ }
+
+}
diff --git a/music-core/src/main/java/org/onap/music/main/CorePropertiesLoader.java b/music-core/src/main/java/org/onap/music/main/CorePropertiesLoader.java
new file mode 100644
index 00000000..2e5ca689
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/main/CorePropertiesLoader.java
@@ -0,0 +1,120 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import java.util.Properties;
+
+public class CorePropertiesLoader {
+
+ public static void loadProperties(Properties properties) {
+ if (properties.getProperty("cassandra.host")!=null) {
+ MusicUtil.setMyCassaHost(properties.getProperty("cassandra.host"));
+ }
+
+ if (properties.getProperty("cassandra.port")!=null) {
+ MusicUtil.setCassandraPort(Integer.parseInt(properties.getProperty("cassandra.port")));
+ }
+
+ if (properties.getProperty("cassandra.user")!=null) {
+ MusicUtil.setCassName(properties.getProperty("cassandra.user"));
+ }
+
+ if (properties.getProperty("cassandra.password")!=null) {
+ MusicUtil.setCassPwd(properties.getProperty("cassandra.password"));
+ }
+
+ if (properties.getProperty("music.properties")!=null) {
+ MusicUtil.setMusicPropertiesFilePath(properties.getProperty("music.properties"));
+ }
+
+ if (properties.getProperty("debug")!=null) {
+ MusicUtil.setDebug(Boolean.parseBoolean(properties.getProperty("debug")));
+ }
+
+ if (properties.getProperty("version")!=null) {
+ MusicUtil.setVersion(properties.getProperty("version"));
+ }
+
+ if (properties.getProperty("build")!=null) {
+ MusicUtil.setBuild(properties.getProperty("build"));
+ }
+
+ if (properties.getProperty("lock.lease.period")!=null) {
+ MusicUtil.setDefaultLockLeasePeriod(Long.parseLong(properties.getProperty("lock.lease.period")));
+ }
+
+ if (properties.getProperty("cadi")!=null) {
+ MusicUtil.setIsCadi(Boolean.parseBoolean(properties.getProperty("cadi")));
+ }
+
+ if (properties.getProperty("keyspace.active")!=null) {
+ MusicUtil.setKeyspaceActive(Boolean.parseBoolean(properties.getProperty("keyspace.active")));
+ }
+
+ if (properties.getProperty("retry.count")!=null) {
+ MusicUtil.setRetryCount(Integer.parseInt(properties.getProperty("retry.count")));
+ }
+
+ if (properties.getProperty("transId.header.prefix")!=null) {
+ MusicUtil.setTransIdPrefix(properties.getProperty("transId.header.prefix"));
+ }
+
+ if (properties.getProperty("conversation.header.prefix")!=null) {
+ MusicUtil.setConversationIdPrefix(properties.getProperty("conversation.header.prefix"));
+ }
+
+ if (properties.getProperty("clientId.header.prefix")!=null) {
+ MusicUtil.setClientIdPrefix(properties.getProperty("clientId.header.prefix"));
+ }
+
+ if (properties.getProperty("messageId.header.prefix")!=null) {
+ MusicUtil.setMessageIdPrefix(properties.getProperty("messageId.header.prefix"));
+ }
+
+ if (properties.getProperty("transId.header.required")!=null) {
+ MusicUtil.setTransIdRequired(Boolean.parseBoolean(properties.getProperty("transId.header.required")));
+ }
+
+ if (properties.getProperty("conversation.header.required")!=null) {
+ MusicUtil.setConversationIdRequired(Boolean.parseBoolean(properties.getProperty("conversation.header.required")));
+ }
+
+ if (properties.getProperty("clientId.header.required")!=null) {
+ MusicUtil.setClientIdRequired(Boolean.parseBoolean(properties.getProperty("clientId.header.required")));
+ }
+
+ if (properties.getProperty("messageId.header.required")!=null) {
+ MusicUtil.setMessageIdRequired(Boolean.parseBoolean(properties.getProperty("messageId.header.required")));
+ }
+
+ if (properties.getProperty("music.aaf.ns")!=null) {
+ MusicUtil.setMusicAafNs(properties.getProperty("music.aaf.ns"));
+ }
+
+ if (properties.getProperty("cipher.enc.key")!=null) {
+ MusicUtil.setCipherEncKey(properties.getProperty("cipher.enc.key"));
+ }
+
+ }
+
+}
diff --git a/music-core/src/main/java/org/onap/music/main/DeadlockDetectionUtil.java b/music-core/src/main/java/org/onap/music/main/DeadlockDetectionUtil.java
new file mode 100644
index 00000000..004bd550
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/main/DeadlockDetectionUtil.java
@@ -0,0 +1,152 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class DeadlockDetectionUtil {
+ private Map<String, Node> nodeList = null;
+ public enum OwnershipType {NONE, CREATED, ACQUIRED};
+
+ private class Node implements Comparable<Node> {
+ private String id;
+ private List<Node> links;
+ private boolean visited = false;
+ private boolean onStack = false;
+
+ @Override
+ public String toString() {
+ StringBuffer sb = new StringBuffer();
+ for (Node link : links)
+ sb.append(link.id);
+ return "Node [id=" + id + ", links=" + sb.toString() + ", visited=" + visited + ", onStack=" + onStack + "]";
+ }
+
+ public Node(String id) {
+ super();
+ this.id = id;
+ this.links = new ArrayList<>();
+ }
+
+ public List<Node> getLinks() {
+ return links;
+ }
+
+ public void addLink(Node link) {
+ this.links.add(link);
+ }
+
+ public void removeLink(Node link) {
+ this.links.remove(link);
+ }
+
+ public boolean isVisited() {
+ return visited;
+ }
+
+ public boolean isOnStack() {
+ return onStack;
+ }
+
+ public void setVisited(boolean visited) {
+ this.visited = visited;
+ }
+
+ public void setOnStack(boolean onStack) {
+ this.onStack = onStack;
+ }
+
+ @Override
+ public int compareTo(Node arg0) {
+ return id.compareTo(arg0.id);
+ }
+ }
+
+ public DeadlockDetectionUtil() {
+ this.nodeList = new HashMap<>();
+ }
+
+ public void listAllNodes() {
+ System.out.println("In DeadlockDetectionUtil: ");
+ for (String key : nodeList.keySet()) {
+ System.out.println(" " + key + " : " + nodeList.get(key));
+ }
+ }
+
+ public boolean checkForDeadlock(String resource, String owner, OwnershipType operation) {
+ setExisting(resource, owner, operation);
+
+ Node currentNode = null;
+ if (operation.equals(OwnershipType.ACQUIRED)) {
+ currentNode = nodeList.get("r" + resource);
+ } else if (operation.equals(OwnershipType.CREATED)) {
+ currentNode = nodeList.get("o" + owner);
+ }
+
+ return findCycle(currentNode);
+ }
+
+ private boolean findCycle(Node currentNode) {
+ if (currentNode==null)
+ return false;
+ if (currentNode.isOnStack())
+ return true;
+ if (currentNode.isVisited())
+ return false;
+ currentNode.setOnStack(true);
+ currentNode.setVisited(true);
+ for (Node childNode : currentNode.getLinks()) {
+ if (findCycle(childNode))
+ return true;
+ }
+ currentNode.setOnStack(false);
+ return false;
+ }
+
+ public void setExisting(String resource, String owner, OwnershipType operation) {
+ String resourceKey = "r" + resource;
+ Node resourceNode = nodeList.get(resourceKey);
+ if (resourceNode==null) {
+ resourceNode = new Node(resourceKey);
+ nodeList.put(resourceKey, resourceNode);
+ }
+
+ String ownerKey = "o" + owner;
+ Node ownerNode = nodeList.get(ownerKey);
+ if (ownerNode==null) {
+ ownerNode = new Node(ownerKey);
+ nodeList.put(ownerKey, ownerNode);
+ }
+
+ if (operation.equals(OwnershipType.ACQUIRED)) {
+ resourceNode.addLink(ownerNode);
+ ownerNode.removeLink(resourceNode);
+ } else if (operation.equals(OwnershipType.CREATED)) {
+ ownerNode.addLink(resourceNode);
+ resourceNode.removeLink(ownerNode);
+ }
+ }
+
+}
diff --git a/music-core/src/main/java/org/onap/music/main/MusicCore.java b/music-core/src/main/java/org/onap/music/main/MusicCore.java
new file mode 100644
index 00000000..30d2bc47
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/main/MusicCore.java
@@ -0,0 +1,264 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonIndex;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonSelect;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.lockingservice.cassandra.MusicLockState;
+import org.onap.music.service.MusicCoreService;
+
+import com.datastax.driver.core.ResultSet;
+
+public class MusicCore {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicCore.class);
+ private static MusicCoreService musicCore = MusicUtil.getMusicCoreService();
+ private static CassaLockStore mLockHandle;
+
+ public static CassaLockStore getmLockHandle() {
+ return mLockHandle;
+ }
+
+ public static void setmLockHandle(CassaLockStore mLockHandleIn) {
+ mLockHandle = mLockHandleIn;
+ }
+
+ /**
+ * Acquire lock
+ *
+ * @param fullyQualifiedKey DO NOT RELY ON THIS KEY WORKING. INCLUDE THE KEY IN THE LOCKID.
+ * @param lockId - the full lock id (key + lockRef)
+ * @return
+ * @throws MusicLockingException
+ * @throws MusicQueryException
+ * @throws MusicServiceException
+ */
+ public static ReturnType acquireLock(String fullyQualifiedKey, String lockId)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ return musicCore.acquireLock(fullyQualifiedKey, lockId);
+ }
+
+ public static ReturnType acquireLockWithLease(String key, String lockId, long leasePeriod)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ return musicCore.acquireLockWithLease(key, lockId, leasePeriod);
+ }
+
+ public static String createLockReferenceAtomic(String fullyQualifiedKey) throws MusicLockingException {
+ return musicCore.createLockReferenceAtomic(fullyQualifiedKey);
+ }
+
+ public static String createLockReference(String fullyQualifiedKey, String owner) throws MusicLockingException {
+ return musicCore.createLockReference(fullyQualifiedKey, owner);
+ }
+
+ public static String createLockReferenceAtomic(String fullyQualifiedKey, LockType locktype) throws MusicLockingException {
+ return musicCore.createLockReferenceAtomic(fullyQualifiedKey, locktype);
+ }
+
+ public static String createLockReference(String fullyQualifiedKey, LockType locktype, String owner) throws MusicLockingException {
+ return musicCore.createLockReference(fullyQualifiedKey, locktype, owner);
+ }
+
+ public static ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject,
+ String consistency) throws MusicServiceException {
+ return musicCore.createTable(keyspace, table, tableQueryObject, consistency);
+ }
+
+ public static ResultSet quorumGet(PreparedQueryObject query) {
+ return musicCore.quorumGet(query);
+ }
+
+ /**
+ * Gets the top of queue for fullyQualifiedKey
+ *
+ * @param fullyQualifiedKey
+ * @return
+ */
+ public static String whoseTurnIsIt(String fullyQualifiedKey) {
+ return musicCore.whoseTurnIsIt(fullyQualifiedKey);
+ }
+
+ /**
+ * Gets the current lockholder(s) for fullyQualifiedKey
+ *
+ * @param fullyQualifiedKey
+ * @return
+ */
+ public static List<String> getCurrentLockHolders(String fullyQualifiedKey) {
+ return musicCore.getCurrentLockHolders(fullyQualifiedKey);
+ }
+
+ public static ReturnType promoteLock(String lockIdToPromote) throws MusicLockingException {
+ return musicCore.promoteLock(lockIdToPromote);
+ }
+
+ public static void destroyLockRef(String lockId) throws MusicLockingException {
+ musicCore.destroyLockRef(lockId);
+ }
+
+ public static ReturnType eventualPut(PreparedQueryObject queryObject) {
+ return musicCore.eventualPut(queryObject);
+ }
+
+ public static ReturnType eventualPut_nb(PreparedQueryObject queryObject, String keyspace, String tablename,
+ String primaryKey) {
+ return musicCore.eventualPut_nb(queryObject, keyspace, tablename, primaryKey);
+ }
+
+ public static ReturnType criticalPut(String keyspace, String table, String primaryKeyValue,
+ PreparedQueryObject queryObject, String lockReference, Condition conditionInfo) {
+ return musicCore.criticalPut(keyspace, table, primaryKeyValue, queryObject, lockReference, conditionInfo);
+ }
+
+ public static ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency)
+ throws MusicServiceException,MusicQueryException {
+ return musicCore.nonKeyRelatedPut(queryObject, consistency);
+ }
+
+ public static ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException {
+ return musicCore.get(queryObject);
+ }
+
+ public static ResultSet criticalGet(String keyspace, String table, String primaryKeyValue,
+ PreparedQueryObject queryObject, String lockReference) throws MusicServiceException {
+ return musicCore.criticalGet(keyspace, table, primaryKeyValue, queryObject, lockReference);
+ }
+
+ public static ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ return musicCore.atomicPut(keyspaceName, tableName, primaryKey, queryObject, conditionInfo);
+ }
+
+ public static ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException {
+ return musicCore.atomicGet(keyspaceName, tableName, primaryKey, queryObject);
+ }
+
+ public static List<String> getLockQueue(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException {
+ return musicCore.getLockQueue(fullyQualifiedKey);
+ }
+
+ public static long getLockQueueSize(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException {
+ return musicCore.getLockQueueSize(fullyQualifiedKey);
+ }
+
+ public static void deleteLock(String lockName) throws MusicLockingException {
+ musicCore.deleteLock(lockName);
+ }
+
+ public static ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException {
+ return musicCore.atomicPutWithDeleteLock(keyspaceName, tableName, primaryKey, queryObject, conditionInfo);
+ }
+
+ public static ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException {
+ return musicCore.atomicGetWithDeleteLock(keyspaceName, tableName, primaryKey, queryObject);
+ }
+
+ public static Map<String, Object> validateLock(String lockName) {
+ return musicCore.validateLock(lockName);
+ }
+
+ public static MusicLockState releaseLock(String lockId, boolean voluntaryRelease) throws MusicLockingException {
+ return musicCore.releaseLock(lockId, voluntaryRelease);
+ }
+
+ public static List<String> releaseAllLocksForOwner(String ownerId, String keyspace, String table) throws MusicLockingException, MusicServiceException, MusicQueryException {
+ return musicCore.releaseAllLocksForOwner(ownerId, keyspace, table);
+ }
+
+ //Added changes for orm implementation.
+
+ public static ResultType createKeyspace(JsonKeySpace jsonKeySpaceObject, String consistencyInfo)
+ throws MusicServiceException, MusicQueryException {
+ return musicCore.createKeyspace(jsonKeySpaceObject,consistencyInfo);
+ }
+
+ public static ResultType dropKeyspace(JsonKeySpace josnKeyspaceObject, String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ return musicCore.dropKeyspace(josnKeyspaceObject, consistencyInfo);
+ }
+
+ public static ResultType createTable(JsonTable jsonTableObject,String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ return musicCore.createTable(jsonTableObject, consistencyInfo);
+ }
+
+ public static ResultType dropTable(JsonTable jsonTableObject, String consistencyInfo)
+ throws MusicServiceException, MusicQueryException {
+ return musicCore.dropTable(jsonTableObject, consistencyInfo);
+ }
+
+ public static ResultType createIndex(JsonIndex jsonIndexObject, String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ return musicCore.createIndex(jsonIndexObject, consistencyInfo);
+ }
+
+ public static ResultSet select(JsonSelect jsonSelect, MultivaluedMap<String, String> rowParams)
+ throws MusicServiceException, MusicQueryException{
+ return musicCore.select(jsonSelect, rowParams);
+ }
+
+ public static ResultSet selectCritical(JsonInsert jsonInsertObj, MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException{
+ return musicCore.selectCritical(jsonInsertObj, rowParams);
+ }
+
+
+ public static ReturnType insertIntoTable(JsonInsert jsonInsert) throws MusicLockingException, MusicQueryException, MusicServiceException{
+ return musicCore.insertIntoTable(jsonInsert);
+ }
+
+ public static ReturnType updateTable(JsonUpdate jsonUpdateObj,MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException{
+ return musicCore.updateTable(jsonUpdateObj, rowParams);
+ }
+
+ public static ReturnType deleteFromTable(JsonDelete jsonDeleteObj,MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException{
+ return musicCore.deleteFromTable(jsonDeleteObj,rowParams);
+ }
+
+}
diff --git a/src/main/java/org/onap/music/main/MusicUtil.java b/music-core/src/main/java/org/onap/music/main/MusicUtil.java
index b737377d..4b8b1059 100755..100644
--- a/src/main/java/org/onap/music/main/MusicUtil.java
+++ b/music-core/src/main/java/org/onap/music/main/MusicUtil.java
@@ -4,7 +4,7 @@
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
* ===================================================================
- * Modifications Copyright (c) 2018 IBM.
+ * Modifications Copyright (c) 2019 IBM.
* Modifications Copyright (c) 2019 Samsung.
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -31,20 +31,15 @@ import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Row;
import java.io.File;
import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Properties;
import java.util.Scanner;
-import java.util.StringTokenizer;
+import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
@@ -61,7 +56,6 @@ import org.onap.music.service.impl.MusicCassaCore;
import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.DataType;
-import com.sun.jersey.core.util.Base64;
/**
* @author nelson24
@@ -74,56 +68,62 @@ import com.sun.jersey.core.util.Base64;
public class MusicUtil {
private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicUtil.class);
+ // Consistancy Constants
public static final String ATOMIC = "atomic";
public static final String EVENTUAL = "eventual";
public static final String CRITICAL = "critical";
public static final String EVENTUAL_NB = "eventual_nb";
public static final String ALL = "all";
public static final String QUORUM = "quorum";
+ public static final String LOCAL_QUORUM = "local_quorum";
public static final String ONE = "one";
public static final String ATOMICDELETELOCK = "atomic_delete_lock";
- public static final String DEFAULTKEYSPACENAME = "TBD";
+
+ // Header Constants
private static final String XLATESTVERSION = "X-latestVersion";
private static final String XMINORVERSION = "X-minorVersion";
private static final String XPATCHVERSION = "X-patchVersion";
+ public static final String AUTHORIZATION = "Authorization";
+
+ // CQL Constants
public static final String SELECT = "select";
public static final String INSERT = "insert";
public static final String UPDATE = "update";
public static final String UPSERT = "upsert";
public static final String USERID = "userId";
- public static final String PASSWORD = "password";
+ public static final String PASSWORD = "";
public static final String CASSANDRA = "cassandra";
- public static final String AUTHORIZATION = "Authorization";
-
private static final String LOCALHOST = "localhost";
private static final String PROPERTIES_FILE = "/opt/app/music/etc/music.properties";
+ public static final String DEFAULTKEYSPACENAME = "TBD";
- private static int myId = 0;
- private static ArrayList<String> allIds = new ArrayList<>();
- private static String publicIp = "";
- private static ArrayList<String> allPublicIps = new ArrayList<>();
- private static String myZkHost = LOCALHOST;
- private static String myCassaHost = LOCALHOST;
- private static String defaultMusicIp = LOCALHOST;
- private static int cassandraPort = 9042;
- private static int notifytimeout = 30000;
- private static int notifyinterval = 5000;
- private static int cacheObjectMaxLife = -1;
+ private static long defaultLockLeasePeriod = 6000;
+ // Amount of times to retry to delete a lock in atomic.
+ private static int retryCount = 3;
private static String lockUsing = MusicUtil.CASSANDRA;
+ // Cadi OnOff
private static boolean isCadi = false;
-
+ // Keyspace Creation on/off
+ private static boolean isKeyspaceActive = false;
private static boolean debug = true;
- private static String version = "2.3.0";
- private static String musicRestIp = LOCALHOST;
+ private static String version = "0.0.0";
+ private static String build = "";
+ private static long lockDaemonSleepms = 1000;
+ private static Set<String> keyspacesToCleanLocks = new HashSet<>();
+
private static String musicPropertiesFilePath = PROPERTIES_FILE;
- private static long defaultLockLeasePeriod = 6000;
- private static final String[] propKeys = new String[] { "cassandra.host", "music.ip", "debug",
- "version", "music.rest.ip", "music.properties", "lock.lease.period", "id", "all.ids", "public.ip",
- "all.pubic.ips", "cassandra.user", "cassandra.password", "aaf.endpoint.url","admin.username","admin.password","aaf.admin.url",
- "music.namespace","admin.aaf.role","cassandra.port","lock.using"};
+ // private static final String[] propKeys = new String[] { MusicUtil.class.getDeclaredMethod(arg0, )"build","cassandra.host", "debug",
+ // "version", "music.properties", "lock.lease.period", "cassandra.user",
+ // "cassandra.password", "aaf.endpoint.url","admin.username","admin.password",
+ // "music.namespace","admin.aaf.role","cassandra.port","lock.using","retry.count",
+ // "transId.header.required","conversation.header.required","clientId.header.required",
+ // "messageId.header.required","transId.header.prefix","conversation.header.prefix",
+ // "clientId.header.prefix","messageId.header.prefix"};
+ // Consistency Constants and variables.
private static final String[] cosistencyLevel = new String[] {
- "ALL","EACH_QUORUM","QUORUM","LOCAL_QUORUM","ONE","TWO","THREE","LOCAL_ONE","ANY","SERIAL","LOCAL_SERIAL"};
+ "ALL","EACH_QUORUM","QUORUM","LOCAL_QUORUM","ONE","TWO",
+ "THREE","LOCAL_ONE","ANY","SERIAL","LOCAL_SERIAL"};
private static final Map<String,ConsistencyLevel> consistencyName = new HashMap<>();
static {
consistencyName.put("ONE",ConsistencyLevel.ONE);
@@ -138,85 +138,64 @@ public class MusicUtil {
consistencyName.put("LOCAL_SERIAL",ConsistencyLevel.LOCAL_SERIAL);
}
+ // Cassandra Values
private static String cassName = "cassandra";
private static String cassPwd;
- private static String aafEndpointUrl = null;
- public static ConcurrentMap<String, Long> zkNodeMap = new ConcurrentHashMap<>();
- private static String adminId = "username";
- private static String adminPass= "password";
- private static String aafAdminUrl= null;
- private static String musicNamespace= "com.att.music.api";
- private static String adminAafRole= "com.att.music.api.admin_api";
-
- public static final long MusicEternityEpochMillis = 1533081600000L; // Wednesday, August 1, 2018 12:00:00 AM
+ private static String myCassaHost = LOCALHOST;
+ private static int cassandraPort = 9042;
+ private static int cassandraConnectTimeOutMS;
+ private static int cassandraReadTimeOutMS;
+ // AAF
+ private static String musicAafNs = "org.onap.music.cadi";
+
+ // Locking
+ public static final long MusicEternityEpochMillis = 1533081600000L; // Wednesday, August 1, 2018 12:00:00 AM
public static final long MaxLockReferenceTimePart = 1000000000000L; // millis after eternity (eq sometime in 2050)
-
public static final long MaxCriticalSectionDurationMillis = 1L * 24 * 60 * 60 * 1000; // 1 day
-
- public static String getLockUsing() {
- return lockUsing;
- }
-
-
- public static void setLockUsing(String lockUsing) {
- MusicUtil.lockUsing = lockUsing;
- }
+ // Response/Request tracking headers
+ private static String transIdPrefix = "false";
+ private static String conversationIdPrefix = "false";
+ private static String clientIdPrefix = "false";
+ private static String messageIdPrefix = "false";
+ private static Boolean transIdRequired = false;
+ private static Boolean conversationIdRequired = false;
+ private static Boolean clientIdRequired = false;
+ private static Boolean messageIdRequired = false;
+ private static String cipherEncKey = "";
- public static String getAafAdminUrl() {
- return aafAdminUrl;
- }
-
-
- public static void setAafAdminUrl(String aafAdminUrl) {
- MusicUtil.aafAdminUrl = aafAdminUrl;
- }
-
-
- public static String getMusicNamespace() {
- return musicNamespace;
- }
-
-
- public static void setMusicNamespace(String musicNamespace) {
- MusicUtil.musicNamespace = musicNamespace;
+ private static long createLockWaitPeriod = 300;
+ private static int createLockWaitIncrement = 50;
+
+ public static long getCreateLockWaitPeriod() {
+ return createLockWaitPeriod;
}
-
-
- public static String getAdminAafRole() {
- return adminAafRole;
+
+ public static void setCreateLockWaitPeriod(long createLockWaitPeriod) {
+ MusicUtil.createLockWaitPeriod = createLockWaitPeriod;
}
-
- public static void setAdminAafRole(String adminAafRole) {
- MusicUtil.adminAafRole = adminAafRole;
+ public static int getCreateLockWaitIncrement() {
+ return createLockWaitIncrement;
}
-
-
-
- public static String getAdminId() {
- return adminId;
+
+ public static void setCreateLockWaitIncrement(int createLockWaitIncrement) {
+ MusicUtil.createLockWaitIncrement = createLockWaitIncrement;
}
-
-
- public static void setAdminId(String adminId) {
- MusicUtil.adminId = adminId;
+
+ public MusicUtil() {
+ throw new IllegalStateException("Utility Class");
}
-
- public static String getAdminPass() {
- return adminPass;
+ public static String getLockUsing() {
+ return lockUsing;
}
- public static void setAdminPass(String adminPass) {
- MusicUtil.adminPass = adminPass;
+ public static void setLockUsing(String lockUsing) {
+ MusicUtil.lockUsing = lockUsing;
}
-
- private MusicUtil() {
- throw new IllegalStateException("Utility Class");
- }
/**
*
* @return cassandra port
@@ -246,112 +225,31 @@ public class MusicUtil {
return cassPwd;
}
- /**
- * @return the aafEndpointUrl
- */
- public static String getAafEndpointUrl() {
- return aafEndpointUrl;
+ public static int getCassandraConnectTimeOutMS() {
+ return cassandraConnectTimeOutMS;
}
- /**
- *
- * @param aafEndpointUrl
- */
- public static void setAafEndpointUrl(String aafEndpointUrl) {
- MusicUtil.aafEndpointUrl = aafEndpointUrl;
+ public static void setCassandraConnectTimeOutMS(int cassandraConnectTimeOutMS) {
+ MusicUtil.cassandraConnectTimeOutMS = cassandraConnectTimeOutMS;
}
- /**
- *
- * @return
- */
- public static int getMyId() {
- return myId;
+ public static int getCassandraReadTimeOutMS() {
+ return cassandraReadTimeOutMS;
}
- /**
- *
- * @param myId
- */
- public static void setMyId(int myId) {
- MusicUtil.myId = myId;
- }
-
- /**
- *
- * @return
- */
- public static List<String> getAllIds() {
- return allIds;
- }
-
- /**
- *
- * @param allIds
- */
- public static void setAllIds(List<String> allIds) {
- MusicUtil.allIds = (ArrayList<String>) allIds;
- }
-
- /**
- *
- * @return
- */
- public static String getPublicIp() {
- return publicIp;
- }
-
- /**
- *
- * @param publicIp
- */
- public static void setPublicIp(String publicIp) {
- MusicUtil.publicIp = publicIp;
- }
-
- /**
- *
- * @return
- */
- public static List<String> getAllPublicIps() {
- return allPublicIps;
- }
-
- /**
- *
- * @param allPublicIps
- */
- public static void setAllPublicIps(List<String> allPublicIps) {
- MusicUtil.allPublicIps = (ArrayList<String>) allPublicIps;
+ public static void setCassandraReadTimeOutMS(int cassandraReadTimeOutMS) {
+ MusicUtil.cassandraReadTimeOutMS = cassandraReadTimeOutMS;
}
/**
* Returns An array of property names that should be in the Properties
* files.
*
- * @return
- */
- public static String[] getPropkeys() {
- return propKeys;
- }
-
- /**
- * Get MusicRestIp - default = localhost property file value - music.rest.ip
- *
- * @return
- */
- public static String getMusicRestIp() {
- return musicRestIp;
- }
-
- /**
- * Set MusicRestIp
- *
- * @param musicRestIp
- */
- public static void setMusicRestIp(String musicRestIp) {
- MusicUtil.musicRestIp = musicRestIp;
- }
+// * @return
+// */
+ // public static String[] getPropkeys() {
+ // return propKeys.clone();
+ // }
/**
* Get MusicPropertiesFilePath - Default = /opt/music/music.properties
@@ -419,7 +317,7 @@ public class MusicUtil {
}
/**
- * Return the version property file value - version
+ * Return the version property file value - version.
*
* @return
*/
@@ -428,6 +326,23 @@ public class MusicUtil {
}
/**
+ * Set the build of project which is a combination of the
+ * version and the date.
+ *
+ * @param build - version-date.
+ */
+ public static void setBuild(String build) {
+ MusicUtil.build = build;
+ }
+
+ /**
+ * Return the build version-date.
+ */
+ public static String getBuild() {
+ return build;
+ }
+
+ /**
* Get MyCassHost - Cassandra Hostname - Default = localhost property file
* value - cassandra.host
*
@@ -440,59 +355,77 @@ public class MusicUtil {
/**
* Set MyCassHost - Cassandra Hostname
*
- * @param myCassaHost
+ * @param myCassaHost .
*/
public static void setMyCassaHost(String myCassaHost) {
MusicUtil.myCassaHost = myCassaHost;
}
/**
- * Get DefaultMusicIp - Default = localhost property file value - music.ip
- *
+ * Gey default retry count
* @return
*/
- public static String getDefaultMusicIp() {
- return defaultMusicIp;
+ public static int getRetryCount() {
+ return retryCount;
}
/**
- * Set DefaultMusicIp
- *
- * @param defaultMusicIp
+ * Set retry count
+ * @param retryCount .
*/
- public static void setDefaultMusicIp(String defaultMusicIp) {
- MusicUtil.defaultMusicIp = defaultMusicIp;
+ public static void setRetryCount(int retryCount) {
+ MusicUtil.retryCount = retryCount;
}
+
/**
- *
- * @return
+ * This is used to turn keyspace creation api on/off.
+ *
+ */
+ public static void setKeyspaceActive(Boolean keyspaceActive) {
+ MusicUtil.isKeyspaceActive = keyspaceActive;
+ }
+
+ /**
+ * This is used to turn keyspace creation api on/off.
+ * @return boolean isKeyspaceActive
*/
+ public static boolean isKeyspaceActive() {
+ return isKeyspaceActive;
+ }
+
+ /**
+ * This method depricated as its not used or needed.
+ *
+ * @return String
+ */
+ @Deprecated
public static String getTestType() {
String testType = "";
try {
Scanner fileScanner = new Scanner(new File(""));
testType = fileScanner.next();// ignore the my id line
@SuppressWarnings("unused")
- String batchSize = fileScanner.next();// ignore the my public ip
- // line
+ String batchSize = fileScanner.next();// ignore the my public ip line
fileScanner.close();
} catch (FileNotFoundException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
}
return testType;
}
/**
- *
+ * Method to do a Thread Sleep.
+ * Used for adding a delay.
+ *
* @param time
*/
public static void sleep(long time) {
try {
Thread.sleep(time);
} catch (InterruptedException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage());
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
Thread.currentThread().interrupt();
}
}
@@ -533,23 +466,23 @@ public class MusicUtil {
String value = "";
switch (type.getName()) {
- case UUID:
- value = valueObj + "";
- break;
- case TEXT:
- case VARCHAR:
- String valueString = valueObj + "";
- valueString = valueString.replace("'", "''");
- value = "'" + valueString + "'";
- break;
- case MAP: {
- Map<String, Object> otMap = (Map<String, Object>) valueObj;
- value = "{" + jsonMaptoSqlString(otMap, ",") + "}";
- break;
- }
- default:
- value = valueObj + "";
- break;
+ case UUID:
+ value = valueObj + "";
+ break;
+ case TEXT:
+ case VARCHAR:
+ String valueString = valueObj + "";
+ valueString = valueString.replace("'", "''");
+ value = "'" + valueString + "'";
+ break;
+ case MAP: {
+ Map<String, Object> otMap = (Map<String, Object>) valueObj;
+ value = "{" + jsonMaptoSqlString(otMap, ",") + "}";
+ break;
+ }
+ default:
+ value = valueObj + "";
+ break;
}
return value;
}
@@ -583,7 +516,7 @@ public class MusicUtil {
case MAP:
return (Map<String, Object>) valueObj;
case LIST:
- return (List<Object>)valueObj;
+ return valueObj;
case BLOB:
default:
@@ -592,8 +525,8 @@ public class MusicUtil {
}
public static ByteBuffer convertToActualDataType(DataType colType, byte[] valueObj) {
- ByteBuffer buffer = ByteBuffer.wrap(valueObj);
- return buffer;
+
+ return ByteBuffer.wrap(valueObj);
}
/**
@@ -661,26 +594,10 @@ public class MusicUtil {
response.header(XPATCHVERSION,verArray[2]);
}
response.header(XLATESTVERSION,version);
- logger.info(EELFLoggerDelegate.applicationLogger,"Version In:" + versionIn);
+ logger.info(EELFLoggerDelegate.auditLogger,"Version In:" + versionIn);
return response;
}
-
- public static Map<String,String> extractBasicAuthentication(String authorization){
- Map<String,String> authValues = new HashMap<>();
- if(authorization == null) {
- authValues.put("ERROR", "Authorization cannot be null");
- return authValues;
- }
- authorization = authorization.replaceFirst("Basic", "");
- String decoded = Base64.base64Decode(authorization);
- StringTokenizer token = new StringTokenizer(decoded, ":");
- authValues.put(MusicUtil.USERID, token.nextToken());
- authValues.put(MusicUtil.PASSWORD,token.nextToken());
- return authValues;
-
- }
-
public static boolean isValidConsistency(String consistency) {
for (String string : cosistencyLevel) {
if (string.equalsIgnoreCase(consistency))
@@ -692,60 +609,8 @@ public class MusicUtil {
public static ConsistencyLevel getConsistencyLevel(String consistency) {
return consistencyName.get(consistency.toUpperCase());
- }
-
- public static void loadProperties() throws Exception {
- Properties prop = new Properties();
- InputStream input = null;
- try {
- // load the properties file
- input = MusicUtil.class.getClassLoader().getResourceAsStream("music.properties");
- prop.load(input);
- } catch (Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unable to find properties file.");
- throw new Exception();
- } finally {
- if (input != null) {
- try {
- input.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- // get the property value and return it
- MusicUtil.setMyCassaHost(prop.getProperty("cassandra.host"));
- MusicUtil.setCassName(prop.getProperty("cassandra.user"));
- MusicUtil.setCassPwd(prop.getProperty("cassandra.password"));
- MusicUtil.setCassandraPort(Integer.parseInt(prop.getProperty("cassandra.port")));
- MusicUtil.setNotifyTimeOut(Integer.parseInt(prop.getProperty("notify.timeout")));
- MusicUtil.setNotifyInterval(Integer.parseInt(prop.getProperty("notify.interval")));
- MusicUtil.setCacheObjectMaxLife(Integer.parseInt(prop.getProperty("cacheobject.maxlife")));
- }
-
- public static void setNotifyInterval(int notifyinterval) {
- MusicUtil.notifyinterval = notifyinterval;
- }
- public static void setNotifyTimeOut(int notifytimeout) {
- MusicUtil.notifytimeout = notifytimeout;
- }
-
- public static int getNotifyInterval() {
- return MusicUtil.notifyinterval;
- }
-
- public static int getNotifyTimeout() {
- return MusicUtil.notifytimeout;
}
- public static int getCacheObjectMaxLife() {
- return MusicUtil.cacheObjectMaxLife;
- }
-
- public static void setCacheObjectMaxLife(int cacheObjectMaxLife) {
- MusicUtil.cacheObjectMaxLife = cacheObjectMaxLife;
- }
-
/**
* Given the time of write for an update in a critical section, this method provides a transformed timestamp
* that ensures that a previous lock holder who is still alive can never corrupt a later critical section.
@@ -755,20 +620,18 @@ public class MusicUtil {
* @throws MusicServiceException
* @throws MusicQueryException
*/
- public static long v2sTimeStampInMicroseconds(long ordinal, long timeOfWrite) throws MusicServiceException, MusicQueryException {
+ public static long v2sTimeStampInMicroseconds(long ordinal, long timeOfWrite) throws MusicServiceException, MusicQueryException{
// TODO: use acquire time instead of music eternity epoch
- long ts = ordinal * MaxLockReferenceTimePart + (timeOfWrite - MusicEternityEpochMillis);
-
- return ts;
+ return ordinal * MaxLockReferenceTimePart + (timeOfWrite - MusicEternityEpochMillis);
}
-
+
public static MusicCoreService getMusicCoreService() {
if(getLockUsing().equals(MusicUtil.CASSANDRA))
return MusicCassaCore.getInstance();
else
return MusicCassaCore.getInstance();
}
-
+
/**
* @param lockName
* @return
@@ -793,9 +656,9 @@ public class MusicUtil {
}
public static void writeBackToQuorum(PreparedQueryObject selectQuery, String primaryKeyName,
- PreparedQueryObject updateQuery, String keyspace, String table,
- Object cqlFormattedPrimaryKeyValue)
- throws Exception {
+ PreparedQueryObject updateQuery, String keyspace, String table,
+ Object cqlFormattedPrimaryKeyValue)
+ throws Exception {
try {
ResultSet results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(selectQuery);
// write it back to a quorum
@@ -818,16 +681,16 @@ public class MusicUtil {
counter = counter + 1;
}
updateQuery.appendQueryString("UPDATE " + keyspace + "." + table + " SET "
- + fieldValueString + " WHERE " + primaryKeyName + "= ? " + ";");
+ + fieldValueString + " WHERE " + primaryKeyName + "= ? " + ";");
updateQuery.addValue(cqlFormattedPrimaryKeyValue);
MusicDataStoreHandle.getDSHandle().executePut(updateQuery, "critical");
} catch (MusicServiceException | MusicQueryException e) {
logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.QUERYERROR +""+updateQuery ,
- ErrorSeverity.MAJOR, ErrorTypes.QUERYERROR);
+ ErrorSeverity.MAJOR, ErrorTypes.QUERYERROR, e);
}
}
-
+
public static boolean getIsCadi() {
return MusicUtil.isCadi;
}
@@ -842,5 +705,177 @@ public class MusicUtil {
return uuid;
}
+ private static String checkPrefix(String prefix){
+ if (prefix == null || "".equals(prefix) || prefix.endsWith("-")) {
+ return prefix;
+ } else {
+ return prefix + "-";
+ }
+ }
+
+ /**
+ * @return the transIdPrefix
+ */
+ public static String getTransIdPrefix() {
+ return transIdPrefix;
+ }
+
+ /**
+ * @param transIdPrefix the transIdPrefix to set
+ */
+ public static void setTransIdPrefix(String transIdPrefix) {
+ MusicUtil.transIdPrefix = checkPrefix(transIdPrefix);
+ }
+
+ /**
+ * @return the conversationIdPrefix
+ */
+ public static String getConversationIdPrefix() {
+ return conversationIdPrefix;
+ }
+
+ /**
+ * @param conversationIdPrefix the conversationIdPrefix to set
+ */
+ public static void setConversationIdPrefix(String conversationIdPrefix) {
+ MusicUtil.conversationIdPrefix = checkPrefix(conversationIdPrefix);
+ }
+
+ /**
+ * @return the clientIdPrefix
+ */
+ public static String getClientIdPrefix() {
+ return clientIdPrefix;
+ }
+
+ /**
+ * @param clientIdPrefix the clientIdPrefix to set
+ */
+ public static void setClientIdPrefix(String clientIdPrefix) {
+ MusicUtil.clientIdPrefix = checkPrefix(clientIdPrefix);
+ }
+
+ /**
+ * @return the messageIdPrefix
+ */
+ public static String getMessageIdPrefix() {
+ return messageIdPrefix;
+ }
+
+ /**
+ * @param messageIdPrefix the messageIdPrefix to set
+ */
+ public static void setMessageIdPrefix(String messageIdPrefix) {
+ MusicUtil.messageIdPrefix = checkPrefix(messageIdPrefix);
+ }
+
+ /**
+ * @return the transIdRequired
+ */
+ public static Boolean getTransIdRequired() {
+ return transIdRequired;
+ }
+
+
+ /**
+ * @param transIdRequired the transIdRequired to set
+ */
+ public static void setTransIdRequired(Boolean transIdRequired) {
+ MusicUtil.transIdRequired = transIdRequired;
+ }
+
+
+ /**
+ * @return the conversationIdRequired
+ */
+ public static Boolean getConversationIdRequired() {
+ return conversationIdRequired;
+ }
+
+
+ /**
+ * @param conversationIdRequired the conversationIdRequired to set
+ */
+ public static void setConversationIdRequired(Boolean conversationIdRequired) {
+ MusicUtil.conversationIdRequired = conversationIdRequired;
+ }
+
+
+ /**
+ * @return the clientIdRequired
+ */
+ public static Boolean getClientIdRequired() {
+ return clientIdRequired;
+ }
+
+
+ /**
+ * @param clientIdRequired the clientIdRequired to set
+ */
+ public static void setClientIdRequired(Boolean clientIdRequired) {
+ MusicUtil.clientIdRequired = clientIdRequired;
+ }
+
+
+ /**
+ * @return the messageIdRequired
+ */
+ public static Boolean getMessageIdRequired() {
+ return messageIdRequired;
+ }
+
+ /**
+ * @param messageIdRequired the messageIdRequired to set
+ */
+ public static void setMessageIdRequired(Boolean messageIdRequired) {
+ MusicUtil.messageIdRequired = messageIdRequired;
+ }
+
+ /**
+ * @return the sleep time, in milliseconds, for the lock cleanup daemon
+ */
+ public static long getLockDaemonSleepTimeMs() {
+ return lockDaemonSleepms;
+ }
+
+ /**
+ * set the sleep time, in milliseconds, for the lock cleanup daemon
+ */
+ public static void setLockDaemonSleepTimeMs(long timeoutms) {
+ MusicUtil.lockDaemonSleepms = timeoutms;
+ }
+
+ public static Set<String> getKeyspacesToCleanLocks() {
+ return keyspacesToCleanLocks;
+ }
+
+ public static void setKeyspacesToCleanLocks(Set<String> keyspaces) {
+ MusicUtil.keyspacesToCleanLocks = keyspaces;
+ }
+
+ public static String getCipherEncKey() {
+ return MusicUtil.cipherEncKey;
+ }
+
+
+ public static void setCipherEncKey(String cipherEncKey) {
+ MusicUtil.cipherEncKey = cipherEncKey;
+ if ( null == cipherEncKey || cipherEncKey.equals("") ||
+ cipherEncKey.equals("nothing to see here")) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Missing Cipher Encryption Key.");
+ }
+ }
+
+ public static String getMusicAafNs() {
+ return MusicUtil.musicAafNs;
+ }
+
+
+ public static void setMusicAafNs(String musicAafNs) {
+ MusicUtil.musicAafNs = musicAafNs;
+ }
+
+
+
}
diff --git a/src/main/java/org/onap/music/main/ResultType.java b/music-core/src/main/java/org/onap/music/main/ResultType.java
index f5ef2070..f5ef2070 100644
--- a/src/main/java/org/onap/music/main/ResultType.java
+++ b/music-core/src/main/java/org/onap/music/main/ResultType.java
diff --git a/src/main/java/org/onap/music/main/ReturnType.java b/music-core/src/main/java/org/onap/music/main/ReturnType.java
index f02dabbf..f02dabbf 100644
--- a/src/main/java/org/onap/music/main/ReturnType.java
+++ b/music-core/src/main/java/org/onap/music/main/ReturnType.java
diff --git a/music-core/src/main/java/org/onap/music/service/MusicCoreService.java b/music-core/src/main/java/org/onap/music/service/MusicCoreService.java
new file mode 100644
index 00000000..753d9b28
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/service/MusicCoreService.java
@@ -0,0 +1,189 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.service;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonIndex;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonSelect;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.lockingservice.cassandra.MusicLockState;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+
+import com.datastax.driver.core.ResultSet;
+
+public interface MusicCoreService {
+
+
+ // Core Music Database Methods
+
+
+ public ReturnType eventualPut(PreparedQueryObject queryObject);
+
+ public ReturnType eventualPut_nb(PreparedQueryObject queryObject,String keyspace,String tablename,String primaryKey);
+
+ public ReturnType criticalPut(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, String lockId, Condition conditionInfo);
+
+ public ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency)
+ throws MusicServiceException,MusicQueryException;
+
+ public ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException;
+
+ public ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException;
+
+ public ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException;
+
+ public ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException;
+
+ public ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo)
+ throws MusicLockingException, MusicQueryException, MusicServiceException;
+
+ public ResultSet criticalGet(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, String lockId) throws MusicServiceException;
+
+ // Core Music Locking Service Methods
+
+ /**
+ * Create a lock ref in the music lock store.
+ * Default is write as this is the safest semantically
+ *
+ * @param fullyQualifiedKey the key to create a lock on
+ * @see {@link #creatLockReference(String, LockType)}
+ */
+ public String createLockReferenceAtomic(String fullyQualifiedKey) throws MusicLockingException; // lock name
+
+ /**
+ * Create a lock ref in the music lock store
+ * @param fullyQualifiedKey the key to create a lock on
+ * @param owner the owner of the lock, for deadlock prevention
+ */
+ public String createLockReference(String fullyQualifiedKey, String owner) throws MusicLockingException;
+
+ /**
+ * Create a lock ref in the music lock store
+ * @param fullyQualifiedKey the key to create a lock on
+ * @param locktype the type of lock create, see {@link LockType}
+ */
+ public String createLockReferenceAtomic(String fullyQualifiedKey, LockType locktype) throws MusicLockingException;
+
+ /**
+ * Create a lock ref in the music lock store
+ * @param fullyQualifiedKey the key to create a lock on
+ * @param locktype the type of lock create, see {@link LockType}
+ * @param owner the owner of the lock, for deadlock prevention
+ */
+ public String createLockReference(String fullyQualifiedKey, LockType locktype, String owner) throws MusicLockingException;
+
+ public ReturnType acquireLockWithLease(String key, String lockReference, long leasePeriod)
+ throws MusicLockingException, MusicQueryException, MusicServiceException; // key,lock id,time
+
+ public ReturnType acquireLock(String key, String lockReference)
+ throws MusicLockingException, MusicQueryException, MusicServiceException; // key,lock id
+
+ public ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject,
+ String consistency) throws MusicServiceException;
+
+ public ResultSet quorumGet(PreparedQueryObject query);
+
+ /**
+ * Gets top of queue for fullyQualifiedKey
+ * @param fullyQualifiedKey
+ * @return
+ */
+ public String whoseTurnIsIt(String fullyQualifiedKey);// lock name
+
+ /**
+ * Gets the current lockholder(s) for lockName
+ * @param lockName
+ * @return
+ */
+ public List<String> getCurrentLockHolders(String fullyQualifiedKey);
+
+ public void destroyLockRef(String lockId) throws MusicLockingException;
+
+ public void deleteLock(String lockName) throws MusicLockingException;
+
+ public ReturnType promoteLock(String lockIdToPromote) throws MusicLockingException;
+
+ public List<String> getLockQueue(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException;
+
+ public long getLockQueueSize(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException;
+
+ public Map<String, Object> validateLock(String lockName);
+
+ public MusicLockState releaseLock(String lockId, boolean voluntaryRelease) throws MusicLockingException;
+
+ public List<String> releaseAllLocksForOwner(String ownerId, String keyspace, String table) throws MusicLockingException, MusicServiceException, MusicQueryException;
+
+
+ //Methods added for orm
+
+
+ public ResultType createTable(JsonTable jsonTableObject, String consistencyInfo) throws MusicServiceException,MusicQueryException;
+
+ public ResultType dropTable(JsonTable jsonTableObject, String consistencyInfo)
+ throws MusicServiceException,MusicQueryException;
+
+ public ResultType createKeyspace(JsonKeySpace jsonKeySpaceObject,String consistencyInfo) throws MusicServiceException,MusicQueryException;
+
+ public ResultType dropKeyspace(JsonKeySpace jsonKeySpaceObject, String consistencyInfo)
+ throws MusicServiceException,MusicQueryException;
+
+ public ResultType createIndex(JsonIndex jsonIndexObject, String consistencyInfo) throws MusicServiceException,MusicQueryException;
+
+ public ResultSet select(JsonSelect jsonSelect, MultivaluedMap<String, String> rowParams) throws MusicServiceException, MusicQueryException;
+
+ public ResultSet selectCritical(JsonInsert jsonInsertObj, MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException;
+
+ public ReturnType insertIntoTable(JsonInsert jsonInsert) throws MusicLockingException, MusicQueryException, MusicServiceException;
+
+ public ReturnType updateTable(JsonUpdate jsonUpdateObj,MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException;
+
+ public ReturnType deleteFromTable(JsonDelete jsonDeleteObj,MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException;
+
+
+}
diff --git a/music-core/src/main/java/org/onap/music/service/impl/MusicCassaCore.java b/music-core/src/main/java/org/onap/music/service/impl/MusicCassaCore.java
new file mode 100644
index 00000000..8055a48d
--- /dev/null
+++ b/music-core/src/main/java/org/onap/music/service/impl/MusicCassaCore.java
@@ -0,0 +1,1236 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (c) 2018 IBM.
+ * ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * 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.service.impl;
+
+import java.io.StringWriter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicInteger;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonIndex;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonSelect;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicDeadlockException;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.lockingservice.cassandra.CassaLockStore.LockObject;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.lockingservice.cassandra.MusicLockState;
+import org.onap.music.lockingservice.cassandra.MusicLockState.LockStatus;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+import org.onap.music.service.MusicCoreService;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.TableMetadata;
+
+public class MusicCassaCore implements MusicCoreService {
+
+ private static CassaLockStore mLockHandle = null;
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicCassaCore.class);
+ private static MusicCassaCore musicCassaCoreInstance = null;
+ private static Set<String> set = Collections.synchronizedSet(new HashSet<String>());
+ HashMap<String, Integer> map = new HashMap<>();
+ AtomicInteger wait = new AtomicInteger(0);
+
+ private MusicCassaCore() {
+ // not going to happen
+ }
+
+ public static CassaLockStore getmLockHandle() {
+ return mLockHandle;
+ }
+
+ //for unit testing purposes
+ static void setmLockHandle(CassaLockStore mLockHandle) {
+ MusicCassaCore.mLockHandle = mLockHandle;
+ }
+
+ public static MusicCassaCore getInstance() {
+
+ if(musicCassaCoreInstance == null) {
+ musicCassaCoreInstance = new MusicCassaCore();
+ }
+ return musicCassaCoreInstance;
+ }
+
+ public static CassaLockStore getLockingServiceHandle() throws MusicLockingException {
+ logger.info(EELFLoggerDelegate.applicationLogger,"Acquiring lock store handle");
+ long start = System.currentTimeMillis();
+
+ if (mLockHandle == null) {
+ try {
+ mLockHandle = new CassaLockStore(MusicDataStoreHandle.getDSHandle());
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.LOCKHANDLE,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
+ throw new MusicLockingException("Failed to aquire Locl store handle " + e);
+ }
+ }
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to acquire lock store handle:" + (end - start) + " ms");
+ return mLockHandle;
+ }
+
+ public String createLockReferenceAtomic(String fullyQualifiedKey) throws MusicLockingException {
+ return createLockReferenceAtomic(fullyQualifiedKey, LockType.WRITE);
+ }
+ public String createLockReference(String fullyQualifiedKey, String owner) throws MusicLockingException {
+ return createLockReference(fullyQualifiedKey, LockType.WRITE, owner);
+ }
+
+
+ /**
+ * This will be called for Atomic calls
+ * it ensures that only one thread tries to create a lock on each key at a time
+ */
+ public String createLockReferenceAtomic(String fullyQualifiedKey, LockType locktype) throws MusicLockingException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ if (splitString.length < 3) {
+ throw new MusicLockingException("Missing or incorrect lock details. Check table or key name.");
+ }
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String lockName = splitString[2];
+
+ logger.info(EELFLoggerDelegate.applicationLogger,"Creating lock reference for lock name:" + lockName);
+ long start = 0L;
+ long end = 0L;
+ String lockReference = null;
+ LockObject peek = null;
+
+ /** Lets check for an existing lock.
+ * This will allow us to limit the amount of requests going forward.
+ */
+ start = System.currentTimeMillis();
+ try {
+ peek = getLockingServiceHandle().peekLockQueue(keyspace, table, lockName);
+ } catch (MusicServiceException | MusicQueryException e) {
+ //logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(),e);
+ throw new MusicLockingException("Error getting lockholder info for key [" + lockName +"]:" + e.getMessage());
+ }
+
+ if(peek!=null && (peek.getLocktype()!=null && peek.getLocktype().equals(LockType.WRITE)) && peek.getAcquireTime()!=null && peek.getLockRef()!=null) {
+ long currentTime = System.currentTimeMillis();
+ if((currentTime-Long.parseLong(peek.getAcquireTime()))<MusicUtil.getDefaultLockLeasePeriod()){
+ //logger.info(EELFLoggerDelegate.applicationLogger,"Lock holder exists and lease not expired. Please try again for key="+lockName);
+ throw new MusicLockingException("Unable to create lock reference for key [" + lockName + "]. Please try again.");
+ }
+ }
+ end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to check for lock reference for key [" + lockName + "]:" + (end - start) + " ms");
+
+ start = System.currentTimeMillis();
+ /* We are Creating a Thread safe set and adding the key to the set.
+ * if a key exists then it wil be passed over and not go to the lock creation.
+ * If a key doesn't exist then it will set the value in the set and continue to create a lock.
+ *
+ * This will ensure that no 2 threads using the same key will be able to try to create a lock
+ * This wil in turn squash the amout of LWT Chatter in Cassandra an reduce the amount of
+ * WriteTimeoutExceptions being experiences on single keys.
+ */
+ if ( set.add(fullyQualifiedKey)) {
+ try {
+ lockReference = "" + getLockingServiceHandle().genLockRefandEnQueue(keyspace, table, lockName, locktype,null);
+ set.remove(fullyQualifiedKey);
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ set.remove(fullyQualifiedKey);
+ throw new MusicLockingException(e.getMessage());
+ } catch (Exception e) {
+ set.remove(fullyQualifiedKey);
+ e.printStackTrace();
+ logger.error(EELFLoggerDelegate.applicationLogger,"Exception in creatLockEnforced:"+ e.getMessage(),e);
+ throw new MusicLockingException("Unable to create lock reference for key [" + lockName + "]. " + e.getMessage());
+ }
+ } else {
+ throw new MusicLockingException("Unable to create lock reference for key [" + lockName + "]. Please try again.");
+ }
+ end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.debugLogger,"### Set = " + set);
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to create lock reference for key [" + lockName + "]:" + (end - start) + " ms");
+ return lockReference;
+
+ //return createLockReference(fullyQualifiedKey, locktype, null);
+ }
+
+ public String createLockReference(String fullyQualifiedKey, LockType locktype, String owner) throws MusicLockingException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ if (splitString.length < 3) {
+ throw new MusicLockingException("Missing or incorrect lock details. Check table or key name.");
+ }
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String lockName = splitString[2];
+
+ logger.info(EELFLoggerDelegate.applicationLogger,"Creating lock reference for lock name:" + lockName);
+ long start = 0L;
+ long end = 0L;
+ String lockReference = null;
+
+ /* Check for a Deadlock */
+ try {
+ boolean deadlock = getLockingServiceHandle().checkForDeadlock(keyspace, table, lockName, locktype, owner, false);
+ if (deadlock) {
+ MusicDeadlockException e = new MusicDeadlockException("Deadlock detected when " + owner + " tried to create lock on " + keyspace + "." + table + "." + lockName);
+ e.setValues(owner, keyspace, table, lockName);
+ throw e;
+ }
+ } catch (MusicDeadlockException e) {
+ //just threw this, no need to wrap it
+ throw e;
+ } catch (MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
+ throw new MusicLockingException("Unable to check for deadlock. " + e.getMessage(), e);
+ }
+ end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to check for deadlock for key [" + lockName + "]:" + (end - start) + " ms");
+
+ start = System.currentTimeMillis();
+ try {
+ lockReference = "" + getLockingServiceHandle().genLockRefandEnQueue(keyspace, table, lockName, locktype, owner);
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ logger.info(EELFLoggerDelegate.applicationLogger,e.getMessage(),e);
+ throw new MusicLockingException("Unable to create lock reference for key [" + lockName + "]. Please try again: " + e.getMessage());
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.applicationLogger,e.getMessage(),e);
+ throw new MusicLockingException("Unable to create lock reference. " + e.getMessage(), e);
+ }
+ end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to create lock reference for key [" + lockName + "]:" + (end - start) + " ms");
+ return lockReference;
+ }
+
+ public ReturnType promoteLock(String lockId) throws MusicLockingException {
+ String[] splitString = lockId.split("\\.");
+ String keyspace = splitString[0].substring(1);//remove '$'
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2].substring(0, splitString[2].lastIndexOf("$"));
+ String lockRef = lockId.substring(lockId.lastIndexOf("$")+1); //lockRef is "$" to end
+
+ logger.info(EELFLoggerDelegate.applicationLogger,"Attempting to promote lock " + lockId);
+
+ try {
+ return getLockingServiceHandle().promoteLock(keyspace, table, primaryKeyValue, lockRef);
+ } catch (MusicServiceException e) {
+ throw new MusicLockingException("Unable to promote lock. ", e);
+ } catch (MusicQueryException e) {
+ throw new MusicLockingException("Unable to promote lock. ", e);
+ }
+
+ }
+
+
+ public ReturnType acquireLockWithLease(String fullyQualifiedKey, String lockReference, long leasePeriod)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ evictExpiredLockHolder(fullyQualifiedKey,leasePeriod);
+ return acquireLock(fullyQualifiedKey, lockReference);
+ }
+
+ private void evictExpiredLockHolder(String fullyQualifiedKey, long leasePeriod)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+
+ LockObject currentLockHolderObject = getLockingServiceHandle().peekLockQueue(keyspace, table, primaryKeyValue);
+
+ if (!currentLockHolderObject.getIsLockOwner()) { // no lock holder
+ return;
+ }
+ /*
+ * Release the lock of the previous holder if it has expired. if the update to the acquire time has
+ * not reached due to network delays, simply use the create time as the reference
+ */
+ long referenceTime = Math.max(Long.parseLong(currentLockHolderObject.getAcquireTime()),
+ Long.parseLong(currentLockHolderObject.getCreateTime()));
+ if ((System.currentTimeMillis() - referenceTime) > leasePeriod) {
+ forciblyReleaseLock(fullyQualifiedKey, currentLockHolderObject.getLockRef() + "");
+ logger.info(EELFLoggerDelegate.applicationLogger, currentLockHolderObject.getLockRef() + " forcibly released");
+ }
+ }
+
+ public ReturnType acquireLock(String fullyQualifiedKey, String lockId)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ String[] splitString = lockId.split("\\.");
+ String keyspace = splitString[0].substring(1);//remove '$'
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2].substring(0, splitString[2].lastIndexOf("$"));
+ String localFullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
+ String lockRef = lockId.substring(lockId.lastIndexOf("$")+1); //lockRef is "$" to end
+
+ LockObject lockInfo = getLockingServiceHandle().getLockInfo(keyspace, table, primaryKeyValue, lockRef);
+
+ if (!lockInfo.getIsLockOwner()) {
+ return new ReturnType(ResultType.FAILURE, lockId + " is not a lock holder");//not top of the lock store q
+ }
+
+ if (getLockingServiceHandle().checkForDeadlock(keyspace, table, primaryKeyValue, lockInfo.getLocktype(), lockInfo.getOwner(), true)) {
+ MusicDeadlockException e = new MusicDeadlockException("Deadlock detected when " + lockInfo.getOwner() + " tried to create lock on " + keyspace + "." + table + "." + primaryKeyValue);
+ e.setValues(lockInfo.getOwner(), keyspace, table, primaryKeyValue);
+ throw e;
+ }
+
+ //check to see if the value of the key has to be synced in case there was a forceful release
+ String syncTable = keyspace+".unsyncedKeys_"+table;
+ String query = "select * from "+syncTable+" where key='"+localFullyQualifiedKey+"';";
+ PreparedQueryObject readQueryObject = new PreparedQueryObject();
+ readQueryObject.appendQueryString(query);
+ ResultSet results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(readQueryObject);
+ if (!results.all().isEmpty()) {
+ logger.info("In acquire lock: Since there was a forcible release, need to sync quorum!");
+ try {
+ syncQuorum(keyspace, table, primaryKeyValue);
+ } catch (Exception e) {
+ StringWriter sw = new StringWriter();
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), "[ERR506E] Failed to aquire lock ",
+ ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR, e);
+ String exceptionAsString = sw.toString();
+ return new ReturnType(ResultType.FAILURE, "Exception thrown while syncing key:\n" + exceptionAsString);
+ }
+ String cleanQuery = "delete from " + syncTable + " where key='"+localFullyQualifiedKey+"';";
+ PreparedQueryObject deleteQueryObject = new PreparedQueryObject();
+ deleteQueryObject.appendQueryString(cleanQuery);
+ MusicDataStoreHandle.getDSHandle().executePut(deleteQueryObject, "critical");
+ }
+
+ getLockingServiceHandle().updateLockAcquireTime(keyspace, table, primaryKeyValue, lockRef);
+
+ return new ReturnType(ResultType.SUCCESS, lockRef+" is the lock holder for the key");
+ }
+
+
+
+ /**
+ *
+ * @param tableQueryObject
+ * @param consistency
+ * @return Boolean Indicates success or failure
+ * @throws MusicServiceException
+ *
+ */
+ public ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject,
+ String consistency) throws MusicServiceException {
+ boolean result = false;
+
+ try {
+ // create shadow locking table
+ result = getLockingServiceHandle().createLockQueue(keyspace, table);
+ if (result == false) {
+ return ResultType.FAILURE;
+ }
+ result = false;
+
+ // create table to track unsynced_keys
+ table = "unsyncedKeys_" + table;
+
+ String tabQuery =
+ "CREATE TABLE IF NOT EXISTS " + keyspace + "." + table + " ( key text,PRIMARY KEY (key) );";
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+
+ queryObject.appendQueryString(tabQuery);
+ result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, "eventual");
+ if (result == false) {
+ return ResultType.FAILURE;
+ }
+ result = false;
+
+ // create actual table
+ result = MusicDataStoreHandle.getDSHandle().executePut(tableQueryObject, consistency);
+ } catch (MusicQueryException | MusicServiceException | MusicLockingException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.WARN,
+ ErrorTypes.MUSICSERVICEERROR);
+ throw new MusicServiceException(ex.getMessage());
+ }
+ return result ? ResultType.SUCCESS : ResultType.FAILURE;
+ }
+
+ private static void syncQuorum(String keyspace, String table, String primaryKeyValue) throws Exception {
+ logger.info(EELFLoggerDelegate.applicationLogger,"Performing sync operation---");
+ PreparedQueryObject selectQuery = new PreparedQueryObject();
+ PreparedQueryObject updateQuery = new PreparedQueryObject();
+
+ // get the primary key d
+ TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, table);
+ String primaryKeyName = tableInfo.getPrimaryKey().get(0).getName(); // we only support single
+ // primary key
+ DataType primaryKeyType = tableInfo.getPrimaryKey().get(0).getType();
+ Object cqlFormattedPrimaryKeyValue =
+ MusicUtil.convertToActualDataType(primaryKeyType, primaryKeyValue);
+
+ // get the row of data from a quorum
+ selectQuery.appendQueryString("SELECT * FROM " + keyspace + "." + table + " WHERE "
+ + primaryKeyName + "= ?" + ";");
+ selectQuery.addValue(cqlFormattedPrimaryKeyValue);
+ MusicUtil.writeBackToQuorum(selectQuery, primaryKeyName, updateQuery, keyspace, table,
+ cqlFormattedPrimaryKeyValue);
+ }
+
+ /**
+ *
+ * @param query
+ * @return ResultSet
+ */
+ public ResultSet quorumGet(PreparedQueryObject query) {
+ ResultSet results = null;
+ try {
+ results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(query);
+ } catch (MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR,
+ ErrorSeverity.MAJOR, ErrorTypes.GENERALSERVICEERROR, e);
+
+ }
+ return results;
+ }
+
+ public String whoseTurnIsIt(String fullyQualifiedKey) {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+ try {
+ LockObject lockOwner = getLockingServiceHandle().peekLockQueue(keyspace, table, primaryKeyValue);
+ if (!lockOwner.getIsLockOwner()) {
+ return null;
+ }
+ return "$" + fullyQualifiedKey + "$" + lockOwner.getLockRef();
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), AppMessages.LOCKINGERROR + fullyQualifiedKey,
+ ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
+ }
+ return null;
+ }
+
+ public List<String> getCurrentLockHolders(String fullyQualifiedKey) {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+ try {
+ return getLockingServiceHandle().getCurrentLockHolders(keyspace, table, primaryKeyValue);
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.LOCKINGERROR+fullyQualifiedKey ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
+ }
+ return null;
+ }
+
+ /**
+ *
+ * @param lockReference
+ * @return
+ */
+ public static String getLockNameFromId(String lockReference) {
+ StringTokenizer st = new StringTokenizer(lockReference);
+ return st.nextToken("$");
+ }
+
+ @Override
+ public void destroyLockRef(String lockId) throws MusicLockingException {
+ long start = System.currentTimeMillis();
+ String fullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
+ String lockRef = lockId.substring(lockId.lastIndexOf('$')+1);
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+ try {
+ getLockingServiceHandle().deQueueLockRef(keyspace, table, primaryKeyValue, lockRef,MusicUtil.getRetryCount());
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.DESTROYLOCK+lockRef,
+ ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR, e);
+ throw new MusicLockingException(e.getMessage());
+ }
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to destroy lock reference:" + (end - start) + " ms");
+ }
+
+ public MusicLockState destroyLockRef(String fullyQualifiedKey, String lockReference) throws MusicLockingException {
+ long start = System.currentTimeMillis();
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+ try {
+ getLockingServiceHandle().deQueueLockRef(keyspace, table, primaryKeyValue, lockReference,MusicUtil.getRetryCount());
+ } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.DESTROYLOCK + lockReference,
+ ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR,e);
+ throw new MusicLockingException(e.getMessage());
+ }
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to destroy lock reference:" + (end - start) + " ms");
+ return new MusicLockState(LockStatus.UNLOCKED, "");
+ }
+
+ @Override
+ public MusicLockState releaseLock(String lockId, boolean voluntaryRelease) throws MusicLockingException {
+ String fullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
+ String lockRef = lockId.substring(lockId.lastIndexOf('$')+1);
+ if (voluntaryRelease) {
+ return voluntaryReleaseLock(fullyQualifiedKey, lockRef);
+ } else {
+ return forciblyReleaseLock(fullyQualifiedKey, lockRef);
+ }
+ }
+
+ public MusicLockState voluntaryReleaseLock(String fullyQualifiedKey, String lockReference)
+ throws MusicLockingException {
+ MusicLockState result = null;
+ try {
+ result = destroyLockRef(fullyQualifiedKey, lockReference);
+ } catch (Exception ex) {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Exception in voluntaryReleaseLock() for " + fullyQualifiedKey + "ref: " + lockReference);
+ throw new MusicLockingException(ex.getMessage());
+ }
+ return result;
+ }
+
+ public MusicLockState forciblyReleaseLock(String fullyQualifiedKey, String lockReference) throws MusicLockingException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+
+ //leave a signal that this key could potentially be unsynchronized
+ String syncTable = keyspace+".unsyncedKeys_"+table;
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ String values = "(?)";
+ queryObject.addValue(fullyQualifiedKey);
+ String insQuery = "insert into "+syncTable+" (key) values "+values+";";
+ queryObject.appendQueryString(insQuery);
+ try {
+ MusicDataStoreHandle.getDSHandle().executePut(queryObject, "critical");
+ } catch (Exception e) {
+ logger.error("Cannot forcibly release lock: " + fullyQualifiedKey + " " + lockReference + ". "
+ + e.getMessage(), e);
+ }
+
+ //now release the lock
+ return destroyLockRef(fullyQualifiedKey, lockReference);
+ }
+
+ @Override
+ public List<String> releaseAllLocksForOwner(String ownerId, String keyspace, String table) throws MusicLockingException, MusicServiceException, MusicQueryException {
+// System.out.println("IN RELEASEALLLOCKSFOROWNER, ");
+
+ List<String> lockIds = getLockingServiceHandle().getAllLocksForOwner(ownerId, keyspace, table);
+ for (String lockId : lockIds) {
+// System.out.println(" LOCKID = " + lockId);
+ //return "$" + keyspace + "." + table + "." + lockName + "$" + String.valueOf(lockRef);
+ releaseLock("$" + keyspace + "." + table + "." + lockId, true);
+ }
+ return lockIds;
+ }
+
+ /**
+ *
+ * @param lockName
+ * @throws MusicLockingException
+ */
+ @Deprecated
+ public void deleteLock(String lockName) throws MusicLockingException {
+ throw new MusicLockingException("Depreciated Method Delete Lock");
+ }
+
+ // Prepared Query Additions.
+
+ /**
+ *
+ * @param queryObject
+ * @return ReturnType
+ * @throws MusicServiceException
+ */
+ public ReturnType eventualPut(PreparedQueryObject queryObject) {
+ boolean result = false;
+ try {
+ result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, MusicUtil.EVENTUAL);
+ } catch (MusicServiceException | MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), "[ERR512E] Failed to get Lock Handle " ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() + " " + ex.getCause() + " " + ex);
+ return new ReturnType(ResultType.FAILURE, ex.getMessage());
+ }
+ if (result) {
+ return new ReturnType(ResultType.SUCCESS, "Eventual Operation Successfully performed");
+ } else {
+ return new ReturnType(ResultType.FAILURE, "Eventual Operation failed to perform");
+ }
+ }
+
+ /**
+ *
+ * @param queryObject
+ * @return ReturnType
+ * @throws MusicServiceException
+ */
+ public ReturnType eventualPut_nb(PreparedQueryObject queryObject,String keyspace,String tablename,String primaryKey) {
+ boolean result = false;
+ long guard = 0;
+ PreparedQueryObject getGaurd = new PreparedQueryObject();
+ getGaurd.appendQueryString("SELECT guard FROM "+keyspace+".lockq_"+tablename+ " WHERE key = ? ;");
+ getGaurd.addValue(primaryKey);
+ try {
+ ResultSet getGaurdResult = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(getGaurd);
+ Row row = getGaurdResult.one();
+ if (row != null) {
+ guard = row.getLong("guard");
+ long timeOfWrite = System.currentTimeMillis();
+ long ts = MusicUtil.v2sTimeStampInMicroseconds(guard, timeOfWrite);
+ String query = queryObject.getQuery();
+ if (!queryObject.getQuery().contains("USING TIMESTAMP")) {
+ if (queryObject.getOperation().equalsIgnoreCase("delete"))
+ query = query.replaceFirst("WHERE", " USING TIMESTAMP " + ts + " WHERE ");
+ else
+ query = query.replaceFirst("SET", "USING TIMESTAMP " + ts + " SET");
+ }
+ queryObject.replaceQueryString(query);
+ }
+
+ } catch (MusicServiceException | MusicQueryException e) {
+ logger.error(EELFLoggerDelegate.applicationLogger,e.getMessage(), e);
+ }
+ try {
+ result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, MusicUtil.EVENTUAL);
+ } catch (MusicServiceException | MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(),"[ERR512E] Failed to get Lock Handle ",
+ ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() + " " + ex.getCause() + " ", ex);
+ return new ReturnType(ResultType.FAILURE, ex.getMessage());
+ }
+ if (result) {
+ return new ReturnType(ResultType.SUCCESS, "Eventual Operation Successfully performed");
+ } else {
+ return new ReturnType(ResultType.FAILURE, "Eventual Operation failed to perform");
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param table
+ * @param primaryKeyValue
+ * @param queryObject
+ * @param lockId
+ * @return
+ */
+ public ReturnType criticalPut(String keyspace, String table, String primaryKeyValue,
+ PreparedQueryObject queryObject, String lockId, Condition conditionInfo) {
+ long start = System.currentTimeMillis();
+ try {
+ String keyLock = lockId.substring(lockId.lastIndexOf(".") + 1,lockId.lastIndexOf("$"));
+ if (lockId.contains(".") && !keyLock.equals(primaryKeyValue)) {
+ return new ReturnType(ResultType.FAILURE,"Lock value '" + keyLock + "' and key value '"
+ + primaryKeyValue + "' not match. Please check your values: "
+ + lockId + " .");
+ }
+ LockObject lockObject = getLockingServiceHandle().getLockInfo(keyspace, table, primaryKeyValue,
+ lockId.substring(lockId.lastIndexOf("$") + 1));
+
+ if ( lockObject == null ) {
+ return new ReturnType(ResultType.FAILURE, lockId + " does not exist.");
+ } else if (!lockObject.getIsLockOwner()) {
+ return new ReturnType(ResultType.FAILURE, lockId + " is not the lock holder");
+ } else if (lockObject.getLocktype() != LockType.WRITE) {
+ return new ReturnType(ResultType.FAILURE,
+ "Attempting to do write operation, but " + lockId + " is a read lock");
+ }
+
+ if (conditionInfo != null) {
+ try {
+ if (conditionInfo.testCondition() == false)
+ return new ReturnType(ResultType.FAILURE, "Lock acquired but the condition is not true");
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e);
+ return new ReturnType(ResultType.FAILURE,
+ "Exception thrown while checking the condition, check its sanctity:\n" + e.getMessage());
+ }
+ }
+ String query = queryObject.getQuery();
+ long timeOfWrite = System.currentTimeMillis();
+ long lockOrdinal = Long.parseLong(lockId.substring(lockId.lastIndexOf("$") + 1));
+ long ts = MusicUtil.v2sTimeStampInMicroseconds(lockOrdinal, timeOfWrite);
+ // TODO: use Statement instead of modifying query
+ if (!queryObject.getQuery().contains("USING TIMESTAMP")) {
+ if (queryObject.getOperation().equalsIgnoreCase("delete"))
+ query = query.replaceFirst("WHERE", " USING TIMESTAMP " + ts + " WHERE ");
+ else if (queryObject.getOperation().equalsIgnoreCase("insert"))
+ query = query.replaceFirst(";", " USING TIMESTAMP " + ts + " ; ");
+ else
+ query = query.replaceFirst("SET", "USING TIMESTAMP " + ts + " SET");
+ }
+ queryObject.replaceQueryString(query);
+ MusicDataStore dsHandle = MusicDataStoreHandle.getDSHandle();
+ dsHandle.executePut(queryObject, MusicUtil.CRITICAL);
+ long end = System.currentTimeMillis();
+ logger.info(EELFLoggerDelegate.applicationLogger,"Time taken for the critical put:" + (end - start) + " ms");
+ } catch (MusicQueryException | MusicServiceException | MusicLockingException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), e);
+ return new ReturnType(ResultType.FAILURE,
+ "Exception thrown while doing the critical put: "
+ + e.getMessage());
+ }
+ return new ReturnType(ResultType.SUCCESS, "Update performed");
+ }
+
+
+ /**
+ *
+ * @param queryObject
+ * @param consistency
+ * @return Boolean Indicates success or failure
+ * @throws MusicServiceException
+ *
+ *
+ */
+ public ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency) throws MusicServiceException,MusicQueryException {
+ // this is mainly for some functions like keyspace creation etc which does not
+ // really need the bells and whistles of Music locking.
+ boolean result = false;
+// try {
+ result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, consistency);
+// } catch (MusicQueryException | MusicServiceException ex) {
+ // logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.UNKNOWNERROR,
+ // ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+// throw new MusicServiceException(ex.getMessage(),ex);
+// }
+ return result ? ResultType.SUCCESS : ResultType.FAILURE;
+ }
+
+ /**
+ * This method performs DDL operation on cassandra.
+ *
+ * @param queryObject query object containing prepared query and values
+ * @return ResultSet
+ * @throws MusicServiceException
+ */
+ public ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException {
+ ResultSet results = null;
+ try {
+ results = MusicDataStoreHandle.getDSHandle().executeOneConsistencyGet(queryObject);
+ } catch (MusicQueryException | MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), e);
+ throw new MusicServiceException(e.getMessage());
+ }
+ return results;
+ }
+
+ /**
+ * This method performs DDL operations on cassandra, if the the resource is available. Lock ID
+ * is used to check if the resource is free.
+ *
+ * @param keyspace name of the keyspace
+ * @param table name of the table
+ * @param primaryKeyValue primary key value
+ * @param queryObject query object containing prepared query and values
+ * @param lockId lock ID to check if the resource is free to perform the operation.
+ * @return ResultSet
+ */
+ public ResultSet criticalGet(String keyspace, String table, String primaryKeyValue,
+ PreparedQueryObject queryObject, String lockId) throws MusicServiceException {
+ ResultSet results = null;
+ String keyLock = lockId.substring(lockId.lastIndexOf(".") + 1,lockId.lastIndexOf("$"));
+ try {
+ if (lockId.contains(".") && !keyLock.equals(primaryKeyValue)) {
+ throw new MusicLockingException("Lock value '" + keyLock + "' and key value '"
+ + primaryKeyValue + "' do not match. Please check your values: "
+ + lockId + " .");
+ }
+ LockObject lockObject = getLockingServiceHandle().getLockInfo(keyspace, table, primaryKeyValue,
+ lockId.substring(lockId.lastIndexOf("$") + 1));
+ if (null == lockObject) {
+ throw new MusicLockingException("No Lock Object. Please check if lock name or key is correct."
+ + lockId + " .");
+ }
+ if ( !lockObject.getIsLockOwner()) {
+ return null;// not top of the lock store q
+ }
+ results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(queryObject);
+ } catch ( MusicLockingException e ) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR);
+ throw new MusicServiceException(
+ "Cannot perform critical get for key: " + primaryKeyValue + " : " + e.getMessage());
+ } catch (MusicQueryException | MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, e);
+ throw new MusicServiceException(
+ "Cannot perform critical get for key: " + primaryKeyValue + " : " + e.getMessage());
+ }
+ return results;
+ }
+
+ /**
+ * This method performs DML operation on cassandra, when the lock of the dd is acquired.
+ *
+ * @param keyspaceName name of the keyspace
+ * @param tableName name of the table
+ * @param primaryKey primary key value
+ * @param queryObject query object containing prepared query and values
+ * @return ReturnType
+ * @throws MusicLockingException
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ */
+ public ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+ long start = System.currentTimeMillis();
+ String fullyQualifiedKey = keyspaceName + "." + tableName + "." + primaryKey;
+ String lockId = createLockReferenceAtomic(fullyQualifiedKey, LockType.WRITE);
+ long lockCreationTime = System.currentTimeMillis();
+ ReturnType lockAcqResult = null;
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "***Acquiring lock for atomicPut() query : " + queryObject.getQuery() + " : " + primaryKey);
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "***Acquiring lock for atomicPut() values: " + queryObject.getValues().toString());
+ if (conditionInfo != null) {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "***Acquiring lock for atomicPut() conditions: " + conditionInfo.toString());
+ }
+ try {
+ lockAcqResult = acquireLockWithLease(fullyQualifiedKey, lockId, MusicUtil.getDefaultLockLeasePeriod());
+ } catch (MusicLockingException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Exception while acquireLockWithLease() in atomic put for key: " + primaryKey);
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage());
+ throw new MusicServiceException(
+ "Cannot perform atomic put for key: " + primaryKey + " : " + ex.getMessage());
+ }
+ long lockAcqTime = System.currentTimeMillis();
+
+ /*
+ * if (!lockAcqResult.getResult().equals(ResultType.SUCCESS)) { logger.info(EELFLoggerDelegate.
+ * applicationLogger,"unable to acquire lock, id " + lockId);
+ * voluntaryReleaseLock(fullyQualifiedKey,lockId); return lockAcqResult; }
+ */
+
+ logger.info(EELFLoggerDelegate.applicationLogger, "acquired lock with id " + lockId);
+ String lockRef = lockId.substring(lockId.lastIndexOf("$"));
+ ReturnType criticalPutResult = null;
+ if (lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
+ criticalPutResult = criticalPut(keyspaceName, tableName, primaryKey, queryObject, lockRef, conditionInfo);
+ long criticalPutTime = System.currentTimeMillis();
+ long lockDeleteTime = System.currentTimeMillis();
+ String timingInfo = "|lock creation time:" + (lockCreationTime - start) + "|lock accquire time:"
+ + (lockAcqTime - lockCreationTime) + "|critical put time:" + (criticalPutTime - lockAcqTime)
+ + "|lock delete time:" + (lockDeleteTime - criticalPutTime) + "|";
+ criticalPutResult.setTimingInfo(timingInfo);
+ } else {
+ logger.info(EELFLoggerDelegate.applicationLogger, "unable to acquire lock, id " + lockId);
+ criticalPutResult = lockAcqResult;
+ }
+ try {
+ voluntaryReleaseLock(fullyQualifiedKey, lockId);
+ } catch (MusicLockingException ex) {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Exception occured while deleting lock after atomic put for key: " + primaryKey);
+ criticalPutResult.setMessage(criticalPutResult.getMessage() + "Lock release failed");
+ }
+ return criticalPutResult;
+ }
+
+
+
+ /**
+ * This method performs DDL operation on cassasndra, when the lock for the resource is acquired.
+ *
+ * @param keyspaceName name of the keyspace
+ * @param tableName name of the table
+ * @param primaryKey primary key value
+ * @param queryObject query object containing prepared query and values
+ * @return ResultSet
+ * @throws MusicServiceException
+ * @throws MusicLockingException
+ * @throws MusicQueryException
+ */
+ public ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException {
+ String fullyQualifiedKey = keyspaceName + "." + tableName + "." + primaryKey;
+ String lockId = createLockReferenceAtomic(fullyQualifiedKey, LockType.READ);
+ ReturnType lockAcqResult = null;
+ ResultSet result = null;
+ logger.info(EELFLoggerDelegate.applicationLogger, "Acquiring lock for atomicGet() : " + queryObject.getQuery());
+ try {
+ lockAcqResult = acquireLockWithLease(fullyQualifiedKey, lockId, MusicUtil.getDefaultLockLeasePeriod());
+ } catch (MusicLockingException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Exception while acquireLockWithLease() in atomic get for key: " + primaryKey);
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage());
+ throw new MusicServiceException(
+ "Cannot perform atomic get for key: " + primaryKey + " : " + ex.getMessage());
+ }
+ if (lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "acquired lock with id " + lockId);
+ String lockRef = lockId.substring(lockId.lastIndexOf("$"));
+ result = criticalGet(keyspaceName, tableName, primaryKey, queryObject, lockRef);
+ } else {
+ logger.info(EELFLoggerDelegate.applicationLogger, "unable to acquire lock, id " + lockId);
+ }
+ try {
+ voluntaryReleaseLock(fullyQualifiedKey, lockId);
+ } catch (MusicLockingException ex) {
+ logger.info(EELFLoggerDelegate.applicationLogger,
+ "Exception occured while deleting lock after atomic put for key: " + primaryKey);
+ throw new MusicLockingException(ex.getMessage());
+ }
+
+ return result;
+ }
+
+
+
+ /**
+ * @param lockName
+ * @return
+ */
+ public Map<String, Object> validateLock(String lockName) {
+ return MusicUtil.validateLock(lockName);
+ }
+
+ @Override
+ @Deprecated
+ public ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException {
+ return null;
+ }
+
+ @Override
+ public List<String> getLockQueue(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+
+ return getLockingServiceHandle().getLockQueue(keyspace, table, primaryKeyValue);
+ }
+ @Override
+ public long getLockQueueSize(String fullyQualifiedKey)
+ throws MusicServiceException, MusicQueryException, MusicLockingException {
+ String[] splitString = fullyQualifiedKey.split("\\.");
+ String keyspace = splitString[0];
+ String table = splitString[1];
+ String primaryKeyValue = splitString[2];
+
+ return getLockingServiceHandle().getLockQueueSize(keyspace, table, primaryKeyValue);
+ }
+
+ @Override
+ @Deprecated
+ public ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
+ PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException {
+ //deprecated
+ return null;
+ }
+
+ //Methods added for ORM changes
+
+ public ResultType createKeyspace(JsonKeySpace jsonKeySpaceObject,String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ ResultType result = nonKeyRelatedPut(jsonKeySpaceObject.genCreateKeyspaceQuery(), consistencyInfo);
+ logger.info(EELFLoggerDelegate.applicationLogger, " Keyspace Creation Process completed successfully");
+
+ return result;
+ }
+
+ public ResultType dropKeyspace(JsonKeySpace jsonKeySpaceObject, String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ ResultType result = nonKeyRelatedPut(jsonKeySpaceObject.genDropKeyspaceQuery(),
+ consistencyInfo);
+ logger.info(EELFLoggerDelegate.applicationLogger, " Keyspace deletion Process completed successfully");
+ return result;
+ }
+
+ public ResultType createTable(JsonTable jsonTableObject, String consistencyInfo)
+ throws MusicServiceException, MusicQueryException {
+ ResultType result = null;
+ try {
+ result = createTable(jsonTableObject.getKeyspaceName(),
+ jsonTableObject.getTableName(), jsonTableObject.genCreateTableQuery(), consistencyInfo);
+
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.WARN,
+ ErrorTypes.MUSICSERVICEERROR);
+ throw new MusicServiceException(ex.getMessage());
+ }
+ logger.info(EELFLoggerDelegate.applicationLogger, " Table Creation Process completed successfully ");
+ return result;
+ }
+
+ public ResultType dropTable(JsonTable jsonTableObject,String consistencyInfo)
+ throws MusicServiceException,MusicQueryException {
+ ResultType result = nonKeyRelatedPut(jsonTableObject.genDropTableQuery(),
+ consistencyInfo);
+ logger.info(EELFLoggerDelegate.applicationLogger, " Table deletion Process completed successfully ");
+
+ return result;
+ }
+
+ @Override
+ public ResultType createIndex(JsonIndex jsonIndexObject, String consistencyInfo)
+ throws MusicServiceException, MusicQueryException{
+ ResultType result = nonKeyRelatedPut(jsonIndexObject.genCreateIndexQuery(),
+ consistencyInfo);
+
+ logger.info(EELFLoggerDelegate.applicationLogger, " Index creation Process completed successfully ");
+ return result;
+ }
+
+ /**
+ * This method performs DDL operation on cassandra.
+ *
+ * @param queryObject query object containing prepared query and values
+ * @return ResultSet
+ * @throws MusicServiceException
+ */
+ public ResultSet select(JsonSelect jsonSelect, MultivaluedMap<String, String> rowParams)
+ throws MusicServiceException, MusicQueryException {
+ ResultSet results = null;
+ try {
+ results = get(jsonSelect.genSelectQuery(rowParams));
+ } catch (MusicServiceException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage());
+ throw new MusicServiceException(e.getMessage());
+ }
+ return results;
+ }
+
+ /**
+ * Select Critical
+ */
+ public ResultSet selectCritical(JsonInsert jsonInsertObj, MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+
+ ResultSet results = null;
+ String consistency = "";
+ if(null != jsonInsertObj && null != jsonInsertObj.getConsistencyInfo()) {
+ consistency = jsonInsertObj.getConsistencyInfo().get("type");
+ }
+
+ String lockId = jsonInsertObj.getConsistencyInfo().get("lockId");
+
+ PreparedQueryObject queryObject = jsonInsertObj.genSelectCriticalPreparedQueryObj(rowParams);
+
+ if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ results = criticalGet(jsonInsertObj.getKeyspaceName(), jsonInsertObj.getTableName(),
+ jsonInsertObj.getPrimaryKeyVal(), queryObject,lockId);
+ } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
+ results = atomicGet(jsonInsertObj.getKeyspaceName(), jsonInsertObj.getTableName(),
+ jsonInsertObj.getPrimaryKeyVal(), queryObject);
+ }
+
+ return results;
+ }
+
+ /**
+ * this is insert row into Table
+ */
+ public ReturnType insertIntoTable(JsonInsert jsonInsertObj)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+
+ String consistency = "";
+ if(null != jsonInsertObj && null != jsonInsertObj.getConsistencyInfo()) {
+ consistency = jsonInsertObj.getConsistencyInfo().get("type");
+ }
+
+ ReturnType result = null;
+
+ try {
+
+ PreparedQueryObject queryObj = null;
+ queryObj = jsonInsertObj.genInsertPreparedQueryObj();
+
+ if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL)) {
+ result = eventualPut(jsonInsertObj.genInsertPreparedQueryObj());
+ } else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = jsonInsertObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+ return new ReturnType(ResultType.FAILURE, "LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL");
+ }
+ result = criticalPut(jsonInsertObj.getKeyspaceName(),
+ jsonInsertObj.getTableName(), jsonInsertObj.getPrimaryKeyVal(), jsonInsertObj.genInsertPreparedQueryObj(), lockId,null);
+ } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
+ result = atomicPut(jsonInsertObj.getKeyspaceName(), jsonInsertObj.getTableName(),
+ jsonInsertObj.getPrimaryKeyVal(), jsonInsertObj.genInsertPreparedQueryObj(), null);
+ }
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return new ReturnType(ResultType.FAILURE, ex.getMessage());
+ }
+
+ return result;
+ }
+
+ /**
+ * This is insert row into Table
+ */
+ public ReturnType updateTable(JsonUpdate jsonUpdateObj, MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+
+ ReturnType result = null;
+ String consistency = "";
+ if(null != jsonUpdateObj && null != jsonUpdateObj.getConsistencyInfo()) {
+ consistency = jsonUpdateObj.getConsistencyInfo().get("type");
+ }
+ PreparedQueryObject queryObject = jsonUpdateObj.genUpdatePreparedQueryObj(rowParams);
+
+ Condition conditionInfo;
+ if (jsonUpdateObj.getConditions() == null) {
+ conditionInfo = null;
+ } else {
+ // to avoid parsing repeatedly, just send the select query to obtain row
+ PreparedQueryObject selectQuery = new PreparedQueryObject();
+ selectQuery.appendQueryString("SELECT * FROM " + jsonUpdateObj.getKeyspaceName() + "." + jsonUpdateObj.getTableName() + " WHERE "
+ + jsonUpdateObj.getRowIdString() + ";");
+ selectQuery.addValue(jsonUpdateObj.getPrimarKeyValue());
+ conditionInfo = new Condition(jsonUpdateObj.getConditions(), selectQuery);
+ }
+
+
+ if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL)) {
+ result = eventualPut(queryObject);
+ } else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = jsonUpdateObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+
+ return new ReturnType(ResultType.FAILURE, "LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL");
+ }
+ result = criticalPut(jsonUpdateObj.getKeyspaceName(), jsonUpdateObj.getTableName(), jsonUpdateObj.getPrimarKeyValue(),
+ queryObject, lockId, conditionInfo);
+ } else if (consistency.equalsIgnoreCase("atomic_delete_lock")) {
+ // this function is mainly for the benchmarks
+ try {
+ result = atomicPutWithDeleteLock(jsonUpdateObj.getKeyspaceName(), jsonUpdateObj.getTableName(),
+ jsonUpdateObj.getPrimarKeyValue(), queryObject, conditionInfo);
+ } catch (MusicLockingException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN,
+ ErrorTypes.GENERALSERVICEERROR, e);
+ throw new MusicLockingException(AppMessages.UNKNOWNERROR.toString());
+
+ }
+ } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
+ try {
+ result = atomicPut(jsonUpdateObj.getKeyspaceName(), jsonUpdateObj.getTableName(), jsonUpdateObj.getPrimarKeyValue(),
+ queryObject, conditionInfo);
+ } catch (MusicLockingException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR, e);
+ throw new MusicLockingException(AppMessages.UNKNOWNERROR.toString());
+ }
+ } else if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL_NB)) {
+ try {
+ result = eventualPut_nb(queryObject, jsonUpdateObj.getKeyspaceName(),
+ jsonUpdateObj.getTableName(), jsonUpdateObj.getPrimarKeyValue());
+ }catch (Exception e) {
+ return new ReturnType(ResultType.FAILURE, e.getMessage());
+ }
+
+ }
+
+ return result;
+ }
+
+ /**
+ * This method is for Delete From Table
+ */
+ public ReturnType deleteFromTable(JsonDelete jsonDeleteObj, MultivaluedMap<String, String> rowParams)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
+
+ ReturnType result = null;
+ String consistency = "";
+ if(null != jsonDeleteObj && null != jsonDeleteObj.getConsistencyInfo()) {
+ consistency = jsonDeleteObj.getConsistencyInfo().get("type");
+ }
+ PreparedQueryObject queryObject = jsonDeleteObj.genDeletePreparedQueryObj(rowParams);
+
+ // get the conditional, if any
+ Condition conditionInfo;
+ if (jsonDeleteObj.getConditions() == null) {
+ conditionInfo = null;
+ } else {
+ // to avoid parsing repeatedly, just send the select query to obtain row
+ PreparedQueryObject selectQuery = new PreparedQueryObject();
+ selectQuery.appendQueryString("SELECT * FROM " + jsonDeleteObj.getKeyspaceName() + "." + jsonDeleteObj.getTableName() + " WHERE "
+ + jsonDeleteObj.getRowIdString() + ";");
+ selectQuery.addValue(jsonDeleteObj.getPrimarKeyValue());
+ conditionInfo = new Condition(jsonDeleteObj.getConditions(), selectQuery);
+ }
+
+ if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL))
+ result = eventualPut(queryObject);
+ else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = jsonDeleteObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+
+ return new ReturnType(ResultType.FAILURE, "LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL");
+ }
+ result = criticalPut(jsonDeleteObj.getKeyspaceName(),
+ jsonDeleteObj.getTableName(), jsonDeleteObj.getPrimarKeyValue(),
+ queryObject, lockId, conditionInfo);
+ } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
+ result = atomicPut(jsonDeleteObj.getKeyspaceName(),
+ jsonDeleteObj.getTableName(), jsonDeleteObj.getPrimarKeyValue(),
+ queryObject, conditionInfo);
+ } else if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL_NB)) {
+ result = eventualPut_nb(queryObject, jsonDeleteObj.getKeyspaceName(),
+ jsonDeleteObj.getTableName(), jsonDeleteObj.getPrimarKeyValue());
+ }
+
+ return result;
+ }
+
+
+}
diff --git a/src/main/resources/LICENSE.txt b/music-core/src/main/resources/LICENSE.txt
index cc6cdea5..cc6cdea5 100644
--- a/src/main/resources/LICENSE.txt
+++ b/music-core/src/main/resources/LICENSE.txt
diff --git a/src/main/resources/Resources.properties b/music-core/src/main/resources/Resources.properties
index 72269cb8..72269cb8 100644
--- a/src/main/resources/Resources.properties
+++ b/music-core/src/main/resources/Resources.properties
diff --git a/music-core/src/main/resources/logback.xml b/music-core/src/main/resources/logback.xml
new file mode 100644
index 00000000..69d59ca3
--- /dev/null
+++ b/music-core/src/main/resources/logback.xml
@@ -0,0 +1,273 @@
+<!--
+ ============LICENSE_START==========================================
+ org.onap.music
+ ===================================================================
+ Copyright (c) 2017 AT&T Intellectual Property
+ ===================================================================
+ 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=============================================
+ ====================================================================
+-->
+<configuration scan="true" scanPeriod="3 seconds">
+ <!--<jmxConfigurator /> -->
+ <!-- directory path for all other type logs -->
+ <property name="logDir" value="/opt/app/music/logs" />
+
+ <!-- directory path for debugging type logs -->
+ <property name="debugDir" value="debug-logs" />
+
+ <!-- specify the component name -->
+ <!-- <property name="componentName" value="EELF"></property> -->
+ <property name="componentName" value="MUSIC"></property>
+
+ <!-- log file names -->
+ <property name="generalLogName" value="music" />
+ <property name="securityLogName" value="security" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+ <property name="defaultPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
+ <!-- <property name="applicationLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n" /> -->
+ <property name="applicationLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %X{keyspace} [transactionId:%X{transactionId}] - %msg%n" />
+ <property name="auditLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+ <property name="metricsLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+ <!-- <property name="errorLoggerPattern" value= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n " /> -->
+ <property name="errorLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %X{keyspace} - %msg%n" />
+ <property name="debugLoggerPattern" value="%date{ISO8601,UTC}|%X{RequestId}| %msg%n" ></property>
+ <property name="logDirectory" value="${logDir}/${componentName}" />
+ <property name="debugLogDirectory" value="${debugDir}/${componentName}" />
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder> -->
+ <layout class="">
+ <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
+ </layout>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+ <!-- <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip</fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>100MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender> -->
+
+ <!-- <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+ daily rollover
+ <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
+ <maxFileSize>1GB</maxFileSize>
+ <maxHistory>5</maxHistory>
+ <totalSizeCap>5GB</totalSizeCap>
+ </rollingPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender> -->
+
+
+ <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
+ <maxFileSize>1GB</maxFileSize>
+ <maxHistory>5</maxHistory>
+ <totalSizeCap>5GB</totalSizeCap>
+ </rollingPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <appender name="EELFSecurity" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip</fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+
+
+
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine
+ related logging events. The audit logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip</fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${auditLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+ <appender name="EELFMetrics" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - %msg%n"</pattern> -->
+ <pattern>${metricsLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender>
+
+ <appender name="EELFError" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip</fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${errorLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <appender name="EELFDebug" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip</fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="info" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+
+ <logger name="com.att.eelf.security" level="info" additivity="false">
+ <appender-ref ref="asyncEELFSecurity" />
+ </logger>
+
+
+ <logger name="com.att.eelf.audit" level="info" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="info" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+
+ <logger name="com.att.eelf.error" level="error" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+
+ </logger>
+
+ <root level="INFO">
+ <appender-ref ref="asyncEELF" />
+ <appender-ref ref="STDOUT" />
+ </root>
+
+ <!-- Conductor Specific additions to squash WARNING and INFO -->
+ <logger name="com.datastax.driver.core.Cluster" level="ERROR"/>
+ <logger name="org.onap.music.main.MusicCore" level="ERROR"/>
+
+</configuration>
diff --git a/music-core/src/main/resources/project.properties b/music-core/src/main/resources/project.properties
new file mode 100644
index 00000000..69b99adc
--- /dev/null
+++ b/music-core/src/main/resources/project.properties
@@ -0,0 +1,5 @@
+version=${project.version}
+artifactId=${project.artifactId}
+build=${project.version}-${timestamp}
+music.properties=/opt/app/music/etc/music.properties
+
diff --git a/music-core/src/main/webapp/WEB-INF/.gitignore b/music-core/src/main/webapp/WEB-INF/.gitignore
new file mode 100644
index 00000000..840e7d31
--- /dev/null
+++ b/music-core/src/main/webapp/WEB-INF/.gitignore
@@ -0,0 +1 @@
+/classes/
diff --git a/src/test/java/LICENSE.txt b/music-core/src/test/java/LICENSE.txt
index cc6cdea5..cc6cdea5 100644
--- a/src/test/java/LICENSE.txt
+++ b/music-core/src/test/java/LICENSE.txt
diff --git a/src/test/java/org/onap/music/unittests/MusicUtilTest.java b/music-core/src/test/java/org/onap/music/cassandra/MusicUtilTest.java
index 04149fc6..b7245d78 100644
--- a/src/test/java/org/onap/music/unittests/MusicUtilTest.java
+++ b/music-core/src/test/java/org/onap/music/cassandra/MusicUtilTest.java
@@ -21,26 +21,32 @@
* ====================================================================
*/
-package org.onap.music.unittests;
+package org.onap.music.cassandra;
import static org.junit.Assert.*;
import java.math.BigInteger;
+import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import org.apache.cassandra.exceptions.PreparedQueryNotFoundException;
+
import org.junit.Test;
-import org.onap.music.authentication.CachingUtil;
import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.exceptions.MusicServiceException;
import org.onap.music.main.MusicUtil;
+//import org.onap.music.main.CorePropertiesLoader;
+import org.onap.music.service.MusicCoreService;
+
+import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.DataType;
-import javassist.CodeConverter.ArrayAccessReplacementMethodNames;
public class MusicUtilTest {
+ private static final String XLATESTVERSION = "X-latestVersion";
+ private static final String XMINORVERSION = "X-minorVersion";
+ private static final String XPATCHVERSION = "X-patchVersion";
+
@Test
public void testGetCassName() {
MusicUtil.setCassName("Cassandra");
@@ -54,52 +60,28 @@ public class MusicUtilTest {
}
@Test
- public void testGetAafEndpointUrl() {
- MusicUtil.setAafEndpointUrl("url");
- assertEquals(MusicUtil.getAafEndpointUrl(),"url");
- }
-
- @Test
- public void testGetMyId() {
- MusicUtil.setMyId(1);
- assertEquals(MusicUtil.getMyId(),1);
+ public void testMusicAafNs() {
+ MusicUtil.setMusicAafNs("ns");
+ assertTrue("ns".equals(MusicUtil.getMusicAafNs()));
}
@Test
- public void testGetAllIds() {
- List<String> ids = new ArrayList<String>();
- ids.add("1");
- ids.add("2");
- ids.add("3");
- MusicUtil.setAllIds(ids);
- assertEquals(MusicUtil.getAllIds().get(0),"1");
- }
-
-// @Test
-// public void testGetPublicIp() {
-// MusicUtil.setPublicIp("10.0.0.1");
-// assertEquals(MusicUtil.getPublicIp(),"10.0.0.1");
-// }
-
- @Test
- public void testGetAllPublicIps() {
- List<String> ips = new ArrayList<String>();
- ips.add("10.0.0.1");
- ips.add("10.0.0.2");
- ips.add("10.0.0.3");
- MusicUtil.setAllPublicIps(ips);
- assertEquals(MusicUtil.getAllPublicIps().get(1),"10.0.0.2");
- }
+ public void testMusicCoreService() {
+ MusicUtil.setLockUsing(MusicUtil.CASSANDRA);
+ MusicCoreService mc = null;
+ mc = MusicUtil.getMusicCoreService();
+ assertTrue(mc != null);
+ MusicUtil.setLockUsing("nothing");
+ mc = null;
+ mc = MusicUtil.getMusicCoreService();
+ assertTrue(mc != null);
- @Test
- public void testGetPropkeys() {
- assertEquals(MusicUtil.getPropkeys()[2],"debug");
}
@Test
- public void testGetMusicRestIp() {
- MusicUtil.setMusicRestIp("localhost");
- assertEquals(MusicUtil.getMusicRestIp(),"localhost");
+ public void testCipherEncKey() {
+ MusicUtil.setCipherEncKey("cipherEncKey");
+ assertTrue("cipherEncKey".equals(MusicUtil.getCipherEncKey()));
}
@Test
@@ -126,28 +108,53 @@ public class MusicUtilTest {
assertEquals(MusicUtil.getVersion(),"1.0.0");
}
- /*@Test
- public void testGetMyZkHost() {
- MusicUtil.setMyZkHost("10.0.0.2");
- assertEquals(MusicUtil.getMyZkHost(),"10.0.0.2");
- }*/
+ @Test
+ public void testBuildVersionA() {
+ assertEquals(MusicUtil.buildVersion("1","2","3"),"1.2.3");
+ }
+
+ @Test
+ public void testBuildVersionB() {
+ assertEquals(MusicUtil.buildVersion("1",null,"3"),"1");
+ }
+
+ @Test
+ public void testBuildVersionC() {
+ assertEquals(MusicUtil.buildVersion("1","2",null),"1.2");
+ }
+ /*
@Test
- public void testGetMyCassaHost() {
- MusicUtil.setMyCassaHost("10.0.0.2");
- assertEquals(MusicUtil.getMyCassaHost(),"10.0.0.2");
+ public void testBuileVersionResponse() {
+ assertTrue(MusicUtil.buildVersionResponse("1","2","3").getClass().getSimpleName().equals("Builder"));
+ assertTrue(MusicUtil.buildVersionResponse("1",null,"3").getClass().getSimpleName().equals("Builder"));
+ assertTrue(MusicUtil.buildVersionResponse("1","2",null).getClass().getSimpleName().equals("Builder"));
+ assertTrue(MusicUtil.buildVersionResponse(null,null,null).getClass().getSimpleName().equals("Builder"));
+ }
+ */
+ @Test
+ public void testGetConsistency() {
+ assertTrue(ConsistencyLevel.ONE.equals(MusicUtil.getConsistencyLevel("one")));
}
@Test
- public void testGetDefaultMusicIp() {
- MusicUtil.setDefaultMusicIp("10.0.0.2");
- assertEquals(MusicUtil.getDefaultMusicIp(),"10.0.0.2");
+ public void testRetryCount() {
+ MusicUtil.setRetryCount(1);
+ assertEquals(MusicUtil.getRetryCount(),1);
+ }
+
+ @Test
+ public void testIsCadi() {
+ MusicUtil.setIsCadi(true);
+ assertEquals(MusicUtil.getIsCadi(),true);
}
-// @Test
-// public void testGetTestType() {
-// fail("Not yet implemented"); // TODO
-// }
+
+ @Test
+ public void testGetMyCassaHost() {
+ MusicUtil.setMyCassaHost("10.0.0.2");
+ assertEquals(MusicUtil.getMyCassaHost(),"10.0.0.2");
+ }
@Test
public void testIsValidQueryObject() {
@@ -167,7 +174,17 @@ public class MusicUtilTest {
System.out.println("#######" + myQueryObject.getQuery().isEmpty());
assertFalse(MusicUtil.isValidQueryObject(false,myQueryObject));
-
+
+ }
+
+
+
+
+ @Test(expected = IllegalStateException.class)
+ public void testMusicUtil() {
+ System.out.println("MusicUtil Constructor Test");
+ MusicUtil mu = new MusicUtil();
+ System.out.println(mu.toString());
}
@Test
@@ -190,9 +207,20 @@ public class MusicUtilTest {
assertEquals(MusicUtil.convertToActualDataType(DataType.cfloat(),"123.01"),Float.parseFloat("123.01"));
assertEquals(MusicUtil.convertToActualDataType(DataType.cdouble(),"123.02"),Double.parseDouble("123.02"));
assertEquals(MusicUtil.convertToActualDataType(DataType.cboolean(),"true"),Boolean.parseBoolean("true"));
+ List<String> myList = new ArrayList<String>();
+ List<String> newList = myList;
+ myList.add("TOM");
+ assertEquals(MusicUtil.convertToActualDataType(DataType.list(DataType.varchar()),myList),newList);
Map<String,Object> myMap = new HashMap<String,Object>();
myMap.put("name","tom");
- assertEquals(MusicUtil.convertToActualDataType(DataType.map(DataType.varchar(),DataType.varchar()),myMap),myMap);
+ Map<String,Object> newMap = myMap;
+ assertEquals(MusicUtil.convertToActualDataType(DataType.map(DataType.varchar(),DataType.varchar()),myMap),newMap);
+ }
+
+ @Test
+ public void testConvertToActualDataTypeByte() throws Exception {
+ byte[] testByte = "TOM".getBytes();
+ assertEquals(MusicUtil.convertToActualDataType(DataType.blob(),testByte),ByteBuffer.wrap(testByte));
}
@@ -205,7 +233,7 @@ public class MusicUtilTest {
assertTrue(result.contains("name"));
assertTrue(result.contains("value"));
}
-
+
@Test
public void test_generateUUID() {
//this function shouldn't be in cachingUtil
@@ -222,4 +250,96 @@ public class MusicUtilTest {
assertFalse(MusicUtil.isValidConsistency("TEST"));
}
+ @Test
+ public void testLockUsing() {
+ MusicUtil.setLockUsing("testlock");
+ assertEquals("testlock", MusicUtil.getLockUsing());
+ }
+
+ @Test
+ public void testCassaPort() {
+ MusicUtil.setCassandraPort(1234);
+ assertEquals(1234, MusicUtil.getCassandraPort());
+ }
+
+ @Test
+ public void testBuild() {
+ MusicUtil.setBuild("testbuild");
+ assertEquals("testbuild", MusicUtil.getBuild());
+ }
+
+ @Test
+ public void testTransId() {
+ MusicUtil.setTransIdPrefix("prefix");
+ assertEquals("prefix-", MusicUtil.getTransIdPrefix());
+ }
+
+
+ @Test
+ public void testConversationIdPrefix() {
+ MusicUtil.setConversationIdPrefix("prefix-");
+ assertEquals("prefix-", MusicUtil.getConversationIdPrefix());
+ }
+
+ @Test
+ public void testClientIdPrefix() {
+ MusicUtil.setClientIdPrefix("clientIdPrefix");
+ assertEquals("clientIdPrefix-", MusicUtil.getClientIdPrefix());
+ }
+
+ @Test
+ public void testMessageIdPrefix() {
+ MusicUtil.setMessageIdPrefix("clientIdPrefix");
+ assertEquals("clientIdPrefix-", MusicUtil.getMessageIdPrefix());
+ }
+
+ @Test
+ public void testTransIdPrefix() {
+ MusicUtil.setTransIdPrefix("transIdPrefix");
+ assertEquals("transIdPrefix-", MusicUtil.getTransIdPrefix());
+ }
+
+ @Test
+ public void testConvIdReq() {
+ MusicUtil.setConversationIdRequired(true);
+ assertEquals(true, MusicUtil.getConversationIdRequired());
+ }
+
+ @Test
+ public void testClientIdRequired() {
+ MusicUtil.setClientIdRequired(true);
+ assertEquals(true, MusicUtil.getClientIdRequired());
+ }
+
+ @Test
+ public void testMessageIdRequired() {
+ MusicUtil.setMessageIdRequired(true);
+ assertEquals(true, MusicUtil.getMessageIdRequired());
+ }
+
+ @Test
+ public void testTransIdRequired() {
+ MusicUtil.setTransIdRequired(true);
+ assertEquals(true,MusicUtil.getTransIdRequired());
+ }
+
+ @Test
+ public void testGetCassandraConnectTimeOutMS() {
+ MusicUtil.setCassandraConnectTimeOutMS(2000);
+ assertEquals(2000,MusicUtil.getCassandraConnectTimeOutMS());
+ }
+
+ @Test
+ public void testGetCassandraReadTimeOutMS() {
+ MusicUtil.setCassandraReadTimeOutMS(2000);
+ assertEquals(2000,MusicUtil.getCassandraReadTimeOutMS());
+ }
+
+ /*
+ @Test
+ public void testLoadProperties() {
+ PropertiesLoader pl = new PropertiesLoader();
+ pl.loadProperties();
+ }
+ */
}
diff --git a/music-core/src/test/java/org/onap/music/datastore/ConditionTest.java b/music-core/src/test/java/org/onap/music/datastore/ConditionTest.java
new file mode 100644
index 00000000..2aac62af
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/datastore/ConditionTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================== org.onap.music
+ * =================================================================== Copyright (c) 2019 AT&T
+ * Intellectual Property ===================================================================
+ * 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.datastore;
+
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.exceptions.MusicServiceException;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.spy;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.Spy;
+
+public class ConditionTest {
+
+ @Spy
+ private Condition condition;
+ private Map<String, Object> conditions;
+ private PreparedQueryObject selectQueryForTheRow;
+
+ @Before
+ public void setup() {
+ conditions = Mockito.mock(Map.class);
+ selectQueryForTheRow = Mockito.mock(PreparedQueryObject.class);
+ condition = spy(new Condition(conditions, selectQueryForTheRow));
+ }
+
+ @Test
+ public void testCondition() throws Exception {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ MusicDataStore dsHandle = Mockito.mock(MusicDataStore.class);
+ Mockito.when(rs.one()).thenReturn(row);
+ Mockito.doReturn(rs).when(condition).quorumGet(Mockito.any());
+ boolean result = false;
+ Mockito.when(dsHandle.doesRowSatisfyCondition(Mockito.any(), Mockito.any())).thenReturn(true);
+ Mockito.doReturn(dsHandle).when(condition).getDSHandle();
+ result = condition.testCondition();
+ assertEquals(true, result);
+ }
+}
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
new file mode 100644
index 00000000..9260cd92
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/datastore/MusicDataStoreTest.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.datastore;
+
+import static org.junit.Assert.*;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.function.Consumer;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.CodecRegistry;
+import com.datastax.driver.core.ColumnDefinitions;
+import com.datastax.driver.core.ColumnDefinitions.Definition;
+import com.datastax.driver.core.exceptions.WriteTimeoutException;
+import com.datastax.driver.core.ColumnMetadata;
+import com.datastax.driver.core.Configuration;
+import com.datastax.driver.core.ConsistencyLevel;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.KeyspaceMetadata;
+import com.datastax.driver.core.Metadata;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleStatement;
+import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.TableMetadata;
+import com.datastax.driver.core.WriteType;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MusicDataStoreTest {
+
+ MusicDataStore dataStore;
+
+ @Mock
+ Session session;
+
+ @Mock
+ Cluster cluster;
+
+ @Before
+ public void before() {
+ CodecRegistry cr = Mockito.mock(CodecRegistry.class);
+ Configuration config = Mockito.mock(Configuration.class);
+ Mockito.when(cluster.getConfiguration()).thenReturn(config);
+ Mockito.when(config.getCodecRegistry()).thenReturn(cr);
+ dataStore = new MusicDataStore(cluster, session);
+ }
+
+
+ @Test
+ public void testMusicDataStoreClusterSession() {
+ Session session = Mockito.mock(Session.class);
+ Cluster cluster = Mockito.mock(Cluster.class);
+
+ CodecRegistry cr = Mockito.mock(CodecRegistry.class);
+ Configuration config = Mockito.mock(Configuration.class);
+ Mockito.when(cluster.getConfiguration()).thenReturn(config);
+ Mockito.when(config.getCodecRegistry()).thenReturn(cr);
+
+
+ MusicDataStore mds = new MusicDataStore(cluster, session);
+ assertEquals(session, mds.getSession());
+ assertEquals(cluster, mds.getCluster());
+ }
+
+ @Test
+ public void testSession() {
+ Session session = Mockito.mock(Session.class);
+ dataStore.setSession(session);
+ assertEquals(session, dataStore.getSession());
+ }
+
+ @Test
+ public void testCluster() {
+ Cluster cluster = Mockito.mock(Cluster.class);
+ CodecRegistry cr = Mockito.mock(CodecRegistry.class);
+ Configuration config = Mockito.mock(Configuration.class);
+ Mockito.when(cluster.getConfiguration()).thenReturn(config);
+ Mockito.when(config.getCodecRegistry()).thenReturn(cr);
+
+ dataStore.setCluster(cluster);
+ assertEquals(cluster, dataStore.getCluster());
+ }
+
+ @Test
+ public void testClose() {
+ dataStore.close();
+ Mockito.verify(session).close();
+ }
+
+ @Test
+ public void testReturnColumnDataType() {
+ Metadata meta = Mockito.mock(Metadata.class);
+ Mockito.when(cluster.getMetadata()).thenReturn(meta);
+ KeyspaceMetadata ksmd = Mockito.mock(KeyspaceMetadata.class);
+ Mockito.when(meta.getKeyspace("keyspace")).thenReturn(ksmd);
+ TableMetadata tmd = Mockito.mock(TableMetadata.class);
+ Mockito.when(ksmd.getTable("table")).thenReturn(tmd);
+ ColumnMetadata cmd = Mockito.mock(ColumnMetadata.class);
+ Mockito.when(tmd.getColumn("columnName")).thenReturn(cmd);
+ Mockito.when(cmd.getType()).thenReturn(com.datastax.driver.core.DataType.text());
+
+ com.datastax.driver.core.DataType dt = dataStore.returnColumnDataType("keyspace", "table", "columnName");
+ assertEquals(com.datastax.driver.core.DataType.text(), dt);
+ }
+
+ @Test
+ public void testReturnColumnMetadata() {
+ Metadata meta = Mockito.mock(Metadata.class);
+ Mockito.when(cluster.getMetadata()).thenReturn(meta);
+ KeyspaceMetadata ksmd = Mockito.mock(KeyspaceMetadata.class);
+ Mockito.when(meta.getKeyspace("keyspace")).thenReturn(ksmd);
+ TableMetadata tmd = Mockito.mock(TableMetadata.class);
+ Mockito.when(ksmd.getTable("tableName")).thenReturn(tmd);
+
+ dataStore.returnColumnMetadata("keyspace", "tableName");
+ assertEquals(tmd, dataStore.returnColumnMetadata("keyspace", "tableName"));
+ }
+
+ @Test
+ public void testReturnKeyspaceMetadata() {
+ Metadata meta = Mockito.mock(Metadata.class);
+ Mockito.when(cluster.getMetadata()).thenReturn(meta);
+ KeyspaceMetadata ksmd = Mockito.mock(KeyspaceMetadata.class);
+ Mockito.when(meta.getKeyspace("keyspace")).thenReturn(ksmd);
+
+ assertEquals(ksmd, dataStore.returnKeyspaceMetadata("keyspace"));
+ }
+
+ @Test
+ public void testGetColValue() {
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getString("columnName")).thenReturn("value");
+ UUID uuid = UUID.randomUUID();
+ Mockito.when(row.getUUID("columnName")).thenReturn(uuid);
+ Mockito.when(row.getVarint("columnName")).thenReturn(BigInteger.ONE);
+ Mockito.when(row.getLong("columnName")).thenReturn((long) 117);
+ Mockito.when(row.getInt("columnName")).thenReturn(5);
+ Mockito.when(row.getFloat("columnName")).thenReturn(Float.MAX_VALUE);
+ Mockito.when(row.getDouble("columnName")).thenReturn(Double.valueOf("2.5"));
+ Mockito.when(row.getBool("columnName")).thenReturn(true);
+ Mockito.when(row.getMap("columnName", String.class, String.class)).thenReturn(new HashMap<String, String>());
+ Mockito.when(row.getList("columnName", String.class)).thenReturn(new ArrayList<String>());
+
+
+ assertEquals("value", dataStore.getColValue(row, "columnName", DataType.varchar()));
+ assertEquals(uuid, dataStore.getColValue(row, "columnName", DataType.uuid()));
+ assertEquals(BigInteger.ONE, dataStore.getColValue(row, "columnName", DataType.varint()));
+ assertEquals((long) 117, dataStore.getColValue(row, "columnName", DataType.bigint()));
+ assertEquals(5, dataStore.getColValue(row, "columnName", DataType.cint()));
+ assertEquals(Float.MAX_VALUE, dataStore.getColValue(row, "columnName", DataType.cfloat()));
+ assertEquals(2.5, dataStore.getColValue(row, "columnName", DataType.cdouble()));
+ assertEquals(true, dataStore.getColValue(row, "columnName", DataType.cboolean()));
+ assertEquals(0, ((Map<String, String>) dataStore.getColValue(row, "columnName",
+ DataType.map(DataType.varchar(), DataType.varchar()))).size());
+ assertEquals(0,
+ ((List<String>) dataStore.getColValue(row, "columnName", DataType.list(DataType.varchar()))).size());
+ }
+
+ @Test
+ public void testGetBlobValue() {
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getBytes("col")).thenReturn(ByteBuffer.allocate(16));
+
+ byte[] byteArray = dataStore.getBlobValue(row, "col", DataType.blob());
+ assertEquals(16, byteArray.length);
+ }
+
+ @Test
+ public void testDoesRowSatisfyCondition() throws Exception {
+ Row row = Mockito.mock(Row.class);
+ ColumnDefinitions cd = Mockito.mock(ColumnDefinitions.class);
+ Mockito.when(row.getColumnDefinitions()).thenReturn(cd);
+ Mockito.when(cd.getType("col1")).thenReturn(DataType.varchar());
+
+ Map<String, Object> condition = new HashMap<>();
+ condition.put("col1", "val1");
+
+ Mockito.when(row.getString("col1")).thenReturn("val1");
+
+ assertTrue(dataStore.doesRowSatisfyCondition(row, condition));
+
+ condition.put("col1", "val2");
+ assertFalse(dataStore.doesRowSatisfyCondition(row, condition));
+ }
+
+ @Test
+ public void testMarshalData() {
+ ResultSet results = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getString("colName")).thenReturn("rowValue");
+ //mock for (Row row: results)
+ Iterator mockIterator = Mockito.mock(Iterator.class);
+ //Mockito.doCallRealMethod().when(results).forEach(Mockito.any(Consumer.class));
+ Mockito.when(results.iterator()).thenReturn(mockIterator);
+ Mockito.when(mockIterator.hasNext()).thenReturn(true, false);
+ Mockito.when(mockIterator.next()).thenReturn(row);
+
+ ColumnDefinitions cd = Mockito.mock(ColumnDefinitions.class);
+ Mockito.when(row.getColumnDefinitions()).thenReturn(cd);
+ //for (Definition: colDefinitions)
+ Iterator mockIterator2 = Mockito.mock(Iterator.class);
+ //Mockito.doCallRealMethod().when(cd).forEach(Mockito.any(Consumer.class));
+ Mockito.when(cd.iterator()).thenReturn(mockIterator2);
+ Mockito.when(mockIterator2.hasNext()).thenReturn(true, false);
+ Definition def = Mockito.mock(Definition.class);
+ Mockito.when(mockIterator2.next()).thenReturn(def);
+ Mockito.when(def.getType()).thenReturn(DataType.varchar());
+ Mockito.when(def.getName()).thenReturn("colName");
+
+ Map<String, HashMap<String, Object>> data = dataStore.marshalData(results);
+ System.out.println("Marshalled data: " + data);
+
+ assertTrue(data.containsKey("row 0"));
+ assertEquals("rowValue", data.get("row 0").get("colName"));
+ }
+
+ private ArgumentCaptor<SimpleStatement> sessionExecuteResponse() {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Mockito.when(session.execute(Mockito.any(Statement.class))).thenReturn(rs);
+
+ ArgumentCaptor<SimpleStatement> argument = ArgumentCaptor.forClass(SimpleStatement.class);
+ return argument;
+ }
+
+ @Test
+ public void testExecutePutPreparedQueryObjectString() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES (?,?);";
+ String lastName = "KRUIKSWIJK";
+ String firstName = "Steven";
+
+ PreparedQueryObject query = new PreparedQueryObject(queryString, lastName, firstName);
+ dataStore.executePut(query, MusicUtil.CRITICAL);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.QUORUM, argument.getValue().getConsistencyLevel());
+ assertEquals(queryString, argument.getValue().getQueryString());
+ assertEquals(2, argument.getValue().valuesCount());
+ }
+
+ @Test
+ public void testExecutePut_ONE() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES (?,?);";
+ String lastName = "KRUIKSWIJK";
+ String firstName = "Steven";
+
+ PreparedQueryObject query = new PreparedQueryObject(queryString, lastName, firstName);
+ dataStore.executePut(query, MusicUtil.ONE);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ONE, argument.getValue().getConsistencyLevel());
+ assertEquals(queryString, argument.getValue().getQueryString());
+ assertEquals(2, argument.getValue().valuesCount());
+ }
+
+ @Test
+ public void testExecutePut_quorum() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES (?,?);";
+ String lastName = "KRUIKSWIJK";
+ String firstName = "Steven";
+
+ PreparedQueryObject query = new PreparedQueryObject(queryString, lastName, firstName);
+ dataStore.executePut(query, MusicUtil.QUORUM);
+
+ Mockito.verify(session).execute(argument.capture());
+ //should be quorum!
+ assertEquals(ConsistencyLevel.LOCAL_QUORUM, argument.getValue().getConsistencyLevel());
+ assertEquals(queryString, argument.getValue().getQueryString());
+ assertEquals(2, argument.getValue().valuesCount());
+ }
+
+ @Test
+ public void testExecutePut_ALL() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES (?,?);";
+ String lastName = "KRUIKSWIJK";
+ String firstName = "Steven";
+
+ PreparedQueryObject query = new PreparedQueryObject(queryString, lastName, firstName);
+ dataStore.executePut(query, MusicUtil.ALL);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ALL, argument.getValue().getConsistencyLevel());
+ assertEquals(queryString, argument.getValue().getQueryString());
+ assertEquals(2, argument.getValue().valuesCount());
+ }
+
+ @Test(expected = MusicQueryException.class)
+ public void testExecutePut_BadQueryObj() throws Exception {
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES (?,?);";
+ String lastName = "KRUIKSWIJK";
+ String firstName = "Steven";
+
+ //Provide extra value here, middle initial
+ PreparedQueryObject query = new PreparedQueryObject(queryString, lastName, firstName, "P");
+ try {
+ dataStore.executePut(query, MusicUtil.CRITICAL);
+ } catch (Exception e) {
+ System.out.println(e.getMessage());
+ throw e;
+ }
+
+ fail("Should have throw error");
+ }
+
+ @Test
+ public void testExecutePutPreparedQueryObjectStringLong() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ String queryString = "INSERT INTO cycling.cyclist_name (lastname, firstname) VALUES ('KRUIKSWIJK','Steven');";
+
+
+ PreparedQueryObject query = new PreparedQueryObject(queryString);
+ dataStore.executePut(query, MusicUtil.EVENTUAL, 10);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ONE, argument.getValue().getConsistencyLevel());
+ assertEquals(queryString, argument.getValue().getQueryString());
+ }
+
+ @Test
+ public void testExecuteGet() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM KEYSPACE.TABLE");
+
+ dataStore.executeGet(query, MusicUtil.ONE);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ONE, argument.getValue().getConsistencyLevel());
+ assertEquals("SELECT * FROM KEYSPACE.TABLE", argument.getValue().getQueryString());
+ }
+
+ @Test (expected = MusicQueryException.class)
+ public void testExecuteGet_badQuery() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM KEYSPACE.TABLE", "broken");
+
+ dataStore.executeGet(query, MusicUtil.ONE);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ONE, argument.getValue().getConsistencyLevel());
+ assertEquals("SELECT * FROM KEYSPACE.TABLE", argument.getValue().getQueryString());
+ }
+
+ @Test
+ public void testExecuteOneConsistencyGet() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM KEYSPACE.TABLE");
+
+ dataStore.executeOneConsistencyGet(query);
+
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.ONE, argument.getValue().getConsistencyLevel());
+ assertEquals("SELECT * FROM KEYSPACE.TABLE", argument.getValue().getQueryString());
+ }
+
+ @Test
+ public void testExecuteLocalQuorumConsistencyGet() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM KEYSPACE.TABLE");
+
+ dataStore.executeLocalQuorumConsistencyGet(query);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.LOCAL_QUORUM, argument.getValue().getConsistencyLevel());
+ assertEquals("SELECT * FROM KEYSPACE.TABLE", argument.getValue().getQueryString());
+ }
+
+ @Test
+ public void testExecuteQuorumConsistencyGet() throws Exception {
+ ArgumentCaptor<SimpleStatement> argument = sessionExecuteResponse();
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM KEYSPACE.TABLE");
+
+ dataStore.executeQuorumConsistencyGet(query);
+
+ Mockito.verify(session).execute(argument.capture());
+ assertEquals(ConsistencyLevel.QUORUM, argument.getValue().getConsistencyLevel());
+ assertEquals("SELECT * FROM KEYSPACE.TABLE", argument.getValue().getQueryString());
+ }
+
+
+ @Test
+ public void testExecutePut() {
+ Mockito.when(session.execute(Mockito.any(SimpleStatement.class)))
+ .thenThrow(new WriteTimeoutException(ConsistencyLevel.QUORUM, WriteType.CAS, 1, 3));
+
+ try {
+ dataStore.executePut(new PreparedQueryObject("Test query"), "critical");
+ } catch (MusicServiceException e) {
+ return;
+ } catch (MusicQueryException e) {
+ // should never reach here
+ fail();
+ }
+ fail();
+ }
+}
diff --git a/music-core/src/test/java/org/onap/music/datastore/PreparedQueryObjectTest.java b/music-core/src/test/java/org/onap/music/datastore/PreparedQueryObjectTest.java
new file mode 100644
index 00000000..7ab7d148
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/datastore/PreparedQueryObjectTest.java
@@ -0,0 +1,101 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 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
+ * e
+ * 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.datastore;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class PreparedQueryObjectTest {
+
+ private PreparedQueryObject preparedQueryObject;
+
+ @Before
+ public void setUp()
+ {
+ preparedQueryObject = new PreparedQueryObject();
+ }
+
+ @Test
+ public void testKeyspaceName()
+ {
+ preparedQueryObject.setKeyspaceName("keyspaceName");
+ assertEquals("keyspaceName", preparedQueryObject.getKeyspaceName());
+ }
+
+ @Test
+ public void testConsistency()
+ {
+ preparedQueryObject.setConsistency("consistency");
+ assertEquals("consistency", preparedQueryObject.getConsistency());
+ }
+
+ @Test
+ public void testTableName()
+ {
+ preparedQueryObject.setTableName("tableName");
+ assertEquals("tableName", preparedQueryObject.getTableName());
+ }
+
+ @Test
+ public void testoperation()
+ {
+ preparedQueryObject.setOperation("operation");
+ assertEquals("operation", preparedQueryObject.getOperation());
+ }
+
+ @Test
+ public void testprimaryKeyValue()
+ {
+ preparedQueryObject.setPrimaryKeyValue("primaryKeyValue");
+ assertEquals("primaryKeyValue", preparedQueryObject.getPrimaryKeyValue());
+ }
+
+ @Test
+ public void testAddValue() {
+ preparedQueryObject.addValue("one");
+ assertEquals("one", preparedQueryObject.getValues().get(0));
+ }
+
+ @Test
+ public void testAddValues() {
+ preparedQueryObject.addValues("one", "two", "three");
+ assertEquals(3, preparedQueryObject.getValues().size());
+ assertEquals("two", preparedQueryObject.getValues().get(1));
+ }
+
+ @Test
+ public void testConstructorQuery() {
+ preparedQueryObject = new PreparedQueryObject("some query string");
+ assertEquals("some query string", preparedQueryObject.getQuery());
+ }
+
+ @Test
+ public void testConstructorQueryValues() {
+ preparedQueryObject = new PreparedQueryObject("another query string", "a", "b", "c");
+ assertEquals("another query string", preparedQueryObject.getQuery());
+ assertEquals(3, preparedQueryObject.getValues().size());
+ assertEquals("b", preparedQueryObject.getValues().get(1));
+ }
+}
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/src/test/java/org/onap/music/unittests/jsonobjects/JsonDeleteTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java
index a069b81d..5b9cef8b 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonDeleteTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonDeleteTest.java
@@ -22,7 +22,7 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.*;
import java.util.ArrayList;
@@ -31,7 +31,6 @@ import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonDelete;
public class JsonDeleteTest {
@@ -83,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/src/test/java/org/onap/music/unittests/jsonobjects/JsonOnboardTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonIndexTest.java
index 1e66ed58..0d89a339 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonOnboardTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonIndexTest.java
@@ -20,60 +20,55 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.*;
+import java.util.HashMap;
+import java.util.Map;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonOnboard;
+import org.onap.music.datastore.PreparedQueryObject;
-public class JsonOnboardTest {
+public class JsonIndexTest {
- JsonOnboard jo = null;
+ JsonIndex ji = null;
+
@Before
public void init() {
- jo = new JsonOnboard();
+ ji = new JsonIndex(null, null, null, null);
}
-
+
+
@Test
- public void testGetPassword() {
- String password = "password";
- jo.setPassword(password);
- assertEquals(password,jo.getPassword());
+ public void testKeyspace() {
+ ji.setKeyspaceName("keyspaceName");
+ assertEquals("keyspaceName", ji.getKeyspaceName());
}
-
+
@Test
- public void testGetAid() {
- String aid = "aid";
- jo.setAid(aid);
- assertEquals(aid,jo.getAid());
-
+ public void testIndexName() {
+ ji.setIndexName("indexName");
+ assertEquals("indexName", ji.getIndexName());
}
-
+
@Test
- public void testGetAppname() {
- String appName = "appName";
- jo.setAppname(appName);
- assertEquals(appName,jo.getAppname());
-
+ public void testFieldName() {
+ ji.setFieldName("field");
+ assertEquals("field", ji.getFieldName());
}
-
+
@Test
- public void testGetUserId() {
- String userId = "userId";
- jo.setUserId(userId);
- assertEquals(userId,jo.getUserId());
-
+ public void testTableName() {
+ ji.setTableName("table");
+ assertEquals("table", ji.getTableName());
}
-
+
@Test
- public void testGetIsAAF() {
- String aaf = "true";
- jo.setIsAAF(aaf);
- assertEquals(aaf,jo.getIsAAF());
-
+ public void testCreateIndexQuery() {
+ JsonIndex ji2 = new JsonIndex("index", "keyspace", "table", "field");
+ PreparedQueryObject query = ji2.genCreateIndexQuery();
+ assertEquals("Create index if not exists index on keyspace.table (field);", query.getQuery());
}
-
}
diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonInsertTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonInsertTest.java
new file mode 100644
index 00000000..ad71c9ea
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonInsertTest.java
@@ -0,0 +1,176 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (c) 2019 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.datastore.jsonobjects;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.SerializationUtils;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.internal.util.reflection.FieldSetter;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import com.datastax.driver.core.ColumnMetadata;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.Session;
+//import org.mockito.internal.util.reflection.Whitebox;
+import com.datastax.driver.core.TableMetadata;
+
+
+public class JsonInsertTest {
+
+ JsonInsert ji = new JsonInsert();
+
+ @Test
+ public void testGetKeyspaceName() {
+ ji.setKeyspaceName("keyspace");
+ assertEquals("keyspace",ji.getKeyspaceName());
+ }
+
+ @Test
+ public void testGetTableName() {
+ ji.setTableName("table");
+ assertEquals("table",ji.getTableName());
+ }
+
+ @Test
+ public void testGetConsistencyInfo() {
+ Map<String,String> cons = new HashMap<>();
+ cons.put("test","true");
+ ji.setConsistencyInfo(cons);
+ assertEquals("true",ji.getConsistencyInfo().get("test"));
+ }
+
+ @Test
+ public void testGetTtl() {
+ ji.setTtl("ttl");
+ assertEquals("ttl",ji.getTtl());
+ }
+
+ @Test
+ public void testGetTimestamp() {
+ ji.setTimestamp("10:30");
+ assertEquals("10:30",ji.getTimestamp());
+ }
+
+ @Test
+ public void testGetValues() {
+ Map<String,Object> cons = new HashMap<>();
+ cons.put("val1","one");
+ cons.put("val2","two");
+ ji.setValues(cons);
+ assertEquals("one",ji.getValues().get("val1"));
+ }
+
+ @Test
+ public void testGetRowSpecification() {
+ Map<String,Object> cons = new HashMap<>();
+ cons.put("val1","one");
+ cons.put("val2","two");
+ ji.setRowSpecification(cons);
+ assertEquals("two",ji.getRowSpecification().get("val2"));
+ }
+
+ @Test
+ public void testSerialize() {
+ Map<String,Object> cons = new HashMap<>();
+ cons.put("val1","one");
+ cons.put("val2","two");
+ ji.setTimestamp("10:30");
+ ji.setRowSpecification(cons);
+ byte[] test1 = ji.serialize();
+ byte[] ji1 = SerializationUtils.serialize(ji);
+ assertArrayEquals(ji1,test1);
+ }
+
+ @Test
+ public void testObjectMap()
+ {
+ Map<String, byte[]> map = new HashMap<>();
+ ji.setObjectMap(map);
+ assertEquals(map, ji.getObjectMap());
+ }
+
+ @Test
+ public void testPrimaryKey() {
+ ji.setPrimaryKeyVal("primKey");
+ assertEquals("primKey", ji.getPrimaryKeyVal());
+ }
+
+ @Test
+ public void testGenInsertPreparedQueryObj() throws Exception {
+ ji.setKeyspaceName("keyspace");
+ ji.setTableName("table");
+ ji.setPrimaryKeyVal("value");
+ Map<String,Object> rowSpec = new HashMap<>();
+ rowSpec.put("val1","one");
+ rowSpec.put("val2","two");
+ ji.setRowSpecification(rowSpec);
+ Map<String,Object> vals = new HashMap<>();
+ vals.put("val1","one");
+ vals.put("val2","two");
+ ji.setValues(vals);
+
+ Map<String,String> cons = new HashMap<>();
+ cons.put("type","quorum");
+ ji.setConsistencyInfo(cons);
+
+ MusicDataStore mds = Mockito.mock(MusicDataStore.class);
+ Session session = Mockito.mock(Session.class);
+ Mockito.when(mds.getSession()).thenReturn(session);
+ MusicDataStoreHandle mdsh = Mockito.mock(MusicDataStoreHandle.class);
+ FieldSetter.setField(mdsh, mdsh.getClass().getDeclaredField("mDstoreHandle"), mds);
+ TableMetadata tableMeta = Mockito.mock(TableMetadata.class);
+ Mockito.when(mds.returnColumnMetadata(Mockito.anyString(), Mockito.anyString()))
+ .thenReturn(tableMeta);
+
+ ColumnMetadata cmd = Mockito.mock(ColumnMetadata.class);
+ List<ColumnMetadata> listcmd = new ArrayList<>();
+ listcmd.add(cmd);
+ Mockito.when(tableMeta.getPrimaryKey()).thenReturn(listcmd);
+ Mockito.when(cmd.getName()).thenReturn("val1");
+ Mockito.when(tableMeta.getColumn("val1")).thenReturn(cmd);
+ Mockito.when(tableMeta.getColumn("val2")).thenReturn(cmd);
+ Mockito.when(cmd.getType()).thenReturn(DataType.text());
+
+ PreparedQueryObject query = ji.genInsertPreparedQueryObj();
+ System.out.println(query.getQuery());
+ System.out.println(query.getValues());
+
+
+ assertEquals("INSERT INTO keyspace.table (vector_ts,val2,val1) VALUES (?,?,?);", query.getQuery());
+ assertTrue(query.getValues().containsAll(vals.values()));
+ }
+
+}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JsonKeySpaceTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonKeySpaceTest.java
index 0f4abd7c..a3fa58e4 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonKeySpaceTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonKeySpaceTest.java
@@ -20,14 +20,13 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonKeySpace;
public class JsonKeySpaceTest {
diff --git a/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonLockTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonLockTest.java
new file mode 100644
index 00000000..75db75e5
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonLockTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.datastore.jsonobjects;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.music.lockingservice.cassandra.LockType;
+
+public class JsonLockTest {
+
+ JsonLock jsonLock;
+
+ @Before
+ public void setup() {
+ jsonLock = new JsonLock();
+ }
+
+ @Test
+ public void testSetLockType() {
+ jsonLock.setLockType(LockType.READ);
+ assertEquals(LockType.READ, jsonLock.getLocktype());
+
+ jsonLock.setLockType(LockType.WRITE);
+ assertEquals(LockType.WRITE, jsonLock.getLocktype());
+
+ jsonLock.setLockType(LockType.PROMOTING);
+ assertEquals(LockType.PROMOTING, jsonLock.getLocktype());
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JsonSelectTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java
index 37d1787a..baada1d5 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonSelectTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonSelectTest.java
@@ -22,7 +22,7 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.assertEquals;
@@ -31,13 +31,12 @@ import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonSelect;
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);
@@ -46,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/src/test/java/org/onap/music/unittests/jsonobjects/JsonTableTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonTableTest.java
index 4e3b4629..3ab32d40 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonTableTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonTableTest.java
@@ -22,14 +22,14 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.exceptions.MusicQueryException;
public class JsonTableTest {
@@ -53,6 +53,7 @@ public class JsonTableTest {
Map<String, Object> properties = new HashMap<>();
properties.put("k1", "one");
jt.setProperties(properties);
+ assertEquals(properties.size(), jt.getProperties().size());
}
@Test
@@ -83,6 +84,13 @@ public class JsonTableTest {
jt.setClusteringOrder(clusteringOrder);
assertEquals(clusteringOrder,jt.getClusteringOrder());
}
+
+ @Test
+ public void testGetClusterKey() {
+ String clusterKey = "clusterKey";
+ jt.setClusteringKey(clusterKey);
+ assertEquals(clusterKey, jt.getClusteringKey());
+ }
@Test
public void testGetPrimaryKey() {
@@ -96,5 +104,50 @@ public class JsonTableTest {
jt.setFilteringKey("FilteringKey");
assertEquals("FilteringKey",jt.getFilteringKey());
}
+
+ @Test
+ public void testPartitionKey() {
+ jt.setPartitionKey("ParitionKey");
+ assertEquals("ParitionKey",jt.getPartitionKey());
+ }
+ @Test
+ public void genCreateTableQuery() throws MusicQueryException {
+ JsonTable jt2 = new JsonTable();
+ jt2.setKeyspaceName("keyspace");
+ jt2.setTableName("table");
+ Map<String, String> fields = new HashMap<>();
+ fields.put("k1", "one");
+ jt2.setFields(fields);
+ jt2.setPrimaryKey("k1");
+ Map<String, String> mapSs = new HashMap<>();
+ mapSs.put("k1", "one");
+ jt2.setConsistencyInfo(mapSs);
+ String clusteringOrder = "clusteringOrder";
+ jt.setClusteringOrder(clusteringOrder);
+ String clusterKey = "clusterKey";
+ jt.setClusteringKey(clusterKey);
+
+ System.out.println(jt2.genCreateTableQuery().getQuery());
+ assertEquals("CREATE TABLE keyspace.table (vector_ts text,k1 one, PRIMARY KEY ( (k1) ));",
+ jt2.genCreateTableQuery().getQuery());
+ }
+
+ @Test
+ public void genDropTableQuery() throws MusicQueryException {
+ JsonTable jt2 = new JsonTable();
+ jt2.setKeyspaceName("keyspace");
+ jt2.setTableName("table");
+ Map<String, String> fields = new HashMap<>();
+ fields.put("k1", "one");
+ jt2.setFields(fields);
+ jt2.setPrimaryKey("k1");
+ Map<String, String> mapSs = new HashMap<>();
+ mapSs.put("k1", "one");
+ jt.setConsistencyInfo(mapSs);
+
+ System.out.println(jt2.genDropTableQuery().getQuery());
+ assertEquals("DROP TABLE keyspace.table;",
+ jt2.genDropTableQuery().getQuery());
+ }
}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JsonUpdateTest.java b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonUpdateTest.java
index e00cb463..37c729f4 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonUpdateTest.java
+++ b/music-core/src/test/java/org/onap/music/datastore/jsonobjects/JsonUpdateTest.java
@@ -22,14 +22,22 @@
* ====================================================================
*******************************************************************************/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.datastore.jsonobjects;
import static org.junit.Assert.*;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+import javax.ws.rs.core.MultivaluedMap;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.mockito.Mockito;
+import org.onap.music.datastore.jsonobjects.JsonUpdate.RowIdentifier;
+import com.datastax.driver.core.ColumnMetadata;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.TableMetadata;
public class JsonUpdateTest {
@@ -108,4 +116,51 @@ public class JsonUpdateTest {
assertTrue(ju.serialize() instanceof byte[]);
}
+ @Test
+ public void testRowIdString() {
+ ju.setRowIdString("testing");
+ assertEquals("testing", ju.getRowIdString());
+ }
+
+ @Test
+ public void testPrimaryKeyValue() {
+ ju.setPrimarKeyValue("primeKey");
+ assertEquals("primeKey", ju.getPrimarKeyValue());
+ }
+
+ @Test
+ public void testGenUpdatePreparedQueryObj() throws Exception {
+ JsonUpdate ju = Mockito.spy(JsonUpdate.class);
+ MultivaluedMap<String, String> rowParams = Mockito.mock(MultivaluedMap.class);
+
+ ju.setKeyspaceName("keyspace");
+ ju.setTableName("table");
+ ju.setPrimarKeyValue("primaryKeyValue");
+ Map<String, String> consistencyInfo = new HashMap<>();
+ consistencyInfo.put("type", "critical");
+ ju.setConsistencyInfo(consistencyInfo);
+ Map<String, Object> values = new HashMap<>();
+ values.put("col1", "val1");
+ ju.setValues(values);
+
+ TableMetadata tmd = Mockito.mock(TableMetadata.class);
+ Mockito.doReturn(tmd).when(ju).returnColumnMetadata(Mockito.anyString(), Mockito.anyString());
+ ColumnMetadata cmd = Mockito.mock(ColumnMetadata.class);
+ Mockito.when(tmd.getColumn("col1")).thenReturn(cmd);
+ List<ColumnMetadata> colList = new ArrayList<>();
+ colList.add(cmd);
+ Mockito.when(tmd.getPrimaryKey()).thenReturn(colList);
+ Mockito.when(cmd.getType()).thenReturn(DataType.varchar());
+
+ RowIdentifier rowId = Mockito.mock(RowIdentifier.class);
+ Mockito.doReturn(rowId).when(ju).getRowIdentifier(Mockito.anyString(), Mockito.anyString(), Mockito.any(),
+ Mockito.any());
+
+ Mockito.when(rowId.getRowIdString()).thenReturn("col1");
+ Mockito.when(rowId.getPrimaryKeyValue()).thenReturn("val1");
+
+
+ assertEquals("UPDATE keyspace.table SET vector_ts=?,col1= ? WHERE col1;",
+ ju.genUpdatePreparedQueryObj(rowParams).getQuery());
+ }
}
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/src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java b/music-core/src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java
index cba9c7c2..cba9c7c2 100644
--- a/src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java
+++ b/music-core/src/test/java/org/onap/music/eelf/logging/format/AppMessagesTest.java
diff --git a/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorSeverityTest.java b/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorSeverityTest.java
new file mode 100644
index 00000000..b2b0fafa
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorSeverityTest.java
@@ -0,0 +1,41 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 IBM Intellectual Property
+ * ===================================================================
+ * 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.format;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ErrorSeverityTest {
+
+ @Test
+ public void TestErrorServerity()
+ {
+ assertEquals("INFO",ErrorSeverity.INFO.name());
+ assertEquals("WARN",ErrorSeverity.WARN.name());
+ assertEquals("ERROR",ErrorSeverity.ERROR.name());
+ assertEquals("FATAL",ErrorSeverity.FATAL.name());
+ assertEquals("CRITICAL",ErrorSeverity.CRITICAL.name());
+ assertEquals("MAJOR",ErrorSeverity.MAJOR.name());
+ assertEquals("MINOR",ErrorSeverity.MINOR.name());
+ assertEquals("NONE",ErrorSeverity.NONE.name());
+ }
+}
diff --git a/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorTypesTest.java b/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorTypesTest.java
new file mode 100644
index 00000000..ff7b188b
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/eelf/logging/format/ErrorTypesTest.java
@@ -0,0 +1,48 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * Modifications Copyright (C) 2019 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.format;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class ErrorTypesTest {
+
+ @Test
+ public void Test1()
+ {
+ assertEquals("CONNECTIONERROR",ErrorTypes.CONNECTIONERROR.name());
+ assertEquals("SESSIONEXPIRED",ErrorTypes.SESSIONEXPIRED.name());
+ assertEquals("AUTHENTICATIONERROR",ErrorTypes.AUTHENTICATIONERROR.name());
+ assertEquals("CACHEERROR",ErrorTypes.CACHEERROR.name());
+ assertEquals("SERVICEUNAVAILABLE",ErrorTypes.SERVICEUNAVAILABLE.name());
+ assertEquals("QUERYERROR",ErrorTypes.QUERYERROR.name());
+ assertEquals("DATAERROR",ErrorTypes.DATAERROR.name());
+ assertEquals("GENERALSERVICEERROR",ErrorTypes.GENERALSERVICEERROR.name());
+ assertEquals("MUSICSERVICEERROR",ErrorTypes.MUSICSERVICEERROR.name());
+ assertEquals("LOCKINGERROR",ErrorTypes.LOCKINGERROR.name());
+ assertEquals("UNKNOWN",ErrorTypes.UNKNOWN.name());
+
+ }
+}
diff --git a/music-core/src/test/java/org/onap/music/exceptions/MusicDeadlockExceptionTest.java b/music-core/src/test/java/org/onap/music/exceptions/MusicDeadlockExceptionTest.java
new file mode 100644
index 00000000..db0e10ea
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/exceptions/MusicDeadlockExceptionTest.java
@@ -0,0 +1,135 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 IBM Intellectual Property
+ * ===================================================================
+ * 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.exceptions;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class MusicDeadlockExceptionTest {
+
+ private String owner = "tester";
+ private String keyspace = "testing";
+ private String table = "lockq";
+ private String key = "test";
+
+ @Test
+ public void TestException1() {
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException();
+ }
+ } catch (MusicDeadlockException mde) {
+ assertEquals("org.onap.music.exceptions.MusicDeadlockException", mde.getClass().getName());
+ }
+
+ }
+
+ @Test
+ public void TestException6() {
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException("org.onap.music.exceptions.MusicDeadlockException");
+ }
+ } catch (MusicDeadlockException mde) {
+ assertEquals(mde.getMessage(),"org.onap.music.exceptions.MusicDeadlockException");
+ }
+
+ }
+
+ @Test
+ public void TestException2() {
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException("MusicDeadlockException Exception occured..");
+ }
+ } catch (MusicDeadlockException mde) {
+ assertEquals(mde.getMessage(), "MusicDeadlockException Exception occured..");
+ }
+
+ }
+
+ @Test
+ public void TestException3() {
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException(new Throwable());
+ }
+ } catch (MusicDeadlockException mve) {
+ assertEquals("org.onap.music.exceptions.MusicDeadlockException", mve.getClass().getName());
+ }
+
+ }
+
+ @Test
+ public void TestException4() {
+ String message = "Exception occured";
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException(message, new Throwable());
+ }
+ } catch (MusicDeadlockException mde) {
+ assertEquals("org.onap.music.exceptions.MusicDeadlockException", mde.getClass().getName());
+ }
+
+ }
+
+ @Test
+ public void TestException5() {
+ String message = "Exception occured";
+ boolean enableSuppression = true;
+ boolean writableStackTrace = false;
+ String s1 = "Value1";
+ String s2 = "value2";
+ try {
+ if (!s1.equalsIgnoreCase(s2)) {
+ throw new MusicDeadlockException(message, new Throwable(), enableSuppression,
+ writableStackTrace);
+ }
+ } catch (MusicDeadlockException mde) {
+ assertEquals("org.onap.music.exceptions.MusicDeadlockException", mde.getClass().getName());
+ }
+
+ }
+
+ @Test
+ public void TestSetValues()
+ {
+ MusicDeadlockException mde=new MusicDeadlockException();
+ mde.setValues(owner,keyspace,table,key);
+ assertEquals("tester",mde.getOwner());
+ assertEquals("testing",mde.getKeyspace());
+ assertEquals("lockq",mde.getTable());
+ assertEquals("test",mde.getKey());
+ }
+}
diff --git a/src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java b/music-core/src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java
index 583a9fd4..583a9fd4 100644
--- a/src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java
+++ b/music-core/src/test/java/org/onap/music/exceptions/MusicLockingExceptionTest.java
diff --git a/src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java b/music-core/src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java
index 22e2d728..22e2d728 100644
--- a/src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java
+++ b/music-core/src/test/java/org/onap/music/exceptions/MusicPolicyVoilationExceptionTest.java
diff --git a/src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java b/music-core/src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java
index 9096506a..9096506a 100644
--- a/src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java
+++ b/music-core/src/test/java/org/onap/music/exceptions/MusicQueryExceptionTest.java
diff --git a/src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java b/music-core/src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java
index bf056b61..bf056b61 100644
--- a/src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java
+++ b/music-core/src/test/java/org/onap/music/exceptions/MusicServiceExceptionTest.java
diff --git a/music-core/src/test/java/org/onap/music/lockingservice/cassandra/CassaLockStoreTest.java b/music-core/src/test/java/org/onap/music/lockingservice/cassandra/CassaLockStoreTest.java
new file mode 100644
index 00000000..a608a970
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/lockingservice/cassandra/CassaLockStoreTest.java
@@ -0,0 +1,311 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.lockingservice.cassandra;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import java.util.Iterator;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.DeadlockDetectionUtil;
+import com.datastax.driver.core.ConsistencyLevel;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.WriteType;
+import com.datastax.driver.core.exceptions.WriteTimeoutException;
+
+public class CassaLockStoreTest {
+
+ private CassaLockStore cassaLockStore;
+ private CassaLockStore.LockObject lockObject;
+ private MusicDataStore dsHandle;
+
+ @Before
+ public void setUp() {
+ dsHandle = Mockito.mock(MusicDataStore.class);
+ cassaLockStore = new CassaLockStore(dsHandle);
+ lockObject = cassaLockStore.new LockObject(false, null, null, null, null, null);
+ }
+
+ @Test
+ public void testLockOwner() {
+ lockObject.setIsLockOwner(true);
+ assertEquals(true, lockObject.getIsLockOwner());
+
+ lockObject.setIsLockOwner(false);
+ assertEquals(false, lockObject.getIsLockOwner());
+ }
+
+ @Test
+ public void testAcquireTime() {
+ lockObject.setAcquireTime("2019-11-11T15:42:12+00:00");
+ assertEquals("2019-11-11T15:42:12+00:00", lockObject.getAcquireTime());
+ }
+
+ @Test
+ public void testCreateTime() {
+ lockObject.setCreateTime("2019-11-11T15:43:44+00:00");
+ assertEquals("2019-11-11T15:43:44+00:00", lockObject.getCreateTime());
+ }
+
+ @Test
+ public void testLockRef() {
+ lockObject.setLockRef("LockReference");
+ assertEquals("LockReference", lockObject.getLockRef());
+ }
+
+ @Test
+ public void testLockType() {
+ lockObject.setLocktype(LockType.READ);
+ assertEquals(LockType.READ, lockObject.getLocktype());
+ }
+
+ @Test
+ public void testOwner() {
+ lockObject.setOwner("Owner");
+ assertEquals("Owner", lockObject.getOwner());
+ }
+
+ @Test
+ public void testCreateLockQueue() {
+ try {
+ Mockito.when(dsHandle.executePut(Mockito.any(), Mockito.any())).thenReturn(true);
+ assertEquals(true, cassaLockStore.createLockQueue("keyspace1", "table1"));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGenLockRefandEnQueue() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ List<Row> latestGuardRow = Mockito.mock(List.class);
+ Mockito.when(latestGuardRow.isEmpty()).thenReturn(false);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(latestGuardRow.get(0)).thenReturn(row);
+ Mockito.when(row.getLong(0)).thenReturn((long) 4);
+ Mockito.when(resultSetMock.all()).thenReturn(latestGuardRow);
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ Mockito.when(dsHandle.executePut(Mockito.any(), Mockito.any())).thenReturn(true);
+ assertEquals("$keyspace2.table2.lockName2$5",
+ cassaLockStore.genLockRefandEnQueue("keyspace2", "table2", "lockName2", LockType.READ, "owner2"));
+ } catch (MusicServiceException | MusicQueryException | MusicLockingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetLockQueue() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Iterator<Row> iterator = Mockito.mock(Iterator.class);
+ Mockito.when(iterator.hasNext()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getLong("lockReference")).thenReturn((long)1).thenReturn((long)2).thenReturn((long)3);
+ Mockito.when(row.get("lockType", LockType.class)).thenReturn(LockType.WRITE).thenReturn(LockType.WRITE).thenReturn(LockType.WRITE);
+ Mockito.when(iterator.next()).thenReturn(row).thenReturn(row).thenReturn(row);
+ Mockito.when(resultSetMock.iterator()).thenReturn(iterator);
+
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals("2", cassaLockStore.getLockQueue("keyspace2", "table2", "key2").get(1));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetLockQueueSize() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(resultSetMock.one()).thenReturn(row);
+ Mockito.when(row.getLong("count")).thenReturn((long) 6);
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals(6, cassaLockStore.getLockQueueSize("keyspace3", "table3", "key3"));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testPeekLockQueue() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.isNull("lockReference")).thenReturn(false);
+ Mockito.when(row.getLong("lockReference")).thenReturn((long) 6);
+ Mockito.when(row.getString("createTime")).thenReturn("2019-11-13T15:05:45+00:00");
+ Mockito.when(row.getString("acquireTime")).thenReturn("2019-11-13T15:05:45+00:00");
+ Mockito.when(row.isNull("lockReference")).thenReturn(false);
+ Mockito.when(resultSetMock.one()).thenReturn(row);
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals("6", cassaLockStore.peekLockQueue("keyspace4", "table4", "key4").getLockRef());
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetCurrentLockHolders() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Iterator<Row> iterator = Mockito.mock(Iterator.class);
+ Mockito.when(iterator.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getLong("lockReference")).thenReturn((long) 5).thenReturn((long) 5);
+ Mockito.when(row.get("lockType", LockType.class)).thenReturn(LockType.WRITE);
+ Mockito.when(iterator.next()).thenReturn(row).thenReturn(row);
+ Mockito.when(resultSetMock.iterator()).thenReturn(iterator);
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals("$keyspace5.table5.key5$5", cassaLockStore.getCurrentLockHolders("keyspace5", "table5", "key5").get(1));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testIsLockOwner() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Iterator<Row> iterator = Mockito.mock(Iterator.class);
+ Mockito.when(iterator.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getLong("lockReference")).thenReturn((long) 5);
+ Mockito.when(row.get("lockType", LockType.class)).thenReturn(LockType.WRITE);
+ Mockito.when(iterator.next()).thenReturn(row).thenReturn(row);
+ Mockito.when(resultSetMock.iterator()).thenReturn(iterator);
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals(true, cassaLockStore.isLockOwner("keyspace5", "table5", "key5", "5"));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetLockInfo() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.isNull("lockReference")).thenReturn(false);
+ Mockito.when(row.getLong("lockReference")).thenReturn((long) 6);
+ Mockito.when(row.getString("createTime")).thenReturn("2019-11-13T15:05:45+00:00");
+ Mockito.when(row.getString("acquireTime")).thenReturn("2019-11-13T15:05:45+00:00");
+ LockType locktype = Mockito.mock(LockType.class);
+ Mockito.when(row.get("lockType", LockType.class)).thenReturn(locktype);
+ Mockito.when(row.getString("owner")).thenReturn("owner6");
+ Mockito.when(resultSetMock.one()).thenReturn(row);
+
+ try {
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ CassaLockStore csLockStore = Mockito.spy(cassaLockStore);
+ Mockito.doReturn(true).when(csLockStore).isLockOwner(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any());
+ assertEquals("6", csLockStore.getLockInfo("keyspace6", "table6", "key6", "6").getLockRef());
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testCheckForDeadlock() {
+ DeadlockDetectionUtil ddu = Mockito.mock(DeadlockDetectionUtil.class);
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Iterator<Row> it = Mockito.mock(Iterator.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(it.hasNext()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
+ Mockito.when(row.getString("key")).thenReturn("key8");
+ Mockito.when(row.getString("owner")).thenReturn("owner8");
+ Mockito.when(row.getString("acquiretime")).thenReturn("1");
+ Mockito.when(it.next()).thenReturn(row).thenReturn(row).thenReturn(row);
+ Mockito.when(resultSetMock.iterator()).thenReturn(it);
+ CassaLockStore csLockStore = Mockito.spy(cassaLockStore);
+ Mockito.doReturn(ddu).when(csLockStore).getDeadlockDetectionUtil();
+ Mockito.when(ddu.checkForDeadlock(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
+ try {
+ Mockito.when(dsHandle.executeLocalQuorumConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals(false,
+ cassaLockStore.checkForDeadlock("keyspace8", "table8", "lockName8", LockType.WRITE, "owner8", true));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testGetAllLocksForOwner() {
+ ResultSet resultSetMock = Mockito.mock(ResultSet.class);
+ Iterator<Row> it = Mockito.mock(Iterator.class);
+ Mockito.when(it.hasNext()).thenReturn(true).thenReturn(true).thenReturn(false);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(row.getString("key")).thenReturn("key10");
+ Mockito.when(row.getLong("lockreference")).thenReturn((long) 10);
+ Mockito.when(it.next()).thenReturn(row);
+ Mockito.when(resultSetMock.iterator()).thenReturn(it);
+ try {
+ Mockito.when(dsHandle.executeQuorumConsistencyGet(Mockito.any())).thenReturn(resultSetMock);
+ assertEquals("key10$10", cassaLockStore.getAllLocksForOwner("owneer10", "keyspace10", "table10").get(1));
+ } catch (MusicServiceException | MusicQueryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testDequeueLockRef() throws Exception {
+ cassaLockStore.deQueueLockRef("keyspace1", "table1", "key6", "6", 2);
+
+ // note only expecting 1 call to this instance, expecting it to succeed
+ Mockito.verify(dsHandle, Mockito.times(1)).executePut(Mockito.any(), Mockito.anyString());
+ }
+
+ @Test
+ public void testDequeueLockRefWriteTimeout() throws Exception {
+ int retryCount = 22;
+ try {
+ Mockito.when(dsHandle.executePut(Mockito.any(), Mockito.anyString()))
+ .thenThrow(new MusicServiceException("Cassandra timeout during..."));
+ cassaLockStore.deQueueLockRef("keyspace1", "table1", "key6", "6", retryCount);
+
+ // Should never reach here
+ fail();
+ } catch (MusicServiceException | MusicQueryException | MusicLockingException e) {
+ // should throw an error
+ }
+
+ Mockito.verify(dsHandle, Mockito.times(retryCount)).executePut(Mockito.any(), Mockito.anyString());
+ }
+}
diff --git a/music-core/src/test/java/org/onap/music/lockingservice/cassandra/MusicLockStateTest.java b/music-core/src/test/java/org/onap/music/lockingservice/cassandra/MusicLockStateTest.java
new file mode 100644
index 00000000..e5b655bd
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/lockingservice/cassandra/MusicLockStateTest.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.lockingservice.cassandra;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.music.lockingservice.cassandra.MusicLockState.LockStatus;
+
+public class MusicLockStateTest {
+
+ MusicLockState musicLockState;
+
+ @Before
+ public void setup() {
+ musicLockState = new MusicLockState(LockStatus.LOCKED, "", true);
+ }
+
+ @Test
+ public void testGetLeasePeriod() {
+ musicLockState.setLeasePeriod(200L);
+ assertEquals(200L, musicLockState.getLeasePeriod());
+ }
+
+ @Test
+ public void testIsNeedToSyncQuorum() {
+ assertEquals(true, musicLockState.isNeedToSyncQuorum());
+ }
+
+ @Test
+ public void testGetLeaseStartTime() {
+ musicLockState.setLeaseStartTime(200L);
+ assertEquals(200L, musicLockState.getLeaseStartTime());
+ }
+
+ @Test
+ public void testGetLockStatus() {
+ musicLockState.setLockStatus(LockStatus.LOCKED);
+ assertEquals(LockStatus.LOCKED, musicLockState.getLockStatus());
+ }
+
+ @Test
+ public void testGetLockHolder() {
+ musicLockState.setLockHolder("lockHolder");
+ assertEquals("lockHolder", musicLockState.getLockHolder());
+ }
+
+ @Test
+ public void testGetErrorMessage() {
+ MusicLockState musicLockState2 = new MusicLockState("This is error message");
+ assertEquals("This is error message", musicLockState2.getErrorMessage());
+ }
+
+ @Test
+ public void testSerialize() {
+ byte[] serializedBytes = musicLockState.serialize();
+ MusicLockState musicLockState3 = musicLockState.deSerialize(serializedBytes);
+ assertEquals(musicLockState.getLeasePeriod(),musicLockState3.getLeasePeriod());
+ assertEquals(musicLockState.isNeedToSyncQuorum(),musicLockState3.isNeedToSyncQuorum());
+ assertEquals(musicLockState.getLeaseStartTime(),musicLockState3.getLeaseStartTime());
+ assertEquals(musicLockState.getLockStatus(),musicLockState3.getLockStatus());
+ assertEquals(musicLockState.getLockHolder(),musicLockState3.getLockHolder());
+ assertEquals(musicLockState.getErrorMessage(),musicLockState3.getErrorMessage());
+ }
+
+}
diff --git a/music-core/src/test/java/org/onap/music/main/CipherUtilTest.java b/music-core/src/test/java/org/onap/music/main/CipherUtilTest.java
new file mode 100644
index 00000000..ff187ffd
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/main/CipherUtilTest.java
@@ -0,0 +1,55 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 IBM Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class CipherUtilTest {
+
+ private CipherUtil cipherUtil;
+
+ @Before
+ public void setup() {
+ cipherUtil = new CipherUtil();
+ }
+
+ @Test
+ public void testEncryptPKC() {
+ String encryptedText = CipherUtil.encryptPKC("This is another string to be encrypted",
+ "4BFF9DCCD774F3650E20C4D3F69F8C99");
+ System.out.println("*************************" + encryptedText);
+ assertEquals(88, encryptedText.length());
+ }
+
+ @Test
+ public void testDecryptPKC() {
+ String encryptedText = CipherUtil.encryptPKC("This is another string to be encrypted",
+ "4BFF9DCCD774F3650E20C4D3F69F8C99");
+ assertEquals("This is another string to be encrypted",
+ CipherUtil.decryptPKC(encryptedText, "4BFF9DCCD774F3650E20C4D3F69F8C99"));
+ }
+
+}
diff --git a/music-core/src/test/java/org/onap/music/main/DeadlockDetectionUtilTest.java b/music-core/src/test/java/org/onap/music/main/DeadlockDetectionUtilTest.java
new file mode 100644
index 00000000..ab767e17
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/main/DeadlockDetectionUtilTest.java
@@ -0,0 +1,87 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 IBM Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.junit.Before;
+import org.junit.Test;
+//import org.junit.experimental.runners.Enclosed;
+//import org.junit.runner.RunWith;
+import org.onap.music.main.DeadlockDetectionUtil.OwnershipType;
+
+//@RunWith(Enclosed.class)
+public class DeadlockDetectionUtilTest {
+ private DeadlockDetectionUtil ddu;
+
+ @Before
+ public void setup() {
+ ddu = new DeadlockDetectionUtil();
+ }
+
+ @Test
+ public void testListAllNodes() {
+ ddu = new DeadlockDetectionUtil();
+ ddu.setExisting("r1", "o2", OwnershipType.ACQUIRED);
+ ddu.setExisting("r3", "o2", OwnershipType.ACQUIRED);
+
+ ByteArrayOutputStream outContent = new ByteArrayOutputStream();
+ System.setOut(new PrintStream(outContent));
+ ddu.listAllNodes();
+
+ /*
+ * String expectedOutput = "In DeadlockDetectionUtil: \n" +
+ * " o2 : Node [id=o2, links=r3, visited=false, onStack=false]\n" +
+ * " r3 : Node [id=r3, links=, visited=false, onStack=false]\n" +
+ * " r1 : Node [id=r1, links=o2, visited=false, onStack=false]\n";
+ * assertEquals(expectedOutput, outContent.toString());
+ *
+ * ddu = new DeadlockDetectionUtil(); ddu.setExisting("111", "222",
+ * OwnershipType.CREATED); ddu.setExisting("333", "222", OwnershipType.CREATED);
+ * outContent = new ByteArrayOutputStream(); System.setOut(new
+ * PrintStream(outContent)); ddu.listAllNodes(); expectedOutput =
+ * "In DeadlockDetectionUtil: \n" +
+ * " o222 : Node [id=o222, links=r111r333, visited=false, onStack=false]\n" +
+ * " r333 : Node [id=r333, links=, visited=false, onStack=false]\n" +
+ * " r111 : Node [id=r111, links=, visited=false, onStack=false]";
+ * assertEquals(expectedOutput, outContent.toString());
+ */
+ }
+
+ @Test
+ public void testcheckForDeadlock() {
+ ddu = new DeadlockDetectionUtil();
+ ddu.setExisting("111", "222", DeadlockDetectionUtil.OwnershipType.ACQUIRED);
+ ddu.setExisting("333", "444", DeadlockDetectionUtil.OwnershipType.ACQUIRED);
+ assertEquals(false, ddu.checkForDeadlock("111", "444", DeadlockDetectionUtil.OwnershipType.CREATED));
+
+ ddu = new DeadlockDetectionUtil();
+ ddu.setExisting("111", "222", DeadlockDetectionUtil.OwnershipType.ACQUIRED);
+ ddu.setExisting("333", "444", DeadlockDetectionUtil.OwnershipType.ACQUIRED);
+ ddu.setExisting("333", "222", DeadlockDetectionUtil.OwnershipType.CREATED);
+ assertEquals(true, ddu.checkForDeadlock("111", "444", DeadlockDetectionUtil.OwnershipType.CREATED));
+ }
+}
diff --git a/music-core/src/test/java/org/onap/music/main/MusicCoreTest.java b/music-core/src/test/java/org/onap/music/main/MusicCoreTest.java
new file mode 100644
index 00000000..4714778b
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/main/MusicCoreTest.java
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * ============LICENSE_START========================================== org.onap.music
+ * =================================================================== Copyright (c) 2019 AT&T
+ * Intellectual Property ===================================================================
+ * 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.main;
+
+import static org.junit.Assert.assertEquals;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.ws.rs.core.MultivaluedMap;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.internal.util.reflection.FieldSetter;
+import org.onap.music.datastore.Condition;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonIndex;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonSelect;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.lockingservice.cassandra.MusicLockState;
+import org.onap.music.service.MusicCoreService;
+import com.datastax.driver.core.ResultSet;
+
+public class MusicCoreTest {
+
+ MusicCore mCore;
+ MusicCoreService musicCore;
+ CassaLockStore mLockHandle;
+
+ @Before
+ public void setup() {
+ mCore = new MusicCore();
+ musicCore = Mockito.mock(MusicCoreService.class);
+ mLockHandle = Mockito.mock(CassaLockStore.class);
+ try {
+ FieldSetter.setField(mCore, mCore.getClass().getDeclaredField("musicCore"), musicCore);
+ } catch (NoSuchFieldException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void testAcquireLock() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.acquireLock(Mockito.any(), Mockito.any())).thenReturn(returnType);
+ result = MusicCore.acquireLock("key1", "lockid1");
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testacquireLockWithLease() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.acquireLockWithLease(Mockito.anyString(), Mockito.anyString(), Mockito.anyLong()))
+ .thenReturn(returnType);
+ result = MusicCore.acquireLockWithLease("key1", "lockid1", 100L);
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testCreateLockReferenceAtomic() throws MusicLockingException {
+ String result = null;
+ Mockito.when(musicCore.createLockReferenceAtomic(Mockito.any())).thenReturn("lockreference1");
+ result = MusicCore.createLockReferenceAtomic("key2");
+ assertEquals("lockreference1", result);
+ }
+
+ @Test
+ public void testCreateLockReference() throws MusicLockingException {
+ String result = null;
+ Mockito.when(musicCore.createLockReference(Mockito.any(), Mockito.any())).thenReturn("lockreference2");
+ result = MusicCore.createLockReference("key3", "owner3");
+ assertEquals("lockreference2", result);
+ }
+
+ @Test
+ public void testCreateLockReferenceAtomic2() throws MusicLockingException {
+ String result = null;
+ Mockito.when(musicCore.createLockReferenceAtomic(Mockito.any(), Mockito.any())).thenReturn("lockreference3");
+ result = MusicCore.createLockReferenceAtomic("key4", LockType.READ);
+ assertEquals("lockreference3", result);
+ }
+
+ @Test
+ public void testCreateLockReference2() throws MusicLockingException {
+ String result = null;
+ Mockito.when(musicCore.createLockReference(Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn("lockreference4");
+ result = MusicCore.createLockReference("key4", LockType.READ, "owner4");
+ assertEquals("lockreference4", result);
+ }
+
+ @Test
+ public void testCreateTable() throws MusicServiceException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.createTable(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn(resultType);
+ result = MusicCore.createTable("keyspace1", "table1", new PreparedQueryObject(), "consistency");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testQuorumGet() {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Mockito.when(musicCore.quorumGet(Mockito.any())).thenReturn(rs);
+ assertEquals(rs, MusicCore.quorumGet(new PreparedQueryObject()));
+ }
+
+ @Test
+ public void testWhoseTurnIsIt() {
+ Mockito.when(musicCore.whoseTurnIsIt(Mockito.any())).thenReturn("turn");
+ assertEquals("turn", MusicCore.whoseTurnIsIt("key5"));
+ }
+
+ @Test
+ public void testGetCurrentLockHolders() {
+ List<String> result = Mockito.mock(List.class);
+ Mockito.when(musicCore.getCurrentLockHolders(Mockito.any())).thenReturn(result);
+ assertEquals(result, MusicCore.getCurrentLockHolders("key6"));
+ }
+
+ @Test
+ public void testPromoteLock() throws MusicLockingException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.promoteLock(Mockito.any())).thenReturn(returnType);
+ result = MusicCore.promoteLock("lockid2");
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testEventualPut() {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ Mockito.when(musicCore.eventualPut(Mockito.any())).thenReturn(returnType);
+ assertEquals(returnType, MusicCore.eventualPut(new PreparedQueryObject()));
+ }
+
+ @Test
+ public void testEventualPut_nb() {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ Mockito.when(musicCore.eventualPut_nb(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn(returnType);
+ assertEquals(returnType,
+ MusicCore.eventualPut_nb(new PreparedQueryObject(), "keyspace2", "table2", "primarykey1"));
+ }
+
+ @Test
+ public void testCriticalPut() {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ Mockito.when(musicCore.criticalPut(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(),
+ Mockito.any())).thenReturn(returnType);
+ assertEquals(returnType, MusicCore.criticalPut("keyspace3", "table3", "primarykey2", new PreparedQueryObject(),
+ "lockreference2", new Condition(new HashMap(), new PreparedQueryObject())));
+ }
+
+ @Test
+ public void testNonKeyRelatedPut() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.nonKeyRelatedPut(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.nonKeyRelatedPut(new PreparedQueryObject(), "consistency2");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testGet() throws MusicServiceException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.get(Mockito.any())).thenReturn(rs);
+ result = MusicCore.get(new PreparedQueryObject());
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testCriticalGet() throws MusicServiceException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.criticalGet(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn(rs);
+ result = MusicCore.criticalGet("keyspace4", "table4", "primarykey3", new PreparedQueryObject(),
+ "lockreference3");
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testAtomicPut() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.atomicPut(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn(returnType);
+ result = MusicCore.atomicPut("keyspace5", "table5", "primarykey4", new PreparedQueryObject(),
+ new Condition(new HashMap(), new PreparedQueryObject()));
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testAtomicGet() throws MusicServiceException, MusicLockingException, MusicQueryException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.atomicGet(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(rs);
+ result = MusicCore.atomicGet("keyspace5", "table5", "primarykey4", new PreparedQueryObject());
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testGetLockQueue() throws MusicServiceException, MusicQueryException, MusicLockingException {
+ List<String> result = Mockito.mock(List.class);
+ List<String> rst = null;
+ Mockito.when(musicCore.getLockQueue(Mockito.any())).thenReturn(result);
+ rst = MusicCore.getLockQueue("key5");
+ assertEquals(result, rst);
+ }
+
+ @Test
+ public void testGetLockQueueSize() throws MusicServiceException, MusicQueryException, MusicLockingException {
+ long result = 0L;
+ Mockito.when(musicCore.getLockQueueSize(Mockito.any())).thenReturn(100L);
+ result = MusicCore.getLockQueueSize("key6");
+ assertEquals(100L, result);
+ }
+
+ @Test
+ public void testatomicPutWithDeleteLock() throws MusicLockingException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.atomicPutWithDeleteLock(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(),
+ Mockito.any())).thenReturn(returnType);
+ result = MusicCore.atomicPutWithDeleteLock("keyspace5", "table5", "primarykey4", new PreparedQueryObject(),
+ new Condition(new HashMap(), new PreparedQueryObject()));
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testAtomicGetWithDeleteLock() throws MusicServiceException, MusicLockingException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.atomicGetWithDeleteLock(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
+ .thenReturn(rs);
+ result = MusicCore.atomicGetWithDeleteLock("keyspace5", "table5", "primarykey4", new PreparedQueryObject());
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testValidateLock() {
+ Map<String, Object> map = Mockito.mock(Map.class);
+ Mockito.when(musicCore.validateLock(Mockito.any())).thenReturn(map);
+ assertEquals(map, MusicCore.validateLock("lockname"));
+ }
+
+ @Test
+ public void testReleaseLock() throws MusicLockingException {
+ MusicLockState musicLockState = Mockito.mock(MusicLockState.class);
+ MusicLockState result = null;
+ Mockito.when(musicCore.releaseLock(Mockito.anyString(), Mockito.anyBoolean())).thenReturn(musicLockState);
+ result = MusicCore.releaseLock("lockid", true);
+ assertEquals(musicLockState, result);
+ }
+
+ @Test
+ public void testReleaseAllLocksForOwner() throws MusicLockingException, MusicServiceException, MusicQueryException {
+ List<String> result = Mockito.mock(List.class);
+ List<String> rst = null;
+ Mockito.when(musicCore.releaseAllLocksForOwner(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(result);
+ rst = MusicCore.releaseAllLocksForOwner("owner2", "keyspace6", "table6");
+ assertEquals(result, rst);
+ }
+
+ @Test
+ public void testCreateKeyspace() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.createKeyspace(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.createKeyspace(new JsonKeySpace(), "consistency3");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testDropKeyspace() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.dropKeyspace(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.dropKeyspace(new JsonKeySpace(), "consistency4");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testCreateTable2() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.createTable(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.createTable(new JsonTable(), "consistency5");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testDropTable() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.dropTable(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.dropTable(new JsonTable(), "consistency5");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testCreateIndex() throws MusicServiceException, MusicQueryException {
+ ResultType resultType = Mockito.mock(ResultType.class);
+ ResultType result = null;
+ Mockito.when(musicCore.createIndex(Mockito.any(), Mockito.any())).thenReturn(resultType);
+ result = MusicCore.createIndex(new JsonIndex("indexName", "keyspace7", "table7", "field"), "consistency6");
+ assertEquals(resultType, result);
+ }
+
+ @Test
+ public void testSelect() throws MusicServiceException, MusicQueryException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.select(Mockito.any(), Mockito.any())).thenReturn(rs);
+ MultivaluedMap<String, String> map = Mockito.mock(MultivaluedMap.class);
+ result = MusicCore.select(new JsonSelect(), map);
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testSelectCritical() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ ResultSet result = null;
+ Mockito.when(musicCore.selectCritical(Mockito.any(), Mockito.any())).thenReturn(rs);
+ MultivaluedMap<String, String> map = Mockito.mock(MultivaluedMap.class);
+ result = MusicCore.selectCritical(new JsonInsert(), map);
+ assertEquals(rs, result);
+ }
+
+ @Test
+ public void testInsertIntoTable() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.insertIntoTable(Mockito.any())).thenReturn(returnType);
+ result = MusicCore.insertIntoTable(new JsonInsert());
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testUpdateTable() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ Mockito.when(musicCore.updateTable(Mockito.any(), Mockito.any())).thenReturn(returnType);
+ MultivaluedMap<String, String> map = Mockito.mock(MultivaluedMap.class);
+ result = MusicCore.updateTable(new JsonUpdate(), map);
+ assertEquals(returnType, result);
+ }
+
+ @Test
+ public void testDeleteFromTable() throws MusicLockingException, MusicQueryException, MusicServiceException {
+ ReturnType returnType = Mockito.mock(ReturnType.class);
+ ReturnType result = null;
+ MultivaluedMap<String, String> map = Mockito.mock(MultivaluedMap.class);
+ Mockito.when(musicCore.deleteFromTable(Mockito.any(), Mockito.any())).thenReturn(returnType);
+ result = MusicCore.deleteFromTable(new JsonDelete(), map);
+ assertEquals(returnType, result);
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/ResultTypeTest.java b/music-core/src/test/java/org/onap/music/main/ResultTypeTest.java
index 012629e0..d6ccc1f1 100644
--- a/src/test/java/org/onap/music/unittests/ResultTypeTest.java
+++ b/music-core/src/test/java/org/onap/music/main/ResultTypeTest.java
@@ -20,11 +20,10 @@
* ====================================================================
*/
-package org.onap.music.unittests;
+package org.onap.music.main;
import static org.junit.Assert.*;
import org.junit.Test;
-import org.onap.music.main.ResultType;
public class ResultTypeTest {
diff --git a/src/test/java/org/onap/music/unittests/ReturnTypeTest.java b/music-core/src/test/java/org/onap/music/main/ReturnTypeTest.java
index 490020ac..fbb5f84d 100644
--- a/src/test/java/org/onap/music/unittests/ReturnTypeTest.java
+++ b/music-core/src/test/java/org/onap/music/main/ReturnTypeTest.java
@@ -20,7 +20,7 @@
* ====================================================================
*/
-package org.onap.music.unittests;
+package org.onap.music.main;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -28,8 +28,6 @@ import static org.junit.Assert.assertTrue;
import java.util.Map;
import org.junit.Test;
-import org.onap.music.main.ResultType;
-import org.onap.music.main.ReturnType;
public class ReturnTypeTest {
diff --git a/music-core/src/test/java/org/onap/music/service/impl/MusicCassaCoreTest.java b/music-core/src/test/java/org/onap/music/service/impl/MusicCassaCoreTest.java
new file mode 100644
index 00000000..33debfaa
--- /dev/null
+++ b/music-core/src/test/java/org/onap/music/service/impl/MusicCassaCoreTest.java
@@ -0,0 +1,485 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2018 AT&T Intellectual Property
+ * ===================================================================
+ * 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.service.impl;
+
+import static org.junit.Assert.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.lockingservice.cassandra.CassaLockStore.LockObject;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+
+@RunWith(MockitoJUnitRunner.class)
+public class MusicCassaCoreTest {
+
+ @Mock
+ private CassaLockStore mLockHandle;
+
+ @Mock
+ private MusicDataStore dsHandle;
+
+ @Mock
+ private Session session;
+
+ MusicCassaCore core;
+
+ @Before
+ public void before() {
+ core = MusicCassaCore.getInstance();
+ MusicCassaCore.setmLockHandle(mLockHandle);
+ MusicDataStoreHandle.setMDstoreHandle(dsHandle);
+ Mockito.when(dsHandle.getSession()).thenReturn(session);
+ }
+
+ @Test
+ public void testGetmLockHandle() {
+ assertEquals(mLockHandle, MusicCassaCore.getmLockHandle());
+ }
+
+ @Test
+ public void testSetmLockHandle() {
+ CassaLockStore m2 = Mockito.mock(CassaLockStore.class);
+ MusicCassaCore.setmLockHandle(m2);
+ assertEquals(m2, MusicCassaCore.getmLockHandle());
+ //revert back to original handle
+ MusicCassaCore.setmLockHandle(mLockHandle);
+ }
+
+ @Test
+ public void testGetInstance() {
+ assertEquals(core, MusicCassaCore.getInstance());
+ }
+
+ @Test
+ public void testGetLockingServiceHandle() {
+ assertEquals(mLockHandle, MusicCassaCore.getmLockHandle());
+ }
+
+ @Test
+ public void testCreateLockReferenceAtomicString() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ Mockito.when(mLockHandle.genLockRefandEnQueue("keyspace", "table", "lockName", LockType.WRITE, null))
+ .thenReturn("lockReturned");
+
+ String lockRef = core.createLockReferenceAtomic(fullyQualifiedKey);
+
+ Mockito.verify(mLockHandle).genLockRefandEnQueue("keyspace", "table", "lockName", LockType.WRITE, null);
+ assertEquals("lockReturned", lockRef);
+ }
+
+ @Test
+ public void testCreateLockReferenceStringString() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String owner = "owner1";
+ Mockito.when(mLockHandle.genLockRefandEnQueue("keyspace", "table", "lockName", LockType.WRITE, owner))
+ .thenReturn("lockReturned");
+
+ String lockRef = core.createLockReference(fullyQualifiedKey, owner);
+
+ Mockito.verify(mLockHandle).genLockRefandEnQueue("keyspace", "table", "lockName", LockType.WRITE, owner);
+ assertEquals("lockReturned", lockRef);
+ }
+
+ @Test
+ public void testCreateLockReferenceAtomicStringLockType() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ Mockito.when(mLockHandle.genLockRefandEnQueue("keyspace", "table", "lockName", LockType.READ, null))
+ .thenReturn("lockReturned");
+
+ String lockRef = core.createLockReferenceAtomic(fullyQualifiedKey, LockType.READ);
+
+ Mockito.verify(mLockHandle).genLockRefandEnQueue("keyspace", "table", "lockName", LockType.READ, null);
+ assertEquals("lockReturned", lockRef);
+ }
+
+ @Test
+ public void testCreateLockReferenceStringLockTypeString() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String owner = "owner1";
+ Mockito.when(mLockHandle.genLockRefandEnQueue("keyspace", "table", "lockName", LockType.READ, owner))
+ .thenReturn("lockReturned");
+
+ String lockRef = core.createLockReference(fullyQualifiedKey, LockType.READ, owner);
+
+ Mockito.verify(mLockHandle).genLockRefandEnQueue("keyspace", "table", "lockName", LockType.READ, owner);
+ assertEquals("lockReturned", lockRef);
+ }
+
+ @Test
+ public void testPromoteLock() throws Exception {
+ String lockId = "$keyspace.table.lockName$1";
+ Mockito.when(mLockHandle.promoteLock("keyspace", "table", "lockName", "1"))
+ .thenReturn(new ReturnType(ResultType.SUCCESS, "Lock Promoted"));
+
+ ReturnType rt = core.promoteLock(lockId);
+ assertEquals(ResultType.SUCCESS, rt.getResult());
+ assertEquals("Lock Promoted", rt.getMessage());
+ }
+
+ @Test
+ public void testAcquireLockWithLease() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String lockId = "$keyspace.table.lockName$1";
+ long leasePeriod = 1000;
+ String currTime = String.valueOf(System.currentTimeMillis());
+ Mockito.when(mLockHandle.peekLockQueue("keyspace", "table", "lockName"))
+ .thenReturn(mLockHandle.new LockObject(true, lockId, currTime, currTime, LockType.WRITE, null));
+ Mockito.when(mLockHandle.getLockInfo("keyspace", "table", "lockName", "1"))
+ .thenReturn(mLockHandle.new LockObject(false, lockId, null, null, LockType.WRITE, null));
+
+ ReturnType rt = core.acquireLockWithLease(fullyQualifiedKey, lockId, leasePeriod);
+ assertEquals(ResultType.FAILURE, rt.getResult());
+ }
+
+ @Test
+ public void testAcquireLock() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String lockId = "$keyspace.table.lockName$1";
+ Mockito.when(mLockHandle.getLockInfo("keyspace", "table", "lockName", "1"))
+ .thenReturn(mLockHandle.new LockObject(false, lockId, null, null, LockType.WRITE, null));
+
+ ReturnType rt = core.acquireLock(fullyQualifiedKey, lockId);
+
+ assertEquals(ResultType.FAILURE, rt.getResult());
+ Mockito.verify(mLockHandle).getLockInfo("keyspace", "table", "lockName", "1");
+ /*TODO: if we successfully acquire the lock we hit an error by trying to read MusicDatastoreHandle */
+ }
+
+ @Test
+ public void testWhoseTurnIsIt() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ Mockito.when(mLockHandle.peekLockQueue("keyspace", "table", "lockName"))
+ .thenReturn(mLockHandle.new LockObject(true, "1", "", "", LockType.WRITE, null));
+
+ String topOfQ = core.whoseTurnIsIt(fullyQualifiedKey);
+ System.out.println(topOfQ);
+
+ assertEquals("$"+fullyQualifiedKey+"$1", topOfQ);
+ }
+
+ @Test
+ public void testGetCurrentLockHolders() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ List<String> currentHolders = new ArrayList<>();
+ currentHolders.add("$"+fullyQualifiedKey+"$1");
+ currentHolders.add("$"+fullyQualifiedKey+"$2");
+ Mockito.when(mLockHandle.getCurrentLockHolders("keyspace", "table", "lockName"))
+ .thenReturn(currentHolders);
+
+ List<String> holders = core.getCurrentLockHolders(fullyQualifiedKey);
+
+ assertTrue(currentHolders.containsAll(holders) && holders.containsAll(currentHolders));
+ }
+
+ @Test
+ public void testGetLockNameFromId() {
+ String lockId = "$keyspace.table.lockName$1";
+ assertEquals("keyspace.table.lockName", core.getLockNameFromId(lockId));
+ }
+
+ @Test
+ public void testDestroyLockRefString() throws Exception {
+ String lockId = "$keyspace.table.lockName$1";
+
+ core.destroyLockRef(lockId);
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "1", MusicUtil.getRetryCount());
+ }
+
+ @Test
+ public void testDestroyLockRefStringString() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String lockReference = "1";
+
+ core.destroyLockRef(fullyQualifiedKey, lockReference);
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "1", MusicUtil.getRetryCount());
+ }
+
+ @Test
+ public void testReleaseLock() throws Exception {
+ String lockId = "$keyspace.table.lockName$1";
+
+ core.releaseLock(lockId, true);
+
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "1", MusicUtil.getRetryCount());
+ }
+
+ @Test
+ public void testVoluntaryReleaseLock() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ String lockReference = "1";
+
+ core.voluntaryReleaseLock(fullyQualifiedKey, lockReference);
+
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "1", MusicUtil.getRetryCount());
+ }
+
+ @Test
+ public void testReleaseAllLocksForOwner() throws Exception {
+ List<String> ownersLocks = new ArrayList<>();
+ ownersLocks.add("lockName$1");
+ ownersLocks.add("lockName$2");
+ Mockito.when(mLockHandle.getAllLocksForOwner("ownerId", "keyspace", "table"))
+ .thenReturn(ownersLocks);
+
+ List<String> locksReleased = core.releaseAllLocksForOwner("ownerId", "keyspace", "table");
+
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "1", MusicUtil.getRetryCount());
+ Mockito.verify(mLockHandle).deQueueLockRef("keyspace", "table", "lockName", "2", MusicUtil.getRetryCount());
+ assertTrue(ownersLocks.containsAll(locksReleased) && locksReleased.containsAll(ownersLocks));
+ }
+
+
+ @Test
+ public void testValidateLock() {
+ String lockId = "$keyspace.table.lockName$1";
+
+ assertFalse(core.validateLock(lockId).containsKey("Error"));
+ }
+
+ @Test
+ public void testGetLockQueue() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ List<String> myList = new ArrayList<>();
+ Mockito.when(mLockHandle.getLockQueue("keyspace", "table", "lockName"))
+ .thenReturn(myList);
+ List<String> theirList = core.getLockQueue(fullyQualifiedKey);
+
+ assertEquals(myList, theirList);
+ }
+
+ @Test
+ public void testGetLockQueueSize() throws Exception {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ Mockito.when(mLockHandle.getLockQueueSize("keyspace", "table", "lockName"))
+ .thenReturn((long) 23);
+ long theirSize = core.getLockQueueSize(fullyQualifiedKey);
+
+ assertEquals(23, theirSize);
+ }
+
+ @Test
+ public void testCreateTable() throws MusicServiceException, MusicQueryException {
+ String keyspaceName = "keyspace";
+ String tableName = "table";
+ JsonTable table = new JsonTable();
+ table.setTableName(tableName);
+ table.setKeyspaceName(keyspaceName);
+ Map<String, String> fields = new HashMap<>();
+ fields.put("employee", "text");
+ fields.put("salary", "int");
+ table.setFields(fields);
+ table.setPrimaryKey("employee");
+
+ Mockito.when(mLockHandle.createLockQueue(Mockito.matches(keyspaceName), Mockito.matches(tableName)))
+ .thenReturn(true);
+ Mockito.when(dsHandle.executePut(Mockito.any(PreparedQueryObject.class), Mockito.matches("eventual"))).thenReturn(true);
+ ResultType rs = core.createTable(table , "eventual");
+
+ assertEquals(ResultType.SUCCESS, rs);
+ }
+
+ @Test
+ public void testDropTable() throws MusicServiceException, MusicQueryException {
+ String keyspaceName = "keyspace";
+ String tableName = "table";
+ JsonTable table = new JsonTable();
+ table.setTableName(tableName);
+ table.setKeyspaceName(keyspaceName);
+
+ ArgumentCaptor<PreparedQueryObject> queryCaptor = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.when(dsHandle.executePut(queryCaptor.capture(), Mockito.matches("eventual"))).thenReturn(true);
+
+ ResultType rs = core.dropTable(table, "eventual");
+ assertEquals(ResultType.SUCCESS, rs);
+ assertEquals("DROP TABLE keyspace.table;", queryCaptor.getValue().getQuery());
+ }
+
+ @Test
+ public void testQuorumGet() throws MusicServiceException, MusicQueryException {
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM EMPLOYEES;");
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Mockito.when(dsHandle.executeQuorumConsistencyGet(Mockito.same(query))).thenReturn(rs);
+ ResultSet returnedRs = core.quorumGet(query);
+
+ assertEquals(rs, returnedRs);
+ }
+
+ @Test
+ public void testForciblyReleaseLock() throws MusicServiceException, MusicQueryException, MusicLockingException {
+ String fullyQualifiedKey = "keyspace.table.lockName";
+ ArgumentCaptor<PreparedQueryObject> unsyncedQuery = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.doReturn(true).when(dsHandle).executePut(unsyncedQuery.capture(), Mockito.matches("critical"));
+ core.forciblyReleaseLock(fullyQualifiedKey, "123");
+
+ assertEquals("insert into keyspace.unsyncedKeys_table (key) values (?);",unsyncedQuery.getValue().getQuery());
+ }
+
+ @Test
+ public void testEventualPut() throws MusicServiceException, MusicQueryException {
+ PreparedQueryObject query = new PreparedQueryObject("INSERT INTO EMPLOYEES VALUES ('John', 1);");
+ Mockito.when(dsHandle.executePut(Mockito.same(query), Mockito.matches("eventual"))).thenReturn(true);
+
+ assertEquals(ResultType.SUCCESS, core.eventualPut(query).getResult());
+ }
+
+ @Test
+ public void testEventualPutNB() throws MusicServiceException, MusicQueryException {
+ String keyspace = "keyspace";
+ String table = "EMPLOYEES";
+ String primaryKey = "NAME";
+ PreparedQueryObject query = new PreparedQueryObject("INSERT INTO EMPLOYEES VALUES ('John', 1);");
+
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Row row = Mockito.mock(Row.class);
+ Mockito.when(dsHandle.executeQuorumConsistencyGet(queryCapture.capture())).thenReturn(rs);
+ Mockito.when(rs.one()).thenReturn(row);
+
+ Mockito.when(dsHandle.executePut(queryCapture.capture(), Mockito.matches("eventual"))).thenReturn(true);
+
+ ReturnType rt = core.eventualPut_nb(query, keyspace, table, primaryKey);
+
+ assertEquals("SELECT guard FROM keyspace.lockq_EMPLOYEES WHERE key = ? ;",
+ queryCapture.getAllValues().get(0).getQuery());
+ assertEquals("INSERT INTO EMPLOYEES VALUES ('John', 1);", queryCapture.getAllValues().get(1).getQuery());
+
+ assertEquals(ResultType.SUCCESS, rt.getResult());
+ }
+
+ @Test
+ public void testCriticalPut() throws MusicServiceException, MusicQueryException {
+ String keyspace = "keyspace";
+ String table = "table";
+ String primaryKey = "lockName";
+ PreparedQueryObject query = new PreparedQueryObject("INSERT INTO TABLE VALUES ('John', 1);");
+ String lockId = "$keyspace.table.lockName$1";
+
+ Mockito.when(mLockHandle.getLockInfo("keyspace", "table", "lockName", "1"))
+ .thenReturn(mLockHandle.new LockObject(true, lockId, null, null, LockType.WRITE, null));
+
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.when(dsHandle.executePut(queryCapture.capture(), Mockito.matches("critical"))).thenReturn(true);
+ ReturnType rt = core.criticalPut(keyspace, table, primaryKey, query, lockId, null);
+
+ assertEquals(true, queryCapture.getValue().getQuery()
+ .startsWith("INSERT INTO TABLE VALUES ('John', 1) USING TIMESTAMP"));
+ assertEquals(ResultType.SUCCESS, rt.getResult());
+ }
+
+ @Test
+ public void testNonKeyRelatedPut() throws MusicServiceException, MusicQueryException {
+ PreparedQueryObject query = new PreparedQueryObject("INSERT INTO TABLE VALUES ('John', 1);");
+ String consistency = "eventual";
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.when(dsHandle.executePut(queryCapture.capture(), Mockito.matches(consistency))).thenReturn(true);
+
+ core.nonKeyRelatedPut(query, consistency);
+
+ assertEquals(query.getQuery(), queryCapture.getValue().getQuery());
+ }
+
+ @Test
+ public void testGet() throws MusicServiceException, MusicQueryException {
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM EMPLOYEES;");
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Mockito.when(dsHandle.executeOneConsistencyGet(Mockito.same(query))).thenReturn(rs);
+ assertEquals(rs, core.get(query));
+ }
+
+ @Test
+ public void testCriticalGet() throws MusicServiceException, MusicQueryException {
+ String keyspace = "keyspace";
+ String table = "table";
+ String primaryKey = "lockName";
+ PreparedQueryObject query = new PreparedQueryObject("SELECT * FROM EMPLOYEES WHERE LOCKNAME='lockName';");
+ String lockId = "$keyspace.table.lockName$1";
+
+ Mockito.when(mLockHandle.getLockInfo("keyspace", "table", "lockName", "1"))
+ .thenReturn(mLockHandle.new LockObject(true, lockId, null, null, LockType.WRITE, null));
+
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ ResultSet rs = Mockito.mock(ResultSet.class);
+ Mockito.when(dsHandle.executeQuorumConsistencyGet(queryCapture.capture())).thenReturn(rs);
+ assertEquals(rs, core.criticalGet(keyspace, table, primaryKey, query, lockId));
+ }
+
+ @Test
+ public void testCreateKeyspace() throws MusicServiceException, MusicQueryException {
+ String keyspace = "cycling";
+ JsonKeySpace ks = new JsonKeySpace();
+ ks.setKeyspaceName(keyspace);
+ ks.setDurabilityOfWrites("true");
+
+ Map<String, Object> replicationInfo = new HashMap<>();
+ replicationInfo.put("class", "SimpleStrategy");
+ replicationInfo.put("replication_factor", 1);
+ ks.setReplicationInfo(replicationInfo);
+ Map<String, String> consistencyInfo = new HashMap<>();
+ consistencyInfo.put("consistency", "quorum");
+ ks.setConsistencyInfo(consistencyInfo);
+
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.when(dsHandle.executePut(queryCapture.capture(), Mockito.matches("eventual"))).thenReturn(true);
+
+ core.createKeyspace(ks , "eventual");
+
+ assertEquals("CREATE KEYSPACE cycling WITH replication = {'replication_factor':1,'class':'SimpleStrategy'} AND durable_writes = true;",
+ queryCapture.getValue().getQuery());
+ }
+
+ @Test
+ public void testDropKeyspace() throws MusicServiceException, MusicQueryException {
+ String keyspace = "cycling";
+ JsonKeySpace ks = new JsonKeySpace();
+ ks.setKeyspaceName(keyspace);
+
+ ArgumentCaptor<PreparedQueryObject> queryCapture = ArgumentCaptor.forClass(PreparedQueryObject.class);
+ Mockito.when(dsHandle.executePut(queryCapture.capture(), Mockito.matches("eventual"))).thenReturn(true);
+
+ core.dropKeyspace(ks , "eventual");
+
+ assertEquals("DROP KEYSPACE cycling;", queryCapture.getValue().getQuery());
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java
index 7f6af4c5..7f6af4c5 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java
+++ b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/JSONObjectTest.java
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java
index 0014093d..b7dfa075 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java
+++ b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/JsonLeasedLockTest.java
@@ -44,11 +44,4 @@ public class JsonLeasedLockTest {
assertEquals(lease,jl.getLeasePeriod());
}
- @Test
- public void testGetNotifyUrl() {
- String url = "http://somewhere.com";
- jl.setNotifyUrl(url);
- assertEquals(url,jl.getNotifyUrl());
- }
-
}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java
index ceda3f3a..ceda3f3a 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java
+++ b/music-core/src/test/java/org/onap/music/unittests/jsonobjects/MusicHealthCheckTest.java
diff --git a/music-core/src/test/resources/LICENSE.txt b/music-core/src/test/resources/LICENSE.txt
new file mode 100644
index 00000000..cc6cdea5
--- /dev/null
+++ b/music-core/src/test/resources/LICENSE.txt
@@ -0,0 +1,24 @@
+
+The following license applies to all files in this and sub-directories. Licenses
+are included in individual source files where appropriate, and if it differs
+from this text, it supersedes this. Any file that does not have license text
+defaults to being covered by this text; not all files support the addition of
+licenses.
+#
+# -------------------------------------------------------------------------
+# Copyright (c) 2017 AT&T Intellectual Property
+#
+# 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.
+#
+# -------------------------------------------------------------------------
+# \ No newline at end of file
diff --git a/music-core/src/test/resources/Resources.properties b/music-core/src/test/resources/Resources.properties
new file mode 100644
index 00000000..72269cb8
--- /dev/null
+++ b/music-core/src/test/resources/Resources.properties
@@ -0,0 +1,50 @@
+#============LICENSE_START==========================================
+#org.onap.music
+#===================================================================
+# Copyright (c) 2017 AT&T Intellectual Property
+#===================================================================
+# 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=============================================
+#====================================================================
+#Resource key=Error Code|Message text|Resolution text |Description text
+LOADING_DEFAULT_LOG_CONFIGURATION=\
+ EELF0001I|\
+ Loading default logging configuration from system resource file "{0}"|\
+ No external logging configurations were defined or found, So verify the default logging configuration from system resource file (../logback.xml). |\
+ Loading default logging configuration from system resource file
+LOADING_LOG_CONFIGURATION=EELF0002I|\
+ Loading logging configuration from file "{0}"|\
+ Verify the correct logging configuration file is loaded. |\
+ Loading logging configuration for specific file
+LOGGING_ALREADY_INITIALIZED=\
+ EELF0003W|\
+ Logging has already been initialized, check the container logging definitions to ensure they represent your desired logging configuration.|\
+ Verify the container logging definitions to ensure they represent your desired logging configuration. |\
+ Logging has already been initialized, check the container logging definitions to ensure they represent your desired logging configuration.
+NO_LOG_CONFIGURATION=\
+ EELF0004E|\
+ No log configuration could be found or defaulted!|\
+ No external and default logging configuration file. |\
+ No log configuration could be found or defaulted!
+SEARCHING_LOG_CONFIGURATION=\
+ EELF0005I|\
+ Searching path "{0}" for log configuration file "{1}"|\
+ Verify the correct Path({user.home};etc;../etc) and filename (eelf.logging.file).|\
+ Searching path for specific log configuration file.
+UNSUPPORTED_LOGGING_FRAMEWORK=\
+ EELF0006E|\
+ An unsupported logging framework is bound to SLF4J. |\
+ Verify your logging frameworks.|\
+ An unsupported logging framework is bound to SLF4J.
+
diff --git a/src/main/resources/application.properties b/music-core/src/test/resources/application.properties
index 02e9c1a9..02e9c1a9 100755..100644
--- a/src/main/resources/application.properties
+++ b/music-core/src/test/resources/application.properties
diff --git a/src/main/resources/cache.ccf b/music-core/src/test/resources/cache.ccf
index e152ee8b..e152ee8b 100644
--- a/src/main/resources/cache.ccf
+++ b/music-core/src/test/resources/cache.ccf
diff --git a/src/main/resources/logback.xml b/music-core/src/test/resources/logback.xml
index 6bc5fd5e..6bc5fd5e 100644
--- a/src/main/resources/logback.xml
+++ b/music-core/src/test/resources/logback.xml
diff --git a/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/music-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
index 1f0955d4..1f0955d4 100644
--- a/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
+++ b/music-core/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
diff --git a/src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider b/music-core/src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider
index bc2f0992..bc2f0992 100644
--- a/src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider
+++ b/music-core/src/test/resources/mockito-extensions/org.mockito.plugins.StackTraceCleanerProvider
diff --git a/src/main/resources/project.properties b/music-core/src/test/resources/project.properties
index 199afa33..199afa33 100644
--- a/src/main/resources/project.properties
+++ b/music-core/src/test/resources/project.properties
diff --git a/distribution/README.md b/music-rest/distribution/README.md
index 8b137891..8b137891 100644
--- a/distribution/README.md
+++ b/music-rest/distribution/README.md
diff --git a/distribution/cassandra/Dockerfile b/music-rest/distribution/cassandra/Dockerfile
index fe13322c..fe13322c 100644
--- a/distribution/cassandra/Dockerfile
+++ b/music-rest/distribution/cassandra/Dockerfile
diff --git a/distribution/cassandra/cassandra.yaml b/music-rest/distribution/cassandra/cassandra.yaml
index fa7c74a6..fa7c74a6 100644
--- a/distribution/cassandra/cassandra.yaml
+++ b/music-rest/distribution/cassandra/cassandra.yaml
diff --git a/distribution/cassandra/docker-entrypoint.sh b/music-rest/distribution/cassandra/docker-entrypoint.sh
index a42d498e..34825bd2 100644
--- a/distribution/cassandra/docker-entrypoint.sh
+++ b/music-rest/distribution/cassandra/docker-entrypoint.sh
@@ -4,13 +4,13 @@ set -e
# first arg is `-f` or `--some-option`
# or there are no args
if [ "$#" -eq 0 ] || [ "${1#-}" != "$1" ]; then
- set -- cassandra -f "$@"
+ set -- cassandra -f "$@"
fi
# allow the container to be started with `--user`
if [ "$1" = 'cassandra' -a "$(id -u)" = '0' ]; then
- chown -R cassandra /var/lib/cassandra /var/log/cassandra "$CASSANDRA_CONFIG"
- exec gosu cassandra "$BASH_SOURCE" "$@"
+ chown -R cassandra /var/lib/cassandra /var/log/cassandra "$CASSANDRA_CONFIG"
+ exec gosu cassandra "$BASH_SOURCE" "$@"
fi
_ip_address() {
@@ -33,45 +33,17 @@ if [ "$1" = 'cassandra' ]; then
CASSANDRA_LISTEN_ADDRESS="$(_ip_address)"
fi
- : ${CASSANDRA_BROADCAST_ADDRESS="$CASSANDRA_LISTEN_ADDRESS"}
+echo "#############################################"
+echo "############## Update music.cql #############"
+echo "#############################################"
if [ "$CASSANDRA_BROADCAST_ADDRESS" = 'auto' ]; then
CASSANDRA_BROADCAST_ADDRESS="$(_ip_address)"
fi
- : ${CASSANDRA_BROADCAST_RPC_ADDRESS:=$CASSANDRA_BROADCAST_ADDRESS}
-
- if [ -n "${CASSANDRA_NAME:+1}" ]; then
- : ${CASSANDRA_SEEDS:="cassandra"}
+ if [ "${MUSIC_REPLICATION_FACTOR}" ]; then
+ sed -ri 's/REPLICATION_FACTOR/'${MUSIC_REPLICATION_FACTOR}'/' "$f"
fi
- : ${CASSANDRA_SEEDS:="$CASSANDRA_BROADCAST_ADDRESS"}
-
- sed -ri 's/(- seeds:).*/\1 "'"$CASSANDRA_SEEDS"'"/' "$CASSANDRA_CONFIG/cassandra.yaml"
-
- for yaml in \
- broadcast_address \
- broadcast_rpc_address \
- cluster_name \
- endpoint_snitch \
- listen_address \
- num_tokens \
- rpc_address \
- start_rpc \
- ; do
- var="CASSANDRA_${yaml^^}"
- val="${!var}"
- if [ "$val" ]; then
- sed -ri 's/^(# )?('"$yaml"':).*/\2 '"$val"'/' "$CASSANDRA_CONFIG/cassandra.yaml"
- fi
- done
-
- for rackdc in dc rack; do
- var="CASSANDRA_${rackdc^^}"
- val="${!var}"
- if [ "$val" ]; then
- sed -ri 's/^('"$rackdc"'=).*/\1 '"$val"'/' "$CASSANDRA_CONFIG/cassandra-rackdc.properties"
- fi
- done
-fi
+done
echo "#############################################"
echo "############## Update music.cql #############"
diff --git a/music-rest/distribution/cassandra_job/Dockerfile b/music-rest/distribution/cassandra_job/Dockerfile
new file mode 100644
index 00000000..937afdee
--- /dev/null
+++ b/music-rest/distribution/cassandra_job/Dockerfile
@@ -0,0 +1,30 @@
+#
+# ============LICENSE_START==========================================
+# org.onap.music
+# ===================================================================
+# Copyright (c) 2019 AT&T Intellectual Property
+# ===================================================================
+# 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=============================================
+# ====================================================================
+
+#registry.hub.docker.com/
+FROM library/cassandra:3.11
+ENV DEF_USER=cassandra
+ENV DEF_PASS=cassandra
+COPY runcql.sh /
+RUN mkdir -p cql/extra && \
+ chmod 755 runcql.sh && \
+ chown cassandra runcql.sh
+CMD ["/runcql.sh"]
diff --git a/distribution/cassandra_job/admin.cql b/music-rest/distribution/cassandra_job/admin.cql
index 904a2bab..904a2bab 100644
--- a/distribution/cassandra_job/admin.cql
+++ b/music-rest/distribution/cassandra_job/admin.cql
diff --git a/distribution/cassandra_job/admin_pw.cql b/music-rest/distribution/cassandra_job/admin_pw.cql
index bbad8d1d..bbad8d1d 100644
--- a/distribution/cassandra_job/admin_pw.cql
+++ b/music-rest/distribution/cassandra_job/admin_pw.cql
diff --git a/distribution/cassandra_job/runcql.sh b/music-rest/distribution/cassandra_job/runcql.sh
index 2ffd5f2f..89396bfc 100644
--- a/distribution/cassandra_job/runcql.sh
+++ b/music-rest/distribution/cassandra_job/runcql.sh
@@ -1,4 +1,25 @@
#! /bin/bash
+#
+# ============LICENSE_START==========================================
+# org.onap.music
+# ===================================================================
+# Copyright (c) 2019 AT&T Intellectual Property
+# ===================================================================
+# 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=============================================
+# ====================================================================
+
if [ -z "$TIMEOUT" ]; then
TIMEOUT=10;
fi
diff --git a/distribution/cassandra_job/test.cql b/music-rest/distribution/cassandra_job/test.cql
index 196fea22..196fea22 100644
--- a/distribution/cassandra_job/test.cql
+++ b/music-rest/distribution/cassandra_job/test.cql
diff --git a/music-rest/distribution/music/Dockerfile b/music-rest/distribution/music/Dockerfile
new file mode 100644
index 00000000..9868ceee
--- /dev/null
+++ b/music-rest/distribution/music/Dockerfile
@@ -0,0 +1,35 @@
+#
+# ============LICENSE_START==========================================
+# org.onap.music
+# ===================================================================
+# Copyright (c) 2019 AT&T Intellectual Property
+# ===================================================================
+# 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=============================================
+# ====================================================================
+
+FROM openjdk:8
+LABEL purpose="Springboot for MUSIC"
+RUN apt-get update && apt-get install -y netcat telnet vim vim-common curl
+RUN groupadd --gid 1000 music && useradd --gid 1000 --uid 1000 music
+RUN mkdir -p /opt/app/music/logs/MUSIC
+COPY MUSIC-SB.jar /opt/app/music
+COPY startup.sh /opt/app/music
+RUN mkdir -p /opt/app/music/logs && \
+ mkdir -p /opt/app/music/etc && \
+ chown -R music:music /opt/app/music/ && \
+ chmod 755 /opt/app/music/startup.sh
+USER music:music
+WORKDIR /opt/app/music
+CMD ["/opt/app/music/startup.sh"]
diff --git a/music-rest/distribution/music/startup.sh b/music-rest/distribution/music/startup.sh
new file mode 100644
index 00000000..98b3ae09
--- /dev/null
+++ b/music-rest/distribution/music/startup.sh
@@ -0,0 +1,68 @@
+#!/bin/bash
+#
+# ============LICENSE_START==========================================
+# org.onap.music
+# ===================================================================
+# Copyright (c) 2019 AT&T Intellectual Property
+# ===================================================================
+# 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=============================================
+# ====================================================================
+
+echo "Running startup script to get password from certman"
+PWFILE=/opt/app/aafcertman/.password
+LOGFILE=/opt/app/music/logs/MUSIC/music-sb.log
+PROPS=/opt/app/music/etc/music-sb.properties
+LOGBACK=/opt/app/music/etc/logback.xml
+LOGGING=
+DEBUG_PROP=
+# Debug Setup. Uses env variables
+# DEBUG and DEBUG_PORT
+# DEBUG=true/false | DEBUG_PORT=<Port valie must be integer>
+if [ "${DEBUG}" == "true" ]; then
+ if [ "${DEBUG_PORT}" == "" ]; then
+ DEBUG_PORT=8000
+ fi
+ echo "Debug mode on"
+ DEBUG_PROP="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=${DEBUG_PORT},suspend=n"
+fi
+
+# LOGBACK file: if /opt/app/music/etc/logback.xml exists thenuse that.
+if [ -f $LOGBACK ]; then
+ LOGGING="--logging.config=file:${LOGBACK}"
+fi
+
+# Get Passwords from /opt/app/aafcertman
+if [ -f $PWFILE ]; then
+ echo "Found ${PWFILE}" >> $LOGFILE
+ PASSWORD=$(cat ${PWFILE})
+ echo "#### Using Password from ${PWFILE} for Certs" >> ${LOGFILE}
+else
+ PASSWORD=changeit
+ echo "#### Using Default Password for Certs" >> ${LOGFILE}
+fi
+
+# If music-sb.properties exists in /opt/app/music/etc then use that to override the application.properties
+if [ -f $PROPS ]; then
+ # Run with different Property file
+ #echo "java ${DEBUG_PROP} -jar MUSIC.jar --spring.config.location=file:${PROPS} ${LOGGING} 2>&1 | tee ${LOGFILE}"
+ java ${DEBUG_PROP} ${JAVA_OPTS} -jar MUSIC-SB.jar ${SPRING_OPTS} --spring.config.location=file:${PROPS} ${LOGGING} 2>&1 | tee ${LOGFILE}
+else
+ #echo "java ${DEBUG_PROP} -jar MUSIC.jar --server.ssl.key-store-password=${PASSWORD} ${LOGGING} 2>&1 | tee ${LOGFILE}"
+ java ${DEBUG_PROP} ${JAVA_OPTS} -jar MUSIC-SB.jar ${SPRING_OPTS} --server.ssl.key-store-password="${PASSWORD}" ${LOGGING} 2>&1 | tee ${LOGFILE}
+fi
+
+
+
+
diff --git a/music-rest/pom.xml b/music-rest/pom.xml
new file mode 100755
index 00000000..9bcfd396
--- /dev/null
+++ b/music-rest/pom.xml
@@ -0,0 +1,385 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START==========================================
+ org.onap.music
+ ===================================================================
+ Copyright (c) 2017 AT&T Intellectual Property
+ ===================================================================
+ Modifications Copyright (c) 2019 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=============================================
+ ====================================================================
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.onap.music</groupId>
+ <artifactId>MUSIC-rest</artifactId>
+ <packaging>jar</packaging>
+ <version>3.2.40-SNAPSHOT</version>
+ <description>
+ This is the MUSIC Spring-based REST service.
+ </description>
+ <name>music-rest</name>
+
+ <parent>
+ <groupId>org.onap.music</groupId>
+ <artifactId>MUSIC</artifactId>
+ <version>3.2.40-SNAPSHOT</version>
+ </parent>
+
+ <properties>
+ <start-class>org.onap.music.MusicApplication</start-class>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <java.version>1.8</java.version>
+ <jersey1.version>1.19</jersey1.version>
+ <jersey2.version>2.25.1</jersey2.version>
+ <jaxrs.version>2.0.1</jaxrs.version>
+
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <!--nexus -->
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <onap.nexus.url>https://nexus.onap.org</onap.nexus.url>
+ <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
+ <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
+ <stagingNexusPath>/content/repositories/staging/</stagingNexusPath>
+ <sitePath>/content/sites/site/org/onap/music/${project.version}</sitePath>
+ <!--maven -->
+ <timestamp>${maven.build.timestamp}</timestamp>
+ <maven.build.timestamp.format>yyyy.MM.dd.HH.mm</maven.build.timestamp.format>
+ <!--skip checkstyle -->
+ <maven.check.skip>false</maven.check.skip>
+ <!--docker -->
+ <docker.tag>${project.version}-${timestamp}</docker.tag>
+ <docker.latest.tag>${project.version}-latest</docker.latest.tag>
+ <maven.compiler.source>1.8</maven.compiler.source>
+ <maven.compiler.target>1.8</maven.compiler.target>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-dependencies</artifactId>
+ <version>2.1.1.RELEASE</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-cassandra</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-jersey</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-aop</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-autoconfigure</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.aspectj</groupId>
+ <artifactId>aspectjweaver</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <!-- Springboot -->
+ <dependency>
+ <groupId>org.onap.music</groupId>
+ <artifactId>MUSIC-core</artifactId>
+ <version>3.2.40-SNAPSHOT</version>
+ </dependency>
+ <!-- Jersey -->
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-client</artifactId>
+ <version>${jersey1.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-server</artifactId>
+ <version>${jersey1.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-json</artifactId>
+ <version>${jersey1.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-jaxrs</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-servlet</artifactId>
+ <version>${jersey1.version}</version>
+ </dependency>
+ <!-- /Jersey -->
+ <!-- Testing -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit-spring</artifactId>
+ <version>3.5.0.1</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>io.dropwizard.metrics</groupId>
+ <artifactId>metrics-core</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.addthis.metrics</groupId>
+ <artifactId>reporter-config-base</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.cassandraunit</groupId>
+ <artifactId>cassandra-unit-shaded</artifactId>
+ <version>3.5.0.1</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-core</artifactId>
+ <version>2.23.4</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- /Testing -->
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ <version>2.1.1.RELEASE</version>
+ <configuration>
+ <mainClass>org.onap.music.MusicApplication</mainClass>
+ <outputDirectory>${project.basedir}/distribution/music/</outputDirectory>
+ <addResources>true</addResources>
+ <finalName>MUSIC-SB</finalName>
+ <excludes>
+ <exclude>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>jsr311-api</artifactId>
+ </exclude>
+ </excludes>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>repackage</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
+ <plugins>
+ <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
+ <plugin>
+ <artifactId>maven-clean-plugin</artifactId>
+ <version>3.1.0</version>
+ </plugin>
+ <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
+ <plugin>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>3.0.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.8.0</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.22.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>3.0.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-install-plugin</artifactId>
+ <version>2.5.2</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8.2</version>
+ </plugin>
+ <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
+ <plugin>
+ <artifactId>maven-site-plugin</artifactId>
+ <version>3.7.1</version>
+ </plugin>
+ <plugin>
+ <artifactId>maven-project-info-reports-plugin</artifactId>
+ <version>3.0.0</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+ <profiles>
+ <profile>
+ <id>docker</id>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.19.1</version>
+ <configuration>
+ <verbose>true</verbose>
+ <apiVersion>1.23</apiVersion>
+ <registry>nexus3.onap.org:10003</registry>
+ <images>
+ <!-- MUSIC War -->
+ <image>
+ <name>onap/music/music_sb</name>
+ <alias>docker_music</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>${docker.tag}</tag>
+ <tag>${docker.latest.tag}</tag>
+ </tags>
+ <dockerFileDir>${project.basedir}/distribution/music</dockerFileDir>
+ </build>
+ </image>
+ <!-- Cassandra -->
+ <image>
+ <name>onap/music/cassandra_3_11</name>
+ <alias>docker_cassandra_sec</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>${docker.tag}</tag>
+ <tag>${docker.latest.tag}</tag>
+ </tags>
+ <dockerFileDir>${project.basedir}/distribution/cassandra</dockerFileDir>
+ </build>
+ </image>
+ <!-- Cassandra Job -->
+ <image>
+ <name>onap/music/cassandra_job</name>
+ <alias>docker_cassandra_job</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>${docker.tag}</tag>
+ <tag>${docker.latest.tag}</tag>
+ </tags>
+ <dockerFileDir>${project.basedir}/distribution/cassandra_job</dockerFileDir>
+ </build>
+ </image>
+ </images>
+ </configuration>
+ <executions>
+ <execution>
+ <id>clean-images</id>
+ <phase>pre-clean</phase>
+ <goals>
+ <goal>remove</goal>
+ </goals>
+ <configuration>
+ <removeAll>true</removeAll>
+ <image>music</image>
+ </configuration>
+ </execution>
+ <execution>
+ <id>generate-images</id>
+ <phase>package</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+ <execution>
+ <id>push-images</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>push</goal>
+ </goals>
+ <configuration>
+ <image>onap/music/music</image>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ <profile>
+ <id>default</id>
+ </profile>
+ </profiles>
+</project>
diff --git a/music-rest/src/main/java/LICENSE.txt b/music-rest/src/main/java/LICENSE.txt
new file mode 100644
index 00000000..cc6cdea5
--- /dev/null
+++ b/music-rest/src/main/java/LICENSE.txt
@@ -0,0 +1,24 @@
+
+The following license applies to all files in this and sub-directories. Licenses
+are included in individual source files where appropriate, and if it differs
+from this text, it supersedes this. Any file that does not have license text
+defaults to being covered by this text; not all files support the addition of
+licenses.
+#
+# -------------------------------------------------------------------------
+# Copyright (c) 2017 AT&T Intellectual Property
+#
+# 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.
+#
+# -------------------------------------------------------------------------
+# \ No newline at end of file
diff --git a/music-rest/src/main/java/org/onap/music/JerseyConfig.java b/music-rest/src/main/java/org/onap/music/JerseyConfig.java
new file mode 100755
index 00000000..b64e7044
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/JerseyConfig.java
@@ -0,0 +1,87 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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;
+
+import io.swagger.jaxrs.config.BeanConfig;
+import io.swagger.jaxrs.listing.ApiListingResource;
+import io.swagger.jaxrs.listing.SwaggerSerializers;
+
+import javax.annotation.PostConstruct;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.onap.music.conductor.conditionals.RestMusicConditionalAPI;
+import org.onap.music.exceptions.MusicExceptionMapper;
+import org.onap.music.rest.RestMusicDataAPI;
+import org.onap.music.rest.RestMusicHealthCheckAPI;
+import org.onap.music.rest.RestMusicLocksAPI;
+import org.onap.music.rest.RestMusicQAPI;
+import org.onap.music.rest.RestMusicTestAPI;
+import org.onap.music.rest.RestMusicVersionAPI;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+@Component
+public class JerseyConfig extends ResourceConfig {
+
+ @Value("${spring.jersey.application-path:/}")
+ private String apiPath;
+
+ public JerseyConfig() {
+ this.registerEndpoints();
+ register(MusicExceptionMapper.class);
+ }
+
+ @PostConstruct
+ public void init() {
+ this.configureSwagger();
+ }
+
+ private void registerEndpoints() {
+ register(RestMusicDataAPI.class);
+ register(RestMusicLocksAPI.class);
+ register(RestMusicConditionalAPI.class);
+ register(RestMusicQAPI.class);
+ register(RestMusicTestAPI.class);
+ register(RestMusicVersionAPI.class);
+ register(RestMusicHealthCheckAPI.class);
+
+ }
+
+ private void configureSwagger() {
+ // Available at localhost:port/swagger.json
+ this.register(ApiListingResource.class);
+ this.register(SwaggerSerializers.class);
+
+ BeanConfig config = new BeanConfig();
+ config.setConfigId("MUSIC");
+ config.setTitle("MUSIC");
+ config.setVersion("v2");
+ config.setContact("Thomas Nelson");
+ config.setSchemes(new String[] {"http", "https"});
+ config.setBasePath("/MUSIC/rest");
+ config.setResourcePackage("org.onap.music");
+ config.setPrettyPrint(true);
+ config.setScan(true);
+ }
+
+}
diff --git a/src/main/java/org/onap/music/MusicApplication.java b/music-rest/src/main/java/org/onap/music/MusicApplication.java
index e6fee58f..0fe354d9 100755
--- a/src/main/java/org/onap/music/MusicApplication.java
+++ b/music-rest/src/main/java/org/onap/music/MusicApplication.java
@@ -22,7 +22,6 @@
package org.onap.music;
-
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
@@ -31,6 +30,10 @@ import javax.servlet.ServletResponse;
import org.onap.aaf.cadi.PropAccess;
import org.onap.music.authentication.CadiAuthFilter;
+import org.onap.music.authentication.MusicAuthorizationFilter;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.MusicLoggingServletFilter;
+import org.onap.music.lockingservice.cassandra.LockCleanUpDaemon;
import org.onap.music.main.MusicUtil;
import org.onap.music.main.PropertiesLoader;
import org.springframework.beans.factory.annotation.Autowired;
@@ -40,96 +43,163 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
-//import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
-import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.DependsOn;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.context.request.RequestContextListener;
-
@SpringBootApplication(scanBasePackages = { "org.onap.music.rest"})
-@EnableAutoConfiguration(exclude={CassandraDataAutoConfiguration.class})
-@ComponentScan(value = {"org.onap.music"})
+@EnableAutoConfiguration(exclude = { CassandraDataAutoConfiguration.class })
+@ComponentScan(value = { "org.onap.music" })
@EnableScheduling
public class MusicApplication extends SpringBootServletInitializer {
+ private static final String KEYSPACE_PATTERN = "/v2/keyspaces/*";
+ private static final String LOCKS_PATTERN = "/v2/locks/*";
+ private static final String Q_PATTERN = "/v2/priorityq/*";
+
@Autowired
- PropertiesLoader propertyLoader;
-
-
+ private PropertiesLoader propertyLoader;
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicApplication.class);
+
+
public static void main(String[] args) {
- System.setProperty("AFT_DME2_CLIENT_IGNORE_SSL_CONFIG","false");
- System.setProperty("AFT_DME2_CLIENT_KEYSTORE","/opt/app/music/etc/truststore2018.jks");
- System.setProperty("AFT_DME2_CLIENT_KEYSTORE_PASSWORD","changeit");
- System.setProperty("AFT_DME2_CLIENT_SSL_INCLUDE_PROTOCOLS","TLSv1.1,TLSv1.2");
new MusicApplication().configure(new SpringApplicationBuilder(MusicApplication.class)).run(args);
+
+ LockCleanUpDaemon daemon = new LockCleanUpDaemon();
+ daemon.setDaemon(true);
+ daemon.start();
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
-
+
return application.sources(MusicApplication.class);
}
-
@Bean("loadProperties")
public void loadProperties() {
propertyLoader.loadProperties();
}
- @Autowired
- private ApplicationContext appContext;
-
+
@Bean
@DependsOn("loadProperties")
public PropAccess propAccess() {
- if(MusicUtil.getIsCadi())
- return new PropAccess(new String[] { "cadi_prop_files=/opt/app/music/etc/cadi.properties" });
- else
+ if (MusicUtil.getIsCadi()) {
+ return new PropAccess(new String[] {
+ "cadi_prop_files=/opt/app/music/etc/cadi.properties" });
+ } else {
return null;
+ }
}
-
+
@Bean(name = "cadiFilter")
@DependsOn("loadProperties")
public Filter cadiFilter() throws ServletException {
propertyLoader.loadProperties();
- if(MusicUtil.getIsCadi()) {
+ if (MusicUtil.getIsCadi()) {
PropAccess propAccess = propAccess();
- CadiAuthFilter cadiFilter = new CadiAuthFilter(propAccess);
- return cadiFilter;
- } else
+ return new CadiAuthFilter(propAccess);
+ } else {
return (ServletRequest request, ServletResponse response, FilterChain chain) -> {
- //do nothing for now.
+ // do nothing for now.
};
-
+ }
+ }
+
+ /**
+ * Added for capturing custom header values from client.
+ *
+ * order is set to 1 for this filter
+ *
+ * sp931a
+ *
+ * @return
+ * @throws ServletException
+ */
+ @Bean(name="logFilter")
+ @DependsOn("loadProperties")
+ public FilterRegistrationBean<Filter> loggingFilterRegistration() throws ServletException {
+ logger.info("loggingFilterRegistration called for log filter..");
+ propertyLoader.loadProperties();
+ FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
+ frb.setFilter(new MusicLoggingServletFilter());
+ frb.addUrlPatterns(
+ KEYSPACE_PATTERN,
+ LOCKS_PATTERN,
+ Q_PATTERN
+ );
+ frb.setName("logFilter");
+ frb.setOrder(1);
+ return frb;
}
@Bean
@DependsOn("loadProperties")
public FilterRegistrationBean<Filter> cadiFilterRegistration() throws ServletException {
+ logger.info("cadiFilterRegistration called for cadi filter..");
FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
frb.setFilter(cadiFilter());
- // The Following Patterns are used to control what APIs will be secure
- // TODO: Make this a configurable item. Build this from an array?
- if(MusicUtil.getIsCadi()) {
+ if (MusicUtil.getIsCadi()) {
frb.addUrlPatterns(
- "/v2/keyspaces/*",
- "/v2/locks/*",
- "/v3/locks/*",
- "/v2/priorityq/*",
- "/v2/admin/*"
- );
+ KEYSPACE_PATTERN,
+ LOCKS_PATTERN,
+ Q_PATTERN
+ );
} else {
frb.addUrlPatterns("/v0/test");
}
frb.setName("cadiFilter");
- frb.setOrder(0);
+ frb.setOrder(2);
+ return frb;
+ }
+
+
+ /**
+ * Added for Authorization using CADI
+ *
+ * sp931a
+ *
+ * @return
+ * @throws ServletException
+ */
+ @Bean
+ @DependsOn("loadProperties")
+ public FilterRegistrationBean<Filter> cadiFilterRegistrationForAuth() throws ServletException {
+ logger.info("cadiFilterRegistrationForAuth called for cadi auth filter..");
+ FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
+ frb.setFilter(cadiMusicAuthFilter());
+
+ if (MusicUtil.getIsCadi()) {
+ frb.addUrlPatterns(
+ KEYSPACE_PATTERN,
+ LOCKS_PATTERN,
+ Q_PATTERN
+ );
+ } else {
+ frb.addUrlPatterns("/v0/test");
+ }
+ frb.setName("cadiMusicAuthFilter");
+ frb.setOrder(3);
return frb;
}
+ @Bean(name = "cadiMusicAuthFilter")
+ @DependsOn("loadProperties")
+ public Filter cadiMusicAuthFilter() throws ServletException {
+ propertyLoader.loadProperties();
+ if (MusicUtil.getIsCadi()) {
+ return new MusicAuthorizationFilter();
+ } else {
+ return (ServletRequest request, ServletResponse response, FilterChain chain) -> {
+ // do nothing for now.
+ };
+ }
+ }
+
@Bean
@ConditionalOnMissingBean(RequestContextListener.class)
public RequestContextListener requestContextListener() {
diff --git a/music-rest/src/main/java/org/onap/music/authentication/AuthUtil.java b/music-rest/src/main/java/org/onap/music/authentication/AuthUtil.java
new file mode 100644
index 00000000..ee3b77a4
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/authentication/AuthUtil.java
@@ -0,0 +1,276 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ *
+ * Modifications Copyright (C) 2019 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.authentication;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicAuthenticationException;
+
+public class AuthUtil {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AuthUtil.class);
+
+ private AuthUtil() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ /**
+ * Get the list of permissions from the Request object.
+ *
+ *
+ * @param request servlet request object
+ * @return returns list of AAFPermission of the requested MechId for all the
+ * namespaces
+ */
+ public static List<AAFPermission> getAAFPermissions(ServletRequest request) {
+ CadiWrap wrapReq = (CadiWrap) request;
+
+ List<Permission> perms = wrapReq.getPermissions(wrapReq.getUserPrincipal());
+ List<AAFPermission> aafPermsList = new ArrayList<>();
+ for (Permission perm : perms) {
+ AAFPermission aafPerm = (AAFPermission) perm;
+ aafPermsList.add(aafPerm);
+ }
+ return aafPermsList;
+ }
+
+ /**
+ * Here is a sample of a permission object in AAI. The key attribute will have
+ * Type|Instance|Action.
+ * AAFPermission:
+ * NS: null
+ * Type: org.onap.music.cadi.keyspace ( Permission Type )
+ * Instance: tomtest ( Cassandra Keyspace )
+ * Action: *|GET|ALL ( Access Level [*|ALL] for full access and [GET] for Read only)
+ * Key: org.onap.music.cadi.keyspace|tomtest|*
+ *
+ * This method will filter all permissions whose key starts with the requested namespace.
+ * The nsamespace here is the music namespace which is defined in music.property file.
+ * i;e is the type contains in key is org.onap.music.cadi.keyspace and the namespace
+ * value is org.onap.music.cadi.keyspace, it will add to list
+ * otherwise reject.
+ *
+ * @param nameSpace
+ * @param allPermissionsList
+ * @return
+ */
+ private static List<AAFPermission> filterNameSpacesAAFPermissions(String nameSpace,
+ List<AAFPermission> allPermissionsList) {
+ List<AAFPermission> list = new ArrayList<>();
+ for (Iterator<AAFPermission> iterator = allPermissionsList.iterator(); iterator.hasNext();) {
+ AAFPermission aafPermission = iterator.next();
+ if(aafPermission.getType().indexOf(nameSpace) == 0) {
+ list.add(aafPermission);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * Decode certian characters from url encoded to normal.
+ *
+ * @param str - String being decoded.
+ * @return returns the decoded string.
+ * @throws Exception throws excpetion
+ */
+ public static String decodeFunctionCode(String str) throws MusicAuthenticationException {
+ final String DECODEVALUE_FORWARDSLASH = "2f";
+ final String DECODEVALUE_HYPHEN = "2d";
+ final String DECODEVALUE_ASTERISK = "2a";
+ String decodedString = str;
+ List<Pattern> decodingList = new ArrayList<>();
+ decodingList.add(Pattern.compile(DECODEVALUE_FORWARDSLASH));
+ decodingList.add(Pattern.compile(DECODEVALUE_HYPHEN));
+ decodingList.add(Pattern.compile(DECODEVALUE_ASTERISK));
+ for (Pattern xssInputPattern : decodingList) {
+ try {
+ decodedString = decodedString.replaceAll("%" + xssInputPattern,
+ new String(Hex.decodeHex(xssInputPattern.toString().toCharArray())));
+ } catch (DecoderException e) {
+ logger.error(EELFLoggerDelegate.securityLogger,
+ "AuthUtil Decode Failed! for instance: " + str);
+ throw new MusicAuthenticationException("Decode failed", e);
+ }
+ }
+
+ return decodedString;
+ }
+
+ /**
+ *
+ *
+ * @param request servlet request object
+ * @param nameSpace application namespace
+ * @return boolean value if the access is allowed
+ * @throws Exception throws exception
+ */
+ public static boolean isAccessAllowed(ServletRequest request, String nameSpace) throws MusicAuthenticationException {
+
+ if (request==null) {
+ throw new MusicAuthenticationException("Request cannot be null");
+ }
+
+ if (nameSpace==null || nameSpace.isEmpty()) {
+ throw new MusicAuthenticationException("NameSpace not Declared!");
+ }
+
+ boolean isauthorized = false;
+ List<AAFPermission> aafPermsList = getAAFPermissions(request);
+ logger.info(EELFLoggerDelegate.securityLogger,
+ "AAFPermission of the requested MechId for all the namespaces: " + aafPermsList);
+ logger.debug(EELFLoggerDelegate.securityLogger, "Requested nameSpace: " + nameSpace);
+
+ List<AAFPermission> aafPermsFinalList = filterNameSpacesAAFPermissions(nameSpace, aafPermsList);
+
+ logger.debug(EELFLoggerDelegate.securityLogger,
+ "AuthUtil list of AAFPermission for the specific namespace :::"
+ + aafPermsFinalList);
+
+ HttpServletRequest httpRequest = (HttpServletRequest) request;
+ String requestUri = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length() + 1);
+
+ logger.debug(EELFLoggerDelegate.securityLogger,
+ "AuthUtil requestUri :::" + requestUri);
+
+ for (Iterator<AAFPermission> iterator = aafPermsFinalList.iterator(); iterator.hasNext();) {
+ AAFPermission aafPermission = iterator.next();
+ if(!isauthorized) {
+ isauthorized = isMatchPattern(aafPermission, requestUri, httpRequest.getMethod());
+ }
+ }
+
+ logger.debug(EELFLoggerDelegate.securityLogger,
+ "isAccessAllowed for the request uri: " + requestUri + "is :" + isauthorized);
+ return isauthorized;
+ }
+
+ /**
+ *
+ * This method will check, if the requested URI matches any of the instance
+ * found with the AAF permission list.
+ * i;e if the request URI is; /v2/keyspaces/tomtest/tables/emp15 and in the
+ * AAF permission table, we have an instance
+ * defined as "tomtest" mapped the logged in user, it will allow else error.
+ *
+ * User trying to create or aquire a lock
+ * Here is the requested URI /v2/locks/create/tomtest.MyTable.Field1
+ * Here the keyspace name i;e tomtest will be test throught out the URL if it
+ * matches, it will allow the user to create a lock.
+ * "tomtest" here is the key, which is mapped as an instance in permission object.
+ * Instance can be delimited with ":" i;e ":music-cassandra-1908-dev:admin". In this case,
+ * each delimited
+ * token will be matched with that of request URI.
+ *
+ * Example Permission:
+ * org.onap.music.api.user.access|tomtest|* or ALL
+ * org.onap.music.api.user.access|tomtest|GET
+ * In case of the action field is ALL and *, user will be allowed else it will
+ * be matched with the requested http method type.
+ *
+ *
+ *
+ * @param aafPermission - AAfpermission obtained by cadi.
+ * @param requestUri - Rest URL client is calling.
+ * @param method - REST Method being used (GET,POST,PUT,DELETE)
+ * @return returns a boolean
+ * @throws Exception - throws an exception
+ */
+ private static boolean isMatchPattern(
+ AAFPermission aafPermission,
+ String requestUri,
+ String method) throws MusicAuthenticationException {
+ if (null == aafPermission || null == requestUri || null == method) {
+ return false;
+ }
+
+ String permKey = aafPermission.getKey();
+
+ logger.debug(EELFLoggerDelegate.securityLogger, "isMatchPattern permKey: "
+ + permKey + ", requestUri " + requestUri + " ," + method);
+
+ String[] keyArray = permKey.split("\\|");
+ String[] subPath = null;
+ String instance = keyArray[1];
+ String action = keyArray[2];
+
+ //if the instance & action both are * , then allow
+ if ("*".equalsIgnoreCase(instance) && "*".equalsIgnoreCase(action)) {
+ return true;
+ }
+ //Decode string like %2f, %2d and %2a
+ if (!"*".equals(instance)) {
+ instance = decodeFunctionCode(instance);
+ }
+ if (!"*".equals(action)) {
+ action = decodeFunctionCode(action);
+ }
+ //Instance: :music-cassandra-1908-dev:admin
+ List<String> instanceList = Arrays.asList(instance.split(":"));
+
+ String[] path = requestUri.split("/");
+
+ for (int i = 0; i < path.length; i++) {
+ // Sometimes the value will begin with "$", so we need to remove it
+ if (path[i].startsWith("$")) {
+ path[i] = path[i].replace("$","");
+ }
+ // Each path element can again delemited by ".";i;e
+ // tomtest.tables.emp. We have scenarios like lock aquire URL
+ subPath = path[i].split("\\.");
+ for (int j = 0; j < subPath.length; j++) {
+ if (instanceList.contains(subPath[j])) {
+ return checkAction(method,action);
+ } else {
+ continue;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static boolean checkAction(String method, String action) {
+ if ("*".equals(action) || "ALL".equalsIgnoreCase(action)) {
+ return true;
+ } else {
+ return (method.equalsIgnoreCase(action));
+ }
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/AAFResponseTest.java b/music-rest/src/main/java/org/onap/music/authentication/AuthorizationError.java
index 354668c7..7015b550 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/AAFResponseTest.java
+++ b/music-rest/src/main/java/org/onap/music/authentication/AuthorizationError.java
@@ -20,35 +20,36 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
-
-import static org.junit.Assert.*;
-import java.util.ArrayList;
-import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.AAFResponse;
-import org.onap.music.datastore.jsonobjects.NameSpace;
-
-public class AAFResponseTest {
-
- @Test
- public void testGetNs() {
- NameSpace ns = new NameSpace();
- AAFResponse ar = new AAFResponse();
- ArrayList<NameSpace> nsArray = new ArrayList<>();
- ns.setName("tom");
- ArrayList<String> admin = new ArrayList<>();
- admin.add("admin1");
- ns.setAdmin(admin);
- nsArray.add(ns);
- ar.setNs(nsArray);
- assertEquals("tom",ar.getNs().get(0).getName());
- assertEquals("admin1",ar.getNs().get(0).getAdmin().get(0));
-
+package org.onap.music.authentication;
+
+
+/**
+ * Authorization error class used while setting error code and description back to client.
+ *
+ *
+ * @author sp931a
+ *
+ */
+public class AuthorizationError {
+
+ private int responseCode;
+
+ private String responseMessage;
+
+ public int getResponseCode() {
+ return responseCode;
+ }
+
+ public void setResponseCode(int responseCode) {
+ this.responseCode = responseCode;
}
-// @Test
-// public void testSetNs() {
-// fail("Not yet implemented");
-// }
+ public String getResponseMessage() {
+ return responseMessage;
+ }
+
+ public void setResponseMessage(String responseMessage) {
+ this.responseMessage = responseMessage;
+ }
-}
+} \ No newline at end of file
diff --git a/music-rest/src/main/java/org/onap/music/authentication/CadiAuthFilter.java b/music-rest/src/main/java/org/onap/music/authentication/CadiAuthFilter.java
new file mode 100644
index 00000000..d043e6d6
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/authentication/CadiAuthFilter.java
@@ -0,0 +1,65 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.authentication;
+
+
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.aaf.cadi.filter.CadiFilter;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+
+@WebFilter(urlPatterns = { "/*" })
+public class CadiAuthFilter extends CadiFilter {
+
+ private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CadiAuthFilter.class);
+
+ public CadiAuthFilter(PropAccess access) throws ServletException {
+ super(true, access);
+ }
+
+ public CadiAuthFilter() throws ServletException {
+ super();
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ super.init(filterConfig);
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ logger.info(EELFLoggerDelegate.securityLogger, "Request is entering cadifilter");
+ long startTime = System.currentTimeMillis();
+ request.setAttribute("startTime", startTime);
+ super.doFilter(request, response, chain);
+ }
+} \ No newline at end of file
diff --git a/music-rest/src/main/java/org/onap/music/authentication/MusicAuthorizationFilter.java b/music-rest/src/main/java/org/onap/music/authentication/MusicAuthorizationFilter.java
new file mode 100644
index 00000000..bde3e205
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/authentication/MusicAuthorizationFilter.java
@@ -0,0 +1,122 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * 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.authentication;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.exceptions.MusicAuthenticationException;
+import org.onap.music.main.MusicUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This filter class does authorization from AAF
+ *
+ * @author sp931a
+ *
+ */
+//@PropertySource(value = {"file:/opt/app/music/etc/music.properties"})
+public class MusicAuthorizationFilter implements Filter {
+
+ private String musicNS = MusicUtil.getMusicAafNs();
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicAuthorizationFilter.class);
+
+ public MusicAuthorizationFilter() throws ServletException {
+ super();
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ // Do Nothing
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
+ throws IOException, ServletException {
+ HttpServletResponse httpResponse = null;
+
+ boolean isAuthAllowed = false;
+
+ if (null != servletRequest && null != servletResponse) {
+ httpResponse = (HttpServletResponse) servletResponse;
+ long startTime = 0;
+ if( null != servletRequest.getAttribute("startTime")) {
+ startTime = ((Long)servletRequest.getAttribute("startTime")).longValue();
+ } else {
+ startTime = System.currentTimeMillis(); // this will set only incase the request attribute not found
+ }
+
+ try {
+ isAuthAllowed = AuthUtil.isAccessAllowed(servletRequest, musicNS);
+ } catch (MusicAuthenticationException e) {
+ logger.error(EELFLoggerDelegate.securityLogger,
+ "Error while checking authorization Music Namespace: " + musicNS + " : " + e.getMessage(),e);
+ } catch ( Exception e) {
+ logger.error(EELFLoggerDelegate.securityLogger,
+ "Error while checking authorization Music Namespace: " + musicNS + " : " + e.getMessage(),e);
+ }
+
+ long endTime = System.currentTimeMillis();
+
+ //startTime set in <code>CadiAuthFilter</code> doFilter
+ logger.debug(EELFLoggerDelegate.securityLogger,
+ "Time took for authentication & authorization : "
+ + (endTime - startTime) + " milliseconds");
+
+ if (!isAuthAllowed) {
+ logger.info(EELFLoggerDelegate.securityLogger,
+ "Unauthorized Access");
+ AuthorizationError authError = new AuthorizationError();
+ authError.setResponseCode(HttpServletResponse.SC_UNAUTHORIZED);
+ authError.setResponseMessage("Unauthorized Access - Please make sure you are "
+ + "onboarded and have proper access to MUSIC. ");
+
+ byte[] responseToSend = restResponseBytes(authError);
+ httpResponse.setHeader("Content-Type", "application/json");
+
+ httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+ servletResponse.getOutputStream().write(responseToSend);
+ return;
+ } else {
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+ }
+ }
+
+ private byte[] restResponseBytes(AuthorizationError eErrorResponse) throws IOException {
+ String serialized = new ObjectMapper().writeValueAsString(eErrorResponse);
+ return serialized.getBytes();
+ }
+}
+
diff --git a/src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java b/music-rest/src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java
index 4efcabea..4efcabea 100644
--- a/src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java
+++ b/music-rest/src/main/java/org/onap/music/conductor/conditionals/JsonConditional.java
diff --git a/src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java b/music-rest/src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java
index 045abd98..2c69c435 100644
--- a/src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java
+++ b/music-rest/src/main/java/org/onap/music/conductor/conditionals/MusicConditional.java
@@ -3,7 +3,9 @@
* org.onap.music
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
* Modifications Copyright (C) 2019 IBM.
+ * Modifications Copyright (c) 2019 Samsung
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -90,7 +92,12 @@ public class MusicConditional {
String key = keyspace + "." + tablename + "." + primaryKey;
- String lockId = MusicCore.createLockReference(key);
+ String lockId;
+ try {
+ lockId = MusicCore.createLockReferenceAtomic(key);
+ } catch (MusicLockingException e) {
+ return new ReturnType(ResultType.FAILURE, e.getMessage());
+ }
long leasePeriod = MusicUtil.getDefaultLockLeasePeriod();
ReturnType lockAcqResult = MusicCore.acquireLockWithLease(key, lockId, leasePeriod);
@@ -112,6 +119,7 @@ public class MusicConditional {
return lockAcqResult;
}
} catch (Exception e) {
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
MusicCore.destroyLockRef(lockId);
return new ReturnType(ResultType.FAILURE, e.getMessage());
}
@@ -130,14 +138,24 @@ public class MusicConditional {
try {
results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(queryBank.get(MusicUtil.SELECT));
} catch (Exception e) {
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
return new ReturnType(ResultType.FAILURE, e.getMessage());
}
if (results.all().isEmpty()) {
- MusicDataStoreHandle.getDSHandle().executePut(queryBank.get(MusicUtil.INSERT), "critical");
- return new ReturnType(ResultType.SUCCESS, "insert");
+ PreparedQueryObject qObject = queryBank.get(MusicUtil.INSERT);
+ qObject.setOperation(MusicUtil.INSERT);
+ logger.info(EELFLoggerDelegate.debugLogger,"### Conditional Insert");
+ MusicCore.criticalPut(keyspace, tableName, primaryKey, qObject, lockId, null);
+ //MusicDataStoreHandle.getDSHandle().executePut(queryBank.get(MusicUtil.INSERT), "critical");
+ return new ReturnType(ResultType.SUCCESS, MusicUtil.INSERT);
+
} else {
- MusicDataStoreHandle.getDSHandle().executePut(queryBank.get(MusicUtil.UPDATE), "critical");
- return new ReturnType(ResultType.SUCCESS, "update");
+ PreparedQueryObject qObject = queryBank.get(MusicUtil.UPDATE);
+ qObject.setOperation(MusicUtil.UPDATE);
+ logger.info(EELFLoggerDelegate.debugLogger,"### Condition Update");
+ MusicCore.criticalPut(keyspace, tableName, primaryKey, qObject, lockId, null);
+ //MusicDataStoreHandle.getDSHandle().executePut(queryBank.get(MusicUtil.UPDATE), "critical");
+ return new ReturnType(ResultType.SUCCESS, MusicUtil.UPDATE);
}
} else {
return new ReturnType(ResultType.FAILURE,
@@ -148,6 +166,7 @@ public class MusicConditional {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
return new ReturnType(ResultType.FAILURE,
"Exception thrown while doing the critical put, check sanctity of the row/conditions:\n"
+ exceptionAsString);
@@ -155,17 +174,27 @@ public class MusicConditional {
}
- public static ReturnType update(Map<String,PreparedQueryObject> queryBank, String keyspace, String tableName, String primaryKey,String primaryKeyValue,String planId,String cascadeColumnName,Map<String,String> cascadeColumnValues) throws MusicLockingException, MusicQueryException, MusicServiceException {
+ public static ReturnType update(UpdateDataObject dataObj)
+ throws MusicLockingException, MusicQueryException, MusicServiceException {
- String key = keyspace + "." + tableName + "." + primaryKeyValue;
- String lockId = MusicCore.createLockReference(key);
+ String key = dataObj.getKeyspace() + "." + dataObj.getTableName() + "." + dataObj.getPrimaryKeyValue();
+ String lockId = MusicCore.createLockReferenceAtomic(key);
long leasePeriod = MusicUtil.getDefaultLockLeasePeriod();
ReturnType lockAcqResult = MusicCore.acquireLockWithLease(key, lockId, leasePeriod);
try {
if (lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
- ReturnType criticalPutResult = updateAtomic(lockId, keyspace, tableName, primaryKey,primaryKeyValue, queryBank,planId,cascadeColumnValues,cascadeColumnName);
+ ReturnType criticalPutResult = updateAtomic(new UpdateDataObject().setLockId(lockId)
+ .setKeyspace(dataObj.getKeyspace())
+ .setTableName( dataObj.getTableName())
+ .setPrimaryKey(dataObj.getPrimaryKey())
+ .setPrimaryKeyValue(dataObj.getPrimaryKeyValue())
+ .setQueryBank(dataObj.getQueryBank())
+ .setPlanId(dataObj.getPlanId())
+ .setCascadeColumnValues(dataObj.getCascadeColumnValues())
+ .setCascadeColumnName(dataObj.getCascadeColumnName()));
+
MusicCore.destroyLockRef(lockId);
return criticalPutResult;
} else {
@@ -175,41 +204,45 @@ public class MusicConditional {
} catch (Exception e) {
MusicCore.destroyLockRef(lockId);
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
return new ReturnType(ResultType.FAILURE, e.getMessage());
}
}
- public static ReturnType updateAtomic(String lockId, String keyspace, String tableName, String primaryKey,String primaryKeyValue,
- Map<String,PreparedQueryObject> queryBank,String planId,Map<String,String> cascadeColumnValues,String casscadeColumnName) {
+ public static ReturnType updateAtomic(UpdateDataObject dataObj) {
try {
- String fullyQualifiedKey = keyspace + "." + tableName + "." + primaryKeyValue;
- ReturnType lockAcqResult = MusicCore.acquireLock(fullyQualifiedKey, lockId);
+ String fullyQualifiedKey = dataObj.getKeyspace() + "." + dataObj.getTableName() + "." + dataObj.getPrimaryKeyValue();
+ ReturnType lockAcqResult = MusicCore.acquireLock(fullyQualifiedKey, dataObj.getLockId());
if (lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
- Row row = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(queryBank.get(MusicUtil.SELECT)).one();
+ Row row = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(dataObj.getQueryBank().get(MusicUtil.SELECT)).one();
if(row != null) {
- Map<String, String> updatedValues = cascadeColumnUpdateSpecific(row, cascadeColumnValues, casscadeColumnName, planId);
+ Map<String, String> updatedValues = cascadeColumnUpdateSpecific(row, dataObj.getCascadeColumnValues(), dataObj.getCascadeColumnName(), dataObj.getPlanId());
JSONObject json = new JSONObject(updatedValues);
PreparedQueryObject update = new PreparedQueryObject();
String vector_ts = String.valueOf(Thread.currentThread().getId() + System.currentTimeMillis());
- update.appendQueryString("UPDATE " + keyspace + "." + tableName + " SET " + casscadeColumnName + "['" + planId
- + "'] = ?, vector_ts = ? WHERE " + primaryKey + " = ?");
+ update.appendQueryString("UPDATE " + dataObj.getKeyspace() + "." + dataObj.getTableName() + " SET "
+ + dataObj.getCascadeColumnName() + "['" + dataObj.getPlanId()
+ + "'] = ?, vector_ts = ? WHERE " + dataObj.getPrimaryKey() + " = ?");
update.addValue(MusicUtil.convertToActualDataType(DataType.text(), json.toString()));
update.addValue(MusicUtil.convertToActualDataType(DataType.text(), vector_ts));
- update.addValue(MusicUtil.convertToActualDataType(DataType.text(), primaryKeyValue));
+ update.addValue(MusicUtil.convertToActualDataType(DataType.text(), dataObj.getPrimaryKeyValue()));
try {
- MusicDataStoreHandle.getDSHandle().executePut(update, "critical");
+ update.setOperation(MusicUtil.UPDATE);
+ MusicCore.criticalPut(dataObj.keyspace, dataObj.tableName, dataObj.primaryKeyValue, update, dataObj.lockId, null);
} catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.applicationLogger, ex);
return new ReturnType(ResultType.FAILURE, ex.getMessage());
}
}else {
- return new ReturnType(ResultType.FAILURE,"Cannot find data related to key: "+primaryKey);
+ return new ReturnType(ResultType.FAILURE,"Cannot find data related to key: "+dataObj.getPrimaryKey());
}
- MusicDataStoreHandle.getDSHandle().executePut(queryBank.get(MusicUtil.UPSERT), "critical");
+ PreparedQueryObject qObject = dataObj.getQueryBank().get(MusicUtil.UPSERT);
+ qObject.setOperation(MusicUtil.INSERT);
+ MusicCore.criticalPut(dataObj.keyspace, dataObj.tableName, dataObj.primaryKeyValue, qObject, dataObj.lockId, null);
return new ReturnType(ResultType.SUCCESS, "update success");
-
} else {
return new ReturnType(ResultType.FAILURE,
"Cannot perform operation since you are the not the lock holder");
@@ -219,6 +252,7 @@ public class MusicConditional {
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
+ logger.error(EELFLoggerDelegate.applicationLogger, e);
return new ReturnType(ResultType.FAILURE,
"Exception thrown while doing the critical put, check sanctity of the row/conditions:\n"
+ exceptionAsString);
@@ -258,8 +292,8 @@ public class MusicConditional {
queryObject.addValue(vector);
if(casscadeColumn!=null && casscadeColumnValues!=null) {
fieldsString.append(casscadeColumn).append(" ,");
- valueString.append("?,");
- queryObject.addValue(casscadeColumnValues);
+ valueString.append("?,");
+ queryObject.addValue(casscadeColumnValues);
}
int counter = 0;
@@ -268,23 +302,23 @@ public class MusicConditional {
fieldsString.append(entry.getKey());
Object valueObj = entry.getValue();
if (primaryKeyName.equals(entry.getKey())) {
- localPrimaryKey = entry.getValue() + "";
- localPrimaryKey = localPrimaryKey.replace("'", "''");
+ localPrimaryKey = entry.getValue() + "";
+ localPrimaryKey = localPrimaryKey.replace("'", "''");
}
DataType colType = null;
try {
colType = tableInfo.getColumn(entry.getKey()).getType();
} catch(NullPointerException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() +" Invalid column name : "+entry.getKey(), AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
-
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() +" Invalid column name : "+entry.getKey(),
+ AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR, ex);
}
Object formattedValue = null;
try {
- formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
+ formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage());
- }
+ logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), e);
+ }
valueString.append("?");
queryObject.addValue(formattedValue);
@@ -300,7 +334,7 @@ public class MusicConditional {
counter = counter + 1;
}
queryObject.appendQueryString("INSERT INTO " + keySpaceName + "." + tableName + " "
- + fieldsString + " VALUES " + valueString);
+ + fieldsString + " VALUES " + valueString + ";");
return queryObject;
}
diff --git a/src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java b/music-rest/src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java
index 20fd3150..584a9e47 100644
--- a/src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java
+++ b/music-rest/src/main/java/org/onap/music/conductor/conditionals/RestMusicConditionalAPI.java
@@ -40,7 +40,6 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
-import org.codehaus.jettison.json.JSONObject;
import org.onap.music.datastore.MusicDataStoreHandle;
import org.onap.music.datastore.PreparedQueryObject;
import org.onap.music.eelf.logging.EELFLoggerDelegate;
@@ -51,10 +50,6 @@ import org.onap.music.main.MusicUtil;
import org.onap.music.main.ResultType;
import org.onap.music.main.ReturnType;
import org.onap.music.response.jsonobjects.JsonResponse;
-import org.onap.music.rest.RestMusicAdminAPI;
-import org.onap.music.authentication.MusicAAFAuthentication;
-import org.onap.music.authentication.MusicAuthenticator;
-import org.onap.music.authentication.MusicAuthenticator.Operation;
import org.onap.music.conductor.*;
import com.datastax.driver.core.DataType;
@@ -66,37 +61,36 @@ import io.swagger.annotations.ApiParam;
@Path("/v2/conditional")
@Api(value = "Conditional Api", hidden = true)
public class RestMusicConditionalAPI {
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicAdminAPI.class);
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicConditionalAPI.class);
private static final String XMINORVERSION = "X-minorVersion";
private static final String XPATCHVERSION = "X-patchVersion";
private static final String NS = "ns";
private static final String VERSION = "v2";
-
- private MusicAuthenticator authenticator = new MusicAAFAuthentication();
@POST
@Path("/insert/keyspaces/{keyspace}/tables/{tablename}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response insertConditional(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version", required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version", required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam("Authorization") String authorization,
- @ApiParam(value = "Keyspace Name", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("tablename") String tablename,
- JsonConditional jsonObj) throws Exception {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
-
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.INSERT_INTO_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
+ @ApiParam(value = "Major Version", required = true)
+ @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false)
+ @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version", required = false)
+ @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = true)
+ @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true)
+ @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true)
+ @HeaderParam("Authorization") String authorization,
+ @ApiParam(value = "Keyspace Name", required = true)
+ @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true)
+ @PathParam("tablename") String tablename,
+ JsonConditional jsonObj) throws Exception {
+ ResponseBuilder response =
+ MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
String primaryKey = jsonObj.getPrimaryKey();
String primaryKeyValue = jsonObj.getPrimaryKeyValue();
String casscadeColumnName = jsonObj.getCasscadeColumnName();
@@ -104,15 +98,14 @@ public class RestMusicConditionalAPI {
Map<String, Object> casscadeColumnData = jsonObj.getCasscadeColumnData();
Map<String, Map<String, String>> conditions = jsonObj.getConditions();
- if (primaryKey == null || primaryKeyValue == null || casscadeColumnName == null || tableValues.isEmpty()
- || casscadeColumnData.isEmpty() || conditions.isEmpty()) {
+ if (primaryKey == null || primaryKeyValue == null || casscadeColumnName == null
+ || tableValues.isEmpty() || casscadeColumnData.isEmpty() || conditions.isEmpty()) {
logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGINFO, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
+ ErrorTypes.AUTHENTICATIONERROR);
return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE)
- .setError(String.valueOf("One or more input values missing")).toMap()).build();
-
+ .setError(String.valueOf("One or more input values missing")).toMap()).build();
}
-
+ Map<String, Object> authMap = null;
Map<String, Object> valuesMap = new LinkedHashMap<>();
for (Map.Entry<String, Object> entry : tableValues.entrySet()) {
valuesMap.put(entry.getKey(), entry.getValue());
@@ -123,10 +116,11 @@ public class RestMusicConditionalAPI {
status.put("nonexists", conditions.get("nonexists").get("status"));
ReturnType out = null;
- out = MusicConditional.conditionalInsert(keyspace, tablename, casscadeColumnName, casscadeColumnData,
- primaryKeyValue, valuesMap, status);
- return response.status(Status.OK).entity(new JsonResponse(out.getResult()).setMessage(out.getMessage()).toMap())
- .build();
+ out = MusicConditional.conditionalInsert(keyspace, tablename,
+ casscadeColumnName, casscadeColumnData,primaryKeyValue, valuesMap, status);
+ return response.status(Status.OK).entity(new JsonResponse(
+ out.getResult()).setMessage(out.getMessage()).toMap())
+ .build();
}
@@ -136,24 +130,25 @@ public class RestMusicConditionalAPI {
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response updateConditional(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version", required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version", required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam("Authorization") String authorization,
- @ApiParam(value = "Major Version", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Major Version", required = true) @PathParam("tablename") String tablename,
- JsonConditional upObj) throws Exception {
+ @ApiParam(value = "Major Version", required = true)
+ @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false)
+ @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version", required = false)
+ @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = true)
+ @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true)
+ @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true)
+ @HeaderParam("Authorization") String authorization,
+ @ApiParam(value = "Major Version", required = true)
+ @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Major Version", required = true)
+ @PathParam("tablename") String tablename,
+ JsonConditional upObj) throws Exception {
ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
-
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.INSERT_INTO_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
+
String primaryKey = upObj.getPrimaryKey();
String primaryKeyValue = upObj.getPrimaryKeyValue();
String casscadeColumnName = upObj.getCasscadeColumnName();
@@ -161,7 +156,7 @@ public class RestMusicConditionalAPI {
Map<String, Object> tableValues = upObj.getTableValues();
if (primaryKey == null || primaryKeyValue == null || casscadeColumnName == null
- || casscadeColumnData.isEmpty()) {
+ || casscadeColumnData.isEmpty()) {
logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGINFO, ErrorSeverity.CRITICAL,
ErrorTypes.AUTHENTICATIONERROR);
return response.status(Status.UNAUTHORIZED).entity(new JsonResponse(ResultType.FAILURE)
@@ -169,29 +164,41 @@ public class RestMusicConditionalAPI {
}
- String planId = casscadeColumnData.get("key").toString();
- Map<String,String> casscadeColumnValueMap = (Map<String, String>) casscadeColumnData.get("value");
+ Map<String,String> casscadeColumnValueMap =
+ (Map<String, String>) casscadeColumnData.get("value");
TableMetadata tableInfo = null;
tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
DataType primaryIdType = tableInfo.getPrimaryKey().get(0).getType();
String primaryId = tableInfo.getPrimaryKey().get(0).getName();
PreparedQueryObject select = new PreparedQueryObject();
- select.appendQueryString("SELECT * FROM " + keyspace + "." + tablename + " where " + primaryId + " = ?");
+ select.appendQueryString("SELECT * FROM " + keyspace + "."
+ + tablename + " where " + primaryId + " = ?");
select.addValue(MusicUtil.convertToActualDataType(primaryIdType, primaryKeyValue));
- PreparedQueryObject upsert = MusicConditional.extractQuery(tableValues, tableInfo, tablename, keyspace, primaryKey, primaryKeyValue, null, null);
+ PreparedQueryObject upsert =
+ MusicConditional.extractQuery(tableValues, tableInfo, tablename,
+ keyspace, primaryKey, primaryKeyValue, null, null);
Map<String,PreparedQueryObject> queryBank = new HashMap<>();
queryBank.put(MusicUtil.SELECT, select);
queryBank.put(MusicUtil.UPSERT, upsert);
- ReturnType result = MusicConditional.update(queryBank, keyspace, tablename, primaryKey,primaryKeyValue,planId,casscadeColumnName,casscadeColumnValueMap);
+ String planId = casscadeColumnData.get("key").toString();
+ ReturnType result = MusicConditional.update(new UpdateDataObject().setQueryBank(queryBank)
+ .setKeyspace(keyspace)
+ .setTableName(tablename)
+ .setPrimaryKey(primaryKey)
+ .setPrimaryKeyValue(primaryKeyValue)
+ .setPlanId(planId)
+ .setCascadeColumnName(casscadeColumnName)
+ .setCascadeColumnValues(casscadeColumnValueMap));
if (result.getResult() == ResultType.SUCCESS) {
return response.status(Status.OK)
- .entity(new JsonResponse(result.getResult()).setMessage(result.getMessage()).toMap()).build();
-
+ .entity(new JsonResponse(result.getResult())
+ .setMessage(result.getMessage()).toMap()).build();
}
return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(result.getResult()).setMessage(result.getMessage()).toMap()).build();
+ .entity(new JsonResponse(result.getResult())
+ .setMessage(result.getMessage()).toMap()).build();
}
diff --git a/music-rest/src/main/java/org/onap/music/conductor/conditionals/UpdateDataObject.java b/music-rest/src/main/java/org/onap/music/conductor/conditionals/UpdateDataObject.java
new file mode 100644
index 00000000..1ea8994e
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/conductor/conditionals/UpdateDataObject.java
@@ -0,0 +1,119 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Samsung Electronics Co., Ltd. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.music.conductor.conditionals;
+
+import java.util.Map;
+import org.onap.music.datastore.PreparedQueryObject;
+
+public class UpdateDataObject {
+
+ Map<String, PreparedQueryObject> queryBank;
+ String keyspace;
+ String tableName;
+ String primaryKey;
+ String primaryKeyValue;
+ String planId;
+ String cascadeColumnName;
+ Map<String, String> cascadeColumnValues;
+ String lockId;
+
+ public Map<String, PreparedQueryObject> getQueryBank() {
+ return queryBank;
+ }
+
+ public UpdateDataObject setQueryBank(Map<String, PreparedQueryObject> queryBank) {
+ this.queryBank = queryBank;
+ return this;
+ }
+
+ public String getKeyspace() {
+ return keyspace;
+ }
+
+ public UpdateDataObject setKeyspace(String keyspace) {
+ this.keyspace = keyspace;
+ return this;
+ }
+
+ public String getTableName() {
+ return tableName;
+ }
+
+ public UpdateDataObject setTableName(String tableName) {
+ this.tableName = tableName;
+ return this;
+ }
+
+ public String getPrimaryKey() {
+ return primaryKey;
+ }
+
+ public UpdateDataObject setPrimaryKey(String primaryKey) {
+ this.primaryKey = primaryKey;
+ return this;
+ }
+
+ public String getPrimaryKeyValue() {
+ return primaryKeyValue;
+ }
+
+ public UpdateDataObject setPrimaryKeyValue(String primaryKeyValue) {
+ this.primaryKeyValue = primaryKeyValue;
+ return this;
+ }
+
+ public String getPlanId() {
+ return planId;
+ }
+
+ public UpdateDataObject setPlanId(String planId) {
+ this.planId = planId;
+ return this;
+ }
+
+ public String getCascadeColumnName() {
+ return cascadeColumnName;
+ }
+
+ public UpdateDataObject setCascadeColumnName(String cascadeColumnName) {
+ this.cascadeColumnName = cascadeColumnName;
+ return this;
+ }
+
+ public Map<String, String> getCascadeColumnValues() {
+ return cascadeColumnValues;
+ }
+
+ public UpdateDataObject setLockId(String lockId) {
+ this.lockId=lockId;
+ return this;
+ }
+
+ public String getLockId() {
+ return lockId;
+ }
+
+ public UpdateDataObject setCascadeColumnValues(Map<String, String> cascadeColumnValues) {
+ this.cascadeColumnValues = cascadeColumnValues;
+ return this;
+ }
+
+
+}
diff --git a/music-rest/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java b/music-rest/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java
new file mode 100644
index 00000000..acbbdd18
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/eelf/healthcheck/MusicHealthCheck.java
@@ -0,0 +1,138 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ *
+ * Modifications Copyright (C) 2019 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.healthcheck;
+
+import java.util.UUID;
+
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.MusicCore;
+
+import com.datastax.driver.core.ConsistencyLevel;
+
+/**
+ * @author inam
+ *
+ */
+public class MusicHealthCheck {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicUtil.class);
+
+ private String cassandrHost;
+
+ public String getCassandraStatus(String consistency) {
+ logger.info(EELFLoggerDelegate.applicationLogger, "Getting Status for Cassandra");
+
+ boolean result = false;
+ UUID randomUUID = UUID.randomUUID();
+ try {
+ result = getAdminKeySpace(consistency, randomUUID);
+ } catch( Exception e) {
+ if(e.getMessage().toLowerCase().contains("unconfigured table healthcheck")) {
+ logger.error("Error", e);
+ logger.debug("Creating table....");
+ try {
+ boolean ksresult = createKeyspace();
+ if(ksresult) {
+ result = getAdminKeySpace(consistency, randomUUID);
+ }
+ } catch (MusicServiceException e1) {
+ logger.error(EELFLoggerDelegate.errorLogger, e1.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN, e1);
+ } catch (MusicQueryException e1) {
+ logger.error(EELFLoggerDelegate.errorLogger, e1.getMessage(), AppMessages.UNKNOWNERROR, ErrorSeverity.ERROR, ErrorTypes.UNKNOWN,e1);
+ }
+ } else {
+ logger.error("Error", e);
+ return "One or more nodes are down or not responding.";
+ }
+ }
+ try {
+ cleanHealthCheckId(randomUUID);
+ } catch (MusicServiceException | MusicQueryException e) {
+ logger.error("Error while cleaning healthcheck record id...", e);
+ }
+ if (result) {
+ return "ACTIVE";
+ } else {
+ logger.info(EELFLoggerDelegate.applicationLogger, "Cassandra Service is not responding");
+ return "INACTIVE";
+ }
+ }
+
+ private Boolean getAdminKeySpace(String consistency, UUID randomUUID) throws MusicServiceException,MusicQueryException {
+ PreparedQueryObject pQuery = new PreparedQueryObject();
+ pQuery.appendQueryString("insert into admin.healthcheck (id) values (?)");
+ pQuery.addValue(randomUUID);
+ ResultType rs = null;
+ rs = nonKeyRelatedPut(pQuery, consistency);
+ logger.info(rs.toString());
+ return null != rs;
+
+ }
+
+ /*For unit testing purpose only*/
+ public ResultType nonKeyRelatedPut(PreparedQueryObject pQuery, String consistency) throws MusicServiceException, MusicQueryException {
+ return MusicCore.nonKeyRelatedPut(pQuery, consistency);
+ }
+
+ private void cleanHealthCheckId(UUID randomUUID) throws MusicServiceException, MusicQueryException {
+ String cleanQuery = "delete from admin.healthcheck where id = ?";
+ PreparedQueryObject deleteQueryObject = new PreparedQueryObject();
+ deleteQueryObject.appendQueryString(cleanQuery);
+ deleteQueryObject.addValue(randomUUID);
+ executeEventualPut(deleteQueryObject);
+ logger.info(EELFLoggerDelegate.applicationLogger, "Cassandra healthcheck responded and cleaned up.");
+ }
+
+ /*For unit testing purpose only*/
+ public void executeEventualPut(PreparedQueryObject deleteQueryObject) throws MusicServiceException, MusicQueryException {
+ MusicDataStoreHandle.getDSHandle().executePut(deleteQueryObject, "eventual");
+ }
+
+ private boolean createKeyspace() throws MusicServiceException,MusicQueryException {
+ PreparedQueryObject pQuery = new PreparedQueryObject();
+ pQuery.appendQueryString("CREATE TABLE admin.healthcheck (id uuid PRIMARY KEY)");
+ ResultType rs = null ;
+ rs = MusicCore.nonKeyRelatedPut(pQuery, ConsistencyLevel.ONE.toString());
+ return rs != null && rs.getResult().toLowerCase().contains("success");
+ }
+
+ public String getCassandrHost() {
+ return cassandrHost;
+ }
+
+ public void setCassandrHost(String cassandrHost) {
+ this.cassandrHost = cassandrHost;
+ }
+
+} \ No newline at end of file
diff --git a/music-rest/src/main/java/org/onap/music/eelf/logging/MusicContainerFilter.java b/music-rest/src/main/java/org/onap/music/eelf/logging/MusicContainerFilter.java
new file mode 100644
index 00000000..bac02afa
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/eelf/logging/MusicContainerFilter.java
@@ -0,0 +1,68 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+
+import org.springframework.stereotype.Component;
+
+
+/**
+ * This filter filter/modifies outbound http responses just before sending back to client.
+ *
+ * @author sp931a
+ *
+ */
+@Component
+public class MusicContainerFilter implements ContainerResponseFilter {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicContainerFilter.class);
+
+ public MusicContainerFilter() {
+
+ }
+
+ @Override
+ public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
+ throws IOException {
+ if (null != EELFLoggerDelegate.mdcGet("transactionId")) {
+ EELFLoggerDelegate.mdcRemove("transactionId");
+ }
+
+ if (null != EELFLoggerDelegate.mdcGet("conversationId")) {
+ EELFLoggerDelegate.mdcRemove("conversationId");
+ }
+
+ if (null != EELFLoggerDelegate.mdcGet("clientId")) {
+ EELFLoggerDelegate.mdcRemove("clientId");
+ }
+
+ if (null != EELFLoggerDelegate.mdcGet("messageId")) {
+ EELFLoggerDelegate.mdcRemove("messageId");
+ }
+ }
+
+}
diff --git a/music-rest/src/main/java/org/onap/music/eelf/logging/MusicLoggingServletFilter.java b/music-rest/src/main/java/org/onap/music/eelf/logging/MusicLoggingServletFilter.java
new file mode 100644
index 00000000..cda5b659
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/eelf/logging/MusicLoggingServletFilter.java
@@ -0,0 +1,207 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (C) 2019 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 java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.music.authentication.AuthorizationError;
+import org.onap.music.main.MusicUtil;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ *
+ * This is the first filter in the chain to be executed before cadi
+ * authentication. The priority has been set in <code>MusicApplication</code>
+ * through filter registration bean
+ *
+ * The responsibility of this filter is to validate header values as per
+ * contract and write it to MDC and http response header back.
+ *
+ *
+ * @author sp931a
+ *
+ */
+
+public class MusicLoggingServletFilter implements Filter {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicLoggingServletFilter.class);
+ // client transaction id, specific to client system, set in properties
+ public static final String CONVERSATION_ID = MusicUtil.getConversationIdPrefix() + "ConversationId";
+
+ // can be used as correlation-id in case of callback, also this can be passed to
+ // other services for tracking.
+ public static final String MESSAGE_ID = MusicUtil.getMessageIdPrefix() + "MessageId";
+
+ // client id would be the unique client source-system-id, i;e VALET or CONDUCTOR
+ // etc
+ public static final String CLIENT_ID = MusicUtil.getClientIdPrefix() + "ClientId";
+
+ // unique transaction of the source system
+ private static final String TRANSACTION_ID = MusicUtil.getTransIdPrefix() + "Transaction-Id";
+
+ public MusicLoggingServletFilter() throws ServletException {
+ super();
+ }
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+
+ logger.info(EELFLoggerDelegate.securityLogger,
+ "In MusicLogginServletFilter doFilter start() :: [\"+MusicUtil.getTransIdRequired()+\",\"+MusicUtil.getConversationIdRequired()+\",\"+MusicUtil.getClientIdRequired()+\",\"+MusicUtil.getMessageIdRequired()");
+
+ HttpServletRequest httpRequest = null;
+ HttpServletResponse httpResponse = null;
+ Map<String, String> headerMap = null;
+ Map<String, String> upperCaseHeaderMap = null;
+
+ if (null != request && null != response) {
+ httpRequest = (HttpServletRequest) request;
+ httpResponse = (HttpServletResponse) response;
+
+ headerMap = getHeadersInfo(httpRequest);
+
+ // The custom header values automatically converted into lower case, not sure
+ // why ? So i had to covert all keys to upper case
+ // The response header back to client will have all custom header values as
+ // upper case.
+ upperCaseHeaderMap = headerMap.entrySet().stream()
+ .collect(Collectors.toMap(entry -> entry.getKey().toUpperCase(), entry -> entry.getValue()));
+ // Enable/disable keys are present in /opt/app/music/etc/music.properties
+
+ if (MusicUtil.getTransIdRequired()
+ && !upperCaseHeaderMap.containsKey(TRANSACTION_ID.toUpperCase())) {
+ populateError(httpResponse, "Transaction id '" + TRANSACTION_ID
+ + "' required on http header");
+ return;
+ } else {
+ populateMDCAndResponseHeader(upperCaseHeaderMap, TRANSACTION_ID, "transactionId",
+ MusicUtil.getTransIdRequired(), httpResponse);
+ }
+
+ if (MusicUtil.getConversationIdRequired()
+ && !upperCaseHeaderMap.containsKey(CONVERSATION_ID.toUpperCase())) {
+ populateError(httpResponse, "Conversation Id '" + CONVERSATION_ID
+ + "' required on http header");
+ return;
+ } else {
+ populateMDCAndResponseHeader(upperCaseHeaderMap, CONVERSATION_ID, "conversationId",
+ MusicUtil.getConversationIdRequired(), httpResponse);
+ }
+
+ if (MusicUtil.getMessageIdRequired()
+ && !upperCaseHeaderMap.containsKey(MESSAGE_ID.toUpperCase())) {
+ populateError(httpResponse, "Message Id '" + MESSAGE_ID
+ + "' required on http header");
+ return;
+ } else {
+ populateMDCAndResponseHeader(upperCaseHeaderMap, MESSAGE_ID, "messageId",
+ MusicUtil.getMessageIdRequired(), httpResponse);
+ }
+
+ if (MusicUtil.getClientIdRequired()
+ && !upperCaseHeaderMap.containsKey(CLIENT_ID.toUpperCase())) {
+ populateError(httpResponse, "Client Id '" + CLIENT_ID
+ + "' required on http header");
+ return;
+ } else {
+ populateMDCAndResponseHeader(upperCaseHeaderMap, CLIENT_ID, "clientId",
+ MusicUtil.getClientIdRequired(), httpResponse);
+ }
+
+ }
+
+ logger.info(EELFLoggerDelegate.securityLogger,
+ "In MusicLogginServletFilter doFilter. Header values validated sucessfully");
+
+ chain.doFilter(request, response);
+ }
+
+ private void populateError(HttpServletResponse httpResponse, String errMsg) throws IOException {
+ AuthorizationError authError = new AuthorizationError();
+ authError.setResponseCode(HttpServletResponse.SC_BAD_REQUEST);
+ authError.setResponseMessage(errMsg);
+
+ byte[] responseToSend = restResponseBytes(authError);
+ httpResponse.setHeader("Content-Type", "application/json");
+
+ // ideally the http response code should be 200, as this is a biz validation
+ // failure. For now, keeping it consistent with other places.
+ httpResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+ httpResponse.getOutputStream().write(responseToSend);
+ }
+
+ private void populateMDCAndResponseHeader(Map<String, String> headerMap, String idKey, String mdcKey,
+ boolean isRequired, HttpServletResponse httpResponse) {
+
+ idKey = idKey.trim().toUpperCase();
+
+ // 1. setting the keys & value in MDC for future use 2.setting the values in
+ // http response header back to client.
+ if (isRequired && (headerMap.containsKey(idKey))) {
+ EELFLoggerDelegate.mdcPut(mdcKey, headerMap.get(idKey));
+ httpResponse.addHeader(idKey, headerMap.get(idKey));
+ } else {
+ // do nothing
+ }
+ }
+
+ private Map<String, String> getHeadersInfo(HttpServletRequest request) {
+
+ Map<String, String> map = new HashMap<String, String>();
+
+ Enumeration<String> headerNames = request.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String key = (String) headerNames.nextElement();
+ String value = request.getHeader(key);
+ map.put(key, value);
+ }
+
+ return map;
+ }
+
+ private byte[] restResponseBytes(AuthorizationError eErrorResponse) throws IOException {
+ String serialized = new ObjectMapper().writeValueAsString(eErrorResponse);
+ return serialized.getBytes();
+ }
+}
diff --git a/src/main/java/org/onap/music/main/MusicDigest.java b/music-rest/src/main/java/org/onap/music/exceptions/MusicAuthenticationException.java
index d05969e3..ab44fd6e 100644
--- a/src/main/java/org/onap/music/main/MusicDigest.java
+++ b/music-rest/src/main/java/org/onap/music/exceptions/MusicAuthenticationException.java
@@ -2,7 +2,7 @@
* ============LICENSE_START==========================================
* org.onap.music
* ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
+ * Copyright (c) 2019 AT&T Intellectual Property
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,60 +20,56 @@
* ====================================================================
*/
-package org.onap.music.main;
+package org.onap.music.exceptions;
/**
- *
+ * @author inam
*
*/
-public class MusicDigest {
- private String evPutStatus;
- private String vectorTs;
+public class MusicAuthenticationException extends Exception {
/**
- * @param evPutStatus
- * @param vectorTs
+ *
*/
- public MusicDigest(String evPutStatus, String vectorTs) {
- this.evPutStatus = evPutStatus;
- this.vectorTs = vectorTs;
+ public MusicAuthenticationException() {
+
}
/**
- * @return
+ * @param message
*/
- public String getEvPutStatus() {
- return evPutStatus;
+ public MusicAuthenticationException(String message) {
+ super(message);
+
}
/**
- * @param evPutStatus
+ * @param cause
*/
- public void setEvPutStatus(String evPutStatus) {
- this.evPutStatus = evPutStatus;
+ public MusicAuthenticationException(Throwable cause) {
+ super(cause);
+
}
/**
- * @return
+ * @param message
+ * @param cause
*/
- public String getVectorTs() {
- return vectorTs;
+ public MusicAuthenticationException(String message, Throwable cause) {
+ super(message, cause);
+
}
/**
- * @param vectorTs
+ * @param message
+ * @param cause
+ * @param enableSuppression
+ * @param writableStackTrace
*/
- public void setVectorTs(String vectorTs) {
- this.vectorTs = vectorTs;
- }
+ public MusicAuthenticationException(String message, Throwable cause, boolean enableSuppression,
+ boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
- public String toString() {
- return vectorTs + "|" + evPutStatus;
}
-}
+}
diff --git a/src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java b/music-rest/src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java
index 83bb1b8a..c31fcf73 100644
--- a/src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java
+++ b/music-rest/src/main/java/org/onap/music/exceptions/MusicExceptionMapper.java
@@ -37,18 +37,20 @@ public class MusicExceptionMapper implements ExceptionMapper<Exception> {
public Response toResponse(Exception exception) {
if(exception instanceof UnrecognizedPropertyException) {
return Response.status(Response.Status.BAD_REQUEST).
- entity(new JsonResponse(ResultType.FAILURE).setError("Unknown field :"+((UnrecognizedPropertyException) exception).getUnrecognizedPropertyName()).toMap()).
- build();
- }
- else if(exception instanceof EOFException) {
+ entity(new JsonResponse(ResultType.FAILURE).setError("Unknown field :"+((UnrecognizedPropertyException) exception).getUnrecognizedPropertyName()).toMap()).
+ build();
+ } else if(exception instanceof EOFException) {
return Response.status(Response.Status.BAD_REQUEST).
- entity(new JsonResponse(ResultType.FAILURE).setError("Request body cannot be empty").toMap()).
- build();
- }
- else {
+ entity(new JsonResponse(ResultType.FAILURE).setError("Request body cannot be empty").toMap()).
+ build();
+ } else if(exception instanceof NullPointerException) {
+ return Response.status(Response.Status.BAD_REQUEST).
+ entity(new JsonResponse(ResultType.FAILURE).setError("NullPointerException - Please check to make sure all inputs are valid.").toMap()).
+ build();
+ } else {
return Response.status(Response.Status.BAD_REQUEST).
- entity(new JsonResponse(ResultType.FAILURE).setError(exception.getMessage()).toMap()).
- build();
+ entity(new JsonResponse(ResultType.FAILURE).setError(exception.getMessage()).toMap()).
+ build();
}
}
}
diff --git a/music-rest/src/main/java/org/onap/music/main/PropertiesLoader.java b/music-rest/src/main/java/org/onap/music/main/PropertiesLoader.java
new file mode 100644
index 00000000..11dc51dd
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/main/PropertiesLoader.java
@@ -0,0 +1,373 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import java.util.HashSet;
+import java.util.Properties;
+
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
+import org.springframework.stereotype.Component;
+
+@PropertySource(value = {"file:/opt/app/music/etc/music.properties", "classpath:/project.properties"})
+//"file:/opt/app/music/etc/key.properties"
+@Component
+public class PropertiesLoader implements InitializingBean {
+
+ @Value("${cassandra.host}")
+ public String cassandraHost;
+
+ @Value("${debug}")
+ public String debug;
+
+ @Value("${version}")
+ public String version;
+
+ @Value("${build}")
+ public String build;
+
+ @Value("${music.properties}")
+ public String musicProperties;
+
+ @Value("${lock.lease.period}")
+ public String lockLeasePeriod;
+
+ @Value("${cassandra.user}")
+ public String cassandraUser;
+
+ @Value("${cassandra.password}")
+ public String cassandraPassword;
+
+ @Value("${cassandra.port}")
+ public String cassandraPort;
+
+ @Value("${cassandra.connecttimeoutms}")
+ public String cassandraConnectTimeOutMS;
+
+ @Value("${cassandra.readtimeoutms}")
+ public String cassandraReadTimeOutMS;
+
+ @Value("${cadi}")
+ public String isCadi;
+
+ @Value("${keyspace.active}")
+ public String isKeyspaceActive;
+
+ @Value("${retry.count}")
+ public String rertryCount;
+
+ @Value("${lock.daemon.sleeptime.ms}")
+ public String lockDaemonSleeptimems;
+
+ @Value("${keyspaces.for.lock.cleanup}")
+ public String keyspacesForLockCleanup;
+
+ @Value("${create.lock.wait.period.ms}")
+ private long createLockWaitPeriod;
+
+ @Value("${create.lock.wait.increment.ms}")
+ private int createLockWaitIncrement;
+
+ @Value("${transId.header.prefix}")
+ private String transIdPrefix;
+
+ @Value("${conversation.header.prefix}")
+ private String conversationIdPrefix;
+
+ @Value("${clientId.header.prefix}")
+ private String clientIdPrefix;
+
+ @Value("${messageId.header.prefix}")
+ private String messageIdPrefix;
+
+ @Value("${transId.header.required}")
+ private Boolean transIdRequired;
+
+ @Value("${conversation.header.required}")
+ private Boolean conversationIdRequired;
+
+ @Value("${clientId.header.required}")
+ private Boolean clientIdRequired;
+
+ @Value("${messageId.header.required}")
+ private Boolean messageIdRequired;
+
+ @Value("${music.aaf.ns}")
+ private String musicAafNs;
+
+ @Value("${cipher.enc.key:}")
+ private String cipherEncKey;
+
+ @SuppressWarnings("unused")
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PropertiesLoader.class);
+
+ @Bean
+ public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
+
+ PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
+ pspc.setIgnoreResourceNotFound(true);
+ pspc.setIgnoreUnresolvablePlaceholders(true);
+ return pspc;
+ }
+
+ /**
+ * .
+ */
+ public void loadProperties() {
+ if(cipherEncKey != null) {
+ MusicUtil.setCipherEncKey(cipherEncKey);
+ }
+ if (musicAafNs != null) {
+ MusicUtil.setMusicAafNs(musicAafNs);
+ }
+ if (cassandraPort != null && !cassandraPort.equals("${cassandra.port}")) {
+ MusicUtil.setCassandraPort(Integer.parseInt(cassandraPort));
+ }
+ if (cassandraUser != null && !cassandraUser.equals("${cassandra.user}")) {
+ MusicUtil.setCassName(cassandraUser);
+ }
+ if (cassandraPassword != null && !cassandraPassword.equals("${cassandra.password}")) {
+ MusicUtil.setCassPwd(cassandraPassword);
+ }
+ if (cassandraConnectTimeOutMS != null && !cassandraConnectTimeOutMS.equals("${cassandra.connecttimeoutms}")) {
+ MusicUtil.setCassandraConnectTimeOutMS(Integer.parseInt(cassandraConnectTimeOutMS));
+ }
+ if (cassandraReadTimeOutMS != null && !cassandraReadTimeOutMS.equals("${cassandra.readtimeoutms}")) {
+ MusicUtil.setCassandraReadTimeOutMS(Integer.parseInt(cassandraReadTimeOutMS));
+ }
+ if (debug != null && !debug.equals("${debug}")) {
+ MusicUtil.setDebug(Boolean.parseBoolean(debug));
+ }
+ if (lockLeasePeriod != null && !lockLeasePeriod.equals("${lock.lease.period}")) {
+ MusicUtil.setDefaultLockLeasePeriod(Long.parseLong(lockLeasePeriod));
+ }
+ if (musicProperties != null && !musicProperties.equals("${music.properties}")) {
+ MusicUtil.setMusicPropertiesFilePath(musicProperties);
+ }
+ if (cassandraHost != null && !cassandraHost.equals("${cassandra.host}")) {
+ MusicUtil.setMyCassaHost(cassandraHost);
+ }
+ if (version != null && !version.equals("${version}")) {
+ MusicUtil.setVersion(version);
+ }
+ if (build != null && !version.equals("${build}")) {
+ MusicUtil.setBuild(build);
+ }
+ if (isCadi != null && !isCadi.equals("${cadi}")) {
+ MusicUtil.setIsCadi(Boolean.parseBoolean(isCadi));
+ }
+ if (rertryCount != null && !rertryCount.equals("${retry.count}")) {
+ MusicUtil.setRetryCount(Integer.parseInt(rertryCount));
+ }
+ if (isKeyspaceActive != null && !isKeyspaceActive.equals("${keyspace.active}")) {
+ MusicUtil.setKeyspaceActive(Boolean.parseBoolean(isKeyspaceActive));
+ }
+ if (lockDaemonSleeptimems != null && !lockDaemonSleeptimems.equals("${lock.daemon.sleeptime.ms}")) {
+ MusicUtil.setLockDaemonSleepTimeMs(Long.parseLong(lockDaemonSleeptimems));
+ }
+ if (keyspacesForLockCleanup !=null && !keyspacesForLockCleanup.equals("${keyspaces.for.lock.cleanup}")) {
+ HashSet<String> keyspaces = new HashSet<>();
+ for (String keyspace: keyspacesForLockCleanup.split(",")) {
+ keyspaces.add(keyspace);
+ }
+ MusicUtil.setKeyspacesToCleanLocks(keyspaces);
+ }
+ if(transIdPrefix!=null) {
+ MusicUtil.setTransIdPrefix(transIdPrefix);
+ }
+
+ if(conversationIdPrefix!=null) {
+ MusicUtil.setConversationIdPrefix(conversationIdPrefix);
+ }
+
+ if(clientIdPrefix!=null) {
+ MusicUtil.setClientIdPrefix(clientIdPrefix);
+ }
+
+ if(messageIdPrefix!=null) {
+ MusicUtil.setMessageIdPrefix(messageIdPrefix);
+ }
+
+ if(transIdRequired!=null) {
+ MusicUtil.setTransIdRequired(transIdRequired);
+ }
+
+ if(conversationIdRequired!=null) {
+ MusicUtil.setConversationIdRequired(conversationIdRequired);
+ }
+
+ if(clientIdRequired!=null) {
+ MusicUtil.setClientIdRequired(clientIdRequired);
+ }
+
+ if(messageIdRequired!=null) {
+ MusicUtil.setMessageIdRequired(messageIdRequired);
+ }
+
+ if(createLockWaitPeriod!=0) {
+ MusicUtil.setCreateLockWaitPeriod(createLockWaitPeriod);
+ }
+
+ if(createLockWaitIncrement!=0) {
+ MusicUtil.setCreateLockWaitIncrement(createLockWaitIncrement);
+ }
+ }
+
+ public static void loadProperties(Properties properties) {
+ if (properties.getProperty("cassandra.host")!=null) {
+ MusicUtil.setMyCassaHost(properties.getProperty("cassandra.host"));
+ }
+
+ if (properties.getProperty("cassandra.port")!=null) {
+ MusicUtil.setCassandraPort(Integer.parseInt(properties.getProperty("cassandra.port")));
+ }
+
+ if (properties.getProperty("cassandra.user")!=null) {
+ MusicUtil.setCassName(properties.getProperty("cassandra.user"));
+ }
+
+ if (properties.getProperty("cassandra.password")!=null) {
+ MusicUtil.setCassPwd(properties.getProperty("cassandra.password"));
+ }
+
+ if(properties.getProperty("cassandra.connectTimeOutMS")!=null) {
+ MusicUtil.setCassandraConnectTimeOutMS(Integer.parseInt(properties.getProperty("cassandra.connecttimeoutms")));
+ }
+
+ if(properties.getProperty("cassandra.readTimeOutMS")!=null) {
+ MusicUtil.setCassandraReadTimeOutMS(Integer.parseInt(properties.getProperty("cassandra.readtimeoutms")));
+ }
+
+ if (properties.getProperty("music.properties")!=null) {
+ MusicUtil.setMusicPropertiesFilePath(properties.getProperty("music.properties"));
+ }
+
+ if (properties.getProperty("debug")!=null) {
+ MusicUtil.setDebug(Boolean.parseBoolean(properties.getProperty("debug")));
+ }
+
+ if (properties.getProperty("version")!=null) {
+ MusicUtil.setVersion(properties.getProperty("version"));
+ }
+
+ if (properties.getProperty("build")!=null) {
+ MusicUtil.setBuild(properties.getProperty("build"));
+ }
+
+ if (properties.getProperty("lock.lease.period")!=null) {
+ MusicUtil.setDefaultLockLeasePeriod(Long.parseLong(properties.getProperty("lock.lease.period")));
+ }
+
+ if (properties.getProperty("cadi")!=null) {
+ MusicUtil.setIsCadi(Boolean.parseBoolean(properties.getProperty("cadi")));
+ }
+
+ if (properties.getProperty("keyspace.active")!=null) {
+ MusicUtil.setKeyspaceActive(Boolean.parseBoolean(properties.getProperty("keyspace.active")));
+ }
+
+ if (properties.getProperty("retry.count")!=null) {
+ MusicUtil.setRetryCount(Integer.parseInt(properties.getProperty("retry.count")));
+ }
+
+ if (properties.getProperty("transId.header.prefix")!=null) {
+ MusicUtil.setTransIdPrefix(properties.getProperty("transId.header.prefix"));
+ }
+
+ if (properties.getProperty("conversation.header.prefix")!=null) {
+ MusicUtil.setConversationIdPrefix(properties.getProperty("conversation.header.prefix"));
+ }
+
+ if (properties.getProperty("clientId.header.prefix")!=null) {
+ MusicUtil.setClientIdPrefix(properties.getProperty("clientId.header.prefix"));
+ }
+
+ if (properties.getProperty("messageId.header.prefix")!=null) {
+ MusicUtil.setMessageIdPrefix(properties.getProperty("messageId.header.prefix"));
+ }
+
+ if (properties.getProperty("transId.header.required")!=null) {
+ MusicUtil.setTransIdRequired(Boolean.parseBoolean(properties.getProperty("transId.header.required")));
+ }
+
+ if (properties.getProperty("conversation.header.required")!=null) {
+ MusicUtil.setConversationIdRequired(Boolean.parseBoolean(properties.getProperty("conversation.header.required")));
+ }
+
+ if (properties.getProperty("clientId.header.required")!=null) {
+ MusicUtil.setClientIdRequired(Boolean.parseBoolean(properties.getProperty("clientId.header.required")));
+ }
+
+ if (properties.getProperty("messageId.header.required")!=null) {
+ MusicUtil.setMessageIdRequired(Boolean.parseBoolean(properties.getProperty("messageId.header.required")));
+ }
+
+ if (properties.getProperty("music.aaf.ns")!=null) {
+ MusicUtil.setMusicAafNs(properties.getProperty("music.aaf.ns"));
+ }
+
+ if (properties.getProperty("cipher.enc.key")!=null) {
+ MusicUtil.setCipherEncKey(properties.getProperty("cipher.enc.key"));
+ }
+
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ // TODO Auto-generated method stub
+
+ }
+
+ /* For unit testing purpose only*/
+ protected void setProperties() {
+ cassandraHost = "127.0.0.1";
+ debug = "true";
+ version = "x.x.x";
+ build = "y.y";
+ musicProperties = "property";
+ lockLeasePeriod = "5000";
+ cassandraUser = "user";
+ cassandraPassword = "password";
+ cassandraPort = "8007";
+ cassandraConnectTimeOutMS = "1000";
+ cassandraReadTimeOutMS = "1000";
+ isCadi = "true";
+ isKeyspaceActive = "true";
+ rertryCount = "20";
+ transIdPrefix = "transId-";
+ conversationIdPrefix = "conversation-";
+ clientIdPrefix = "clientId-";
+ messageIdPrefix = "messageId-";
+ transIdRequired = true;
+ conversationIdRequired = true;
+ clientIdRequired = true;
+ messageIdRequired = true;
+ musicAafNs = "ns";
+ cipherEncKey = "key";
+ }
+
+}
diff --git a/src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java b/music-rest/src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java
index 8e589efe..5ae49f5d 100644
--- a/src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java
+++ b/music-rest/src/main/java/org/onap/music/response/jsonobjects/JsonResponse.java
@@ -3,6 +3,8 @@
* org.onap.music
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
+ *
+ * Modifications Copyright (C) 2019 IBM.
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,7 +24,9 @@
package org.onap.music.response.jsonobjects;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.onap.music.lockingservice.cassandra.MusicLockState.LockStatus;
@@ -44,6 +48,7 @@ public class JsonResponse {
/* versioning */
private String musicVersion;
+ private String musicBuild;
/* Data Fields */
private Map<String, HashMap<String, Object>> dataResult;
@@ -51,9 +56,9 @@ public class JsonResponse {
/* Locking fields */
private String lock;
private LockStatus lockStatus;
- private String lockHolder;
+ private List<String> lockHolders;
private String lockLease;
-
+ private boolean isLockHolders=false;
/**
* Create a JSONLock Response
@@ -65,7 +70,16 @@ public class JsonResponse {
this.status = status;
}
- /**
+ public boolean isLockHolders() {
+ return isLockHolders;
+ }
+
+ public JsonResponse setisLockHolders(boolean isLockHolders) {
+ this.isLockHolders = isLockHolders;
+ return this;
+ }
+
+ /**
*
* @return
*/
@@ -122,7 +136,7 @@ public class JsonResponse {
/**
- *
+ * .
* @return the music version
*/
public String getMusicVersion() {
@@ -130,7 +144,7 @@ public class JsonResponse {
}
/**
- *
+ * .
* @param version of music
* @return
*/
@@ -139,6 +153,25 @@ public class JsonResponse {
return this;
}
+ /**
+ * .
+ * @return the music version
+ */
+ public String getMusicBuild() {
+ return this.musicBuild;
+ }
+
+ /**
+ * .
+ * @param build of music
+ * @return
+ */
+ public JsonResponse setMusicBuild(String build) {
+ this.musicBuild = build;
+ return this;
+ }
+
+
public Map<String, HashMap<String, Object>> getDataResult() {
return this.dataResult;
}
@@ -189,8 +222,8 @@ public class JsonResponse {
* @return the lockHolder
*/
@ApiModelProperty(value = "Holder of the Lock")
- public String getLockHolder() {
- return lockHolder;
+ public List<String> getLockHolder() {
+ return lockHolders;
}
/**
@@ -198,10 +231,15 @@ public class JsonResponse {
* @param lockHolder
*/
public JsonResponse setLockHolder(String lockHolder) {
- this.lockHolder = lockHolder;
+ this.lockHolders = new ArrayList<String>();
+ this.lockHolders.add(lockHolder);
return this;
}
+ public JsonResponse setLockHolder(List<String> lockHolders) {
+ this.lockHolders = lockHolders;
+ return this;
+ }
/**
@@ -227,37 +265,42 @@ public class JsonResponse {
public Map<String, Object> toMap() {
Map<String, Object> fullMap = new HashMap<>();
fullMap.put("status", status);
-/*<<<<<<< HEAD
- if (error!=null) {
- fullMap.put("error", error);
+ if (error != null && !"".equals(error)) {
+ fullMap.put("error", error);
}
- if (message!=null) {
- fullMap.put("message", message);
+ if (message != null) {
+ fullMap.put("message", message);
}
-=======*/
- if (error!=null && !"".equals(error)) {fullMap.put("error", error);}
- if (message!=null) {fullMap.put("message", message);}
- if (musicVersion!=null) {
+ if (musicVersion != null) {
fullMap.put("version", musicVersion);
}
- if (dataResult!=null) {
+ if (musicBuild != null) {
+ fullMap.put("build", musicBuild);
+ }
+
+ if (dataResult != null) {
fullMap.put("result", dataResult);
}
- if (lock!=null) {
+ if (lock != null) {
Map<String, Object> lockMap = new HashMap<>();
- if (lock!=null) {
+ if (lock != null) {
lockMap.put("lock", lock);
}
- if (lockStatus!=null) {
+ if (lockStatus != null) {
lockMap.put("lock-status", lockStatus);
}
- if (lockHolder!=null) {
- lockMap.put("lock-holder", lockHolder);
+ if (lockHolders != null && !lockHolders.isEmpty()) {
+ if (lockHolders.size()==1 && !isLockHolders) {
+ //for backwards compatability
+ lockMap.put("lock-holder", lockHolders.get(0));
+ } else {
+ lockMap.put("lock-holder", lockHolders);
+ }
}
- if (lockLease!=null) {
+ if (lockLease != null) {
lockMap.put("lock-lease", lockLease);
}
fullMap.put("lock", lockMap);
@@ -273,7 +316,7 @@ public class JsonResponse {
public String toString() {
return "JsonLockResponse [status=" + status + ", error=" + error + ", message=" + message
+ ", lock=" + lock + ", lockStatus=" + lockStatus + ", lockHolder="
- + lockHolder + "]";
+ + lockHolders + "]";
}
}
diff --git a/src/main/java/org/onap/music/rest/Application.java b/music-rest/src/main/java/org/onap/music/rest/Application.java
index 5375155b..5375155b 100644
--- a/src/main/java/org/onap/music/rest/Application.java
+++ b/music-rest/src/main/java/org/onap/music/rest/Application.java
diff --git a/music-rest/src/main/java/org/onap/music/rest/RestMusicDataAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
new file mode 100755
index 00000000..756856d0
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
@@ -0,0 +1,1052 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * Modifications Copyright (C) 2019 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.rest;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonIndex;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonKeySpace;
+import org.onap.music.datastore.jsonobjects.JsonSelect;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+import org.onap.music.response.jsonobjects.JsonResponse;
+
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.TableMetadata;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Example;
+import io.swagger.annotations.ExampleProperty;
+
+/* Version 2 Class */
+//@Path("/v{version: [0-9]+}/keyspaces")
+@Path("/v2/keyspaces")
+@Api(value = "Data Api")
+public class RestMusicDataAPI {
+ /*
+ * Header values for Versioning X-minorVersion *** - Used to request or communicate a MINOR
+ * version back from the client to the server, and from the server back to the client - This
+ * will be the MINOR version requested by the client, or the MINOR version of the last MAJOR
+ * version (if not specified by the client on the request) - Contains a single position value
+ * (e.g. if the full version is 1.24.5, X-minorVersion = "24") - Is optional for the client on
+ * request; however, this header should be provided if the client needs to take advantage of
+ * MINOR incremented version functionality - Is mandatory for the server on response
+ *
+ *** X-patchVersion *** - Used only to communicate a PATCH version in a response for
+ * troubleshooting purposes only, and will not be provided by the client on request - This will
+ * be the latest PATCH version of the MINOR requested by the client, or the latest PATCH version
+ * of the MAJOR (if not specified by the client on the request) - Contains a single position
+ * value (e.g. if the full version is 1.24.5, X-patchVersion = "5") - Is mandatory for the
+ * server on response (CURRENTLY NOT USED)
+ *
+ *** X-latestVersion *** - Used only to communicate an API's latest version - Is mandatory for the
+ * server on response, and shall include the entire version of the API (e.g. if the full version
+ * is 1.24.5, X-latestVersion = "1.24.5") - Used in the response to inform clients that they are
+ * not using the latest version of the API (CURRENTLY NOT USED)
+ *
+ */
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicDataAPI.class);
+ private static final String XMINORVERSION = "X-minorVersion";
+ private static final String XPATCHVERSION = "X-patchVersion";
+ private static final String NS = "ns";
+ private static final String VERSION = "v2";
+ private static final String PARAMETER_ERROR = "Missing Row Identifier. Please provide the parameter of key=value for the row being selected.";
+
+
+ private class RowIdentifier {
+ public String primarKeyValue;
+ public StringBuilder rowIdString;
+ @SuppressWarnings("unused")
+ public PreparedQueryObject queryObject; // the string with all the row
+ // identifiers separated by AND
+
+ public RowIdentifier(String primaryKeyValue, StringBuilder rowIdString,
+ PreparedQueryObject queryObject) {
+ this.primarKeyValue = primaryKeyValue;
+ this.rowIdString = rowIdString;
+ this.queryObject = queryObject;
+ }
+ }
+
+
+ /**
+ * Create Keyspace REST
+ *
+ * @param kspObject
+ * @param keyspaceName
+ * @return
+ * @throws Exception
+ */
+ @POST
+ @Path("/{name}")
+ @ApiOperation(value = "Create Keyspace", response = String.class,
+ notes = "This API will not work if MUSIC properties has keyspace.active=false ")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"message\" : \"Keysapce <keyspace> Created\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response createKeySpace(
+ @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam(NS) String ns,
+ JsonKeySpace kspObject,
+ @ApiParam(value = "Keyspace Name",required = true) @PathParam("name") String keyspaceName) {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
+ logger.info(EELFLoggerDelegate.applicationLogger,"In Create Keyspace " + keyspaceName);
+ if (MusicUtil.isKeyspaceActive() ) {
+ logger.info(EELFLoggerDelegate.applicationLogger,"Creating Keyspace " + keyspaceName);
+
+ if(kspObject == null || kspObject.getReplicationInfo() == null) {
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(ResultType.BODYMISSING.getResult()).toMap()).build();
+ }
+ ResultType result = ResultType.FAILURE;
+ try {
+ kspObject.setKeyspaceName(keyspaceName);
+ result = MusicCore.createKeyspace(kspObject, MusicUtil.EVENTUAL);
+ logger.info(EELFLoggerDelegate.applicationLogger, "result = " + result);
+ } catch ( MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.QUERYERROR
+ ,ErrorSeverity.WARN, ErrorTypes.QUERYERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ } catch ( MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Keyspace " + keyspaceName + " Created").toMap()).build();
+ } else {
+ String vError = "Keyspace Creation has been turned off. Contact DBA to create the keyspace or set keyspace.active to true.";
+ logger.info(EELFLoggerDelegate.applicationLogger,vError);
+ logger.error(EELFLoggerDelegate.errorLogger,vError, AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Response.Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(vError).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+
+ }
+
+ /**
+ *
+ * @param kspObject
+ * @param keyspaceName
+ * @return
+ * @throws Exception
+ */
+ @DELETE
+ @Path("/{name}")
+ @ApiOperation(value = "Delete Keyspace", response = String.class,
+ notes = "This API will not work if MUSIC properties has keyspace.active=false ")
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"message\" : \"Keysapce <keyspace> Deleted\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response dropKeySpace(
+ @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Keyspace Name",required = true) @PathParam("name") String keyspaceName) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+ logger.info(EELFLoggerDelegate.applicationLogger,"In Drop Keyspace " + keyspaceName);
+ if (MusicUtil.isKeyspaceActive()) {
+ String consistency = MusicUtil.EVENTUAL;// for now this needs only
+ String droperror = "Error Deleteing Keyspace " + keyspaceName;
+ JsonKeySpace kspObject = new JsonKeySpace();
+ kspObject.setKeyspaceName(keyspaceName);
+ try{
+ ResultType result = MusicCore.dropKeyspace(kspObject, consistency);
+ if ( result.equals(ResultType.FAILURE) ) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError(droperror).toMap()).build();
+ }
+ } catch ( MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.QUERYERROR
+ ,ErrorSeverity.WARN, ErrorTypes.QUERYERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(droperror + " " + ex.getMessage()).toMap()).build();
+ } catch ( MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR
+ ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(droperror + " " + ex.getMessage()).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Keyspace " + keyspaceName + " Deleted").toMap()).build();
+ } else {
+ String vError = "Keyspace deletion has been turned off. Contact DBA to delete the keyspace or set keyspace.active to true.";
+ logger.info(EELFLoggerDelegate.applicationLogger,vError);
+ logger.error(EELFLoggerDelegate.errorLogger,vError, AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Response.Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(vError).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param tableObj
+ * @param version
+ * @param keyspace
+ * @param tablename
+ * @param headers
+ * @return
+ * @throws Exception -
+ */
+ @POST
+ @Path("/{keyspace: .*}/tables/{tablename: .*}")
+ @ApiOperation(value = "Create Table", response = String.class,
+ notes = "Create a table with the required json in the body.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"message\" : \"Tablename <tablename> Created under keyspace <keyspace>\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response createTable(
+ @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonTable tableObj,
+ @ApiParam(value = "Keyspace Name",required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",required = true) @PathParam("tablename") String tablename) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if ( null == tableObj ) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError(ResultType.BODYMISSING.getResult()).toMap()).build();
+ }
+ if(keyspace == null || keyspace.isEmpty() || tablename == null || tablename.isEmpty()){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("One or more path parameters are not set, please check and try again."
+ + "Parameter values: keyspace='" + keyspace + "' tablename='" + tablename + "'")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
+ String consistency = MusicUtil.EVENTUAL;
+ // for now this needs only eventual consistency
+ ResultType result = ResultType.FAILURE;
+ try {
+ tableObj.setKeyspaceName(keyspace);
+ tableObj.setTableName(tablename);
+ result = MusicCore.createTable(tableObj, consistency);
+ } catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.MUSICSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ if ( result.equals(ResultType.FAILURE) ) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError("Error Creating Table " + tablename).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("TableName " + tablename.trim() + " Created under keyspace " + keyspace.trim()).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param fieldName
+ * @param info
+ * @throws Exception
+ */
+ @POST
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/index/{field: .*}")
+ @ApiOperation(value = "Create Index", response = String.class,
+ notes = "An index provides a means to access data using attributes "
+ + "other than the partition key. The benefit is fast, efficient lookup "
+ + "of data matching a given condition.")
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"message\" : \"Index Created on <keyspace>.<table>.<field>\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unknown Error in create index.\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response createIndex(
+ @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Keyspace Name",required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",required = true) @PathParam("tablename") String tablename,
+ @ApiParam(value = "Field Name",required = true) @PathParam("field") String fieldName,
+ @Context UriInfo info) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if ((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty()) || (fieldName == null || fieldName.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
+ MultivaluedMap<String, String> rowParams = info.getQueryParameters();
+ String indexName = "";
+ if (rowParams.getFirst("index_name") != null)
+ indexName = rowParams.getFirst("index_name");
+
+ JsonIndex jsonIndexObject = new JsonIndex(indexName, keyspace, tablename, fieldName);
+
+ ResultType result = ResultType.FAILURE;
+ try {
+ result = MusicCore.createIndex(jsonIndexObject, MusicUtil.EVENTUAL);
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .CRITICAL, ErrorTypes.GENERALSERVICEERROR, ex);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ if ( result.equals(ResultType.SUCCESS) ) {
+ return response.status(Status.OK).entity(new JsonResponse(result).setMessage("Index Created on " + keyspace+"."+tablename+"."+fieldName).toMap()).build();
+ } else {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError("Unknown Error in create index.").toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param insObj
+ * @param keyspace
+ * @param tablename
+ * @return
+ * @throws Exception
+ */
+ @POST
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
+ @ApiOperation(value = "Insert Into Table", response = String.class,
+ notes = "Insert into table with data in json body.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"message\" : \"Insert Successful\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure - Generic",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response insertIntoTable(
+ @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonInsert insObj,
+ @ApiParam(value = "Keyspace Name",
+ required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",
+ required = true) @PathParam("tablename") String tablename) {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if ( null == insObj ) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError(ResultType.BODYMISSING.getResult()).toMap()).build();
+ }
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace","(" + keyspace + ")");
+ ReturnType result = null;
+ String consistency = insObj.getConsistencyInfo().get("type");
+ try {
+ insObj.setKeyspaceName(keyspace);
+ insObj.setTableName(tablename);
+ if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = insObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
+ }
+ }
+ result = MusicCore.insertIntoTable(insObj);
+ }catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ if (result==null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
+ }else if(result.getResult() == ResultType.FAILURE) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result.getResult()).setError(result.getMessage()).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(result.getResult()).setMessage("Insert Successful").toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param insObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ * @throws Exception
+ */
+ @PUT
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
+ @ApiOperation(value = "Update Table", response = String.class,
+ notes = "Update the table with the data in the JSON body.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response updateTable(
+ @ApiParam(value = "Major Version",
+ required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",
+ required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",
+ required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonUpdate updateObj,
+ @ApiParam(value = "Keyspace Name",
+ required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",
+ required = true) @PathParam("tablename") String tablename,
+ @Context UriInfo info) throws MusicQueryException, MusicServiceException {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if ( null == updateObj ) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError(ResultType.BODYMISSING.getResult()).toMap()).build();
+ }
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
+ long startTime = System.currentTimeMillis();
+ String operationId = UUID.randomUUID().toString(); // just for infoging
+ // purposes.
+ String consistency = updateObj.getConsistencyInfo().get("type");
+ ReturnType operationResult = null;
+ logger.info(EELFLoggerDelegate.applicationLogger, "--------------Music " + consistency
+ + " update-" + operationId + "-------------------------");
+
+ updateObj.setKeyspaceName(keyspace);
+ updateObj.setTableName(tablename);
+
+ try {
+ if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = updateObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
+ }
+ }
+ operationResult = MusicCore.updateTable(updateObj,info.getQueryParameters());
+ }catch (MusicLockingException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN,
+ ErrorTypes.GENERALSERVICEERROR, e);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
+ }catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ long actualUpdateCompletionTime = System.currentTimeMillis();
+
+ long endTime = System.currentTimeMillis();
+ long jsonParseCompletionTime = System.currentTimeMillis();
+ String timingString = "Time taken in ms for Music " + consistency + " update-" + operationId
+ + ":" + "|total operation time:" + (endTime - startTime)
+ + "|json parsing time:" + (jsonParseCompletionTime - startTime)
+ + "|update time:" + (actualUpdateCompletionTime - jsonParseCompletionTime)
+ + "|";
+
+ if (operationResult != null && operationResult.getTimingInfo() != null) {
+ String lockManagementTime = operationResult.getTimingInfo();
+ timingString = timingString + lockManagementTime;
+ }
+ logger.info(EELFLoggerDelegate.applicationLogger, timingString);
+
+ if (operationResult==null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
+ }
+ if ( operationResult.getResult() == ResultType.SUCCESS ) {
+ return response.status(Status.OK).entity(new JsonResponse(operationResult.getResult()).setMessage(operationResult.getMessage()).toMap()).build();
+ } else {
+ logger.error(EELFLoggerDelegate.errorLogger,operationResult.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(operationResult.getResult()).setError(operationResult.getMessage()).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param delObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws MusicServiceException
+ * @throws MusicQueryException
+ * @throws Exception
+ */
+ @DELETE
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
+ @ApiOperation(value = "Delete From table", response = String.class,
+ notes = "Delete from a table, the row or parts of a row. Based on JSON body.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response deleteFromTable(
+ @ApiParam(value = "Major Version",
+ required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",
+ required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",
+ required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonDelete delObj,
+ @ApiParam(value = "Keyspace Name",
+ required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",
+ required = true) @PathParam("tablename") String tablename,
+ @Context UriInfo info) throws MusicQueryException, MusicServiceException {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
+ if(delObj == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,ResultType.BODYMISSING.getResult(), AppMessages.MISSINGDATA ,ErrorSeverity.WARN, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ResultType.BODYMISSING.getResult()).toMap()).build();
+ }
+ ReturnType operationResult = null;
+ String consistency = delObj.getConsistencyInfo().get("type");
+ delObj.setKeyspaceName(keyspace);
+ delObj.setTableName(tablename);
+ try {
+ if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ String lockId = delObj.getConsistencyInfo().get("lockId");
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
+ }
+ }
+
+ operationResult = MusicCore.deleteFromTable(delObj,info.getQueryParameters());
+ } catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+
+ } catch (MusicLockingException e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR, e);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("Unable to perform Delete operation. Exception from music").toMap()).build();
+ }
+ if (operationResult==null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
+ }
+ if (operationResult.getResult().equals(ResultType.SUCCESS)) {
+ return response.status(Status.OK).entity(new JsonResponse(operationResult.getResult()).setMessage(operationResult.getMessage()).toMap()).build();
+ } else {
+ logger.error(EELFLoggerDelegate.errorLogger,operationResult.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(operationResult.getMessage()).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param tabObj
+ * @param keyspace
+ * @param tablename
+ * @throws Exception
+ */
+ @DELETE
+ @Path("/{keyspace: .*}/tables/{tablename: .*}")
+ @ApiOperation(value = "Drop Table", response = String.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response dropTable(
+ @ApiParam(value = "Major Version",
+ required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",
+ required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",
+ required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Keyspace Name",
+ required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",
+ required = true) @PathParam("tablename") String tablename) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
+ JsonTable jsonTable = new JsonTable();
+ jsonTable.setKeyspaceName(keyspace);
+ jsonTable.setTableName(tablename);
+ try {
+ return response.status(Status.OK).entity(new JsonResponse(MusicCore.dropTable(jsonTable, MusicUtil.EVENTUAL)).toMap()).build();
+ } catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.QUERYERROR,ErrorSeverity.WARN
+ , ErrorTypes.QUERYERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.MISSINGINFO ,ErrorSeverity.WARN
+ , ErrorTypes.GENERALSERVICEERROR,ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param selObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ */
+ @PUT
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/rows/criticalget")
+ @ApiOperation(value = "** Depreciated ** - Select Critical", response = Map.class,
+ notes = "This API is depreciated in favor of the regular select api.\n"
+ + "Avaliable to use with the select api by providing a minorVersion of 1 "
+ + "and patchVersion of 0.\n"
+ + "Critical Get requires parameter rowId=value and consistency in order to work.\n"
+ + "It will fail if either are missing.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"result\":{\"row 0\":{\"address\":"
+ + "{\"city\":\"Someplace\",\"street\":\"1 Some way\"},"
+ + "\"emp_salary\":50,\"emp_name\":\"tom\",\"emp_id\":"
+ + "\"cfd66ccc-d857-4e90-b1e5-df98a3d40cd6\"}},\"status\":\"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response selectCritical(
+ @ApiParam(value = "Major Version",
+ required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",example = "0",
+ required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",example = "0",
+ required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonInsert selObj,
+ @ApiParam(value = "Keyspace Name",
+ required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name",
+ required = true) @PathParam("tablename") String tablename,
+ @Context UriInfo info) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspace + " )");
+ if (info.getQueryParameters().isEmpty()) {
+ logger.error(EELFLoggerDelegate.errorLogger,RestMusicDataAPI.PARAMETER_ERROR, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes
+ .GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(RestMusicDataAPI.PARAMETER_ERROR).toMap()).build();
+ }
+ if (selObj == null || selObj.getConsistencyInfo().isEmpty()) {
+ String error = " Missing Body or Consistency type.";
+ logger.error(EELFLoggerDelegate.errorLogger,ResultType.BODYMISSING.getResult() + error, AppMessages.MISSINGDATA ,ErrorSeverity.WARN, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ResultType.BODYMISSING.getResult() + error).toMap()).build();
+ }
+ ResultSet results = null;
+ String consistency = selObj.getConsistencyInfo().get("type");
+ String lockId = selObj.getConsistencyInfo().get("lockId");
+ selObj.setKeyspaceName(keyspace);
+ selObj.setTableName(tablename);
+ try {
+ if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
+ if(lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
+ + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
+ + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
+ }
+ }
+ results = MusicCore.selectCritical(selObj, info.getQueryParameters());
+ }catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+
+ }catch(Exception ex) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+
+ if(results!=null && results.getAvailableWithoutFetching() >0) {
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setError("No data found").toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ * This API will replace the original select and provide a single API fro select and critical.
+ * The idea is to depreciate the older api of criticalGet and use a single API.
+ *
+ * @param selObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ */
+ @GET
+ @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
+ @ApiOperation(value = "Select", response = Map.class,
+ notes = "This has 2 versions: if minorVersion and patchVersion is null or 0, this will be a Eventual Select only.\n"
+ + "If minorVersion is 1 and patchVersion is 0, this will act like the Critical Select \n"
+ + "Critical Get requires parameter rowId=value and consistency in order to work.\n"
+ + "If parameters are missing or consistency information is missing. An eventual select will be preformed.")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"result\":{\"row 0\":{\"address\":"
+ + "{\"city\":\"Someplace\",\"street\":\"1 Some way\"},"
+ + "\"emp_salary\":50,\"emp_name\":\"tom\",\"emp_id\":"
+ + "\"cfd66ccc-d857-4e90-b1e5-df98a3d40cd6\"}},\"status\":\"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"<errorMessage>\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response selectWithCritical(
+ @ApiParam(value = "Major Version",example = "v2",
+ required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",example = "1",
+ required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",example = "0",
+ required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false,hidden = true) @HeaderParam(NS) String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonInsert selObj,
+ @ApiParam(value = "Keyspace Name", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("tablename") String tablename,
+ @Context UriInfo info) throws Exception {
+ if ((minorVersion != null && patchVersion != null) &&
+ (Integer.parseInt(minorVersion) == 1 && Integer.parseInt(patchVersion) == 0) &&
+ (!(null == selObj) && !selObj.getConsistencyInfo().isEmpty())) {
+ return selectCritical(version, minorVersion, patchVersion, aid, ns, authorization, selObj, keyspace, tablename, info);
+ } else {
+ return select(version, minorVersion, patchVersion, aid, ns, authorization, keyspace, tablename, info);
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws Exception
+ */
+ private Response select(
+ String version,String minorVersion,String patchVersion,
+ String aid,String ns,String authorization,String keyspace,
+ String tablename,UriInfo info) throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("one or more path parameters are not set, please check and try again")
+ .toMap()).build();
+ }
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspace + " ) ");
+ try {
+ JsonSelect jsonSelect = new JsonSelect();
+ jsonSelect.setKeyspaceName(keyspace);
+ jsonSelect.setTableName(tablename);
+ ResultSet results = MusicCore.select(jsonSelect, info.getQueryParameters());
+ if(results.getAvailableWithoutFetching() >0) {
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).setError("No data found").toMap()).build();
+ } catch (MusicQueryException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), ex.getMessage() ,ErrorSeverity
+ .WARN, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.ERROR,
+ ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @param limit
+ * @return
+ * @throws MusicServiceException
+ */
+ public PreparedQueryObject selectSpecificQuery(String keyspace,
+ String tablename, UriInfo info, int limit)
+ throws MusicServiceException {
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ StringBuilder rowIdString = getRowIdentifier(keyspace,
+ tablename,info.getQueryParameters(),queryObject).rowIdString;
+ queryObject.appendQueryString(
+ "SELECT * FROM " + keyspace + "." + tablename + " WHERE " + rowIdString);
+ if (limit != -1) {
+ queryObject.appendQueryString(" LIMIT " + limit);
+ }
+ queryObject.appendQueryString(";");
+ return queryObject;
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param rowParams
+ * @param queryObject
+ * @return
+ * @throws MusicServiceException
+ */
+ private RowIdentifier getRowIdentifier(String keyspace, String tablename,
+ MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
+ throws MusicServiceException {
+ StringBuilder rowSpec = new StringBuilder();
+ int counter = 0;
+ TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
+ if (tableInfo == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ throw new MusicServiceException(
+ "Table information not found. Please check input for table name= "
+ + keyspace + "." + tablename);
+ }
+ StringBuilder primaryKey = new StringBuilder();
+ for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
+ String keyName = entry.getKey();
+ List<String> valueList = entry.getValue();
+ String indValue = valueList.get(0);
+ DataType colType = null;
+ Object formattedValue = null;
+ try {
+ colType = tableInfo.getColumn(entry.getKey()).getType();
+ formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,e);
+ }
+ if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey())) {
+ primaryKey.append(indValue);
+ }
+ rowSpec.append(keyName + "= ?");
+ queryObject.addValue(formattedValue);
+ if (counter != rowParams.size() - 1) {
+ rowSpec.append(" AND ");
+ }
+ counter = counter + 1;
+ }
+ return new RowIdentifier(primaryKey.toString(), rowSpec, queryObject);
+ }
+}
diff --git a/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java
index cb8965ee..eef3aa3a 100644
--- a/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicHealthCheckAPI.java
@@ -62,32 +62,44 @@ public class RestMusicHealthCheckAPI {
private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicUtil.class);
private static final String ACTIVE_STATUS = "ACTIVE";
+ private static final String INVALID_STATUS = "INVALID";
+ private static final String INACTIVE_STATUS = "INACTIVE";
+ private static final String INVALID_MESSAGE = "Consistency level is invalid...";
+ private static final String INACTIVE_MESSAGE = "One or more nodes in the Cluster is/are down or not responding.";
+ private static final String ACTIVE_MESSAGE = "Cassandra Running and Listening to requests";
+ private static final String STATUS_KEY = "status";
+ private static final String MESSAGE_KEY = "message";
@GET
@Path("/pingCassandra/{consistency}")
@ApiOperation(value = "Get Health Status", response = Map.class)
@Produces(MediaType.APPLICATION_JSON)
- public Response cassandraStatus(@Context HttpServletResponse response, @ApiParam(value = "Consistency level",
- required = true) @PathParam("consistency") String consistency) {
+ public Response cassandraStatus(
+ @Context HttpServletResponse response,
+ @ApiParam(value = "Consistency level",required = true)
+ @PathParam("consistency") String consistency) {
logger.info(EELFLoggerDelegate.applicationLogger,"Replying to request for MUSIC Health Check status for Cassandra");
Map<String, Object> resultMap = new HashMap<>();
if(ConsistencyLevel.valueOf(consistency) == null) {
- resultMap.put("INVALID", "Consistency level is invalid...");
+ resultMap.put(STATUS_KEY,INVALID_STATUS);
+ resultMap.put(MESSAGE_KEY, INVALID_MESSAGE);
+ resultMap.put(INVALID_STATUS, INVALID_STATUS);
return Response.status(Status.BAD_REQUEST).entity(resultMap).build();
}
MusicHealthCheck cassHealthCheck = new MusicHealthCheck();
String status = cassHealthCheck.getCassandraStatus(consistency);
if(status.equals(ACTIVE_STATUS)) {
- resultMap.put(ACTIVE_STATUS, "Cassandra Running and Listening to requests");
+ resultMap.put(STATUS_KEY,ACTIVE_STATUS);
+ resultMap.put(MESSAGE_KEY, ACTIVE_MESSAGE);
+ resultMap.put(ACTIVE_STATUS, ACTIVE_MESSAGE);
return Response.status(Status.OK).entity(resultMap).build();
} else {
- resultMap.put("INACTIVE", "One or more nodes in the Cluster is/are down or not responding.");
+ resultMap.put(STATUS_KEY,INACTIVE_STATUS);
+ resultMap.put(MESSAGE_KEY, INACTIVE_MESSAGE);
+ resultMap.put(INACTIVE_STATUS, INACTIVE_MESSAGE);
return Response.status(Status.BAD_REQUEST).entity(resultMap).build();
}
-
-
-
}
@GET
diff --git a/music-rest/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java
new file mode 100644
index 00000000..321e2561
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java
@@ -0,0 +1,632 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ *
+ * 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.rest;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+
+import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
+import org.onap.music.datastore.jsonobjects.JsonLock;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.onap.music.exceptions.MusicLockingException;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.lockingservice.cassandra.MusicLockState;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.main.ReturnType;
+import org.onap.music.response.jsonobjects.JsonResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Example;
+import io.swagger.annotations.ExampleProperty;
+
+
+@Path("/v2/locks/")
+@Api(value="Locking Api")
+public class RestMusicLocksAPI {
+
+ private EELFLoggerDelegate logger =EELFLoggerDelegate.getLogger(RestMusicLocksAPI.class);
+ private static final String XMINORVERSION = "X-minorVersion";
+ private static final String XPATCHVERSION = "X-patchVersion";
+ private static final String VERSION = "v2";
+
+ /**
+ * Puts the requesting process in the q for this lock. The corresponding
+ * node will be created if it did not already exist
+ *
+ * @param lockName
+ * @return
+ * @throws Exception
+ */
+ @POST
+ @Path("/create/{lockname}")
+ @ApiOperation(value = "Create and Acquire a Lock Id for a single row.",
+ notes = "Creates and Acquires a Lock Id for a specific Row in a table based on the key of that row.\n"
+ + " The corresponding lock will be created if it did not already exist."
+ + " Lock Name also the Lock is in the form of keyspaceName.tableName.rowId.\n"
+ + " The Response will be in the form of \"$kesypaceName.tableName.rowId$lockRef\" "
+ + " where the lockRef is a integer representing the Lock Name buffered by \"$\" "
+ + " followed by the lock number. This term for "
+ + " this response is a lockId and it will be used in other /locks API calls where a "
+ + " lockId is required. If just a lock is required then the form that would be "
+ + " the original lockname(without the buffered \"$\").",
+ response = Map.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"$keyspace.table.rowId$<integer>\"},"
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to aquire lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response createLockReference(
+ @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ JsonLock lockObject,
+ @ApiParam(value = "Lock Owner", required = false) @HeaderParam("owner") String owner,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockName);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+
+ //default lock type is write, as this is always semantically safe
+ LockType locktype = LockType.WRITE;
+ if (lockObject!=null && lockObject.getLocktype()!=null) {
+ locktype = lockObject.getLocktype();
+ }
+ String lockId;
+ try {
+ lockId= MusicCore.createLockReference(lockName, locktype, owner);
+ } catch (MusicLockingException e) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
+ }
+
+ if (lockId == null) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.LOCKINGERROR ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Lock Id is null").toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setLock(lockId).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * Checks if the node is in the top of the queue and hence acquires the lock
+ *
+ * @param lockId
+ * @return
+ * @throws Exception
+ */
+ @GET
+ @Path("/acquire/{lockId}")
+ @ApiOperation(value = "Aquire Lock Id ",
+ notes = "Checks if the node is in the top of the queue and hence acquires the lock",
+ response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"$keyspace.table.rowId$<integer>\"},"
+ + "\"message\" : \"<integer> is the lock holder for the key\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to aquire lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response accquireLock(
+ @ApiParam(value="Lock Id",required=true) @PathParam("lockId") String lockId,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockId);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+ try {
+ String lockName = lockId.substring(lockId.indexOf('$')+1, lockId.lastIndexOf('$'));
+ ReturnType lockStatus = MusicCore.acquireLock(lockName,lockId);
+ if ( lockStatus.getResult().equals(ResultType.SUCCESS)) {
+ response.status(Status.OK);
+ } else {
+ response.status(Status.BAD_REQUEST);
+ }
+ return response.entity(new JsonResponse(lockStatus.getResult()).setLock(lockId).setMessage(lockStatus.getMessage()).toMap()).build();
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,AppMessages.INVALIDLOCK + lockId, ErrorSeverity.CRITICAL,
+ ErrorTypes.LOCKINGERROR, e);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Unable to aquire lock").toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+
+ @POST
+ @Path("/acquire-with-lease/{lockId}")
+ @ApiOperation(
+ hidden = false,
+ value = " ** DEPRECATED ** - Aquire Lock with Lease",
+ notes = "Acquire the lock with a lease, where lease period is in Milliseconds.\n"
+ + "This will ensure that a lock will expire in set milliseconds.\n"
+ + "This is no longer available after v3.2.0",
+ response = Map.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"$keyspace.table.rowId$<integer>\","
+ + "\"lock-lease\" : \"6000\"},"
+ + "\"message\" : \"<integer> is the lock holder for the key\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to aquire lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ @Deprecated
+ public Response accquireLockWithLease(
+ JsonLeasedLock lockObj,
+ @ApiParam(value="Lock Id",required=true) @PathParam("lockId") String lockId,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockId);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+ String lockName = lockId.substring(lockId.indexOf('$')+1, lockId.lastIndexOf('$'));
+ ReturnType lockLeaseStatus = MusicCore.acquireLockWithLease(lockName, lockId, lockObj.getLeasePeriod());
+ if ( lockLeaseStatus.getResult().equals(ResultType.SUCCESS)) {
+ response.status(Status.OK);
+ } else {
+ response.status(Status.BAD_REQUEST);
+ }
+ return response.entity(new JsonResponse(lockLeaseStatus.getResult()).setLock(lockName)
+ .setMessage(lockLeaseStatus.getMessage())
+ .setLockLease(String.valueOf(lockObj.getLeasePeriod())).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+
+
+ }
+
+
+ @GET
+ @Path("/enquire/{lockname}")
+ @ApiOperation(value = "Get the top of the lock queue",
+ notes = "Gets the current single lockholder at top of lock queue",
+ response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"keyspace.table.rowId\","
+ + "\"lock-holder\" : \"$tomtest.employees.tom$<integer>\"}},"
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Error Message\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response enquireLock(
+ @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockName);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+ String who = MusicCore.whoseTurnIsIt(lockName);
+ ResultType status = ResultType.SUCCESS;
+ String error = "";
+ if ( who == null ) {
+ status = ResultType.FAILURE;
+ error = "There was a problem getting the lock holder";
+ logger.error(EELFLoggerDelegate.errorLogger,"There was a problem getting the lock holder", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ @GET
+ @Path("/holders/{lockname}")
+ @ApiOperation(value = "Get Lock Holders",
+ notes = "Gets the current Lock Holders.\n"
+ + "Will return an array of READ Lock References.",
+ response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"keyspace.table.rowId\","
+ + "\"lock-holder\" : [\"$keyspace.table.rowId$<integer1>\",\"$keyspace.table.rowId$<integer2>\"]}},"
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Error message\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response currentLockHolder(@ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockName);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.INCORRECTDATA, ErrorSeverity.CRITICAL,
+ ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(
+ new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap())
+ .build();
+ }
+ String keyspaceName = (String) resultMap.get("keyspace");
+ List<String> who = MusicCore.getCurrentLockHolders(lockName);
+ ResultType status = ResultType.SUCCESS;
+ String error = "";
+ if (who == null || who.isEmpty()) {
+ status = ResultType.FAILURE;
+ error = (who !=null && who.isEmpty()) ? "No lock holders for the key":"There was a problem getting the lock holder";
+ logger.error(EELFLoggerDelegate.errorLogger, "There was a problem getting the lock holder",
+ AppMessages.INCORRECTDATA, ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap())
+ .build();
+ }
+ return response.status(Status.OK)
+ .entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).setisLockHolders(true).toMap())
+ .build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+
+ @GET
+ @Path("/{lockname}")
+ @ApiOperation(value = "Lock State",
+ notes = "Returns current Lock State and Holder.",
+ response = Map.class,hidden = true)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"$keyspace.table.rowId$<integer>\"},"
+ + "\"message\" : \"<integer> is the lock holder for the key\","
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to aquire lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response currentLockState(
+ @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockName);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
+ String who = MusicCore.whoseTurnIsIt(lockName);
+ ResultType status = ResultType.SUCCESS;
+ String error = "";
+ if ( who == null ) {
+ status = ResultType.FAILURE;
+ error = "There was a problem getting the lock holder";
+ logger.error(EELFLoggerDelegate.errorLogger,"There was a problem getting the lock holder", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+
+ }
+
+ /**
+ *
+ * deletes the process from the lock queue
+ *
+ * @param lockId
+ * @throws Exception
+ */
+ @DELETE
+ @Path("/release/{lockreference}")
+ @ApiOperation(value = "Release Lock",
+ notes = "Releases the lock from the lock queue.",
+ response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success - UNLOCKED = Lock Removed.",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"lock\" : {\"lock\" : \"$keyspace.table.rowId$<integer>\"},"
+ + "\"lock-status\" : \"UNLOCKED\"},"
+ + "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to aquire lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response unLock(@PathParam("lockreference") String lockId,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockId);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
+ boolean voluntaryRelease = true;
+ MusicLockState mls = MusicCore.releaseLock(lockId,voluntaryRelease);
+ if(mls.getErrorMessage() != null) {
+ resultMap.put(ResultType.EXCEPTION.getResult(), mls.getErrorMessage());
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ return response.status(Status.BAD_REQUEST).entity(resultMap).build();
+ }
+ Map<String,Object> returnMap = null;
+ if (mls.getLockStatus() == MusicLockState.LockStatus.UNLOCKED) {
+ returnMap = new JsonResponse(ResultType.SUCCESS).setLock(lockId)
+ .setLockStatus(mls.getLockStatus()).toMap();
+ response.status(Status.OK);
+ }
+ if (mls.getLockStatus() == MusicLockState.LockStatus.LOCKED) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.LOCKINGERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ returnMap = new JsonResponse(ResultType.FAILURE).setLock(lockId)
+ .setLockStatus(mls.getLockStatus()).toMap();
+ response.status(Status.BAD_REQUEST);
+ }
+ return response.entity(returnMap).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+ /**
+ *
+ * @param lockName
+ * @throws Exception
+ */
+ @Deprecated
+ @DELETE
+ @Path("/delete/{lockname}")
+ @ApiOperation(
+ hidden = true,
+ value = "-DEPRECATED- Delete Lock", response = Map.class,
+ notes = "-DEPRECATED- Delete the lock.")
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Error Message if any\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response deleteLock(@PathParam("lockname") String lockName,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "AID", required = false, hidden = true) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Application namespace",
+ required = false, hidden = true) @HeaderParam("ns") String ns) throws Exception{
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockName);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+ try{
+ MusicCore.destroyLockRef(lockName);
+ }catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, e);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
+ }
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).toMap()).build();
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+
+
+ /**
+ * Puts the requesting process in the q for this lock. The corresponding
+ * node will be created if it did not already exist
+ *
+ * @param lockName
+ * @return
+ * @throws Exception
+ */
+ @POST
+ @Path("/promote/{lockname}")
+ @ApiOperation(value = "Attempt to promote the lock for a single row.",
+ response = Map.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiResponses(value={
+ @ApiResponse(code=200, message = "Success",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "\"status\" : \"SUCCESS\"}")
+ })),
+ @ApiResponse(code=400, message = "Failure",examples = @Example( value = {
+ @ExampleProperty(mediaType="application/json",value =
+ "{\"error\" : \"Unable to promote lock\","
+ + "\"status\" : \"FAILURE\"}")
+ }))
+ })
+ public Response promoteLock(
+ @ApiParam(value="Lock Id",required=true) @PathParam("lockId") String lockId,
+ @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
+ @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization)
+ throws Exception {
+ try {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
+ Map<String, Object> resultMap = MusicCore.validateLock(lockId);
+ if (resultMap.containsKey("Error")) {
+ logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
+ response.status(Status.BAD_REQUEST);
+ return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
+ }
+
+ String keyspaceName = (String) resultMap.get("keyspace");
+ EELFLoggerDelegate.mdcPut("keyspace", "( " + keyspaceName + " ) ");
+
+ try {
+ ReturnType lockStatus = MusicCore.promoteLock(lockId);
+ if ( lockStatus.getResult().equals(ResultType.SUCCESS)) {
+ response.status(Status.OK);
+ } else {
+ response.status(Status.BAD_REQUEST);
+ }
+ return response.entity(new JsonResponse(lockStatus.getResult()).setLock(lockId).setMessage(lockStatus.getMessage()).toMap()).build();
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger,AppMessages.INVALIDLOCK + lockId, ErrorSeverity.CRITICAL,
+ ErrorTypes.LOCKINGERROR, e);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Unable to promote lock").toMap()).build();
+ }
+ } finally {
+ EELFLoggerDelegate.mdcRemove("keyspace");
+ }
+ }
+}
diff --git a/music-rest/src/main/java/org/onap/music/rest/RestMusicQAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicQAPI.java
new file mode 100755
index 00000000..63b72cda
--- /dev/null
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicQAPI.java
@@ -0,0 +1,443 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * Modifications Copyright (C) 2019 IBM.
+ * Modifications Copyright (c) 2019 Samsung
+ * ===================================================================
+ * 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.rest;
+
+import java.util.Map;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
+import javax.ws.rs.core.Response.Status;
+import org.onap.music.datastore.jsonobjects.JsonDelete;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.eelf.logging.EELFLoggerDelegate;
+
+import org.onap.music.eelf.logging.format.AppMessages;
+import org.onap.music.eelf.logging.format.ErrorSeverity;
+import org.onap.music.eelf.logging.format.ErrorTypes;
+import org.apache.commons.lang3.StringUtils;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import com.datastax.driver.core.ResultSet;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.main.ResultType;
+import org.onap.music.response.jsonobjects.JsonResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+
+@Path("/v2/priorityq/")
+@Api(value = "Q Api",hidden = true)
+public class RestMusicQAPI {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicQAPI.class);
+
+
+ /**
+ *
+ * @param tableObj
+ * @param keyspace
+ * @param tablename
+ * @throws Exception
+ */
+
+ @POST
+ @Path("/keyspaces/{keyspace}/{qname}") // qname same as tablename
+ @ApiOperation(value = "Create Q", response = String.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response createQ(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonTable tableObj,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename) throws Exception {
+ ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
+
+ Map<String, String> fields = tableObj.getFields();
+ if (fields == null) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ/Required table fields are empty or not set").toMap())
+ .build();
+ }
+
+ String primaryKey = tableObj.getPrimaryKey();
+ String partitionKey = tableObj.getPartitionKey();
+ String clusteringKey = tableObj.getClusteringKey();
+ String filteringKey = tableObj.getFilteringKey();
+ String clusteringOrder = tableObj.getClusteringOrder();
+
+ if(primaryKey == null) {
+ primaryKey = tableObj.getFields().get("PRIMARY KEY");
+ }
+
+ if ((primaryKey == null) && (partitionKey == null)) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Partition key cannot be empty").toMap())
+ .build();
+ }
+
+ if ((primaryKey == null) && (clusteringKey == null)) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Clustering key cannot be empty").toMap())
+ .build();
+ }
+
+ if (clusteringOrder == null) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Clustering Order cannot be empty").toMap())
+ .build();
+ }
+
+ if ((primaryKey!=null) && (partitionKey == null)) {
+ primaryKey = primaryKey.trim();
+ int count1 = StringUtils.countMatches(primaryKey,')');
+ int count2 = StringUtils.countMatches(primaryKey,'(');
+ if (count1 != count2) {
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ Error: primary key '(' and ')' do not match, primary key=" + primaryKey)
+ .toMap()).build();
+ }
+
+ if ( primaryKey.indexOf('(') == -1 || ( count2 == 1 && (primaryKey.lastIndexOf(')') +1) == primaryKey.length() ) ) {
+ if (primaryKey.contains(",") ) {
+ partitionKey= primaryKey.substring(0,primaryKey.indexOf(','));
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ clusteringKey=primaryKey.substring(primaryKey.indexOf(',')+1); // make sure index
+ clusteringKey=clusteringKey.replaceAll("[)]+", "");
+ } else {
+ partitionKey=primaryKey;
+ partitionKey=partitionKey.replaceAll("[\\)]+","");
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ clusteringKey="";
+ }
+ } else {
+ partitionKey= primaryKey.substring(0,primaryKey.indexOf(')'));
+ partitionKey=partitionKey.replaceAll("[\\(]+","");
+ partitionKey = partitionKey.trim();
+ clusteringKey= primaryKey.substring(primaryKey.indexOf(')'));
+ clusteringKey=clusteringKey.replaceAll("[\\(]+","");
+ clusteringKey=clusteringKey.replaceAll("[\\)]+","");
+ clusteringKey = clusteringKey.trim();
+ if (clusteringKey.indexOf(',') == 0)
+ clusteringKey=clusteringKey.substring(1);
+ clusteringKey = clusteringKey.trim();
+ if (clusteringKey.equals(",") )
+ clusteringKey=""; // print error if needed ( ... ),)
+ }
+ }
+
+ if (partitionKey.trim().isEmpty()) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Partition key cannot be empty").toMap())
+ .build();
+ }
+
+ if (clusteringKey.trim().isEmpty()) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Clustering key cannot be empty").toMap())
+ .build();
+ }
+
+ if((filteringKey != null) && (filteringKey.equalsIgnoreCase(partitionKey))) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("CreateQ: Filtering key cannot be same as Partition Key").toMap())
+ .build();
+ }
+
+ return new RestMusicDataAPI().createTable(version, minorVersion, patchVersion, aid, ns, authorization, tableObj, keyspace, tablename);
+ }
+
+ /**
+ *
+ * @param insObj
+ * @param keyspace
+ * @param tablename
+ * @throws Exception
+ */
+ @POST
+ @Path("/keyspaces/{keyspace}/{qname}/rows")
+ @ApiOperation(value = "", response = Void.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ // public Map<String, Object> insertIntoQ(
+ public Response insertIntoQ(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonInsert insObj,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename) {
+
+ ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
+ if (insObj.getValues().isEmpty()) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("Required HTTP Request body is missing.").toMap()).build();
+ }
+ return new RestMusicDataAPI().insertIntoTable(version, minorVersion, patchVersion, aid, ns,
+ authorization, insObj, keyspace, tablename);
+ }
+
+ /**
+ *
+ * @param updateObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws Exception
+ */
+ @PUT
+ @Path("/keyspaces/{keyspace}/{qname}/rows")
+ @ApiOperation(value = "updateQ", response = String.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response updateQ(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonUpdate updateObj,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
+ @Context UriInfo info) throws MusicServiceException, MusicQueryException {
+
+ ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
+ if (updateObj.getValues().isEmpty()) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE)
+ .setError("Required HTTP Request body is missing. JsonUpdate updateObj.getValues() is empty. ")
+ .toMap())
+ .build();
+ }
+ return new RestMusicDataAPI().updateTable(version, minorVersion, patchVersion, aid, ns,
+ authorization,updateObj, keyspace, tablename, info);
+ }
+
+ /**
+ *
+ * @param delObj
+ * @param keyspace
+ * @param tablename
+ * @param info
+ *
+ * @return
+ * @throws Exception
+ */
+
+ @DELETE
+ @Path("/keyspaces/{keyspace}/{qname}/rows")
+ @ApiOperation(value = "deleteQ", response = String.class)
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response deleteFromQ(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ JsonDelete delObj,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
+ @Context UriInfo info) throws MusicServiceException, MusicQueryException {
+ // added checking as per RestMusicDataAPI
+ ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
+ if (delObj == null) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
+ ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
+ return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
+ .setError("deleteFromQ JsonDelete delObjis empty").toMap()).build();
+ }
+
+ return new RestMusicDataAPI().deleteFromTable(version, minorVersion, patchVersion, aid, ns,
+ authorization, delObj, keyspace, tablename, info);
+ }
+
+ /**
+ *
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws Exception
+ */
+ @GET
+ @Path("/keyspaces/{keyspace}/{qname}/peek")
+ @ApiOperation(value = "", response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ //public Map<String, HashMap<String, Object>> peek(
+ public Response peek(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
+ @Context UriInfo info) {
+ int limit =1; //peek must return just the top row
+ // Map<String ,String> auth = new HashMap<>();
+ // String userId =auth.get(MusicUtil.USERID);
+ // String password =auth.get(MusicUtil.PASSWORD);
+ ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
+
+ PreparedQueryObject queryObject = new PreparedQueryObject();
+ if (info.getQueryParameters() == null ) { //|| info.getQueryParameters().isEmpty())
+ queryObject.appendQueryString(
+ "SELECT * FROM " + keyspace + "." + tablename + " LIMIT " + limit + ";");
+ } else {
+ try {
+ queryObject = new RestMusicDataAPI().selectSpecificQuery(keyspace, tablename, info, limit);
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.UNKNOWNERROR,
+ ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap())
+ .build();
+ }
+ }
+
+ try {
+ ResultSet results = MusicCore.get(queryObject);
+ return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS)
+ .setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
+ } catch (MusicServiceException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.UNKNOWNERROR,
+ ErrorSeverity.ERROR, ErrorTypes.MUSICSERVICEERROR, ex);
+ return response.status(Status.BAD_REQUEST)
+ .entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap())
+ .build();
+ }
+ }
+
+ /**
+ *
+ *
+ * @param keyspace
+ * @param tablename
+ * @param info
+ * @return
+ * @throws Exception
+ */
+ @GET
+ @Path("/keyspaces/{keyspace}/{qname}/filter")
+ @ApiOperation(value = "filter", response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ // public Map<String, HashMap<String, Object>> filter(
+ public Response filter(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
+ @Context UriInfo info) throws Exception {
+
+ return new RestMusicDataAPI().selectWithCritical(version, minorVersion, patchVersion, aid, ns, authorization,null, keyspace, tablename, info);// , limit)
+
+ }
+
+ /**
+ *
+ * @param tabObj
+ * @param keyspace
+ * @param tablename
+ * @throws Exception
+ */
+ @DELETE
+ @ApiOperation(value = "DropQ", response = String.class)
+ @Path("/keyspaces/{keyspace}/{qname}")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response dropQ(
+ @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
+ @ApiParam(value = "Minor Version",
+ required = false) @HeaderParam("X-minorVersion") String minorVersion,
+ @ApiParam(value = "Patch Version",
+ required = false) @HeaderParam("X-patchVersion") String patchVersion,
+ @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
+ @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
+ @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
+ @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
+ @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename) throws Exception {
+
+ return new RestMusicDataAPI().dropTable(version, minorVersion, patchVersion, aid, ns, authorization, keyspace, tablename);
+
+ }
+}
diff --git a/src/main/java/org/onap/music/rest/RestMusicTestAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicTestAPI.java
index 6d973acb..c1c04b09 100644
--- a/src/main/java/org/onap/music/rest/RestMusicTestAPI.java
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicTestAPI.java
@@ -51,6 +51,7 @@ public class RestMusicTestAPI {
* @return
*/
@GET
+ @Path("/")
@ApiOperation(value = "Get Test", response = Map.class)
@Produces(MediaType.APPLICATION_JSON)
public Map<String, HashMap<String, String>> simpleTests(
@@ -60,6 +61,7 @@ public class RestMusicTestAPI {
for(int i=0; i < 3; i++){
HashMap<String, String> innerMap = new HashMap<>();
innerMap.put("Music Version",MusicUtil.getVersion());
+ innerMap.put("Music Build",MusicUtil.getBuild());
innerMap.put(i+1+"", i+2+"");
testMap.put(i+"", innerMap);
}
diff --git a/src/main/java/org/onap/music/rest/RestMusicVersionAPI.java b/music-rest/src/main/java/org/onap/music/rest/RestMusicVersionAPI.java
index 74b8e5dd..8c86152e 100644
--- a/src/main/java/org/onap/music/rest/RestMusicVersionAPI.java
+++ b/music-rest/src/main/java/org/onap/music/rest/RestMusicVersionAPI.java
@@ -3,6 +3,8 @@
* org.onap.music
* ===================================================================
* Copyright (c) 2017 AT&T Intellectual Property
+ *
+ * Modifications Copyright (C) 2019 IBM.
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,9 +38,6 @@ import org.onap.music.eelf.logging.EELFLoggerDelegate;
import org.onap.music.main.MusicUtil;
import org.onap.music.main.ResultType;
-import com.att.eelf.configuration.EELFLogger;
-import com.att.eelf.configuration.EELFManager;
-
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -47,10 +46,10 @@ import io.swagger.annotations.ApiOperation;
@Api(value="Version Api")
public class RestMusicVersionAPI {
- private EELFLoggerDelegate logger =EELFLoggerDelegate.getLogger(RestMusicVersionAPI.class);
-
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicVersionAPI.class);
+ private static final String MUSIC_KEY = "MUSIC:";
/**
- * Get the version of MUSIC
+ * Get the version of MUSIC.
* @return
*/
@GET
@@ -59,6 +58,25 @@ public class RestMusicVersionAPI {
public Map<String,Object> version(@Context HttpServletResponse response) {
logger.info("Replying to request for MUSIC version with MUSIC:" + MusicUtil.getVersion());
response.addHeader("X-latestVersion",MusicUtil.getVersion());
- return new JsonResponse(ResultType.SUCCESS).setMusicVersion("MUSIC:" + MusicUtil.getVersion()).toMap();
+ return new JsonResponse(ResultType.SUCCESS).
+ setMusicVersion(MUSIC_KEY + MusicUtil.getVersion()).toMap();
}
+
+ /**
+ * Get the version of MUSIC.
+ * @return
+ */
+ @GET
+ @Path("/build")
+ @ApiOperation(value = "Get Version", response = Map.class)
+ @Produces(MediaType.APPLICATION_JSON)
+ public Map<String,Object> build(@Context HttpServletResponse response) {
+ logger.info("Replying to request for MUSIC build with MUSIC:" + MusicUtil.getBuild());
+ response.addHeader("X-latestVersion",MusicUtil.getVersion());
+ return new JsonResponse(ResultType.SUCCESS)
+ .setMusicBuild(MUSIC_KEY + MusicUtil.getBuild())
+ .setMusicVersion(MUSIC_KEY + MusicUtil.getVersion()).toMap();
+ }
+
+
} \ No newline at end of file
diff --git a/music-rest/src/main/resources/application.properties b/music-rest/src/main/resources/application.properties
new file mode 100755
index 00000000..6fbe6326
--- /dev/null
+++ b/music-rest/src/main/resources/application.properties
@@ -0,0 +1,9 @@
+server.port=8080
+server.servlet.context-path=/MUSIC/rest
+security.require-ssl=true
+server.ssl.key-store=/opt/app/aafcertman/keystore.jks
+server.ssl.key-store-password=changeit
+server.ssl.key-store-provider=SUN
+server.ssl.key-store-type=JKS
+httpPort=8081
+spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_ENUMS=true
diff --git a/music-rest/src/main/resources/key.properties b/music-rest/src/main/resources/key.properties
new file mode 100644
index 00000000..5ce266fa
--- /dev/null
+++ b/music-rest/src/main/resources/key.properties
@@ -0,0 +1 @@
+cipher.enc.key= nothing to see here
diff --git a/music-rest/src/test/java/LICENSE.txt b/music-rest/src/test/java/LICENSE.txt
new file mode 100644
index 00000000..cc6cdea5
--- /dev/null
+++ b/music-rest/src/test/java/LICENSE.txt
@@ -0,0 +1,24 @@
+
+The following license applies to all files in this and sub-directories. Licenses
+are included in individual source files where appropriate, and if it differs
+from this text, it supersedes this. Any file that does not have license text
+defaults to being covered by this text; not all files support the addition of
+licenses.
+#
+# -------------------------------------------------------------------------
+# Copyright (c) 2017 AT&T Intellectual Property
+#
+# 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.
+#
+# -------------------------------------------------------------------------
+# \ No newline at end of file
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/NameSpaceTest.java b/music-rest/src/test/java/org/onap/music/JerseyConfigTest.java
index ee4d3933..d7475a9d 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/NameSpaceTest.java
+++ b/music-rest/src/test/java/org/onap/music/JerseyConfigTest.java
@@ -1,8 +1,8 @@
-/*
+/*******************************************************************************
* ============LICENSE_START==========================================
* org.onap.music
* ===================================================================
- * Copyright (c) 2018 IBM.
+ * Copyright (c) 2019 AT&T Intellectual Property
* ===================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,42 +15,25 @@
* 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.unittests.jsonobjects;
+ *******************************************************************************/
+package org.onap.music;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.NameSpace;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class NameSpaceTest {
- private NameSpace nameSpace;
-
+public class JerseyConfigTest {
+ JerseyConfig jerseyConfig;
+
@Before
- public void setUp() {
- nameSpace = new NameSpace();
+ public void setup() {
+ jerseyConfig = new JerseyConfig();
}
-
- @Test
- public void testGetSetAdmin() {
- List<String> list = new ArrayList<String>();
- list.add("admin");
- nameSpace.setAdmin(list);
- Assert.assertEquals(list, nameSpace.getAdmin());
- }
-
+
@Test
- public void testGetSetName() {
- nameSpace.setName("name");
- Assert.assertEquals("name", nameSpace.getName());
+ public void testInitJerseyConfig() {
+ jerseyConfig.init();
}
}
diff --git a/music-rest/src/test/java/org/onap/music/conductor/conditionals/JsonConditionalTest.java b/music-rest/src/test/java/org/onap/music/conductor/conditionals/JsonConditionalTest.java
new file mode 100644
index 00000000..07c43114
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/conductor/conditionals/JsonConditionalTest.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.conductor.conditionals;
+
+import static org.junit.Assert.assertEquals;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JsonConditionalTest {
+
+ Map<String,Object> tableValues;
+ Map<String,Object> casscadeColumnData;
+ Map<String,Map<String,String>> conditions;
+ JsonConditional jsonConditional;
+
+ @Before
+ public void setup() {
+ tableValues = Mockito.mock(Map.class);
+ casscadeColumnData = Mockito.mock(Map.class);
+ conditions = Mockito.mock(Map.class);
+ jsonConditional = new JsonConditional();
+ }
+
+ @Test
+ public void testSetTableValues() {
+ jsonConditional.setTableValues(tableValues);
+ assertEquals(tableValues, jsonConditional.getTableValues());
+ }
+
+ @Test
+ public void testSetPrimaryKey() {
+ jsonConditional.setPrimaryKey("primarykey");
+ assertEquals("primarykey", jsonConditional.getPrimaryKey());
+ }
+
+ @Test
+ public void testSetPrimaryKeyValue() {
+ jsonConditional.setPrimaryKeyValue("primarykeyvalue");
+ assertEquals("primarykeyvalue", jsonConditional.getPrimaryKeyValue());
+ }
+
+ @Test
+ public void testSetCasscadeColumnName() {
+ jsonConditional.setCasscadeColumnName("columnname");
+ assertEquals("columnname", jsonConditional.getCasscadeColumnName());
+ }
+
+ @Test
+ public void testSetCasscadeColumnData() {
+ jsonConditional.setCasscadeColumnData(casscadeColumnData);
+ assertEquals(casscadeColumnData, jsonConditional.getCasscadeColumnData());
+ }
+
+ @Test
+ public void testSetConditions() {
+ jsonConditional.setConditions(conditions);
+ assertEquals(conditions, jsonConditional.getConditions());
+ }
+
+}
diff --git a/music-rest/src/test/java/org/onap/music/conductor/conditionals/UpdateDataObjectTest.java b/music-rest/src/test/java/org/onap/music/conductor/conditionals/UpdateDataObjectTest.java
new file mode 100644
index 00000000..b651f5e9
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/conductor/conditionals/UpdateDataObjectTest.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.conductor.conditionals;
+
+import static org.junit.Assert.assertEquals;
+import java.util.Map;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.datastore.PreparedQueryObject;
+
+public class UpdateDataObjectTest {
+
+ UpdateDataObject updateDataObject;
+ Map<String, PreparedQueryObject> queryBank;
+ Map<String, String> cascadeColumnValues;
+
+ @Before
+ public void setup() {
+ updateDataObject = new UpdateDataObject();
+ queryBank = Mockito.mock(Map.class);
+ cascadeColumnValues = Mockito.mock(Map.class);
+ }
+
+ @Test
+ public void testSetQueryBank() {
+ updateDataObject.setQueryBank(queryBank);
+ assertEquals(queryBank, updateDataObject.getQueryBank());
+ }
+
+ @Test
+ public void testSetKeyspace() {
+ updateDataObject.setKeyspace("keyspace");
+ assertEquals("keyspace", updateDataObject.getKeyspace());
+ }
+
+ @Test
+ public void testSetTableName() {
+ updateDataObject.setTableName("table");
+ assertEquals("table", updateDataObject.getTableName());
+ }
+
+ @Test
+ public void testSetPrimaryKey() {
+ updateDataObject.setPrimaryKey("primarykey");
+ assertEquals("primarykey", updateDataObject.getPrimaryKey());
+ }
+
+ @Test
+ public void testSetPrimaryKeyValue() {
+ updateDataObject.setPrimaryKeyValue("primarykeyvalue");
+ assertEquals("primarykeyvalue", updateDataObject.getPrimaryKeyValue());
+ }
+
+ @Test
+ public void testSetPlanId() {
+ updateDataObject.setPlanId("planid");
+ assertEquals("planid", updateDataObject.getPlanId());
+ }
+
+ @Test
+ public void testSetCascadeColumnName() {
+ updateDataObject.setCascadeColumnName("columnname");
+ assertEquals("columnname", updateDataObject.getCascadeColumnName());
+ }
+
+ @Test
+ public void testSetCascadeColumnValues() {
+ updateDataObject.setCascadeColumnValues(cascadeColumnValues);
+ assertEquals(cascadeColumnValues, updateDataObject.getCascadeColumnValues());
+ }
+
+ @Test
+ public void testSetLockId() {
+ updateDataObject.setLockId("lockid");
+ assertEquals("lockid", updateDataObject.getLockId());
+ }
+}
diff --git a/music-rest/src/test/java/org/onap/music/eelf/healthcheck/MusicHealthCheckTest.java b/music-rest/src/test/java/org/onap/music/eelf/healthcheck/MusicHealthCheckTest.java
new file mode 100644
index 00000000..66290630
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/eelf/healthcheck/MusicHealthCheckTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.healthcheck;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.exceptions.MusicQueryException;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.ResultType;
+
+public class MusicHealthCheckTest {
+
+ MusicHealthCheck musicHealthCheck;
+
+ @Before
+ public void setup() {
+ musicHealthCheck = new MusicHealthCheck();
+ }
+
+ @Test
+ public void testSetCassandrHost() {
+ musicHealthCheck.setCassandrHost("127.0.0.1");
+ assertEquals("127.0.0.1", musicHealthCheck.getCassandrHost());
+ }
+
+ @Test
+ public void testGetCassandraStatus() throws MusicServiceException, MusicQueryException {
+ MusicHealthCheck mHealthCheck = Mockito.spy(MusicHealthCheck.class);
+ doReturn(ResultType.SUCCESS).when(mHealthCheck).nonKeyRelatedPut(Mockito.any(), Mockito.anyString());
+ doNothing().when(mHealthCheck).executeEventualPut(Mockito.any());
+ assertEquals("ACTIVE", mHealthCheck.getCassandraStatus("consistency"));
+ }
+
+}
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);
+ }
+
+}
diff --git a/music-rest/src/test/java/org/onap/music/eelf/logging/MusicLoggingServletFilterTest.java b/music-rest/src/test/java/org/onap/music/eelf/logging/MusicLoggingServletFilterTest.java
new file mode 100644
index 00000000..8f5d4521
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/eelf/logging/MusicLoggingServletFilterTest.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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 static org.mockito.Mockito.doNothing;
+import java.io.IOException;
+import java.util.Enumeration;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.main.MusicUtil;
+
+public class MusicLoggingServletFilterTest {
+ MusicLoggingServletFilter filter;
+
+ @Before
+ public void setup() throws ServletException {
+ filter = new MusicLoggingServletFilter();
+ }
+
+ @Test
+ public void testDoFilter() throws IOException, ServletException {
+ FilterChain chain = Mockito.mock(FilterChain.class);
+ Enumeration<String> headerNames = Mockito.mock(Enumeration.class);
+ HttpServletRequest httpRequest = Mockito.mock(HttpServletRequest.class);
+ HttpServletResponse httpResponse = Mockito.mock(HttpServletResponse.class);
+ Mockito.when(headerNames.hasMoreElements()).thenReturn(true).thenReturn(true).thenReturn(true).thenReturn(false);
+ Mockito.when(headerNames.nextElement()).thenReturn("element1").thenReturn("element2").thenReturn("element3");
+ Mockito.when(httpRequest.getHeader(Mockito.anyString())).thenReturn("key1").thenReturn("key2").thenReturn("key3");
+ Mockito.when(httpRequest.getHeaderNames()).thenReturn(headerNames);
+ MusicUtil.setTransIdRequired(false);
+ MusicUtil.setConversationIdRequired(false);
+ MusicUtil.setMessageIdRequired(false);
+ MusicUtil.setClientIdRequired(false);
+ doNothing().when(chain).doFilter(Mockito.any(), Mockito.any());
+ filter.doFilter(httpRequest, httpResponse, chain);
+ }
+
+}
diff --git a/src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java b/music-rest/src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java
index 58135551..58135551 100644
--- a/src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java
+++ b/music-rest/src/test/java/org/onap/music/exceptions/MusicExceptionMapperTest.java
diff --git a/music-rest/src/test/java/org/onap/music/main/PropertiesLoaderTest.java b/music-rest/src/test/java/org/onap/music/main/PropertiesLoaderTest.java
new file mode 100644
index 00000000..7c10e8f1
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/main/PropertiesLoaderTest.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.main;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import java.util.Properties;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.rest.RestMusicVersionAPI;
+
+public class PropertiesLoaderTest {
+ PropertiesLoader propertiesLoader;
+
+ @Before
+ public void setup() {
+ propertiesLoader = new PropertiesLoader();
+ }
+
+ @Test
+ public void testLoadProperties() {
+ Properties properties = Mockito.mock(Properties.class);
+ Mockito.when(properties.getProperty("cassandra.host")).thenReturn("127.0.0.1");
+ Mockito.when(properties.getProperty("cassandra.port")).thenReturn("8007");
+ Mockito.when(properties.getProperty("cassandra.user")).thenReturn("user");
+ Mockito.when(properties.getProperty("cassandra.password")).thenReturn("password");
+ Mockito.when(properties.getProperty("music.properties")).thenReturn("property");
+ Mockito.when(properties.getProperty("debug")).thenReturn("true");
+ Mockito.when(properties.getProperty("version")).thenReturn("x.x.x");
+ Mockito.when(properties.getProperty("build")).thenReturn("y.y");
+ Mockito.when(properties.getProperty("lock.lease.period")).thenReturn("5000");
+ Mockito.when(properties.getProperty("cadi")).thenReturn("true");
+ Mockito.when(properties.getProperty("keyspace.active")).thenReturn("true");
+ Mockito.when(properties.getProperty("retry.count")).thenReturn("20");
+ Mockito.when(properties.getProperty("transId.header.prefix")).thenReturn("transId");
+ Mockito.when(properties.getProperty("conversation.header.prefix")).thenReturn("conversation");
+ Mockito.when(properties.getProperty("clientId.header.prefix")).thenReturn("clientId");
+ Mockito.when(properties.getProperty("messageId.header.prefix")).thenReturn("messageId");
+ Mockito.when(properties.getProperty("transId.header.required")).thenReturn("true");
+ Mockito.when(properties.getProperty("conversation.header.required")).thenReturn("true");
+ Mockito.when(properties.getProperty("clientId.header.required")).thenReturn("true");
+ Mockito.when(properties.getProperty("messageId.header.required")).thenReturn("true");
+ Mockito.when(properties.getProperty("music.aaf.ns")).thenReturn("ns");
+ Mockito.when(properties.getProperty("cipher.enc.key")).thenReturn("key");
+ CorePropertiesLoader.loadProperties(properties);
+ assertEquals("127.0.0.1", MusicUtil.getMyCassaHost());
+ assertEquals(8007, MusicUtil.getCassandraPort());
+ assertEquals("user", MusicUtil.getCassName());
+ assertEquals("password", MusicUtil.getCassPwd());
+ assertEquals("property", MusicUtil.getMusicPropertiesFilePath());
+ assertEquals(true, MusicUtil.isDebug());
+ assertEquals("x.x.x", MusicUtil.getVersion());
+ assertEquals("y.y", MusicUtil.getBuild());
+ assertEquals(5000L, MusicUtil.getDefaultLockLeasePeriod());
+ assertEquals(true, MusicUtil.getIsCadi());
+ assertEquals(true, MusicUtil.isKeyspaceActive());
+ assertEquals(20, MusicUtil.getRetryCount());
+ assertEquals("transId-", MusicUtil.getTransIdPrefix());
+ assertEquals("conversation-", MusicUtil.getConversationIdPrefix());
+ assertEquals("clientId-", MusicUtil.getClientIdPrefix());
+ assertEquals("messageId-", MusicUtil.getMessageIdPrefix());
+ assertEquals(true, MusicUtil.getTransIdRequired());
+ assertEquals(true, MusicUtil.getConversationIdRequired());
+ assertEquals(true, MusicUtil.getClientIdRequired());
+ assertEquals(true, MusicUtil.getMessageIdRequired());
+ assertEquals("ns", MusicUtil.getMusicAafNs());
+ assertEquals("key", MusicUtil.getCipherEncKey());
+
+ Mockito.when(properties.getProperty("cassandra.connecttimeoutms")).thenReturn("1000");
+ Mockito.when(properties.getProperty("cassandra.readtimeoutms")).thenReturn("1000");
+ Mockito.when(properties.getProperty("cassandra.connectTimeOutMS")).thenReturn("1000");
+ Mockito.when(properties.getProperty("cassandra.readTimeOutMS")).thenReturn("1000");
+ PropertiesLoader.loadProperties(properties);
+ assertEquals("127.0.0.1", MusicUtil.getMyCassaHost());
+ assertEquals(8007, MusicUtil.getCassandraPort());
+ assertEquals("user", MusicUtil.getCassName());
+ assertEquals("password", MusicUtil.getCassPwd());
+ assertEquals(1000, MusicUtil.getCassandraConnectTimeOutMS());
+ assertEquals(1000, MusicUtil.getCassandraReadTimeOutMS());
+ assertEquals("property", MusicUtil.getMusicPropertiesFilePath());
+ assertEquals(true, MusicUtil.isDebug());
+ assertEquals("x.x.x", MusicUtil.getVersion());
+ assertEquals("y.y", MusicUtil.getBuild());
+ assertEquals(5000L, MusicUtil.getDefaultLockLeasePeriod());
+ assertEquals(true, MusicUtil.getIsCadi());
+ assertEquals(true, MusicUtil.isKeyspaceActive());
+ assertEquals(20, MusicUtil.getRetryCount());
+ assertEquals("transId-", MusicUtil.getTransIdPrefix());
+ assertEquals("conversation-", MusicUtil.getConversationIdPrefix());
+ assertEquals("clientId-", MusicUtil.getClientIdPrefix());
+ assertEquals("messageId-", MusicUtil.getMessageIdPrefix());
+ assertEquals(true, MusicUtil.getTransIdRequired());
+ assertEquals(true, MusicUtil.getConversationIdRequired());
+ assertEquals(true, MusicUtil.getClientIdRequired());
+ assertEquals(true, MusicUtil.getMessageIdRequired());
+ assertEquals("ns", MusicUtil.getMusicAafNs());
+ assertEquals("key", MusicUtil.getCipherEncKey());
+
+ propertiesLoader.setProperties();
+ propertiesLoader.loadProperties();
+ assertEquals("127.0.0.1", MusicUtil.getMyCassaHost());
+ assertEquals(8007, MusicUtil.getCassandraPort());
+ assertEquals("user", MusicUtil.getCassName());
+ assertEquals("password", MusicUtil.getCassPwd());
+ assertEquals(1000, MusicUtil.getCassandraConnectTimeOutMS());
+ assertEquals(1000, MusicUtil.getCassandraReadTimeOutMS());
+ assertEquals("property", MusicUtil.getMusicPropertiesFilePath());
+ assertEquals(true, MusicUtil.isDebug());
+ assertEquals("x.x.x", MusicUtil.getVersion());
+ assertEquals("y.y", MusicUtil.getBuild());
+ assertEquals(5000L, MusicUtil.getDefaultLockLeasePeriod());
+ assertEquals(true, MusicUtil.getIsCadi());
+ assertEquals(true, MusicUtil.isKeyspaceActive());
+ assertEquals(20, MusicUtil.getRetryCount());
+ assertEquals("transId-", MusicUtil.getTransIdPrefix());
+ assertEquals("conversation-", MusicUtil.getConversationIdPrefix());
+ assertEquals("clientId-", MusicUtil.getClientIdPrefix());
+ assertEquals("messageId-", MusicUtil.getMessageIdPrefix());
+ assertEquals(true, MusicUtil.getTransIdRequired());
+ assertEquals(true, MusicUtil.getConversationIdRequired());
+ assertEquals(true, MusicUtil.getClientIdRequired());
+ assertEquals(true, MusicUtil.getMessageIdRequired());
+ assertEquals("ns", MusicUtil.getMusicAafNs());
+ assertEquals("key", MusicUtil.getCipherEncKey());
+ }
+}
diff --git a/music-rest/src/test/java/org/onap/music/rest/ApplicationTest.java b/music-rest/src/test/java/org/onap/music/rest/ApplicationTest.java
new file mode 100644
index 00000000..66983312
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/rest/ApplicationTest.java
@@ -0,0 +1,94 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ *
+ * Modifications Copyright (C) 2019 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.rest;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class ApplicationTest {
+
+ Application apl=new Application();
+ private String application_name="music";
+ private String username="music";
+ private String password="music";
+ private String keyspace_name="music";
+ private boolean is_aaf=false;
+ private String uuid="123";
+ private boolean is_api=true;
+
+ @Test
+ public void testsetApplication_name() {
+ apl.setApplication_name(application_name);
+ assertEquals("music",apl.getApplication_name());
+ }
+
+ @Test
+ public void testsetUsername()
+ {
+ apl.setUsername(username);
+ assertEquals("music",apl.getUsername());
+ }
+
+ @Test
+ public void testsetPassword()
+ {
+ apl.setPassword(password);
+ assertEquals("music",apl.getPassword());
+ }
+
+ @Test
+ public void testsetKeyspace_name()
+ {
+ apl.setKeyspace_name(keyspace_name);
+ assertEquals("music",apl.getKeyspace_name());
+ }
+
+ @Test
+ public void testsetIs_aaf()
+ {
+ apl.setIs_aaf(is_aaf);
+ assertEquals(false,apl.isIs_aaf());
+ }
+
+
+ @Test
+ public void testsetUuid()
+ {
+ apl.setUuid(uuid);
+ assertEquals("123",apl.getUuid());
+ }
+
+ @Test
+ public void testsetIs_api()
+ {
+ apl.setIs_api(is_api);
+ assertEquals(true,apl.getIs_api());
+
+ }
+
+
+
+}
diff --git a/music-rest/src/test/java/org/onap/music/rest/RestMusicTestAPITest.java b/music-rest/src/test/java/org/onap/music/rest/RestMusicTestAPITest.java
new file mode 100644
index 00000000..235367ce
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/rest/RestMusicTestAPITest.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.main.MusicUtil;
+
+public class RestMusicTestAPITest {
+
+ RestMusicTestAPI restMusicTestAPI;
+
+ @Before
+ public void setup() {
+ restMusicTestAPI = new RestMusicTestAPI();
+ }
+
+ @Test
+ public void testSimpleTests() {
+ HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class);
+ doNothing().when(httpServletResponse).addHeader(Mockito.anyString(), Mockito.anyString());
+ MusicUtil.setVersion("x.x.x");
+ MusicUtil.setBuild("y.y");
+ Map<String, HashMap<String, String>> map = restMusicTestAPI.simpleTests(httpServletResponse);
+
+ Map<String, String> map1 = map.get("0");
+ assertEquals("2", map1.get("1").toString());
+ assertEquals("x.x.x", map1.get("Music Version").toString());
+ assertEquals("y.y", map1.get("Music Build").toString());
+
+ Map<String, String> map2 = map.get("1");
+ assertEquals("3", map2.get("2").toString());
+ assertEquals("x.x.x", map2.get("Music Version").toString());
+ assertEquals("y.y", map2.get("Music Build").toString());
+
+ Map<String, String> map3 = map.get("2");
+ assertEquals("4", map3.get("3").toString());
+ assertEquals("x.x.x", map3.get("Music Version").toString());
+ assertEquals("y.y", map3.get("Music Build").toString());
+ }
+}
diff --git a/music-rest/src/test/java/org/onap/music/rest/RestMusicVersionAPITest.java b/music-rest/src/test/java/org/onap/music/rest/RestMusicVersionAPITest.java
new file mode 100644
index 00000000..6fc433e4
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/rest/RestMusicVersionAPITest.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.rest;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.doNothing;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.music.main.MusicUtil;
+
+public class RestMusicVersionAPITest {
+
+ RestMusicVersionAPI restMusicVersionAPI;
+
+ @Before
+ public void setup() {
+ restMusicVersionAPI = new RestMusicVersionAPI();
+ }
+
+ @Test
+ public void testVersion() {
+ MusicUtil.setVersion("x.x.x");
+ HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class);
+ doNothing().when(httpServletResponse).addHeader(Mockito.anyString(), Mockito.anyString());
+ Map<String,Object> map = restMusicVersionAPI.version(httpServletResponse);
+ assertEquals("MUSIC:x.x.x", map.get("version").toString());
+ assertEquals("SUCCESS", map.get("status").toString());
+ }
+
+ @Test
+ public void testBuild() {
+ MusicUtil.setBuild("y.y");
+ MusicUtil.setVersion("x.x.x");
+ HttpServletResponse httpServletResponse = Mockito.mock(HttpServletResponse.class);
+ doNothing().when(httpServletResponse).addHeader(Mockito.anyString(), Mockito.anyString());
+ Map<String,Object> map = restMusicVersionAPI.build(httpServletResponse);
+ assertEquals("MUSIC:x.x.x", map.get("version").toString());
+ assertEquals("SUCCESS", map.get("status").toString());
+ assertEquals("MUSIC:y.y", map.get("build").toString());
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/CassandraCQL.java b/music-rest/src/test/java/org/onap/music/unittests/CassandraCQL.java
index 32072145..7b116bc8 100644
--- a/src/test/java/org/onap/music/unittests/CassandraCQL.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/CassandraCQL.java
@@ -42,9 +42,10 @@ import java.util.UUID;
import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
import org.onap.music.datastore.MusicDataStore;
import org.onap.music.datastore.PreparedQueryObject;
-
+import org.onap.music.lockingservice.cassandra.LockType;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
+import com.datastax.driver.extras.codecs.enums.EnumNameCodec;
public class CassandraCQL {
public static final String createAdminKeyspace = "CREATE KEYSPACE admin WITH REPLICATION = "
@@ -235,6 +236,9 @@ public class CassandraCQL {
EmbeddedCassandraServerHelper.startEmbeddedCassandra();
Cluster cluster = new Cluster.Builder().withoutJMXReporting().withoutMetrics().addContactPoint(address).withPort(9142).build();
cluster.getConfiguration().getSocketOptions().setReadTimeoutMillis(5000);
+ EnumNameCodec<LockType> lockTypeCodec = new EnumNameCodec<LockType>(LockType.class);
+ cluster.getConfiguration().getCodecRegistry().register(lockTypeCodec);
+
Session session = cluster.connect();
return new MusicDataStore(cluster, session);
diff --git a/src/test/java/org/onap/music/unittests/JsonResponseTest.java b/music-rest/src/test/java/org/onap/music/unittests/JsonResponseTest.java
index 88fddf4e..6af8c0d9 100644
--- a/src/test/java/org/onap/music/unittests/JsonResponseTest.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/JsonResponseTest.java
@@ -26,7 +26,9 @@ package org.onap.music.unittests;
import static org.junit.Assert.*;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.onap.music.lockingservice.cassandra.MusicLockState.LockStatus;
@@ -111,6 +113,28 @@ public class JsonResponseTest {
}
@Test
+ public void testLockLease() {
+ result = new JsonResponse(ResultType.SUCCESS);
+ result.setLockLease("lockLease");
+ assertEquals("lockLease", result.getLockLease());
+ }
+
+ @Test
+ public void testMusicBuild() {
+ result = new JsonResponse(ResultType.SUCCESS);
+ result.setMusicBuild("Build");
+ assertEquals("Build", result.getMusicBuild());
+ }
+
+ @Test
+ public void testLockHolder() {
+ result = new JsonResponse(ResultType.SUCCESS);
+ List<String> lockHolders = new ArrayList<>();
+ result.setLockHolder(lockHolders);
+ assertEquals(lockHolders, result.getLockHolder());
+ }
+
+ @Test
public void testLockStatus() {
result = new JsonResponse(ResultType.SUCCESS);
LockStatus status = LockStatus.LOCKED;
@@ -125,4 +149,19 @@ public class JsonResponseTest {
assertTrue(result.toString() instanceof String);
}
+
+ @Test
+ public void testLockHolders() {
+ result = new JsonResponse(ResultType.SUCCESS).setLock("lockName").setLockHolder("lockholder1");
+ Map<String, Object> lockMap = (Map<String, Object>) result.toMap().get("lock");
+ // assure that this is string for backwards compatibility
+ assertEquals("lockholder1", lockMap.get("lock-holder"));
+
+ List<String> lockholders = new ArrayList<>();
+ lockholders.add("lockholder1");
+ lockholders.add("lockholder2");
+ result.setLockHolder(lockholders);
+ lockMap = (Map<String, Object>) result.toMap().get("lock");
+ assertEquals(lockMap.get("lock-holder"), lockholders);
+ }
}
diff --git a/src/test/java/org/onap/music/unittests/MusicDataStoreTest.java b/music-rest/src/test/java/org/onap/music/unittests/MusicDataStoreTest.java
index 6b7dc781..68e6f3dc 100644
--- a/src/test/java/org/onap/music/unittests/MusicDataStoreTest.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/MusicDataStoreTest.java
@@ -37,7 +37,6 @@ import org.onap.music.exceptions.MusicServiceException;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.onap.music.authentication.CachingUtil;
import org.onap.music.datastore.MusicDataStore;
import org.onap.music.datastore.PreparedQueryObject;
@@ -84,7 +83,7 @@ public class MusicDataStoreTest {
assertEquals(true, result);
}
-
+
@Test
public void Test2_ExecutePut_eventual_insert() throws MusicServiceException, MusicQueryException {
testObject = CassandraCQL.setPreparedInsertQueryObject1();
diff --git a/src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java b/music-rest/src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java
index 4594ba2c..385a4698 100644
--- a/src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/TestRestMusicQAPI.java
@@ -1,16 +1,20 @@
/*
- * ============LICENSE_START========================================== org.onap.music
- * =================================================================== Copyright (c) 2017 AT&T
- * Intellectual Property ===================================================================
- * 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
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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
+ * 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 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=============================================
* ====================================================================
@@ -48,6 +52,7 @@ import org.mindrot.jbcrypt.BCrypt;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.music.datastore.MusicDataStore;
import org.onap.music.datastore.MusicDataStoreHandle;
import org.onap.music.datastore.PreparedQueryObject;
import org.onap.music.datastore.jsonobjects.JsonDelete;
@@ -62,9 +67,10 @@ import org.onap.music.lockingservice.cassandra.CassaLockStore;
import org.onap.music.main.MusicCore;
import org.onap.music.main.MusicUtil;
//import org.onap.music.main.ResultType;
-import org.onap.music.rest.RestMusicAdminAPI;
+//import org.onap.music.rest.RestMusicAdminAPI;
import org.onap.music.rest.RestMusicDataAPI;
import org.onap.music.rest.RestMusicQAPI;
+import org.springframework.test.util.ReflectionTestUtils;
import org.onap.music.rest.RestMusicLocksAPI;
import com.datastax.driver.core.DataType;
import com.datastax.driver.core.ResultSet;
@@ -79,8 +85,8 @@ import com.sun.jersey.core.util.MultivaluedMapImpl;
@RunWith(MockitoJUnitRunner.class)
public class TestRestMusicQAPI {
-
- RestMusicAdminAPI admin = new RestMusicAdminAPI();
+
+ //RestMusicAdminAPI admin = new RestMusicAdminAPI();
RestMusicLocksAPI lock = new RestMusicLocksAPI();
RestMusicQAPI qData = new RestMusicQAPI();
static PreparedQueryObject testObject;
@@ -90,7 +96,7 @@ public class TestRestMusicQAPI {
@Mock
UriInfo info;
-
+
static String appName = "TestApp";
static String userId = "TestUser";
static String password = "TestPassword";
@@ -124,17 +130,18 @@ public class TestRestMusicQAPI {
@BeforeClass
public static void init() throws Exception {
try {
- MusicDataStoreHandle.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
- MusicCore.mLockHandle = new CassaLockStore(MusicDataStoreHandle.mDstoreHandle);
+ ReflectionTestUtils.setField(MusicDataStoreHandle.class, "mDstoreHandle",
+ CassandraCQL.connectToEmbeddedCassandra());
+ MusicCore.setmLockHandle(new CassaLockStore(MusicDataStoreHandle.getDSHandle()));
- // System.out.println("before class keysp");
+ // System.out.println("before class keysp");
//resp=data.createKeySpace(majorV,minorV,patchV,aid,appName,userId,password,kspObject,keyspaceName);
//System.out.println("after keyspace="+keyspaceName);
} catch (Exception e) {
- System.out.println("before class exception ");
+ System.out.println("before class exception ");
e.printStackTrace();
}
- // admin keyspace and table
+ // admin keyspace and table
testObject = new PreparedQueryObject();
testObject.appendQueryString("CREATE KEYSPACE admin WITH REPLICATION = "
+ "{'class' : 'SimpleStrategy' , "
@@ -186,7 +193,7 @@ public class TestRestMusicQAPI {
if (rows.size() > 0) {
System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
}
-
+
JsonKeySpace jsonKeyspace = new JsonKeySpace();
Map<String, String> consistencyInfo = new HashMap<>();
Map<String, Object> replicationInfo = new HashMap<>();
@@ -212,8 +219,9 @@ public class TestRestMusicQAPI {
testObject = new PreparedQueryObject();
testObject.appendQueryString("DROP KEYSPACE IF EXISTS admin");
MusicCore.eventualPut(testObject);
- if (MusicDataStoreHandle.mDstoreHandle!=null) {}
- //MusicDataStoreHandle.mDstoreHandle.close();
+ MusicDataStore mds = (MusicDataStore) ReflectionTestUtils.getField(MusicDataStoreHandle.class, "mDstoreHandle");
+ if (mds != null)
+ mds.close();
}
@@ -243,7 +251,7 @@ public class TestRestMusicQAPI {
System.out.println("Entity" + response.getEntity());
assertEquals(200, response.getStatus());
}*/
-
+
@Test
public void Test1_createQ_FieldsEmpty() throws Exception {
JsonTable jsonTable = new JsonTable();
@@ -298,7 +306,7 @@ public class TestRestMusicQAPI {
System.out.println("Entity" + response.getEntity());
assertEquals(200, response.getStatus());
}*/
-
+
/* @Test
public void Test1_createQ_ClusterOrderGood1() throws Exception {
String tableNameC="testcjcO";
@@ -468,13 +476,13 @@ public class TestRestMusicQAPI {
// "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, userId, password,
System.out.println("#######status is " + response.getStatus()+"table namec="+tableNameC);
System.out.println("Entity" + response.getEntity());
- assertEquals(401, response.getStatus());
+ assertEquals(400, response.getStatus());
}
@Test
public void Test3_createQ_0() throws Exception {
- //duplicate testing ...
+ //duplicate testing ...
JsonTable jsonTable = new JsonTable();
Map<String, String> consistencyInfo = new HashMap<>();
Map<String, String> fields = new HashMap<>();
@@ -510,34 +518,9 @@ public class TestRestMusicQAPI {
//assertNotEquals(200,response0.getStatus());
}
- // Improper Auth
- @Test
- public void Test3_createQ1() throws Exception {
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, String> fields = new HashMap<>();
- fields.put("uuid", "text");
- fields.put("emp_name", "text");
- fields.put("emp_salary", "varint");
- fields.put("PRIMARY KEY", "(emp_name)");
- consistencyInfo.put("type", "eventual");
- jsonTable.setConsistencyInfo(consistencyInfo);
- jsonTable.setKeyspaceName(keyspaceName);
- jsonTable.setPartitionKey("emp_name");
- jsonTable.setClusteringKey("uuid");
- jsonTable.setTableName(tableName);
- jsonTable.setClusteringOrder("uuid DESC");
- jsonTable.setFields(fields);
- //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
- Response response = qData.createQ(majorV, minorV,patchV,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, wrongAuthorization,
- jsonTable, keyspaceName, tableName);
- System.out.println("#######status is " + response.getStatus());
- System.out.println("Entity" + response.getEntity());
- assertEquals(401, response.getStatus());
- }
// Improper keyspace
+ @Ignore
@Test
public void Test3_createQ2() throws Exception {
JsonTable jsonTable = new JsonTable();
@@ -627,48 +610,8 @@ public class TestRestMusicQAPI {
assertEquals(200, response.getStatus());
}*/
- // Auth Error
- @Test
- public void Test4_insertIntoQ3() throws Exception {
- JsonInsert jsonInsert = new JsonInsert();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, Object> values = new HashMap<>();
- values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
- values.put("emp_name", "test1");
- values.put("emp_salary", 1500);
- consistencyInfo.put("type", "eventual");
- jsonInsert.setConsistencyInfo(consistencyInfo);
- jsonInsert.setKeyspaceName(keyspaceName);
- jsonInsert.setTableName(tableName);
- jsonInsert.setValues(values);
- //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
- Response response = qData.insertIntoQ(majorV, minorV,patchV,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, wrongAuthorization,
- jsonInsert, keyspaceName, tableName);
- assertEquals(401, response.getStatus());
- }
- // Table wrong
- @Test
- public void Test4_insertIntoQ4() throws Exception {
- JsonInsert jsonInsert = new JsonInsert();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, Object> values = new HashMap<>();
- values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
- values.put("emp_name", "test1");
- values.put("emp_salary", 1500);
- consistencyInfo.put("type", "eventual");
- jsonInsert.setConsistencyInfo(consistencyInfo);
- jsonInsert.setKeyspaceName(keyspaceName);
- jsonInsert.setTableName(tableName);
- jsonInsert.setValues(values);
- //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
- Response response = qData.insertIntoQ(majorV, minorV,patchV,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
- jsonInsert, keyspaceName, "wrong");
- assertEquals(401, response.getStatus());
- }
-
+
/* @Test
public void Test5_updateQ() throws Exception {
JsonUpdate jsonUpdate = new JsonUpdate();
@@ -690,25 +633,25 @@ public class TestRestMusicQAPI {
assertEquals(200, response.getStatus());
}*/
- @Test
- public void Test5_updateQEmptyValues() throws Exception {
- JsonUpdate jsonUpdate = new JsonUpdate();
- Map<String, String> consistencyInfo = new HashMap<>();
- MultivaluedMap<String, String> row = new MultivaluedMapImpl();
- Map<String, Object> values = new HashMap<>();
- row.add("emp_name", "testName");
- //values.put("emp_salary", 2500);
- consistencyInfo.put("type", "atomic");
- jsonUpdate.setConsistencyInfo(consistencyInfo);
- jsonUpdate.setKeyspaceName(keyspaceName);
- jsonUpdate.setTableName(tableName);
- jsonUpdate.setValues(values);
- //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
- //Mockito.when(info.getQueryParameters()).thenReturn(row);
- Response response = qData.updateQ(majorV, minorV,patchV, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- authorization, jsonUpdate, keyspaceName, tableName, info);
- assertNotEquals(200, response.getStatus());
- }
+ @Test
+ public void Test5_updateQEmptyValues() throws Exception {
+ JsonUpdate jsonUpdate = new JsonUpdate();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+ Map<String, Object> values = new HashMap<>();
+ row.add("emp_name", "testName");
+ //values.put("emp_salary", 2500);
+ consistencyInfo.put("type", "atomic");
+ jsonUpdate.setConsistencyInfo(consistencyInfo);
+ jsonUpdate.setKeyspaceName(keyspaceName);
+ jsonUpdate.setTableName(tableName);
+ jsonUpdate.setValues(values);
+ //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+ //Mockito.when(info.getQueryParameters()).thenReturn(row);
+ Response response = qData.updateQ(majorV, minorV,patchV, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonUpdate, keyspaceName, tableName, info);
+ assertNotEquals(200, response.getStatus());
+ }
/* @Test
public void Test6_filterQ() throws Exception { //select
@@ -758,7 +701,7 @@ public class TestRestMusicQAPI {
jsonSelect.setConsistencyInfo(consistencyInfo);
Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
UriInfo infoe= mockUriInfo("/peek?");//empty queryParam: cause exception
- // infoe.setQueryParameters("");
+ // infoe.setQueryParameters("");
System.out.println("uriinfo="+infoe.getQueryParameters());
Mockito.when(infoe.getQueryParameters()).thenReturn(row);
Response response = qData.peek(majorV, minorV,patchV,"abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
@@ -798,8 +741,8 @@ public class TestRestMusicQAPI {
//Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
Mockito.when(info.getQueryParameters()).thenReturn(row);
Response response = qData.deleteFromQ(majorV, minorV,patchV,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
- jsonDelete, keyspaceName, tableName, info);
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
+ jsonDelete, keyspaceName, tableName, info);
assertEquals(400, response.getStatus());
}
@@ -829,17 +772,17 @@ public class TestRestMusicQAPI {
Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
Response response = qData.dropQ(majorV, minorV,patchV,
"abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
- keyspaceName, tableName);
+ keyspaceName, tableName);
assertEquals(200, response.getStatus());
}*/
-
+
private UriInfo mockUriInfo(String urix) throws URISyntaxException {
- String uri="http://localhost:8080/MUSIC/rest/v"+majorV+"/priorityq/keyspaces/"+keyspaceName+"/"+tableName+urix;
- UriInfo uriInfo = Mockito.mock(UriInfo.class);
- System.out.println("mock urix="+urix+" uri="+uri);
- Mockito.when(uriInfo.getRequestUri()).thenReturn(new URI(uri));
- return uriInfo;
- }
+ String uri="http://localhost:8080/MUSIC/rest/v"+majorV+"/priorityq/keyspaces/"+keyspaceName+"/"+tableName+urix;
+ UriInfo uriInfo = Mockito.mock(UriInfo.class);
+ System.out.println("mock urix="+urix+" uri="+uri);
+ Mockito.when(uriInfo.getRequestUri()).thenReturn(new URI(uri));
+ return uriInfo;
+ }
//Empty Fields
@@ -891,7 +834,7 @@ public class TestRestMusicQAPI {
assertEquals(400, response.getStatus());
}
- //Clustering key null
+ //Clustering key null
@Test
public void Test8_createQ_ClusteringKey_empty() throws Exception {
String tableNameC="testcjcC";
@@ -945,7 +888,7 @@ public class TestRestMusicQAPI {
assertEquals(400, response.getStatus());
}
- //Invalid primary key
+ //Invalid primary key
@Test
public void Test8_createQ_primaryKey_invalid() throws Exception {
String tableNameC="testcjcC";
diff --git a/music-rest/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java b/music-rest/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java
new file mode 100644
index 00000000..cc7c5146
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java
@@ -0,0 +1,116 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.unittests;
+
+import java.util.List;
+import java.util.UUID;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+import org.mindrot.jbcrypt.BCrypt;
+import org.onap.music.datastore.MusicDataStore;
+import org.onap.music.datastore.MusicDataStoreHandle;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import org.springframework.test.util.ReflectionTestUtils;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.sun.jersey.core.util.Base64;
+
+@RunWith(Suite.class)
+@SuiteClasses({ TstRestMusicDataAPI.class, TstRestMusicLockAPI.class,
+ TstRestMusicConditionalAPI.class})
+public class TestsUsingCassandra {
+
+ static String appName = "TestApp";
+ static String userId = "TestUser";
+ static String password = "TestPassword";
+ static String authData = userId+":"+password;
+ static String wrongAuthData = userId+":"+"pass";
+ static String authorization = new String(Base64.encode(authData.getBytes()));
+ static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
+ static boolean isAAF = false;
+ static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
+ static String keyspaceName = "testcassa";
+ static String tableName = "employees";
+ static String xLatestVersion = "X-latestVersion";
+ static String onboardUUID = null;
+ static String aid = "abc66ccc-d857-4e90-b1e5-df98a3d40ce6";
+
+ @BeforeClass
+ public static void beforeClass() throws Exception {
+ ReflectionTestUtils.setField(MusicDataStoreHandle.class, "mDstoreHandle",
+ CassandraCQL.connectToEmbeddedCassandra());
+ MusicCore.setmLockHandle(new CassaLockStore(MusicDataStoreHandle.getDSHandle()));
+ createAdminTable();
+ }
+
+ @AfterClass
+ public static void afterClass() {
+ PreparedQueryObject testObject = new PreparedQueryObject();
+ testObject.appendQueryString("DROP KEYSPACE IF EXISTS admin");
+ MusicCore.eventualPut(testObject);
+ MusicDataStore mds = (MusicDataStore) ReflectionTestUtils.getField(MusicDataStoreHandle.class, "mDstoreHandle");
+ if (mds != null)
+ mds.close();
+ }
+
+ private static void createAdminTable() throws Exception {
+ PreparedQueryObject testObject = new PreparedQueryObject();
+ testObject.appendQueryString(CassandraCQL.createAdminKeyspace);
+ MusicCore.eventualPut(testObject);
+ testObject = new PreparedQueryObject();
+ testObject.appendQueryString(CassandraCQL.createAdminTable);
+ MusicCore.eventualPut(testObject);
+
+ testObject = new PreparedQueryObject();
+ testObject.appendQueryString(
+ "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
+ + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(),
+ keyspaceName));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), BCrypt.hashpw(password, BCrypt.gensalt())));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
+ MusicCore.eventualPut(testObject);
+
+ testObject = new PreparedQueryObject();
+ testObject.appendQueryString(
+ "select uuid from admin.keyspace_master where application_name = ? allow filtering");
+ testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
+ ResultSet rs = MusicCore.get(testObject);
+ List<Row> rows = rs.all();
+ if (rows.size() > 0) {
+ System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
+ onboardUUID = rows.get(0).getUUID("uuid").toString();
+ }
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java
index 3adab912..7021178e 100644
--- a/src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicConditionalAPI.java
@@ -39,7 +39,6 @@ import org.mindrot.jbcrypt.BCrypt;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.music.authentication.CachingUtil;
import org.onap.music.conductor.conditionals.JsonConditional;
import org.onap.music.conductor.conditionals.RestMusicConditionalAPI;
import org.onap.music.datastore.MusicDataStoreHandle;
@@ -293,8 +292,6 @@ public class TstRestMusicConditionalAPI {
query.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
query.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- CachingUtil.updateMusicCache(keyspaceName, appName);
- CachingUtil.updateMusicValidateCache(appName, userId, hashedpwd);
MusicCore.eventualPut(query);
}
diff --git a/src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java
index 18692915..ea3fb54e 100644
--- a/src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicDataAPI.java
@@ -44,7 +44,6 @@ import org.mindrot.jbcrypt.BCrypt;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.music.authentication.CachingUtil;
import org.onap.music.datastore.MusicDataStoreHandle;
import org.onap.music.datastore.PreparedQueryObject;
import org.onap.music.datastore.jsonobjects.JsonDelete;
@@ -137,6 +136,42 @@ public class TstRestMusicDataAPI {
Map<String, String> respMap = (Map<String, String>) response.getEntity();
assertEquals(ResultType.FAILURE, respMap.get("status"));
}
+
+ @Test
+ public void test1_createKeyspaceSuccess() throws Exception {
+ System.out.println("Testing successful creation and deletion of keyspace");
+ MusicUtil.setKeyspaceActive(true);
+
+ String keyspaceToCreate = "temp"+keyspaceName;
+
+
+ JsonKeySpace jsonKeyspace = new JsonKeySpace();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, Object> replicationInfo = new HashMap<>();
+ consistencyInfo.put("type", "eventual");
+ replicationInfo.put("class", "SimpleStrategy");
+ replicationInfo.put("replication_factor", 1);
+ jsonKeyspace.setConsistencyInfo(consistencyInfo);
+ jsonKeyspace.setDurabilityOfWrites("true");
+ //don't overwrite a keyspace we already have
+ jsonKeyspace.setKeyspaceName(keyspaceToCreate);
+ jsonKeyspace.setReplicationInfo(replicationInfo);
+ // Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+ Response response =
+ data.createKeySpace("1", "1", "1", null, authorization, appName, jsonKeyspace, keyspaceToCreate);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ Map<String, String> respMap = (Map<String, String>) response.getEntity();
+ assertEquals(ResultType.SUCCESS, respMap.get("status"));
+
+ response = data.dropKeySpace("1", "1", "1", null, authorization, appName, keyspaceToCreate);
+ assertEquals(200, response.getStatus());
+ respMap = (Map<String, String>) response.getEntity();
+ assertEquals(ResultType.SUCCESS, respMap.get("status"));
+
+ //unset to not mess up any further tests
+ MusicUtil.setKeyspaceActive(false);
+ }
@Test
public void test3_createTable() throws Exception {
@@ -159,6 +194,16 @@ public class TstRestMusicDataAPI {
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
assertEquals(200, response.getStatus());
}
+
+ @Test
+ public void test3_createTableNoBody() throws Exception {
+ System.out.println("Testing create table w/o body");
+
+ Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, null, keyspaceName, tableName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
@Test
public void test3_createTableNoName() throws Exception {
@@ -181,6 +226,22 @@ public class TstRestMusicDataAPI {
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
assertEquals(400, response.getStatus());
}
+
+ @Test
+ public void test3_createTableNoFields() throws Exception {
+ System.out.println("Testing create table without fields");
+ JsonTable jsonTable = new JsonTable();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ consistencyInfo.put("type", "eventual");
+ jsonTable.setConsistencyInfo(consistencyInfo);
+ jsonTable.setKeyspaceName(keyspaceName);
+ jsonTable.setPrimaryKey("emp_name");
+ jsonTable.setTableName("");
+ Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonTable, keyspaceName, "");
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
@Test
@@ -261,58 +322,13 @@ public class TstRestMusicDataAPI {
assertEquals(400, response2.getStatus());
Map<String, String> respMap = (Map<String, String>) response2.getEntity();
assertEquals(ResultType.FAILURE, respMap.get("status"));
- assertEquals("Table " + keyspaceName + "." + tableNameDup + " already exists", respMap.get("error"));
+ assertEquals("Already Exists Exception: Table " + keyspaceName + "." + tableNameDup + " already exists", respMap.get("error"));
}
- // Improper Auth
- @Test
- public void test3_createTable1() throws Exception {
- System.out.println("Testing create table w/ improper authentication");
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, String> fields = new HashMap<>();
- fields.put("uuid", "text");
- fields.put("emp_name", "text");
- fields.put("emp_salary", "varint");
- fields.put("PRIMARY KEY", "(emp_name)");
- consistencyInfo.put("type", "eventual");
- jsonTable.setConsistencyInfo(consistencyInfo);
- jsonTable.setKeyspaceName(keyspaceName);
- jsonTable.setPrimaryKey("emp_name");
- jsonTable.setTableName(tableName);
- jsonTable.setFields(fields);
- Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, jsonTable, keyspaceName, tableName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- // Improper keyspace
- @Test
- public void test3_createTable3() throws Exception {
- System.out.println("Testing create table for wrong keyspace");
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, String> fields = new HashMap<>();
- fields.put("uuid", "text");
- fields.put("emp_name", "text");
- fields.put("emp_salary", "varint");
- fields.put("PRIMARY KEY", "(emp_name)");
- consistencyInfo.put("type", "eventual");
- jsonTable.setConsistencyInfo(consistencyInfo);
- jsonTable.setKeyspaceName(keyspaceName);
- jsonTable.setPrimaryKey("emp_name");
- jsonTable.setTableName(tableName);
- jsonTable.setFields(fields);
- Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- authorization, jsonTable, "wrong", tableName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
// Improper parenthesis in key field
@Test
- public void test3_createTable_badParantesis() throws Exception {
+ public void test3_createTable_badParanthesis() throws Exception {
System.out.println("Testing malformed create table request");
String tableNameC = "testTable0";
JsonTable jsonTable = new JsonTable();
@@ -479,38 +495,6 @@ public class TstRestMusicDataAPI {
assertEquals(200, response.getStatus());
}
-
- // good clustering key, need to pass queryparameter
- @Test
- public void test3_createTableIndex_badAuth() throws Exception {
- System.out.println("Testing index in create table w/ wrong authorization");
- String tableNameC = "testTableCinx";
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, String> fields = new HashMap<>();
- fields.put("uuid", "text");
- fields.put("emp_name", "text");
- fields.put("emp_salary", "varint");
- fields.put("PRIMARY KEY", "((emp_name),emp_salary)");
- consistencyInfo.put("type", "eventual");
- jsonTable.setConsistencyInfo(consistencyInfo);
- jsonTable.setKeyspaceName(keyspaceName);
- jsonTable.setTableName(tableNameC);
- jsonTable.setClusteringOrder("emp_salary ASC");
- jsonTable.setFields(fields);
- Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- authorization, jsonTable, keyspaceName, tableNameC);
- // if 200 print to log otherwise fail assertEquals(200, response.getStatus());
- // info.setQueryParameters("index_name=inx_uuid");
- Map<String, String> queryParametersMap = new HashMap<String, String>();
-
- queryParametersMap.put("index_name", "inxuuid");
- response = data.createIndex("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, keyspaceName, tableNameC, "uuid", info);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
// create index without table name
@Test
@@ -565,7 +549,54 @@ public class TstRestMusicDataAPI {
assertEquals(200, response.getStatus());
}
+
+ @Test
+ public void test4_insertIntoTableNoBody() throws Exception {
+ System.out.println("Testing insert into table w/o body");
+ createTable();
+ Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, null, keyspaceName, tableName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test4_insertIntoTableNoaValues() throws Exception {
+ System.out.println("Testing insert into table");
+ createTable();
+ JsonInsert jsonInsert = new JsonInsert();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ consistencyInfo.put("type", "eventual");
+ jsonInsert.setConsistencyInfo(consistencyInfo);
+ jsonInsert.setKeyspaceName(keyspaceName);
+ jsonInsert.setTableName(tableName);
+
+ Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonInsert, keyspaceName, tableName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test4_insertIntoTableNoValues() throws Exception {
+ System.out.println("Testing insert into table");
+ createTable();
+ JsonInsert jsonInsert = new JsonInsert();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ consistencyInfo.put("type", "eventual");
+ jsonInsert.setConsistencyInfo(consistencyInfo);
+ jsonInsert.setKeyspaceName(keyspaceName);
+ jsonInsert.setTableName(tableName);
+
+ Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonInsert, keyspaceName, tableName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(400, response.getStatus());
+ }
+
@Test
public void test4_insertIntoTableCriticalNoLockID() throws Exception {
System.out.println("Testing critical insert into table without lockid");
@@ -654,29 +685,6 @@ public class TstRestMusicDataAPI {
assertEquals(200, response.getStatus());
}
- // Auth Error
- @Test
- public void test4_insertIntoTable3() throws Exception {
- System.out.println("Testing insert into table with bad credentials");
- createTable();
- JsonInsert jsonInsert = new JsonInsert();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, Object> values = new HashMap<>();
- values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
- values.put("emp_name", "test1");
- values.put("emp_salary", 1500);
- consistencyInfo.put("type", "eventual");
- jsonInsert.setConsistencyInfo(consistencyInfo);
- jsonInsert.setKeyspaceName(keyspaceName);
- jsonInsert.setTableName(tableName);
- jsonInsert.setValues(values);
- Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, jsonInsert, keyspaceName, tableName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
// Table wrong
@Test
public void test4_insertIntoTable4() throws Exception {
@@ -748,28 +756,19 @@ public class TstRestMusicDataAPI {
assertEquals(200, response.getStatus());
}
- @Test
- public void test5_updateTable_wrongAuth() throws Exception {
- System.out.println("Testing update table w/ wrong credentials");
- createTable();
- JsonUpdate jsonUpdate = new JsonUpdate();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, Object> values = new HashMap<>();
- values.put("emp_salary", 2500);
- consistencyInfo.put("type", "atomic");
- jsonUpdate.setConsistencyInfo(consistencyInfo);
- jsonUpdate.setKeyspaceName(keyspaceName);
- jsonUpdate.setTableName(tableName);
- jsonUpdate.setValues(values);
+ public void test5_updateTableNoBody() throws Exception {
+ System.out.println("Testing update table no body");
+ createTable();
+
Response response = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, jsonUpdate, keyspaceName, tableName, info);
+ authorization, null, keyspaceName, tableName, info);
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
+ assertEquals(400, response.getStatus());
}
-
+
@Test
public void test5_updateTable_tableDNE() throws Exception {
System.out.println("Testing update table that does not exist");
@@ -843,62 +842,6 @@ public class TstRestMusicDataAPI {
assertEquals(200, response.getStatus());
}
- @Ignore
- @Test
- public void test5_updateTableAuthException1() throws Exception {
- System.out.println("Testing update table authentication error");
- createTable();
- JsonUpdate jsonUpdate = new JsonUpdate();
- Map<String, String> consistencyInfo = new HashMap<>();
- MultivaluedMap<String, String> row = new MultivaluedMapImpl();
- Map<String, Object> values = new HashMap<>();
- row.add("emp_name", "testname");
- values.put("emp_salary", 2500);
- consistencyInfo.put("type", "atomic");
- jsonUpdate.setConsistencyInfo(consistencyInfo);
- jsonUpdate.setKeyspaceName(keyspaceName);
- jsonUpdate.setTableName(tableName);
- jsonUpdate.setValues(values);
-
- Mockito.when(info.getQueryParameters()).thenReturn(row);
- String authDatax = ":";
- String authorizationx = new String(Base64.encode(authDatax.getBytes()));
- Response response = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- authorizationx, jsonUpdate, keyspaceName, tableName, info);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
- @Ignore
- @Test
- public void test5_updateTableAuthEmpty() throws Exception {
- System.out.println("Testing update table without authentication");
- createTable();
-
- JsonUpdate jsonUpdate = new JsonUpdate();
- Map<String, String> consistencyInfo = new HashMap<>();
- MultivaluedMap<String, String> row = new MultivaluedMapImpl();
- Map<String, Object> values = new HashMap<>();
- row.add("emp_name", "testname");
- values.put("emp_salary", 2500);
- consistencyInfo.put("type", "atomic");
- jsonUpdate.setConsistencyInfo(consistencyInfo);
- jsonUpdate.setKeyspaceName(keyspaceName);
- jsonUpdate.setTableName(tableName);
- jsonUpdate.setValues(values);
-
- Mockito.when(info.getQueryParameters()).thenReturn(row);
- String authDatax = ":" + password;
- String authorizationx = new String(Base64.encode(authDatax.getBytes()));
- String appNamex = "xx";
- Response response = data.updateTable("1", "1", "1", "", appNamex, authorizationx, jsonUpdate, keyspaceName,
- tableName, info);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
@Test
public void test6_critical_selectAtomic() throws Exception {
System.out.println("Testing critical select atomic");
@@ -919,41 +862,44 @@ public class TstRestMusicDataAPI {
Map<String, String> row0 = (Map<String, String>) result.get("row 0");
assertEquals("testname", row0.get("emp_name"));
assertEquals(BigInteger.valueOf(500), row0.get("emp_salary"));
- }
+ }
+
@Test
- public void test6_critical_selectCritical_nolockid() throws Exception {
- System.out.println("Testing critical select critical w/o lockid");
+ public void test6_critical_select() throws Exception {
+ System.out.println("Testing critical select w/o body");
createAndInsertIntoTable();
- JsonInsert jsonInsert = new JsonInsert();
- Map<String, String> consistencyInfo = new HashMap<>();
MultivaluedMap<String, String> row = new MultivaluedMapImpl();
row.add("emp_name", "testname");
- consistencyInfo.put("type", "critical");
- jsonInsert.setConsistencyInfo(consistencyInfo);
Mockito.when(info.getQueryParameters()).thenReturn(row);
Response response = data.selectCritical("1", "1", "1","abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
- appName, authorization, jsonInsert, keyspaceName, tableName,info);
+ appName, authorization, null, keyspaceName, tableName,info);
HashMap<String,HashMap<String,Object>> map = (HashMap<String, HashMap<String, Object>>) response.getEntity();
HashMap<String, Object> result = map.get("result");
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
assertEquals(400, response.getStatus());
}
-
+
+ // Added during merge?
@Test
- public void test6_critical_select_wrongAuth() throws Exception {
- System.out.println("Testing critical select w/ wrong authentication");
+ public void test6_critical_selectCritical_nolockid() throws Exception {
+ System.out.println("Testing critical select critical w/o lockid");
createAndInsertIntoTable();
JsonInsert jsonInsert = new JsonInsert();
Map<String, String> consistencyInfo = new HashMap<>();
- consistencyInfo.put("type", "atomic");
+ MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+ row.add("emp_name", "testname");
+ consistencyInfo.put("type", "critical");
jsonInsert.setConsistencyInfo(consistencyInfo);
+ Mockito.when(info.getQueryParameters()).thenReturn(row);
Response response = data.selectCritical("1", "1", "1","abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
- appName, wrongAuthorization, jsonInsert, keyspaceName, tableName,info);
+ appName, authorization, jsonInsert, keyspaceName, tableName,info);
+ HashMap<String,HashMap<String,Object>> map = (HashMap<String, HashMap<String, Object>>) response.getEntity();
+ HashMap<String, Object> result = map.get("result");
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
+ assertEquals(400, response.getStatus());
}
@Test
@@ -982,8 +928,8 @@ public class TstRestMusicDataAPI {
consistencyInfo.put("type", "atomic");
jsonSelect.setConsistencyInfo(consistencyInfo);
Mockito.when(info.getQueryParameters()).thenReturn(row);
- Response response = data.select("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
- keyspaceName, tableName, info);
+ Response response = data.selectWithCritical("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName, authorization,
+ null,keyspaceName, tableName, info);
HashMap<String, HashMap<String, Object>> map = (HashMap<String, HashMap<String, Object>>) response.getEntity();
HashMap<String, Object> result = map.get("result");
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
@@ -994,21 +940,6 @@ public class TstRestMusicDataAPI {
}
@Test
- public void test6_select_wrongAuth() throws Exception {
- System.out.println("Testing select w/ wrong authentication");
- createAndInsertIntoTable();
- JsonSelect jsonSelect = new JsonSelect();
- Map<String, String> consistencyInfo = new HashMap<>();
- consistencyInfo.put("type", "atomic");
- jsonSelect.setConsistencyInfo(consistencyInfo);
- Response response = data.select("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
- appName, wrongAuthorization, keyspaceName, tableName, info);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
- @Test
public void test6_select_nullTablename() throws Exception {
System.out.println("Testing select w/ null tablename");
createAndInsertIntoTable();
@@ -1016,8 +947,8 @@ public class TstRestMusicDataAPI {
Map<String, String> consistencyInfo = new HashMap<>();
consistencyInfo.put("type", "atomic");
jsonSelect.setConsistencyInfo(consistencyInfo);
- Response response = data.select("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
- appName, wrongAuthorization, keyspaceName, null, info);
+ Response response = data.selectWithCritical("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
+ appName, wrongAuthorization,null, keyspaceName, null, info);
System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
assertEquals(400, response.getStatus());
@@ -1041,20 +972,6 @@ public class TstRestMusicDataAPI {
}
@Test
- public void test6_deleteFromTable_wrongAuth() throws Exception {
- System.out.println("Testing delete from table");
- createAndInsertIntoTable();
- JsonDelete jsonDelete = new JsonDelete();
- Map<String, String> consistencyInfo = new HashMap<>();
- consistencyInfo.put("type", "atomic");
- jsonDelete.setConsistencyInfo(consistencyInfo);
- Response response = data.deleteFromTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, jsonDelete, keyspaceName, tableName, info);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
public void test6_deleteFromTable_missingTablename() throws Exception {
System.out.println("Testing delete from table w/ null tablename");
createAndInsertIntoTable();
@@ -1120,21 +1037,6 @@ public class TstRestMusicDataAPI {
}
@Test
- public void test7_dropTable_wrongAuth() throws Exception {
- System.out.println("Testing drop table w/ wrong auth");
- createTable();
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- consistencyInfo.put("type", "atomic");
- jsonTable.setConsistencyInfo(consistencyInfo);
- Response response = data.dropTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
- wrongAuthorization, keyspaceName, tableName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
- @Test
public void test7_dropTable_nullTablename() throws Exception {
System.out.println("Testing drop table w/ null tablename");
createTable();
@@ -1189,8 +1091,6 @@ public class TstRestMusicDataAPI {
query.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
query.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- CachingUtil.updateMusicCache(keyspaceName, appName);
- CachingUtil.updateMusicValidateCache(appName, userId, hashedpwd);
MusicCore.eventualPut(query);
}
diff --git a/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java
new file mode 100644
index 00000000..91781a34
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java
@@ -0,0 +1,768 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.unittests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mindrot.jbcrypt.BCrypt;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.music.datastore.PreparedQueryObject;
+import org.onap.music.datastore.jsonobjects.JsonInsert;
+import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
+import org.onap.music.datastore.jsonobjects.JsonLock;
+import org.onap.music.datastore.jsonobjects.JsonTable;
+import org.onap.music.datastore.jsonobjects.JsonUpdate;
+import org.onap.music.exceptions.MusicServiceException;
+import org.onap.music.lockingservice.cassandra.CassaLockStore;
+import org.onap.music.lockingservice.cassandra.LockType;
+import org.onap.music.main.MusicCore;
+import org.onap.music.main.MusicUtil;
+import org.onap.music.rest.RestMusicDataAPI;
+import org.onap.music.rest.RestMusicLocksAPI;
+import com.datastax.driver.core.DataType;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.sun.jersey.core.util.Base64;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TstRestMusicLockAPI {
+
+
+ @Mock
+ UriInfo info;
+
+ RestMusicLocksAPI lock = new RestMusicLocksAPI();
+ RestMusicDataAPI data = new RestMusicDataAPI();
+ static PreparedQueryObject testObject;
+
+ static String appName = "TestApp";
+ static String userId = "TestUser";
+ static String password = "TestPassword";
+ static String authData = userId + ":" + password;
+ static String wrongAuthData = userId + ":" + "pass";
+ static String authorization = new String(Base64.encode(authData.getBytes()));
+ static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
+ static boolean isAAF = false;
+ static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
+ static String keyspaceName = "testcassa";
+ static String tableName = "employees";
+ static String onboardUUID = null;
+ static String lockName = "testcassa.employees.testname";
+
+ @BeforeClass
+ public static void init() throws Exception {
+ System.out.println("Testing RestMusicLock class");
+ try {
+ createKeyspace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new Exception("Unable to initialize before TestRestMusicData test class. " + e.getMessage());
+ }
+ }
+
+ @After
+ public void afterEachTest() throws MusicServiceException {
+ clearAllTablesFromKeyspace();
+ }
+
+ @AfterClass
+ public static void tearDownAfterClass() throws Exception {
+ testObject = new PreparedQueryObject();
+ testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
+ MusicCore.eventualPut(testObject);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_createLockReference() throws Exception {
+ System.out.println("Testing create lockref");
+ createAndInsertIntoTable();
+ Response response = lock.createLockReference(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(200, response.getStatus());
+ assertTrue(respMap.containsKey("lock"));
+ assertTrue(((Map<String, String>) respMap.get("lock")).containsKey("lock"));
+ }
+
+ @Test
+ public void test_createBadLockReference() throws Exception {
+ System.out.println("Testing create bad lockref");
+ createAndInsertIntoTable();
+ Response response = lock.createLockReference("badlock", "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_createReadLock() throws Exception {
+ System.out.println("Testing create read lockref");
+ createAndInsertIntoTable();
+ JsonLock jsonLock = createJsonLock(LockType.READ);
+ Response response = lock.createLockReference(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(200, response.getStatus());
+ assertTrue(respMap.containsKey("lock"));
+ assertTrue(((Map<String, String>) respMap.get("lock")).containsKey("lock"));
+ }
+
+ @Test
+ public void test_createWriteLock() throws Exception {
+ System.out.println("Testing create read lockref");
+ createAndInsertIntoTable();
+ JsonLock jsonLock = createJsonLock(LockType.WRITE);
+ Response response = lock.createLockReference(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+
+ assertEquals(200, response.getStatus());
+ assertTrue(respMap.containsKey("lock"));
+ assertTrue(((Map<String, String>) respMap.get("lock")).containsKey("lock"));
+ }
+
+ @Test
+ public void test_accquireLock() throws Exception {
+ System.out.println("Testing acquire lock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.accquireLock(lockRef, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ }
+
+ @Test
+ public void test_acquireReadLock() throws Exception {
+ System.out.println("Testing acquire read lock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference(LockType.READ);
+ String lockRef2 = createLockReference(LockType.READ);
+
+ Response response =
+ lock.accquireLock(lockRef, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ response =
+ lock.accquireLock(lockRef2, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ }
+
+ @Test
+ public void test_acquireReadLockaFail() throws Exception {
+ System.out.println("Testing acquire read lock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference(LockType.WRITE);
+ String lockRef2 = createLockReference(LockType.READ);
+
+ Response response =
+ lock.accquireLock(lockRef, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ response =
+ lock.accquireLock(lockRef2, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_writeWReadLock() throws Exception {
+ System.out.println("Testing writing with a read lock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference(LockType.READ);
+
+ JsonUpdate jsonUpdate = new JsonUpdate();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, Object> values = new HashMap<>();
+ values.put("emp_salary", 2500);
+ consistencyInfo.put("type", "critical");
+ consistencyInfo.put("lockId", lockRef);
+ jsonUpdate.setConsistencyInfo(consistencyInfo);
+ jsonUpdate.setKeyspaceName(keyspaceName);
+ jsonUpdate.setTableName(tableName);
+ jsonUpdate.setValues(values);
+ MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+ row.add("emp_name", "testname");
+ Mockito.when(info.getQueryParameters()).thenReturn(row);
+
+ Response response = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonUpdate, keyspaceName, tableName, info);
+
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_writeWWriteLock() throws Exception {
+ System.out.println("Testing writing with a read lock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference(LockType.WRITE);
+
+ JsonUpdate jsonUpdate = new JsonUpdate();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, Object> values = new HashMap<>();
+ values.put("emp_salary", 2500);
+ consistencyInfo.put("type", "critical");
+ consistencyInfo.put("lockId", lockRef);
+ jsonUpdate.setConsistencyInfo(consistencyInfo);
+ jsonUpdate.setKeyspaceName(keyspaceName);
+ jsonUpdate.setTableName(tableName);
+ jsonUpdate.setValues(values);
+ MultivaluedMap<String, String> row = new MultivaluedMapImpl();
+ row.add("emp_name", "testname");
+ Mockito.when(info.getQueryParameters()).thenReturn(row);
+
+ Response response = data.updateTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonUpdate, keyspaceName, tableName, info);
+
+ assertEquals(200, response.getStatus());
+ }
+
+ @Test
+ public void test_accquireLockWLease() throws Exception {
+ System.out.println("Testing acquire lock with lease");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference();
+
+ JsonLeasedLock jsonLock = new JsonLeasedLock();
+ jsonLock.setLeasePeriod(10000); // 10 second lease period?
+ Response response = lock.accquireLockWithLease(jsonLock, lockRef, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ }
+
+ @Test
+ public void test_accquireBadLockWLease() throws Exception {
+ System.out.println("Testing acquire bad lock ref with lease");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference();
+
+ JsonLeasedLock jsonLock = new JsonLeasedLock();
+ jsonLock.setLeasePeriod(10000); // 10 second lease period?
+ Response response = lock.accquireLockWithLease(jsonLock, "badlock", "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_accquireBadLock() throws Exception {
+ System.out.println("Testing acquire lock that is not lock-holder");
+ createAndInsertIntoTable();
+ // This is required to create an initial loc reference.
+ String lockRef1 = createLockReference();
+ // This will create the next lock reference, whcih will not be avalale yet.
+ String lockRef2 = createLockReference();
+
+ Response response = lock.accquireLock(lockRef2, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_accquireBadLockRef() throws Exception {
+ System.out.println("Testing acquire bad lock ref");
+ createAndInsertIntoTable();
+ // This is required to create an initial loc reference.
+ String lockRef1 = createLockReference();
+
+ Response response = lock.accquireLock("badlockref", "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_currentLockHolder() throws Exception {
+ System.out.println("Testing get current lock holder");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.enquireLock(lockName, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ assertEquals(lockRef, ((Map<String, String>) respMap.get("lock")).get("lock-holder"));
+ }
+
+ @Test
+ public void test_nocurrentLockHolder() throws Exception {
+ System.out.println("Testing get current lock holder w/ bad lockref");
+ createAndInsertIntoTable();
+
+ Response response =
+ lock.enquireLock(lockName, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_badcurrentLockHolder() throws Exception {
+ System.out.println("Testing get current lock holder w/ bad lockref");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.enquireLock("badlock", "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_holders() throws Exception {
+ System.out.println("Testing holders api");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.currentLockHolder(lockName, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ assertEquals(lockRef, ((Map<String, List>) respMap.get("lock")).get("lock-holder").get(0));
+ }
+
+ @Test
+ public void test_holdersbadRef() throws Exception {
+ System.out.println("Testing holders api w/ bad lockref");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.currentLockHolder("badname", "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_unLock() throws Exception {
+ System.out.println("Testing unlock");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.unLock(lockRef, "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ }
+
+ @Test
+ public void test_unLockBadRef() throws Exception {
+ System.out.println("Testing unlock w/ bad lock ref");
+ createAndInsertIntoTable();
+ String lockRef = createLockReference();
+
+ Response response =
+ lock.unLock("badref", "1", "1", authorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @Test
+ public void test_getLockState() throws Exception {
+ System.out.println("Testing get lock state");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response = lock.currentLockState(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ Map<String,Object> respMap = (Map<String, Object>) response.getEntity();
+ assertEquals(lockRef, ((Map<String,String>) respMap.get("lock")).get("lock-holder"));
+ }
+
+ @Test
+ public void test_getLockStateBadRef() throws Exception {
+ System.out.println("Testing get lock state w/ bad ref");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response = lock.currentLockState("badname", "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(400, response.getStatus());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_deadlock() throws Exception {
+ System.out.println("Testing deadlock");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // Process 1 creates and acquires a lock on row 1
+ JsonLock jsonLock = createJsonLock(LockType.WRITE);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response responseAcquire1 =
+ lock.accquireLock(lockRefCreate1, "1", "1", authorization, "abc66001-d857-4e90-b1e5-df98a3d40ce6", appName);
+
+ // Process 2 creates and acquires a lock on row 2
+ Response responseCreate2 = lock.createLockReference(lockName + "2", "1", "1", authorization,
+ "abcde002-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process2", appName);
+ Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+ String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+ Response responseAcquire2 =
+ lock.accquireLock(lockRefCreate2, "1", "1", authorization, "abc66002-d857-4e90-b1e5-df98a3d40ce6", appName);
+
+ // Process 2 creates a lock on row 1
+ Response responseCreate3 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde003-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process2", appName);
+
+ // Process 1 creates a lock on row 2, causing deadlock
+ Response responseCreate4 = lock.createLockReference(lockName + "2", "1", "1", authorization,
+ "abcde004-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+ Map<String, Object> respMapCreate4 = (Map<String, Object>) responseCreate4.getEntity();
+
+ System.out.println("Status: " + responseCreate4.getStatus() + ". Entity " + responseCreate4.getEntity());
+ assertEquals(400, responseCreate4.getStatus());
+ assertTrue(respMapCreate4.containsKey("error"));
+ assertTrue( ((String)respMapCreate4.get("error")).toLowerCase().indexOf("deadlock") > -1 );
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_lockPromotion() throws Exception {
+ System.out.println("Testing lock promotion");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // creates a lock 1
+ JsonLock jsonLock = createJsonLock(LockType.READ);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLock, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+ System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+ assertEquals(200, respMapPromote.getStatus());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_lockPromotionReadWrite() throws Exception {
+ System.out.println("Testing lock promotion with read and writes");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // creates a lock 1
+ JsonLock jsonLockRead = createJsonLock(LockType.READ);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ JsonLock jsonLockWrite = createJsonLock(LockType.WRITE);
+ Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockWrite, "process1", appName);
+ Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+ String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+ Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+ System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+ assertEquals(200, respMapPromote.getStatus());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_lockPromotionWriteRead() throws Exception {
+ System.out.println("Testing lock promotion with reads not at top of queue");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // creates a lock 1
+ JsonLock jsonLockWrite = createJsonLock(LockType.WRITE);
+ Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockWrite, "process1", appName);
+ Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+ String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+ // creates a lock 2
+ JsonLock jsonLockRead = createJsonLock(LockType.READ);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+ System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+ assertEquals(200, respMapPromote.getStatus());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_lockPromotion2Reads() throws Exception {
+ System.out.println("Testing lock promotion w/ 2 ReadLocks");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // creates a lock 1
+ JsonLock jsonLockRead = createJsonLock(LockType.READ);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate2 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+ System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+ assertEquals(400, respMapPromote.getStatus());
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void test_2lockPromotions() throws Exception {
+ System.out.println("Testing 2 lock promotions");
+ createAndInsertIntoTable();
+ insertAnotherIntoTable();
+
+ // creates a lock 1
+ JsonLock jsonLockRead = createJsonLock(LockType.READ);
+ Response responseCreate1 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate1 = (Map<String, Object>) responseCreate1.getEntity();
+ String lockRefCreate1 = ((Map<String, String>) respMapCreate1.get("lock")).get("lock");
+
+ Response responseCreate2 = lock.createLockReference(lockName, "1", "1", authorization,
+ "abcde001-d857-4e90-b1e5-df98a3d40ce6", jsonLockRead, "process1", appName);
+ Map<String, Object> respMapCreate2 = (Map<String, Object>) responseCreate2.getEntity();
+ String lockRefCreate2 = ((Map<String, String>) respMapCreate2.get("lock")).get("lock");
+
+ Response respMapPromote = lock.promoteLock(lockRefCreate1, "1", "1", authorization);
+ System.out.println("Status: " + respMapPromote.getStatus() + ". Entity " + respMapPromote.getEntity());
+
+ assertEquals(400, respMapPromote.getStatus());
+
+ Response respMap2Promote = lock.promoteLock(lockRefCreate2, "1", "1", authorization);
+ System.out.println("Status: " + respMap2Promote.getStatus() + ". Entity " + respMap2Promote.getEntity());
+
+ assertEquals(400, respMapPromote.getStatus());
+ }
+
+
+
+ // Ignoring since this is now a duplicate of delete lock ref.
+ @Test
+ @Ignore
+ public void test_deleteLock() throws Exception {
+ System.out.println("Testing get lock state");
+ createAndInsertIntoTable();
+
+ String lockRef = createLockReference();
+
+ Response response = lock.deleteLock(lockName, "1", "1",
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", authorization, appName);
+ System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
+ assertEquals(200, response.getStatus());
+ }
+
+ /**
+ * Create table and lock reference
+ *
+ * @return the lock ref created
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private String createLockReference() throws Exception {
+ Response response = lock.createLockReference(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", null, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ return ((Map<String, String>) respMap.get("lock")).get("lock");
+ }
+
+ /**
+ * Create table and lock reference
+ *
+ * @return the lock ref created
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ private String createLockReference(LockType lockType) throws Exception {
+ JsonLock jsonLock = createJsonLock(lockType);
+ Response response = lock.createLockReference(lockName, "1", "1", authorization,
+ "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", jsonLock, null, appName);
+ Map<String, Object> respMap = (Map<String, Object>) response.getEntity();
+ return ((Map<String, String>) respMap.get("lock")).get("lock");
+ }
+
+ private static void createKeyspace() throws Exception {
+ // shouldn't really be doing this here, but create keyspace is currently turned off
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString(CassandraCQL.createKeySpace);
+ MusicCore.eventualPut(query);
+
+ boolean isAAF = false;
+ String hashedpwd = BCrypt.hashpw(password, BCrypt.gensalt());
+ query = new PreparedQueryObject();
+ query.appendQueryString("INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
+ + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
+ query.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspaceName));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
+ query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
+ //CachingUtil.updateMusicCache(keyspaceName, appName);
+ //CachingUtil.updateMusicValidateCache(appName, userId, hashedpwd);
+ MusicCore.eventualPut(query);
+ }
+
+ private void clearAllTablesFromKeyspace() throws MusicServiceException {
+ ArrayList<String> tableNames = new ArrayList<>();
+ PreparedQueryObject query = new PreparedQueryObject();
+ query.appendQueryString(
+ "SELECT table_name FROM system_schema.tables WHERE keyspace_name = '" + keyspaceName + "';");
+ ResultSet rs = MusicCore.get(query);
+ for (Row row : rs) {
+ tableNames.add(row.getString("table_name"));
+ }
+ for (String table : tableNames) {
+ query = new PreparedQueryObject();
+ query.appendQueryString("DROP TABLE " + keyspaceName + "." + table);
+ MusicCore.eventualPut(query);
+ }
+ }
+
+ /**
+ * Create a table {@link tableName} in {@link keyspaceName}
+ *
+ * @throws Exception
+ */
+ private void createTable() throws Exception {
+ JsonTable jsonTable = new JsonTable();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, String> fields = new HashMap<>();
+ fields.put("uuid", "text");
+ fields.put("emp_name", "text");
+ fields.put("emp_salary", "varint");
+ fields.put("PRIMARY KEY", "(emp_name)");
+ consistencyInfo.put("type", "eventual");
+ jsonTable.setConsistencyInfo(consistencyInfo);
+ jsonTable.setKeyspaceName(keyspaceName);
+ jsonTable.setPrimaryKey("emp_name");
+ jsonTable.setTableName(tableName);
+ jsonTable.setFields(fields);
+ // Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
+ Response response = data.createTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonTable, keyspaceName, tableName);
+ }
+
+ /**
+ * Create table {@link createTable} and insert into said table
+ *
+ * @throws Exception
+ */
+ private void createAndInsertIntoTable() throws Exception {
+ createTable();
+
+ JsonInsert jsonInsert = new JsonInsert();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, Object> values = new HashMap<>();
+ values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
+ values.put("emp_name", "testname");
+ values.put("emp_salary", 500);
+ consistencyInfo.put("type", "eventual");
+ jsonInsert.setConsistencyInfo(consistencyInfo);
+ jsonInsert.setKeyspaceName(keyspaceName);
+ jsonInsert.setTableName(tableName);
+ jsonInsert.setValues(values);
+ Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonInsert, keyspaceName, tableName);
+ }
+
+ private void insertAnotherIntoTable() throws Exception {
+ createTable();
+
+ JsonInsert jsonInsert = new JsonInsert();
+ Map<String, String> consistencyInfo = new HashMap<>();
+ Map<String, Object> values = new HashMap<>();
+ values.put("uuid", "cccccccc-d857-4e90-b1e5-df98a3d40cd6");
+ values.put("emp_name", "testname2");
+ values.put("emp_salary", 700);
+ consistencyInfo.put("type", "eventual");
+ jsonInsert.setConsistencyInfo(consistencyInfo);
+ jsonInsert.setKeyspaceName(keyspaceName);
+ jsonInsert.setTableName(tableName);
+ jsonInsert.setValues(values);
+ Response response = data.insertIntoTable("1", "1", "1", "abcdef00-d857-4e90-b1e5-df98a3d40ce6", appName,
+ authorization, jsonInsert, keyspaceName, tableName);
+ }
+
+ private JsonLock createJsonLock(LockType lockType) {
+ JsonLock jsonLock = new JsonLock();
+ jsonLock.setLockType(lockType);
+ return jsonLock;
+ }
+
+} \ No newline at end of file
diff --git a/music-rest/src/test/java/org/onap/music/unittests/authentication/AuthUtilTest.java b/music-rest/src/test/java/org/onap/music/unittests/authentication/AuthUtilTest.java
new file mode 100644
index 00000000..b578bd66
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/unittests/authentication/AuthUtilTest.java
@@ -0,0 +1,123 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2019 AT&T Intellectual Property
+ * ===================================================================
+ * 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.unittests.authentication;
+
+import static org.junit.Assert.*;
+import java.util.ArrayList;
+import java.util.List;
+import javax.servlet.ServletRequest;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.aaf.cadi.CadiWrap;
+import org.onap.aaf.cadi.Permission;
+import org.onap.aaf.cadi.aaf.AAFPermission;
+import org.onap.music.authentication.AuthUtil;
+
+public class AuthUtilTest {
+
+ @Test
+ public void testGetAAFPermissions() {
+ CadiWrap cw = Mockito.mock(CadiWrap.class);
+ List<Permission> permList = new ArrayList<Permission>();
+ Permission perm1 = Mockito.mock(AAFPermission.class);
+ permList.add(perm1);
+ Mockito.when(cw.getPermissions(Mockito.any())).thenReturn(permList);
+
+ List<AAFPermission> returnedPerm = AuthUtil.getAAFPermissions(cw);
+
+ assertEquals(perm1, returnedPerm.get(0));
+ }
+
+ @Test
+ public void testDecodeFunctionCode() throws Exception {
+ String toDecode = "some%2dthing.something.%2a";
+ String decoded = AuthUtil.decodeFunctionCode(toDecode);
+
+ assertEquals("some-thing.something.*", decoded);
+ }
+
+ @Test
+ public void testIsAccessAllowed() throws Exception {
+ System.out.println("Request perms");
+ assertTrue(AuthUtil.isAccessAllowed(createRequest("*", "*"), "testns"));
+ }
+
+ @Test
+ public void testIsAccessNotAllowed() throws Exception {
+ System.out.println("Request to write when have read perms");
+ assertFalse(AuthUtil.isAccessAllowed(createRequest("POST", "GET"), "testns"));
+ }
+
+ @Test
+ public void testIsAccessAllowedNullRequest() {
+ try {
+ assertFalse(AuthUtil.isAccessAllowed(null, "namespace"));
+ fail("Should throw exception");
+ } catch (Exception e) {
+ }
+ }
+
+ @Test
+ public void testIsAccessAllowedNullNamespace() {
+ try {
+ assertFalse(AuthUtil.isAccessAllowed(createRequest(), null));
+ fail("Should throw exception");
+ } catch (Exception e) {
+ }
+ }
+
+ @Test
+ public void testIsAccessAllowedEmptyNamespace() {
+ try {
+ assertFalse(AuthUtil.isAccessAllowed(createRequest(), ""));
+ fail("Should throw exception");
+ } catch (Exception e) {
+ }
+ }
+
+ /**
+ *
+ * @param permRequested 'PUT', 'POST', 'GET', or 'DELETE'
+ * @param permGranted '*' or 'GET'
+ * @return
+ */
+ private ServletRequest createRequest(String permRequested, String permGranted) {
+ CadiWrap cw = Mockito.mock(CadiWrap.class);
+ List<Permission> permList = new ArrayList<Permission>();
+ AAFPermission perm1 = Mockito.mock(AAFPermission.class);
+ Mockito.when(perm1.getType()).thenReturn("testns");
+ Mockito.when(perm1.getKey()).thenReturn("org.onap.music.api.user.access|testns|" + permGranted);
+
+ permList.add(perm1);
+ Mockito.when(cw.getPermissions(Mockito.any())).thenReturn(permList);
+ Mockito.when(cw.getRequestURI()).thenReturn("/v2/locks/create/testns.MyTable.Field1");
+ Mockito.when(cw.getContextPath()).thenReturn("/v2/locks/create");
+ Mockito.when(cw.getMethod()).thenReturn(permRequested);
+
+ return cw;
+ }
+
+ private ServletRequest createRequest() {
+ return createRequest("POST","*");
+ }
+}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/MusicDigestTest.java b/music-rest/src/test/java/org/onap/music/unittests/authentication/AuthorizationErrorTest.java
index cf8a9c63..b432072a 100644
--- a/src/test/java/org/onap/music/unittests/jsonobjects/MusicDigestTest.java
+++ b/music-rest/src/test/java/org/onap/music/unittests/authentication/AuthorizationErrorTest.java
@@ -20,41 +20,32 @@
* ====================================================================
*/
-package org.onap.music.unittests.jsonobjects;
+package org.onap.music.unittests.authentication;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
-import org.onap.music.main.MusicDigest;
+import org.onap.music.authentication.AuthorizationError;
-public class MusicDigestTest {
-
- private MusicDigest musicDigest;
+public class AuthorizationErrorTest {
+
+ private AuthorizationError authorizationError;
@Before
- public void setUp()
- {
- musicDigest= new MusicDigest("evPutStatus", "vectorTs");
- }
-
- @Test
- public void testGetSetEvPutStatus()
- {
- musicDigest.setEvPutStatus("evPutStatus");
- assertEquals("evPutStatus", musicDigest.getEvPutStatus());
+ public void setUp() {
+ authorizationError = new AuthorizationError();
}
-
+
@Test
- public void testGetSetVectorTs()
- {
- musicDigest.setVectorTs("vectorTs");
- assertEquals("vectorTs", musicDigest.getVectorTs());
+ public void testResponseCode() {
+ authorizationError.setResponseCode(400);
+ assertEquals(400, authorizationError.getResponseCode());
}
-
+
@Test
- public void testToString()
- {
- assertEquals("vectorTs|evPutStatus", musicDigest.toString());
+ public void testResponseMessage() {
+ authorizationError.setResponseMessage("ResponseMessage");
+ assertEquals("ResponseMessage", authorizationError.getResponseMessage());
}
}
diff --git a/music-rest/src/test/java/org/onap/music/unittests/authentication/CadiAuthFilterTest.java b/music-rest/src/test/java/org/onap/music/unittests/authentication/CadiAuthFilterTest.java
new file mode 100644
index 00000000..eb6dde39
--- /dev/null
+++ b/music-rest/src/test/java/org/onap/music/unittests/authentication/CadiAuthFilterTest.java
@@ -0,0 +1,63 @@
+/*
+ * ============LICENSE_START==========================================
+ * org.onap.music
+ * ===================================================================
+ * Copyright (c) 2017 AT&T Intellectual Property
+ * ===================================================================
+ * 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.unittests.authentication;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+
+import java.io.IOException;
+
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.onap.aaf.cadi.PropAccess;
+import org.onap.music.authentication.CadiAuthFilter;
+import org.springframework.mock.web.MockFilterConfig;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+
+import javax.servlet.FilterConfig;
+
+public class CadiAuthFilterTest {
+
+ @Test
+ public void Test1() throws ServletException
+ {
+ PropAccess props=new PropAccess();
+ CadiAuthFilter c=new CadiAuthFilter(props);
+ }
+
+
+ @Test
+ public void Test2() throws ServletException
+ {
+ CadiAuthFilter c=new CadiAuthFilter();
+ }
+
+ }
+
+
diff --git a/music-rest/src/test/resources/logback.xml b/music-rest/src/test/resources/logback.xml
new file mode 100644
index 00000000..6bc5fd5e
--- /dev/null
+++ b/music-rest/src/test/resources/logback.xml
@@ -0,0 +1,302 @@
+<!--
+ ============LICENSE_START==========================================
+ org.onap.music
+ ===================================================================
+ Copyright (c) 2017 AT&T Intellectual Property
+ ===================================================================
+ 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=============================================
+ ====================================================================
+-->
+<configuration scan="true" scanPeriod="3 seconds">
+ <!--<jmxConfigurator /> -->
+ <!-- directory path for all other type logs -->
+ <property name="logDir" value="/opt/app/music/logs" />
+
+ <!-- directory path for debugging type logs -->
+ <property name="debugDir" value="debug-logs" />
+
+ <!-- specify the component name -->
+ <!-- <property name="componentName" value="EELF"></property> -->
+ <property name="componentName" value="MUSIC"></property>
+
+ <!-- log file names -->
+ <property name="generalLogName" value="music" />
+ <property name="securityLogName" value="security" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+ <property name="defaultPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" />
+ <!-- <property name="applicationLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n" /> -->
+ <property name="applicationLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %X{keyspace} - %msg%n" />
+ <property name="auditLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+ <property name="metricsLoggerPattern" value="%X{BeginTimestamp}|%X{EndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ElapsedTime}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVirtualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+ <!-- <property name="errorLoggerPattern" value= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %msg%n " /> -->
+ <property name="errorLoggerPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level %X{keyspace} - %msg%n" />
+ <property name="debugLoggerPattern" value="%date{ISO8601,UTC}|%X{RequestId}| %msg%n" ></property>
+ <property name="logDirectory" value="${logDir}/${componentName}" />
+ <property name="debugLogDirectory" value="${debugDir}/${componentName}" />
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder> -->
+ <layout class="">
+ <pattern>
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
+ </pattern>
+ </layout>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+<!-- <appender name="EELF"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>100MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender> -->
+
+ <!-- <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+ daily rollover
+ <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
+ <maxFileSize>1GB</maxFileSize>
+ <maxHistory>5</maxHistory>
+ <totalSizeCap>5GB</totalSizeCap>
+ </rollingPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender> -->
+
+
+ <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
+ <maxFileSize>1GB</maxFileSize>
+ <maxHistory>5</maxHistory>
+ <totalSizeCap>5GB</totalSizeCap>
+ </rollingPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n </pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+
+
+
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine
+ related logging events. The audit logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${auditLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+<appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>${metricsLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender>
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${errorLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="info" additivity="false">
+ <appender-ref ref="asyncEELF" />
+
+ </logger>
+ <logger name="com.att.eelf.security" level="info" additivity="false">
+ <appender-ref ref="asyncEELFSecurity" />
+
+ </logger>
+
+
+ <logger name="com.att.eelf.audit" level="info" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="info" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+
+ </logger>
+
+
+ <logger name="com.att.eelf.error" level="error" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+
+ </logger>
+
+ <root level="INFO">
+ <appender-ref ref="asyncEELF" />
+ <!-- <appender-ref ref="STDOUT" /> -->
+ </root>
+
+ <!-- Conductor Specific additions to squash WARNING and INFO -->
+ <logger name="com.datastax.driver.core.Cluster" level="ERROR"/>
+ <logger name="org.onap.music.main.MusicCore" level="ERROR"/>
+
+</configuration>
diff --git a/pom.xml b/pom.xml
index f6b6288b..05bdaefb 100755
--- a/pom.xml
+++ b/pom.xml
@@ -26,50 +26,27 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.onap.music</groupId>
<artifactId>MUSIC</artifactId>
- <packaging>jar</packaging>
- <version>3.2.18-SNAPSHOT</version>
+ <packaging>pom</packaging>
+ <version>3.2.40-SNAPSHOT</version>
<description>
- This is the MUSIC REST interface, packaged as a Springboot jar file.
+ This is the MUSIC project.
</description>
- <parent>
+ <parent>
<groupId>org.onap.oparent</groupId>
<artifactId>oparent</artifactId>
- <version>1.2.0</version>
+ <version>2.0.0</version>
<relativePath/>
- </parent>
+ </parent>
- <dependencyManagement>
- <dependencies>
- <!-- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- <version>2.0.3.RELEASE</version>
- </dependency> -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>2.1.1.RELEASE</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
<properties>
- <start-class>org.onap.music.MusicApplication</start-class>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
- <jersey1.version>1.19</jersey1.version>
- <jersey2.version>2.25.1</jersey2.version>
- <jaxrs.version>2.0.1</jaxrs.version>
- <cassandra.version>3.6.0</cassandra.version>
-
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--nexus -->
<nexusproxy>https://nexus.onap.org</nexusproxy>
+ <onap.nexus.url>https://nexus.onap.org</onap.nexus.url>
<snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
<releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
<stagingNexusPath>/content/repositories/staging/</stagingNexusPath>
@@ -77,13 +54,29 @@
<!--maven -->
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyy.MM.dd.HH.mm</maven.build.timestamp.format>
+ <!--skip checkstyle -->
+ <maven.check.skip>false</maven.check.skip>
<!--docker -->
<docker.tag>${project.version}-${timestamp}</docker.tag>
<docker.latest.tag>${project.version}-latest</docker.latest.tag>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
+ <!-- Default Sonar configuration -->
+ <sonar.coverage.jacoco.xmlReportPaths>${project.reporting.outputDirectory}/jacoco-ut/jacoco.xml,${project.reporting.outputDirectory}/jacoco-it/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
</properties>
+ <dependencies>
+ <!-- Development -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>4.0.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <!-- Springboot -->
+ </dependencies>
+
+
<repositories>
<repository>
<id>onap-releases</id>
@@ -105,408 +98,8 @@
<name>ONAP public Repository</name>
<url>${nexusproxy}/content/groups/public</url>
</repository>
- <repository>
- <!-- SWM repository has EELF jars -->
- <id>att-cadi-repo</id>
- <name>ATT CADI Repository</name>
- <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/attarch-releases/</url>
- </repository>
-
</repositories>
- <build>
- <!-- <finalName>${project.artifactId}-${project.version}-${timestamp}</finalName>-->
- <finalName>${project.artifactId}</finalName>
- <sourceDirectory>src/main/java</sourceDirectory>
- <outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
- <testSourceDirectory>src/test/java</testSourceDirectory>
- <testOutputDirectory>target/test-classes</testOutputDirectory>
- <defaultGoal>validate</defaultGoal>
- <resources>
- <resource>
- <directory>src/main/resources</directory>
- <filtering>true</filtering>
- <includes>
- <include>**/*.properties</include>
- <include>**/*.xml</include>
- <include>**/*.ccf</include>
- </includes>
- </resource>
- </resources>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <configuration>
- <mainClass>org.onap.music.MusicApplication</mainClass>
- <outputDirectory>./distribution/music/</outputDirectory>
- <addResources>true</addResources>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
-<!--
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <warSourceDirectory>WebContent</warSourceDirectory>
- <failOnMissingWebXml>false</failOnMissingWebXml>
- </configuration>
- </plugin>
--->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <id>make-a-jar</id>
- <phase>compile</phase>
- <goals>
- <goal>jar</goal>
- </goals>
- <configuration>
- <excludes>
- <!--<exclude>**/*.xml</exclude>
- <exclude>**/*.properties</exclude>-->
- <exclude>**/Sample*</exclude>
- </excludes>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-install-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <phase>install</phase>
- <goals>
- <goal>install-file</goal>
- </goals>
- <configuration>
- <packaging>jar</packaging>
- <artifactId>${project.artifactId}</artifactId>
- <groupId>${project.groupId}</groupId>
- <version>${project.version}</version>
- <file>${project.build.directory}/${project.artifactId}.jar</file>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
- <!-- Springboot -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-cassandra</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-jersey</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <scope>compile</scope>
- </dependency>
- <!-- Swagger 2 -->
-<!-- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger2</artifactId>
- <version>2.8.0</version>
- <scope>compile</scope>
- </dependency>
- -->
-<!-- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger-ui</artifactId>
- <version>2.8.0</version>
- <scope>compile</scope>
- </dependency>
- -->
- <!-- End Swagger -->
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <scope>compile</scope>
- </dependency>
-
- <!-- Springboot -->
- <!-- Development -->
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.4</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.0.1</version>
- <scope>provided</scope>
- </dependency>
- <!-- /Development -->
- <!-- Logging -->
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- <version>1.2.3</version>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <version>1.2.3</version>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.att.eelf</groupId>
- <artifactId>eelf-core</artifactId>
- <version>1.0.1-oss</version>
- <exclusions>
- <exclusion>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-api-mockito</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-module-junit4</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- End Logging -->
- <!-- Cassandra -->
- <dependency>
- <groupId>io.dropwizard.metrics</groupId>
- <artifactId>metrics-core</artifactId>
- <version>4.1.0-rc3</version>
- </dependency>
- <dependency>
- <groupId>com.datastax.cassandra</groupId>
- <artifactId>cassandra-driver-core</artifactId>
- <version>3.6.0</version>
- </dependency>
- <dependency>
- <groupId>com.datastax.cassandra</groupId>
- <artifactId>cassandra-driver-core</artifactId>
- <version>${cassandra.version}</version>
- <exclusions>
- <!-- <exclusion>
- <groupId>io.netty</groupId>
- <artifactId>*</artifactId>
- </exclusion> -->
- </exclusions>
- </dependency>
- <!-- /Cassandra -->
- <!-- Jersey -->
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-client</artifactId>
- <version>${jersey1.version}</version>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-server</artifactId>
- <version>${jersey1.version}</version>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-json</artifactId>
- <version>${jersey1.version}</version>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-servlet</artifactId>
- <version>${jersey1.version}</version>
- </dependency>
- <!-- /Jersey -->
-
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-jcs-core</artifactId>
- <version>2.2</version>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.11</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.8</version>
- </dependency>
- <!-- Testing -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- <scope>test</scope>
- </dependency>
- <!-- <dependency>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit</artifactId>
- <version>3.3.0.2</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>io.dropwizard.metrics</groupId>
- <artifactId>metrics-core</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.addthis.metrics</groupId>
- <artifactId>reporter-config-base</artifactId>
- </exclusion>
- </exclusions>
- </dependency> -->
- <dependency>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit-spring</artifactId>
- <version>3.5.0.1</version>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- <exclusion>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- </exclusion>
- <exclusion>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit</artifactId>
- </exclusion>
- <exclusion>
- <groupId>io.dropwizard.metrics</groupId>
- <artifactId>metrics-core</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.cassandraunit</groupId>
- <artifactId>cassandra-unit-shaded</artifactId>
- <version>3.5.0.1</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>io.dropwizard.metrics</groupId>
- <artifactId>metrics-core</artifactId>
- <version>3.1.0</version>
- </dependency>
- <dependency>
- <groupId>org.mockito</groupId>
- <artifactId>mockito-core</artifactId>
- <version>2.23.4</version>
- <scope>test</scope>
- </dependency>
- <!-- /Testing -->
- <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310 -->
- <dependency>
- <groupId>com.fasterxml.jackson.datatype</groupId>
- <artifactId>jackson-datatype-jsr310</artifactId>
- <version>2.9.8</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- </dependency>
- <dependency>
- <groupId>io.swagger</groupId>
- <artifactId>swagger-jersey-jaxrs</artifactId>
- <version>1.5.21</version>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.mindrot</groupId>
- <artifactId>jbcrypt</artifactId>
- <version>0.4</version>
- </dependency>
- <dependency>
- <groupId>org.onap.aaf.authz</groupId>
- <artifactId>aaf-cadi-aaf</artifactId>
- <version>2.1.7</version>
- </dependency>
- <dependency>
- <groupId>org.onap.aaf.authz</groupId>
- <artifactId>aaf-cadi-client</artifactId>
- <version>2.1.7</version>
- </dependency>
- <dependency>
- <groupId>org.onap.aaf.authz</groupId>
- <artifactId>aaf-cadi-core</artifactId>
- <version>2.1.7</version>
- </dependency>
-
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- <version>2.8.5</version>
- </dependency>
- </dependencies>
-
<reporting>
<plugins>
<plugin>
@@ -535,127 +128,6 @@
</plugins>
</reporting>
- <profiles>
- <profile>
- <id>docker</id>
- <build>
- <plugins>
- <plugin>
- <groupId>io.fabric8</groupId>
- <artifactId>docker-maven-plugin</artifactId>
- <version>0.19.1</version>
- <configuration>
- <verbose>true</verbose>
- <apiVersion>1.23</apiVersion>
- <registry>nexus3.onap.org:10003</registry>
- <images>
- <!-- MUSIC War -->
- <image>
- <name>onap/music/music_sb</name>
- <alias>docker_music</alias>
- <build>
- <cleanup>true</cleanup>
- <tags>
- <tag>${docker.tag}</tag>
- <tag>${docker.latest.tag}</tag>
- </tags>
- <dockerFileDir>${project.basedir}/distribution/music</dockerFileDir>
-<!-- <assembly>
- <descriptorRef>artifact</descriptorRef>
- </assembly> -->
- </build>
- </image>
- <!-- Cassandra -->
- <image>
- <name>onap/music/cassandra_3_11</name>
- <alias>docker_cassandra_sec</alias>
- <build>
- <cleanup>true</cleanup>
- <tags>
- <tag>${docker.tag}</tag>
- <tag>${docker.latest.tag}</tag>
- </tags>
- <dockerFileDir>${project.basedir}/distribution/cassandra</dockerFileDir>
- </build>
- </image>
- <!-- Cassandra Job -->
- <image>
- <name>onap/music/cassandra_job</name>
- <alias>docker_cassandra_job</alias>
- <build>
- <cleanup>true</cleanup>
- <tags>
- <tag>${docker.tag}</tag>
- <tag>${docker.latest.tag}</tag>
- </tags>
- <dockerFileDir>${project.basedir}/distribution/cassandra_job</dockerFileDir>
- </build>
- </image>
- <!-- Trigger -->
- <image>
- <name>onap/music/musictrigger</name>
- <alias>docker_trigger</alias>
- <build>
- <cleanup>true</cleanup>
- <tags>
- <tag>${docker.tag}</tag>
- <tag>${docker.latest.tag}</tag>
- </tags>
- <dockerFileDir>${project.basedir}/distribution/trigger</dockerFileDir>
- </build>
- </image>
- <!-- tomcat 8.5 -->
- <!-- <image> <name>onap/music/tomcat_music</name>
- <alias>docker_tomcat</alias> <build> <cleanup>true</cleanup> <tags> <tag>8.5-${timestamp}</tag>
- <tag>8.5-latest</tag> </tags> <dockerFileDir>${project.basedir}/distribution/tomcat</dockerFileDir>
- </build> </image>\ -->
- </images>
- </configuration>
- <executions>
- <execution>
- <id>clean-images</id>
- <phase>pre-clean</phase>
- <goals>
- <goal>remove</goal>
- </goals>
- <configuration>
- <removeAll>true</removeAll>
- <image>music</image>
- </configuration>
- </execution>
- <execution>
- <id>generate-images</id>
- <phase>package</phase>
- <goals>
- <goal>build</goal>
- </goals>
- </execution>
- <execution>
- <id>push-images</id>
- <phase>deploy</phase>
- <goals>
- <goal>push</goal>
- </goals>
- <configuration>
- <image>onap/music/music</image>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- <profile>
- <id>default</id>
- <repositories>
- <repository>
- <id>nexus</id>
- <name>attarch-releases</name>
- <url>http://mavencentral.it.att.com:8084/nexus/content/repositories/attarch-releases</url>
- </repository>
- </repositories>
- </profile>
- </profiles>
<distributionManagement>
<repository>
<id>ecomp-releases</id>
@@ -673,4 +145,8 @@
<url>dav:${nexusproxy}${sitePath}</url>
</site>
</distributionManagement>
+ <modules>
+ <module>music-core</module>
+ <module>music-rest</module>
+ </modules>
</project>
diff --git a/postman/MusicLocal.postman_collection.json b/postman/MusicLocal.postman_collection.json
index bfbc8aac..19597e15 100644
--- a/postman/MusicLocal.postman_collection.json
+++ b/postman/MusicLocal.postman_collection.json
@@ -439,7 +439,7 @@
"description": "",
"collectionId": "a7ff2cf7-0a5a-1b0b-a393-829a672c80d6",
"responses": [],
- "rawModeData": "{\n \"values\": {\n \"emp_id\": \"cfd66ccc-d857-4e90-b1e5-df98a3d40cd6\",\n \"emp_name\": \"bharath\",\n \"emp_salary\": 50,\n \"address\":{ \"street\" : \"att way\", \"city\" : \"bedminster\" }\n },\n \"consistencyInfo\": {\n \"type\": \"atomic\",\n \"lockId\": \"$testks.employees$x-95351186188533762-0000000000\"\n }\n}"
+ "rawModeData": "{\n \"values\": {\n \"emp_id\": \"cfd66ccc-d857-4e90-b1e5-df98a3d40cd6\",\n \"emp_name\": \"bharath\",\n \"emp_salary\": 50,\n \"address\":{ \"street\" : \"Smith Way\", \"city\" : \"Bedminster\" }\n },\n \"consistencyInfo\": {\n \"type\": \"atomic\",\n \"lockId\": \"$testks.employees$x-95351186188533762-0000000000\"\n }\n}"
},
{
"id": "b667b219-8eec-2267-1994-7f0fb97b77ce",
diff --git a/releases/3.2.34.yaml b/releases/3.2.34.yaml
new file mode 100644
index 00000000..572f8a2f
--- /dev/null
+++ b/releases/3.2.34.yaml
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '3.2.34'
+project: 'music'
+log_dir: 'music-maven-stage-master/103/'
diff --git a/releases/3.2.35.yaml b/releases/3.2.35.yaml
new file mode 100644
index 00000000..012d8245
--- /dev/null
+++ b/releases/3.2.35.yaml
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '3.2.35'
+project: 'music'
+log_dir: 'music-maven-stage-master/140/'
diff --git a/releases/3.2.38-container.yaml b/releases/3.2.38-container.yaml
new file mode 100644
index 00000000..d745f053
--- /dev/null
+++ b/releases/3.2.38-container.yaml
@@ -0,0 +1,8 @@
+distribution_type: 'container'
+container_release_tag: '3.2.38'
+project: 'music'
+log_dir: 'music-maven-docker-stage-master/336'
+ref: fd5224f4aaf68e6ae186ef8a163edd7f5b2966f7
+containers:
+ - name: 'music/music_sb'
+ version: '3.2.38-latest'
diff --git a/releases/3.2.38.yaml b/releases/3.2.38.yaml
new file mode 100644
index 00000000..086fc3a0
--- /dev/null
+++ b/releases/3.2.38.yaml
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '3.2.38'
+project: 'music'
+log_dir: 'music-maven-stage-master/353/'
diff --git a/releases/3.2.39-container.yaml b/releases/3.2.39-container.yaml
new file mode 100644
index 00000000..51731116
--- /dev/null
+++ b/releases/3.2.39-container.yaml
@@ -0,0 +1,8 @@
+distribution_type: 'container'
+container_release_tag: '3.2.39'
+project: 'music'
+log_dir: 'music-maven-docker-stage-master/338'
+ref: 99f396136789182931fbded1127856247593d91b
+containers:
+ - name: 'music/music_sb'
+ version: '3.2.39-latest'
diff --git a/releases/3.2.39.yaml b/releases/3.2.39.yaml
new file mode 100644
index 00000000..8d0abaa0
--- /dev/null
+++ b/releases/3.2.39.yaml
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '3.2.39'
+project: 'music'
+log_dir: 'music-maven-stage-master/354/'
diff --git a/releases/3.2.40-container.yaml b/releases/3.2.40-container.yaml
new file mode 100644
index 00000000..5353ecfb
--- /dev/null
+++ b/releases/3.2.40-container.yaml
@@ -0,0 +1,8 @@
+distribution_type: 'container'
+container_release_tag: '3.2.40'
+project: 'music'
+log_dir: 'music-maven-docker-stage-master/340'
+ref: 0c173cdf44af313e376f1e8ae4fd6e6973c6c20b
+containers:
+ - name: 'music/music_sb'
+ version: '3.2.40-latest'
diff --git a/releases/3.2.40.yaml b/releases/3.2.40.yaml
new file mode 100644
index 00000000..1fc4307c
--- /dev/null
+++ b/releases/3.2.40.yaml
@@ -0,0 +1,5 @@
+---
+distribution_type: 'maven'
+version: '3.2.40'
+project: 'music'
+log_dir: 'music-maven-stage-master/357/'
diff --git a/src/main/java/org/onap/music/JerseyConfig.java b/src/main/java/org/onap/music/JerseyConfig.java
deleted file mode 100755
index 1b5f034a..00000000
--- a/src/main/java/org/onap/music/JerseyConfig.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright 2012-2015 the original author or authors.
- *
- * 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.
- */
-
-package org.onap.music;
-
-import io.swagger.jaxrs.config.BeanConfig;
-import io.swagger.jaxrs.listing.ApiListingResource;
-import io.swagger.jaxrs.listing.SwaggerSerializers;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.onap.music.rest.*;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.PostConstruct;
-
-@Component public class JerseyConfig extends ResourceConfig {
-
- @Value("${spring.jersey.application-path:/}") private String apiPath;
-
- public JerseyConfig() {
- this.registerEndpoints();
- }
-
- @PostConstruct public void init() {
- this.configureSwagger();
- }
-
- private void registerEndpoints() {
- register(RestMusicAdminAPI.class);
- register(RestMusicDataAPI.class);
- register(RestMusicLocksAPI.class);
- register(RestMusicQAPI.class);
- register(RestMusicTestAPI.class);
- register(RestMusicVersionAPI.class);
- register(RestMusicHealthCheckAPI.class);
- }
-
- private void configureSwagger() {
- //Available at localhost:port/swagger.json
- this.register(ApiListingResource.class);
- this.register(SwaggerSerializers.class);
-
- BeanConfig config = new BeanConfig();
- config.setConfigId("MUSIC");
- config.setTitle("MUSIC");
- config.setVersion("v2");
- config.setContact("Thomas Nelson");
- config.setSchemes(new String[] {"http", "https"});
- config.setBasePath("/MUSIC/rest");
- config.setResourcePackage("org.onap.music");
- config.setPrettyPrint(true);
- config.setScan(true);
- }
-
-}
diff --git a/src/main/java/org/onap/music/authentication/CachingUtil.java b/src/main/java/org/onap/music/authentication/CachingUtil.java
deleted file mode 100755
index 5c379c6e..00000000
--- a/src/main/java/org/onap/music/authentication/CachingUtil.java
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * Modifications Copyright (c) 2018 IBM
- * Modifications Copyright (c) 2019 Samsung
- * ===================================================================
- * 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.authentication;
-
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import javax.ws.rs.core.MediaType;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.jcs.JCS;
-import org.apache.commons.jcs.access.CacheAccess;
-import org.mindrot.jbcrypt.BCrypt;
-import org.onap.music.authentication.MusicAuthenticator.Operation;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-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;
-
-/**
- * All Caching related logic is handled by this class and a schedule cron runs to update cache.
- *
- * @author Vikram
- *
- */
-public class CachingUtil implements Runnable {
-
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CachingUtil.class);
-
- /** keyspace & ns */
- private static CacheAccess<String, String> musicCache = JCS.getInstance("musicCache");
- /** cache to hold isaaf application */
- private static CacheAccess<String, String> appNameCache = JCS.getInstance("appNameCache");
- /** hold user creds for namespace */
- private static CacheAccess<String, Map<String, String>> musicValidateCache = JCS.getInstance("musicValidateCache");
- private static Map<String, Number> userAttempts = new HashMap<>();
- private static Map<String, Calendar> lastFailedTime = new HashMap<>();
- private static CacheAccess<String, String> adminUserCache = JCS.getInstance("adminUserCache");
-
- public static CacheAccess<String, String> getAdminUserCache() {
- return adminUserCache;
- }
-
- public static void updateAdminUserCache(String authorization,String userId) {
- adminUserCache.put(authorization,userId);
- }
-
- private static final String USERNAME="username";
- private static final String PASSWORD="password";
-
-
- public void initializeAafCache() throws MusicServiceException {
- logger.info(EELFLoggerDelegate.applicationLogger,"Resetting and initializing AAF Cache...");
-
- String query = "SELECT uuid, application_name, keyspace_name, username, password FROM admin.keyspace_master WHERE is_api = ? allow filtering";
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(query);
- try {
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), false));
- } catch (Exception e1) {
- logger.error(EELFLoggerDelegate.errorLogger, e1.getMessage(),AppMessages.CACHEERROR, ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- }
- ResultSet rs = MusicCore.get(pQuery);
- Iterator<Row> it = rs.iterator();
- Map<String, String> map = null;
- while (it.hasNext()) {
- Row row = it.next();
- String nameSpace = row.getString("keyspace_name");
- String userId = row.getString(USERNAME);
- String password = row.getString(PASSWORD);
- String keySpace = row.getString("application_name");
- try {
- userAttempts.put(nameSpace, 0);
- boolean responseObj = triggerAAF(nameSpace, userId, password);
- if (responseObj) {
- map = new HashMap<>();
- map.put(userId, password);
- musicValidateCache.put(nameSpace, map);
- musicCache.put(keySpace, nameSpace);
- logger.debug("Cronjob: Cache Updated with AAF response for namespace "
- + nameSpace);
- }
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.INFO, ErrorTypes.GENERALSERVICEERROR);
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),"Something at AAF was changed for ns: " + nameSpace+" So not updating Cache for the namespace. ");
- }
- }
-
- }
-
- @Override
- public void run() {
- logger.info(EELFLoggerDelegate.applicationLogger,"Scheduled task invoked. Refreshing Cache...");
- try {
- initializeAafCache();
- } catch (MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(),AppMessages.UNKNOWNERROR, ErrorSeverity.INFO, ErrorTypes.GENERALSERVICEERROR);
- }
- }
-
- public static boolean authenticateAAFUser(String nameSpace, String userId, String password,
- String keySpace) throws Exception {
-
- if (musicValidateCache.get(nameSpace) != null && musicCache.get(keySpace)!=null) {
- if (keySpace != null && !musicCache.get(keySpace).equals(nameSpace)) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Create new application for the same namespace.");
- } else if (musicValidateCache.get(nameSpace).get(userId).equals(password)) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Authenticated with cache value..");
- // reset invalid attempts to 0
- userAttempts.put(nameSpace, 0);
- return true;
- } else {
- // call AAF update cache with new password
- if (userAttempts.get(nameSpace) == null)
- userAttempts.put(nameSpace, 0);
- if ((Integer) userAttempts.get(nameSpace) >= 3) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Reached max attempts. Checking if time out..");
- logger.info(EELFLoggerDelegate.applicationLogger,"Failed time: "+lastFailedTime.get(nameSpace).getTime());
- Calendar calendar = Calendar.getInstance();
- long delayTime = (calendar.getTimeInMillis()-lastFailedTime.get(nameSpace).getTimeInMillis());
- logger.info(EELFLoggerDelegate.applicationLogger,"Delayed time: "+delayTime);
- if( delayTime > 120000) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Resetting failed attempt.");
- userAttempts.put(nameSpace, 0);
- } else {
- logger.info(EELFLoggerDelegate.applicationLogger,"No more attempts allowed. Please wait for atleast 2 min.");
- throw new Exception("No more attempts allowed. Please wait for atleast 2 min.");
- }
- }
- logger.error(EELFLoggerDelegate.errorLogger,"",AppMessages.CACHEAUTHENTICATION,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- logger.info(EELFLoggerDelegate.applicationLogger,"Check AAF again...");
- }
- }
-
- boolean responseObj = false;
- try {
- responseObj = triggerAAF(nameSpace, userId, password);
- }catch (Exception ex) {
- logger.info("Exception while trigger aaf");
- logger.info("Exception: " + ex.getMessage());
- throw new Exception("Exception raised while triggering AAF authentication" +ex.getMessage());
- }
- if (responseObj) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Valid user. Cache is updated for "+nameSpace);
- Map<String, String> map = new HashMap<>();
- map.put(userId, password);
- musicValidateCache.put(nameSpace, map);
- musicCache.put(keySpace, nameSpace);
- return true;
- }
- logger.info(EELFLoggerDelegate.applicationLogger,"Invalid user. Cache not updated");
- return false;
- }
-
- private static boolean triggerAAF(String nameSpace, String userId, String password)
- throws Exception {
- logger.info(EELFLoggerDelegate.applicationLogger,"Inside AAF authorization");
- if (MusicUtil.getAafEndpointUrl() == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"AAF endpoint is not set. Please specify in the properties file.",AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- throw new Exception("AAF endpoint is not set. Please specify in the properties file.");
- }
- Client client = Client.create();
- // WebResource webResource =
- // client.resource("https://aaftest.test.att.com:8095/proxy/authz/nss/"+nameSpace);
- WebResource webResource = client.resource(MusicUtil.getAafEndpointUrl().concat(nameSpace));
- String plainCreds = userId + ":" + password;
- byte[] plainCredsBytes = plainCreds.getBytes();
- byte[] base64CredsBytes = Base64.encodeBase64(plainCredsBytes);
- String base64Creds = new String(base64CredsBytes);
-
- ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
- .header("Authorization", "Basic " + base64Creds)
- .header("content-type", "application/json").get(ClientResponse.class);
- logger.info(EELFLoggerDelegate.applicationLogger, "aaf response: "+response.toString());
- if (response.getStatus() != 200) {
- if (userAttempts.get(nameSpace) == null)
- userAttempts.put(nameSpace, 0);
- if ((Integer) userAttempts.get(nameSpace) >= 2) {
- lastFailedTime.put(nameSpace, Calendar.getInstance());
- userAttempts.put(nameSpace, ((Integer) userAttempts.get(nameSpace) + 1));
- throw new Exception(
- "Reached max invalid attempts. Please contact admin and retry with valid credentials.");
- }
- userAttempts.put(nameSpace, ((Integer) userAttempts.get(nameSpace) + 1));
- throw new Exception(
- "Unable to authenticate. Please check the AAF credentials against namespace.");
- // TODO Allow for 2-3 times and forbid any attempt to trigger AAF with invalid values
- // for specific time.
- }
- /*response.getHeaders().put(HttpHeaders.CONTENT_TYPE,
- Arrays.asList(MediaType.APPLICATION_JSON));
- // AAFResponse output = response.getEntity(AAFResponse.class);
- response.bufferEntity();
- String x = response.getEntity(String.class);
- AAFResponse responseObj = new ObjectMapper().readValue(x, AAFResponse.class);*/
-
- return true;
- }
-
- public static void updateMusicCache(String keyspace, String nameSpace) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Updating musicCache for keyspace " + keyspace + " with nameSpace " + nameSpace);
- musicCache.put(keyspace, nameSpace);
- }
-
- public static void updateCadiCache(String user, String keyspace) {
- musicCache.put(user, keyspace);
- }
-
- public static String getKSFromCadiCache(String user) {
- return musicCache.get(user);
- }
-
- public static void updateMusicValidateCache(String nameSpace, String userId, String password) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Updating musicCache for nameSpacce " + nameSpace + " with userId " + userId);
- Map<String, String> map = new HashMap<>();
- map.put(userId, password);
- musicValidateCache.put(nameSpace, map);
- }
-
- public static void updateisAAFCache(String namespace, String isAAF) {
- appNameCache.put(namespace, isAAF);
- }
-
- public static String isAAFApplication(String namespace) throws MusicServiceException {
- String isAAF = appNameCache.get(namespace);
- if (isAAF == null) {
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "SELECT is_aaf from admin.keyspace_master where application_name = '"
- + namespace + "' allow filtering");
- Row rs = null;
- try {
- rs = MusicCore.get(pQuery).one();
- } catch(InvalidQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,"Exception admin keyspace not configured."+e.getMessage());
- throw new MusicServiceException("Please make sure admin.keyspace_master table is configured.");
- }
- try {
- isAAF = String.valueOf(rs.getBool("is_aaf"));
- if(isAAF != null)
- appNameCache.put(namespace, isAAF);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), AppMessages.QUERYERROR,ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
- }
- }
- return isAAF;
- }
-
- public static String getUuidFromMusicCache(String keyspace) throws MusicServiceException {
- String uuid = null;
- if (uuid == null) {
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "SELECT uuid from admin.keyspace_master where keyspace_name = '"
- + keyspace + "' allow filtering");
- Row rs = MusicCore.get(pQuery).one();
- try {
- uuid = rs.getUUID("uuid").toString();
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,"Exception occurred during uuid retrieval from DB."+e.getMessage());
- }
- }
- return uuid;
- }
-
- public static String getAppName(String keyspace) throws MusicServiceException {
- String appName = null;
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "SELECT application_name from admin.keyspace_master where keyspace_name = '"
- + keyspace + "' allow filtering");
- Row rs = MusicCore.get(pQuery).one();
- try {
- appName = rs.getString("application_name");
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, e.getMessage(), AppMessages.QUERYERROR, ErrorSeverity.ERROR, ErrorTypes.QUERYERROR);
- }
- return appName;
- }
-
- @Deprecated
- public static Map<String, Object> validateRequest(String nameSpace, String userId,
- String password, String keyspace, String aid, String operation) {
- Map<String, Object> resultMap = new HashMap<>();
- if (!"createKeySpace".equals(operation)) {
- if (nameSpace == null) {
- resultMap.put("Exception", "Application namespace is mandatory.");
- }
- }
- return resultMap;
- }
-
- public static Map<String, Object> validateRequest(String nameSpace, String userId,
- String password, String keyspace, String aid, Operation operation) {
- Map<String, Object> resultMap = new HashMap<>();
- if (Operation.CREATE_KEYSPACE!=operation) {
- if (nameSpace == null) {
- resultMap.put("Exception", "Application namespace is mandatory.");
- }
- }
- return resultMap;
- }
-
- public static Map<String, Object> verifyOnboarding(String ns, String userId, String password) {
- Map<String, Object> resultMap = new HashMap<>();
- if (ns == null || userId == null || password == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- logger.error(EELFLoggerDelegate.errorLogger,"One or more required headers is missing. userId: "+userId+" :: password: "+password);
- resultMap.put("Exception",
- "One or more required headers appName(ns), userId, password is missing. Please check.");
- return resultMap;
- }
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(
- "select * from admin.keyspace_master where application_name = ? allow filtering");
- try {
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), ns));
- } catch(Exception e) {
- resultMap.put("Exception",
- "Unable to process input data. Invalid input data type. Please check ns, userId and password values. "+e.getMessage());
- return resultMap;
- }
- Row rs = null;
- try {
- rs = MusicCore.get(queryObject).one();
- } catch (MusicServiceException e) {
- String errorMsg = "Unable to process operation. Error is "+e.getMessage();
- logger.error(EELFLoggerDelegate.errorLogger, errorMsg);
- resultMap.put("Exception", errorMsg);
- return resultMap;
- } catch (InvalidQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,"Exception admin keyspace not configured."+e.getMessage());
- resultMap.put("Exception", "Please make sure admin.keyspace_master table is configured.");
- return resultMap;
- }
- if (rs == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Application is not onboarded. Please contact admin.");
- resultMap.put("Exception", "Application is not onboarded. Please contact admin.");
- } else {
- if(!(rs.getString(USERNAME).equals(userId)) || !(BCrypt.checkpw(password, rs.getString(PASSWORD)))) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- logger.error(EELFLoggerDelegate.errorLogger,"Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId);
- resultMap.put("Exception", "Namespace, UserId and password doesn't match. namespace: "+ns+" and userId: "+userId);
- return resultMap;
- }
- }
- return resultMap;
- }
-
- public static Map<String, Object> authenticateAIDUser(String nameSpace, String userId, String password,
- String keyspace) {
- Map<String, Object> resultMap = new HashMap<>();
- String pwd = null;
- if((musicCache.get(keyspace) != null) && (musicValidateCache.get(nameSpace) != null)
- && (musicValidateCache.get(nameSpace).containsKey(userId))) {
- if(!musicCache.get(keyspace).equals(nameSpace)) {
- resultMap.put("Exception", "Namespace and keyspace doesn't match");
- return resultMap;
- }
- if(!BCrypt.checkpw(password,musicValidateCache.get(nameSpace).get(userId))) {
- resultMap.put("Exception", "Namespace, userId and password doesn't match");
- return resultMap;
- }
- return resultMap;
- }
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(
- "select * from admin.keyspace_master where keyspace_name = ? allow filtering");
- try {
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspace));
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,"Adding value to query object failed: " + e.getMessage());
- }
- Row rs = null;
- try {
- rs = MusicCore.get(queryObject).one();
- } catch (MusicServiceException e) {
- String errMsg = "Unable to process operation. Error is "+e.getMessage();
- logger.error(EELFLoggerDelegate.errorLogger, errMsg);
- resultMap.put("Exception", errMsg);
- return resultMap;
- }
- if(rs == null) {
- resultMap.put("Exception", "Please make sure keyspace:"+keyspace+" exists.");
- return resultMap;
- }
- else {
- String user = rs.getString(USERNAME);
- pwd = rs.getString(PASSWORD);
- String ns = rs.getString("application_name");
- if(!ns.equals(nameSpace)) {
- resultMap.put("Exception", "Namespace and keyspace doesn't match");
- return resultMap;
- }
- if(!user.equals(userId)) {
- resultMap.put("Exception", "Invalid userId :"+userId);
- return resultMap;
- }
- if(!BCrypt.checkpw(password, pwd)) {
- resultMap.put("Exception", "Invalid password");
- return resultMap;
- }
- }
- CachingUtil.updateMusicCache(keyspace, nameSpace);
- CachingUtil.updateMusicValidateCache(nameSpace, userId, pwd);
- return resultMap;
- }
-}
diff --git a/src/main/java/org/onap/music/authentication/CadiAuthFilter.java b/src/main/java/org/onap/music/authentication/CadiAuthFilter.java
deleted file mode 100644
index 56371c7d..00000000
--- a/src/main/java/org/onap/music/authentication/CadiAuthFilter.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.authentication;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.servlet.FilterConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.HttpServletRequest;
-
-import com.att.eelf.configuration.EELFLogger;
-import org.onap.aaf.cadi.CadiWrap;
-import org.onap.aaf.cadi.Permission;
-import org.onap.aaf.cadi.PropAccess;
-import org.onap.aaf.cadi.aaf.AAFPermission;
-import org.onap.aaf.cadi.filter.CadiFilter;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.main.MusicCore;
-
-public class CadiAuthFilter extends CadiFilter {
-
- private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CadiAuthFilter.class);
-
- public CadiAuthFilter(PropAccess access) throws ServletException {
- super(true, access);
- }
-
- public void init(FilterConfig filterConfig) throws ServletException {
- super.init(filterConfig);
- }
-
-
- private boolean matchPattern(String requestedPath, String includeUrl) {
- includeUrl = includeUrl.substring(1);
- String[] path = requestedPath.split("/");
- if (path.length > 1) {
- String[] roleFunctionArray = includeUrl.split("/");
- boolean match = true;
- for (int i = 0; i < roleFunctionArray.length; i++) {
- if (match) {
- if (!"*".equals(roleFunctionArray[i])) {
- Pattern p = Pattern.compile(Pattern.quote(path[i]), Pattern.CASE_INSENSITIVE);
- Matcher m = p.matcher(roleFunctionArray[i]);
- match = m.matches();
- } else if (roleFunctionArray[i].equals("*")) {
- match = true;
- }
-
- }
- }
- if (match)
- return match;
- } else {
- if (requestedPath.matches(includeUrl))
- return true;
- else if ("*".equals(includeUrl))
- return true;
- }
- return false;
- }
-
-
- public static List<AAFPermission> getAAFPermissions(HttpServletRequest request) {
- CadiWrap wrapReq = (CadiWrap) request;
- List<Permission> perms = wrapReq.getPermissions(wrapReq.getUserPrincipal());
- List<AAFPermission> aafPermsList = new ArrayList<>();
- for (Permission perm : perms) {
- AAFPermission aafPerm = (AAFPermission) perm;
- aafPermsList.add(aafPerm);
- logger.info(aafPerm.toString());
- logger.info(aafPerm.getType());
- }
- return aafPermsList;
- }
-
- public static List<AAFPermission> getAAFPermissions(ServletRequest request) {
- CadiWrap wrapReq = (CadiWrap) request;
- List<Permission> perms = wrapReq.getPermissions(wrapReq.getUserPrincipal());
- List<AAFPermission> aafPermsList = new ArrayList<>();
- for (Permission perm : perms) {
- AAFPermission aafPerm = (AAFPermission) perm;
- aafPermsList.add(aafPerm);
- }
- return aafPermsList;
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/org/onap/music/authentication/MusicAAFAuthentication.java b/src/main/java/org/onap/music/authentication/MusicAAFAuthentication.java
deleted file mode 100644
index 2d0d4e59..00000000
--- a/src/main/java/org/onap/music/authentication/MusicAAFAuthentication.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.authentication;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.ws.rs.core.MediaType;
-
-import org.apache.commons.jcs.access.CacheAccess;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.authentication.MusicAuthenticator.Operation;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.Row;
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-
-public class MusicAAFAuthentication implements MusicAuthenticator {
-
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicAAFAuthentication.class);
-
- @Override
- public boolean authenticateAdmin(String authorization) {
- logger.info(EELFLoggerDelegate.applicationLogger, "MusicCore.authenticateAdmin: ");
- String userId = MusicUtil.extractBasicAuthentication(authorization).get(MusicUtil.USERID);
- if(MusicUtil.getIsCadi()) {
- CachingUtil.updateAdminUserCache(authorization, userId);
- return true;
- }
- CacheAccess<String, String> adminCache = CachingUtil.getAdminUserCache();
- if (authorization == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "Authorization cannot be empty...");
- return false;
- }
- if (adminCache.get(authorization) != null && adminCache.get(authorization).equals(userId)) {
- logger.info(EELFLoggerDelegate.applicationLogger, "MusicCore.authenticateAdmin: Validated against admincache.. ");
- return true;
- }
- else {
- Client client = Client.create();
- String aafUrl = MusicUtil.getAafAdminUrl();
- if (aafUrl==null) {
- logger.error(EELFLoggerDelegate.errorLogger, "Admin url is not set, please set in properties");
- return false;
- }
-
- WebResource webResource = client.resource(
- MusicUtil.getAafAdminUrl().concat(userId).concat("/").concat(MusicUtil.getAdminAafRole()));
-
- ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
- .header("Authorization", authorization).get(ClientResponse.class);
- if (response.getStatus() == 200) {
- CachingUtil.updateAdminUserCache(authorization, userId);
- return true;
- }
- }
- return false;
- }
-
- @Override
- public boolean authenticateUser(String namespace, String authorization, String keyspace,
- String aid, Operation operation) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Inside User Authentication.......");
- Map<String,String> userCredentials = MusicUtil.extractBasicAuthentication(authorization);
- String userId = userCredentials.get(MusicUtil.USERID);
- String password = userCredentials.get(MusicUtil.PASSWORD);
-
- Map<String, Object> resultMap = new HashMap<>();
- String uuid = null;
- if(! MusicUtil.getIsCadi()) {
- resultMap = CachingUtil.validateRequest(namespace, userId, password, keyspace, aid,
- operation);
- if (!resultMap.isEmpty())
- return false;
- String isAAFApp = null;
- try {
- isAAFApp= CachingUtil.isAAFApplication(namespace);
- } catch(MusicServiceException e) {
- logger.error(e.getErrorMessage(), e);
- resultMap.put("Exception", e.getMessage());
- return false;
- }
- if(isAAFApp == null) {
- resultMap.put("Exception", "Namespace: "+namespace+" doesn't exist. Please make sure ns(appName)"
- + " is correct and Application is onboarded.");
- return false;
- }
- boolean isAAF = Boolean.parseBoolean(isAAFApp);
- if (userId == null || password == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- logger.error(EELFLoggerDelegate.errorLogger,"UserId/Password or more required headers is missing.");
- resultMap.put("Exception",
- "UserId and Password are mandatory for the operation " + operation);
- return false;
- }
- if(!isAAF && !(operation==Operation.CREATE_KEYSPACE)) {
- resultMap = CachingUtil.authenticateAIDUser(namespace, userId, password, keyspace);
- if (!resultMap.isEmpty())
- return false;
-
- }
- if (isAAF && namespace != null && userId != null && password != null) {
- boolean isValid = true;
- try {
- isValid = CachingUtil.authenticateAAFUser(namespace, userId, password, keyspace);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,"Error while aaf authentication for user:" + userId);
- logger.error(EELFLoggerDelegate.errorLogger,"Error: "+ e.getMessage());
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.AUTHENTICATIONERROR ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- logger.error(EELFLoggerDelegate.errorLogger,"Got exception while AAF authentication for namespace " + namespace);
- resultMap.put("Exception", e.getMessage());
- }
- if (!isValid) {
- logger.error(EELFLoggerDelegate.errorLogger,"User not authenticated...", AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- resultMap.put("Exception", "User not authenticated...");
- }
- if (!resultMap.isEmpty())
- return false;
-
- }
- } else {
-
- String cachedKS = CachingUtil.getKSFromCadiCache(userId);
- if(cachedKS != null && !cachedKS.equals(keyspace)) {
- resultMap.put("Exception", "User not authenticated to access this keyspace...");
- return false;
- }
- }
-
- if (operation==Operation.CREATE_KEYSPACE) {
- try {
- logger.info(EELFLoggerDelegate.applicationLogger,"AID is not provided. Creating new UUID for keyspace.");
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "select uuid from admin.keyspace_master where application_name=? and username=? and keyspace_name=? allow filtering");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), namespace));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(),
- MusicUtil.DEFAULTKEYSPACENAME));
- Row rs = MusicCore.get(pQuery).one();
- uuid = rs.getUUID("uuid").toString();
- resultMap.put("uuid", "existing");
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.applicationLogger,"No UUID found in DB. So creating new UUID.");
- uuid = MusicUtil.generateUUID();
- resultMap.put("uuid", "new");
- }
- resultMap.put("aid", uuid);
- CachingUtil.updateCadiCache(userId, keyspace);
- }
- return true;
- }
-
-}
diff --git a/src/main/java/org/onap/music/authentication/MusicAuthenticator.java b/src/main/java/org/onap/music/authentication/MusicAuthenticator.java
deleted file mode 100644
index 78f76ab1..00000000
--- a/src/main/java/org/onap/music/authentication/MusicAuthenticator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2019 AT&T Intellectual Property
- * ===================================================================
- * 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.authentication;
-
-public interface MusicAuthenticator {
- public enum Operation{
- CREATE_KEYSPACE,
- DROP_KEYSPACE,
- CREATE_TABLE,
- CREATE_INDEX,
- INSERT_INTO_TABLE,
- UPDATE_TABLE,
- DELETE_FROM_TABLE,
- DROP_TABLE,
- SELECT_CRITICAL,
- SELECT,
- CREATE_LOCKREF,
- ACQUIRE_LOCK,
- CURRENT_LOCK,
- DELETE_LOCK
- }
-
- /**
- * Authenticate a user account
- * @param namespace - user's namespace
- * @param authorization - basicAuth representation of username/password
- * @param keyspace - keyspace user is trying to access
- * @param aid - aid that identifies the user
- * @param operation - operation that user is trying to do
- * @return true if user has access
- */
- public boolean authenticateUser(String namespace, String authorization,
- String keyspace, String aid, Operation operation);
-
- /**
- * Authenticate an administrative account
- * @param authorization - basicAuth representation of username/password
- * @return true if user has admin privileges
- */
- public boolean authenticateAdmin(String authorization);
-
-}
diff --git a/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java b/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java
deleted file mode 100644
index dc1c43a8..00000000
--- a/src/main/java/org/onap/music/datastore/MusicDataStoreHandle.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2019 IBM.
- * ===================================================================
- * Modifications Copyright (c) 2019 Samsung
- * ===================================================================
- * 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.datastore;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.main.MusicUtil;
-
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.TableMetadata;
-
-public class MusicDataStoreHandle {
-
- private MusicDataStoreHandle(){
- throw new IllegalStateException("Utility class");
- }
-
- public static MusicDataStore mDstoreHandle = null;
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicDataStoreHandle.class);
-
- /**
- *
- * @param remoteIp
- * @return
- */
- public static MusicDataStore getDSHandle(String remoteIp) {
- logger.info(EELFLoggerDelegate.metricsLogger,"Acquiring data store handle");
- long start = System.currentTimeMillis();
- if (mDstoreHandle == null) {
- mDstoreHandle = new MusicDataStore(remoteIp);
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.metricsLogger,"Time taken to acquire data store handle:" + (end - start) + " ms");
- return mDstoreHandle;
- }
-
- /**
- *
- * @return
- * @throws MusicServiceException
- */
- public static MusicDataStore getDSHandle() throws MusicServiceException {
- logger.info(EELFLoggerDelegate.metricsLogger,"Acquiring data store handle");
- long start = System.currentTimeMillis();
- if (mDstoreHandle == null) {
- // Quick Fix - Best to put this into every call to getDSHandle?
- if (!"localhost".equals(MusicUtil.getMyCassaHost())) {
- mDstoreHandle = new MusicDataStore(MusicUtil.getMyCassaHost());
- } else {
- mDstoreHandle = new MusicDataStore();
- }
- }
- if(mDstoreHandle.getSession() == null) {
- String message = "Connection to Cassandra has not been enstablished."
- + " Please check connection properites and reboot.";
- logger.info(EELFLoggerDelegate.applicationLogger, message);
- throw new MusicServiceException(message);
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.metricsLogger,"Time taken to acquire data store handle:" + (end - start) + " ms");
- return mDstoreHandle;
- }
-
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @return
- * @throws MusicServiceException
- */
- public static TableMetadata returnColumnMetadata(String keyspace, String tablename) throws MusicServiceException {
- return getDSHandle().returnColumnMetadata(keyspace, tablename);
- }
-
- /**
- *
- * @param results
- * @return
- * @throws MusicServiceException
- */
- public static Map<String, HashMap<String, Object>> marshallResults(ResultSet results) throws MusicServiceException {
- return getDSHandle().marshalData(results);
- }
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java
deleted file mode 100644
index b98a391d..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonDelete.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * Modifications Copyright (c) 2019 Samsung
- * ===================================================================
- * 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.datastore.jsonobjects;
-
-import java.util.List;
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-@ApiModel(value = "JsonTable", description = "Json model for delete")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonDelete {
-
- private List<String> columns = null;
- private Map<String, String> consistencyInfo;
- private Map<String, Object> conditions;
- String ttl, timestamp;
-
-
- @ApiModelProperty(value = "Conditions")
- public Map<String, Object> getConditions() {
- return conditions;
- }
-
- public void setConditions(Map<String, Object> conditions) {
- this.conditions = conditions;
- }
-
- @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- @ApiModelProperty(value = "Column values")
- public List<String> getColumns() {
- return columns;
- }
-
- public void setColumns(List<String> columns) {
- this.columns = columns;
- }
-
-
- @ApiModelProperty(value = "Time to live information")
- public String getTtl() {
- return ttl;
- }
-
- public void setTtl(String ttl) {
- this.ttl = ttl;
- }
-
- @ApiModelProperty(value = "Time stamp")
- public String getTimestamp() {
- return timestamp;
- }
-
- public void setTimestamp(String timestamp) {
- this.timestamp = timestamp;
- }
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java
deleted file mode 100644
index 4533f947..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonInsert.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2018 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.datastore.jsonobjects;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-
-@ApiModel(value = "JsonTable", description = "Json model for table vlaues insert")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonInsert implements Serializable {
- private String keyspaceName;
- private String tableName;
- private transient Map<String, Object> values;
- private String ttl;
- private String timestamp;
- private transient Map<String, Object> rowSpecification;
- private Map<String, String> consistencyInfo;
- private Map<String, byte[]> objectMap;
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonInsert.class);
-
- @ApiModelProperty(value = "objectMap")
- public Map<String, byte[]> getObjectMap() {
- return objectMap;
- }
-
- public void setObjectMap(Map<String, byte[]> objectMap) {
- this.objectMap = objectMap;
- }
-
- @ApiModelProperty(value = "keyspace")
- public String getKeyspaceName() {
- return keyspaceName;
- }
-
- public void setKeyspaceName(String keyspaceName) {
- this.keyspaceName = keyspaceName;
- }
-
- @ApiModelProperty(value = "Table name")
- public String getTableName() {
- return tableName;
- }
-
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
-
- @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- @ApiModelProperty(value = "Time to live information")
- public String getTtl() {
- return ttl;
- }
-
- public void setTtl(String ttl) {
- this.ttl = ttl;
- }
-
- @ApiModelProperty(value = "Time stamp")
- public String getTimestamp() {
- return timestamp;
- }
-
- public void setTimestamp(String timestamp) {
- this.timestamp = timestamp;
- }
-
- @ApiModelProperty(value = "values returned")
- public Map<String, Object> getValues() {
- return values;
- }
-
- public void setValues(Map<String, Object> values) {
- this.values = values;
- }
-
- @ApiModelProperty(value = "Information for selecting specific rows for insert")
- public Map<String, Object> getRow_specification() {
- return rowSpecification;
- }
-
- public void setRow_specification(Map<String, Object> rowSpecification) {
- this.rowSpecification = rowSpecification;
- }
-
- public byte[] serialize() {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutput out = null;
- try {
- out = new ObjectOutputStream(bos);
- out.writeObject(this);
- } catch (IOException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.DATAERROR);
- }
- return bos.toByteArray();
- }
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java
deleted file mode 100644
index f2232ffd..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonKeySpace.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.datastore.jsonobjects;
-
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-@ApiModel(value = "JsonTable", description = "Json model creating new keyspace")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonKeySpace {
- private String keyspaceName;
- private Map<String, Object> replicationInfo;
- private String durabilityOfWrites;
- private Map<String, String> consistencyInfo;
-
- @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- @ApiModelProperty(value = "Replication information")
- public Map<String, Object> getReplicationInfo() {
- return replicationInfo;
- }
-
- public void setReplicationInfo(Map<String, Object> replicationInfo) {
- this.replicationInfo = replicationInfo;
- }
-
- @ApiModelProperty(value = "Durability", allowableValues = "true,false")
- public String getDurabilityOfWrites() {
- return durabilityOfWrites;
- }
-
- public void setDurabilityOfWrites(String durabilityOfWrites) {
- this.durabilityOfWrites = durabilityOfWrites;
- }
-
- @ApiModelProperty(value = "Keyspace name")
- public String getKeyspaceName() {
- return keyspaceName;
- }
-
- public void setKeyspaceName(String keyspaceName) {
- this.keyspaceName = keyspaceName;
- }
-
-
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonOnboard.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonOnboard.java
deleted file mode 100755
index 82993ebc..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonOnboard.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.datastore.jsonobjects;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-@ApiModel(value = "JsonOnboard", description = "Defines the Json for Onboarding an application.")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonOnboard {
- private String appname;
- private String userId;
- private String password;
- private String isAAF;
- private String aid;
- private String keyspace;
-
- @ApiModelProperty(value = "Application Keyspace")
- public String getKeyspace() {
- return keyspace;
- }
-
- public void setKeyspace_name(String keyspace) {
- this.keyspace = keyspace;
- }
-
- @ApiModelProperty(value = "Application Password")
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- @ApiModelProperty(value = "Application UUID")
- public String getAid() {
- return aid;
- }
-
- public void setAid(String aid) {
- this.aid = aid;
- }
-
- @ApiModelProperty(value = "Application name")
- public String getAppname() {
- return appname;
- }
-
- public void setAppname(String appname) {
- this.appname = appname;
- }
-
- @ApiModelProperty(value = "User Id")
- public String getUserId() {
- return userId;
- }
-
- public void setUserId(String userId) {
- this.userId = userId;
- }
-
- @ApiModelProperty(value = "Is AAF Application", allowableValues = "true, false")
- public String getIsAAF() {
- return isAAF;
- }
-
- public void setIsAAF(String isAAF) {
- this.isAAF = isAAF;
- }
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java
deleted file mode 100644
index faef9b8f..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonSelect.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2018 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.datastore.jsonobjects;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonSelect implements Serializable {
- private Map<String, String> consistencyInfo;
-
-
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- public byte[] serialize() {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutput out = null;
- try {
- out = new ObjectOutputStream(bos);
- out.writeObject(this);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return bos.toByteArray();
- }
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java
deleted file mode 100644
index badcaebe..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonTable.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.datastore.jsonobjects;
-
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-@ApiModel(value = "JsonTable", description = "Defines the Json for Creating a new Table.")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonTable {
- private String keyspaceName;
- private String tableName;
-
- private Map<String, String> fields;
- private Map<String, Object> properties;
- private String primaryKey;
- private String partitionKey;
- private String clusteringKey;
- private String filteringKey;
- private String clusteringOrder;
- private Map<String, String> consistencyInfo;
-
- @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- @ApiModelProperty(value = "Properties")
- public Map<String, Object> getProperties() {
- return properties;
- }
-
- public void setProperties(Map<String, Object> properties) {
- this.properties = properties;
- }
-
- @ApiModelProperty(value = "Fields")
- public Map<String, String> getFields() {
- return fields;
- }
-
- public void setFields(Map<String, String> fields) {
- this.fields = fields;
- }
-
- @ApiModelProperty(value = "KeySpace Name")
- public String getKeyspaceName() {
- return keyspaceName;
- }
-
- public void setKeyspaceName(String keyspaceName) {
- this.keyspaceName = keyspaceName;
- }
-
- @ApiModelProperty(value = "Table Name")
- public String getTableName() {
- return tableName;
- }
-
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
-
- @ApiModelProperty(value = "Clustering Order", notes = "")
- public String getClusteringOrder() {
- return clusteringOrder;
- }
-
- public void setClusteringOrder(String clusteringOrder) {
- this.clusteringOrder = clusteringOrder;
- }
-
- @ApiModelProperty(value = "Primary Key")
- public String getPrimaryKey() {
- return primaryKey;
- }
-
- public void setPrimaryKey(String primaryKey) {
- this.primaryKey = primaryKey;
- }
-
- public String getClusteringKey() {
- return clusteringKey;
- }
-
- public void setClusteringKey(String clusteringKey) {
- this.clusteringKey = clusteringKey;
- }
-
- public String getFilteringKey() {
- return filteringKey;
- }
-
- public void setFilteringKey(String filteringKey) {
- this.filteringKey = filteringKey;
- }
-
- public String getPartitionKey() {
- return partitionKey;
- }
-
- public void setPartitionKey(String partitionKey) {
- this.partitionKey = partitionKey;
- }
-
-
-}
diff --git a/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java b/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java
deleted file mode 100644
index e31c6ccf..00000000
--- a/src/main/java/org/onap/music/datastore/jsonobjects/JsonUpdate.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2018 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.datastore.jsonobjects;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Map;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-
-@ApiModel(value = "JsonTable", description = "Json model for table update")
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class JsonUpdate implements Serializable {
- private String keyspaceName;
- private String tableName;
- private transient Map<String, Object> values;
- private String ttl;
- private String timestamp;
- private Map<String, String> consistencyInfo;
- private transient Map<String, Object> conditions;
- private transient Map<String, Object> rowSpecification;
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JsonUpdate.class);
-
- @ApiModelProperty(value = "Conditions")
- public Map<String, Object> getConditions() {
- return conditions;
- }
-
- public void setConditions(Map<String, Object> conditions) {
- this.conditions = conditions;
- }
-
- @ApiModelProperty(value = "Information for selecting sepcific rows")
- public Map<String, Object> getRow_specification() {
- return rowSpecification;
- }
-
- public void setRow_specification(Map<String, Object> rowSpecification) {
- this.rowSpecification = rowSpecification;
- }
-
-
- @ApiModelProperty(value = "Keyspace name")
- public String getKeyspaceName() {
- return keyspaceName;
- }
-
- public void setKeyspaceName(String keyspaceName) {
- this.keyspaceName = keyspaceName;
- }
-
- @ApiModelProperty(value = "Table name")
- public String getTableName() {
- return tableName;
- }
-
- public void setTableName(String tableName) {
- this.tableName = tableName;
- }
-
- @ApiModelProperty(value = "Consistency level", allowableValues = "eventual,critical,atomic")
- public Map<String, String> getConsistencyInfo() {
- return consistencyInfo;
- }
-
- public void setConsistencyInfo(Map<String, String> consistencyInfo) {
- this.consistencyInfo = consistencyInfo;
- }
-
- @ApiModelProperty(value = "Time to live value")
- public String getTtl() {
- return ttl;
- }
-
- public void setTtl(String ttl) {
- this.ttl = ttl;
- }
-
- @ApiModelProperty(value = "Time stamp")
- public String getTimestamp() {
- return timestamp;
- }
-
- public void setTimestamp(String timestamp) {
- this.timestamp = timestamp;
- }
-
- @ApiModelProperty(value = "Column values")
- public Map<String, Object> getValues() {
- return values;
- }
-
- public void setValues(Map<String, Object> values) {
- this.values = values;
- }
-
- public byte[] serialize() {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutput out = null;
- try {
- out = new ObjectOutputStream(bos);
- out.writeObject(this);
- } catch (IOException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e,AppMessages.IOERROR, ErrorSeverity.ERROR, ErrorTypes.DATAERROR);
- }
- return bos.toByteArray();
- }
-
-}
diff --git a/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java b/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java
deleted file mode 100644
index 4ed63575..00000000
--- a/src/main/java/org/onap/music/lockingservice/cassandra/CassaLockStore.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2019 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.lockingservice.cassandra;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.onap.music.datastore.MusicDataStore;
-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 com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-
-/*
- * This is the lock store that is built on top of Cassandra that is used by MUSIC to maintain lock state.
- */
-
-public class CassaLockStore {
-
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CassaLockStore.class);
- private static String table_prepend_name = "lockQ_";
-
- public class LockObject{
- public String lockRef;
- public String createTime;
- public String acquireTime;
- public LockObject(String lockRef, String createTime, String acquireTime) {
- this.lockRef = lockRef;
- this.acquireTime = acquireTime;
- this.createTime = createTime;
-
- }
- }
- MusicDataStore dsHandle;
- public CassaLockStore() {
- dsHandle = new MusicDataStore();
- }
-
- public CassaLockStore(MusicDataStore dsHandle) {
- this.dsHandle=dsHandle;
- }
-
-
- /**
- *
- * This method creates a shadow locking table for every main table in Cassandra. This table tracks all information regarding locks.
- * @param keyspace of the application.
- * @param table of the application.
- * @return true if the operation was successful.
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public boolean createLockQueue(String keyspace, String table) throws MusicServiceException, MusicQueryException {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Create lock queue/table for " + keyspace+"."+table);
- table = table_prepend_name+table;
- String tabQuery = "CREATE TABLE IF NOT EXISTS "+keyspace+"."+table
- + " ( key text, lockReference bigint, createTime text, acquireTime text, guard bigint static, PRIMARY KEY ((key), lockReference) ) "
- + "WITH CLUSTERING ORDER BY (lockReference ASC);";
- PreparedQueryObject queryObject = new PreparedQueryObject();
-
- queryObject.appendQueryString(tabQuery);
- boolean result;
- result = dsHandle.executePut(queryObject, "eventual");
- return result;
- }
-
- /**
- * This method creates a lock reference for each invocation. The lock references are monotonically increasing timestamps.
- * @param keyspace of the locks.
- * @param table of the locks.
- * @param lockName is the primary key of the lock table
- * @return the UUID lock reference.
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public String genLockRefandEnQueue(String keyspace, String table, String lockName) throws MusicServiceException, MusicQueryException {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Create lock reference for " + keyspace + "." + table + "." + lockName);
- String lockTable ="";
- lockTable = table_prepend_name+table;
-
-
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- String selectQuery = "SELECT guard FROM " + keyspace + "." + lockTable + " WHERE key=?;";
-
- queryObject.addValue(lockName);
- queryObject.appendQueryString(selectQuery);
- ResultSet gqResult = dsHandle.executeOneConsistencyGet(queryObject);
- List<Row> latestGuardRow = gqResult.all();
-
- long prevGuard = 0;
- long lockRef = 1;
- if (!latestGuardRow.isEmpty()) {
- prevGuard = latestGuardRow.get(0).getLong(0);
- lockRef = prevGuard + 1;
- }
-
- long lockEpochMillis = System.currentTimeMillis();
-
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Created lock reference for " + keyspace + "." + lockTable + "." + lockName + ":" + lockRef);
-
- queryObject = new PreparedQueryObject();
- String insQuery = "BEGIN BATCH" +
- " UPDATE " + keyspace + "." + lockTable +
- " SET guard=? WHERE key=? IF guard = " + (prevGuard == 0 ? "NULL" : "?") +";" +
- " INSERT INTO " + keyspace + "." + lockTable +
- "(key, lockReference, createTime, acquireTime) VALUES (?,?,?,?) IF NOT EXISTS; APPLY BATCH;";
-
- queryObject.addValue(lockRef);
- queryObject.addValue(lockName);
- if (prevGuard != 0)
- queryObject.addValue(prevGuard);
-
- queryObject.addValue(lockName);
- queryObject.addValue(lockRef);
- queryObject.addValue(String.valueOf(lockEpochMillis));
- queryObject.addValue("0");
- queryObject.appendQueryString(insQuery);
- dsHandle.executePut(queryObject, "critical");
- return "$"+keyspace+"."+table+"."+lockName+"$"+ lockRef;
- }
-
- /**
- * Returns a result set containing the list of clients waiting for a particular lock
- * @param keyspace
- * @param table
- * @param key
- * @return list of lockrefs in the queue
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public List<String> getLockQueue(String keyspace, String table, String key)
- throws MusicServiceException, MusicQueryException {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Getting the queue for " + keyspace+"."+table+"."+key);
- table = table_prepend_name+table;
- String selectQuery = "select * from " + keyspace + "." + table + " where key='" + key + "';";
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(selectQuery);
- ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
- ArrayList<String> lockQueue = new ArrayList<>();
- for (Row row: rs) {
- lockQueue.add(Long.toString(row.getLong("lockReference")));
- }
- return lockQueue;
- }
-
-
- /**
- * Returns a result set containing the list of clients waiting for a particular lock
- * @param keyspace
- * @param table
- * @param key
- * @return size of lockrefs queue
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public long getLockQueueSize(String keyspace, String table, String key)
- throws MusicServiceException, MusicQueryException {
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Getting the queue size for " + keyspace+"."+table+"."+key);
- table = table_prepend_name+table;
- String selectQuery = "select count(*) from " + keyspace + "." + table + " where key='" + key + "';";
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(selectQuery);
- ResultSet rs = dsHandle.executeOneConsistencyGet(queryObject);
- return rs.one().getLong("count");
- }
-
-
- /**
- * This method returns the top of lock table/queue for the key.
- * @param keyspace of the application.
- * @param table of the application.
- * @param key is the primary key of the application table
- * @return the UUID lock reference.
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public LockObject peekLockQueue(String keyspace, String table, String key) throws MusicServiceException, MusicQueryException{
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Peek in lock table for " + keyspace+"."+table+"."+key);
- table = table_prepend_name+table;
- String selectQuery = "select * from "+keyspace+"."+table+" where key='"+key+"' LIMIT 1;";
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(selectQuery);
- ResultSet results = dsHandle.executeOneConsistencyGet(queryObject);
- Row row = results.one();
- String lockReference = "" + row.getLong("lockReference");
- String createTime = row.getString("createTime");
- String acquireTime = row.getString("acquireTime");
-
- return new LockObject(lockReference, createTime,acquireTime);
- }
-
-
- /**
- * This method removes the lock ref from the lock table/queue for the key.
- * @param keyspace of the application.
- * @param table of the application.
- * @param key is the primary key of the application table
- * @param lockReference the lock reference that needs to be dequeued.
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public void deQueueLockRef(String keyspace, String table, String key, String lockReference) throws MusicServiceException, MusicQueryException{
- table = table_prepend_name+table;
- PreparedQueryObject queryObject = new PreparedQueryObject();
- Long lockReferenceL = Long.parseLong(lockReference.substring(lockReference.lastIndexOf('$')+1));
- String deleteQuery = "delete from "+keyspace+"."+table+" where key='"+key+"' AND lockReference ="+lockReferenceL+" IF EXISTS;";
- queryObject.appendQueryString(deleteQuery);
- dsHandle.executePut(queryObject, "critical");
- }
-
-
- public void updateLockAcquireTime(String keyspace, String table, String key, String lockReference) throws MusicServiceException, MusicQueryException{
- table = table_prepend_name+table;
- PreparedQueryObject queryObject = new PreparedQueryObject();
- Long lockReferenceL = Long.parseLong(lockReference);
- String updateQuery = "update "+keyspace+"."+table+" set acquireTime='"+ System.currentTimeMillis()+"' where key='"+key+"' AND lockReference = "+lockReferenceL+" IF EXISTS;";
- queryObject.appendQueryString(updateQuery);
- dsHandle.executePut(queryObject, "eventual");
-
- }
-
-
-}
diff --git a/src/main/java/org/onap/music/main/MusicCore.java b/src/main/java/org/onap/music/main/MusicCore.java
deleted file mode 100644
index 221e680b..00000000
--- a/src/main/java/org/onap/music/main/MusicCore.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.main;
-
-import java.util.List;
-import java.util.Map;
-
-import org.onap.music.datastore.Condition;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.exceptions.MusicLockingException;
-import org.onap.music.exceptions.MusicQueryException;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.lockingservice.cassandra.CassaLockStore;
-import org.onap.music.lockingservice.cassandra.MusicLockState;
-import org.onap.music.service.MusicCoreService;
-import org.onap.music.service.impl.MusicCassaCore;
-
-import com.datastax.driver.core.ResultSet;
-
-public class MusicCore {
-
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicCore.class);
- private static boolean unitTestRun=true;
-
- private static MusicCoreService musicCore = MusicUtil.getMusicCoreService();
- public static CassaLockStore mLockHandle;
-
-
- /**
- * Acquire lock
- * @param fullyQualifiedKey DO NOT RELY ON THIS KEY WORKING. INCLUDE THE KEY IN THE LOCKID.
- * @param lockId - the full lock id (key + lockRef)
- * @return
- * @throws MusicLockingException
- * @throws MusicQueryException
- * @throws MusicServiceException
- */
- public static ReturnType acquireLock(String fullyQualifiedKey, String lockId)
- throws MusicLockingException, MusicQueryException, MusicServiceException {
- return musicCore.acquireLock(fullyQualifiedKey, lockId);
- }
-
- public static ReturnType acquireLockWithLease(String key, String lockId, long leasePeriod)
- throws MusicLockingException, MusicQueryException, MusicServiceException {
- return musicCore.acquireLockWithLease(key, lockId, leasePeriod);
- }
-
- public static String createLockReference(String fullyQualifiedKey) {
- return musicCore.createLockReference(fullyQualifiedKey);
- }
-
- public static ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject,
- String consistency) throws MusicServiceException {
- return musicCore.createTable(keyspace, table, tableQueryObject, consistency);
- }
-
- public static ResultSet quorumGet(PreparedQueryObject query) {
- return musicCore.quorumGet(query);
- }
-
- public static String whoseTurnIsIt(String fullyQualifiedKey) {
- return musicCore.whoseTurnIsIt(fullyQualifiedKey);
- }
-
- public static void destroyLockRef(String lockId) {
- musicCore.destroyLockRef(lockId);
- }
-
- public static ReturnType eventualPut(PreparedQueryObject queryObject) {
- return musicCore.eventualPut(queryObject);
- }
-
- public static ReturnType eventualPut_nb(PreparedQueryObject queryObject,String keyspace,
- String tablename,String primaryKey) {
- return musicCore.eventualPut_nb(queryObject, keyspace, tablename, primaryKey);
- }
-
- public static ReturnType criticalPut(String keyspace, String table, String primaryKeyValue,
- PreparedQueryObject queryObject, String lockReference, Condition conditionInfo) {
- return musicCore.criticalPut(keyspace, table, primaryKeyValue, queryObject, lockReference, conditionInfo);
- }
-
- public static ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency)
- throws MusicServiceException {
- return musicCore.nonKeyRelatedPut(queryObject, consistency);
- }
-
- public static ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException{
- return musicCore.get(queryObject);
- }
-
- public static ResultSet criticalGet(String keyspace, String table, String primaryKeyValue,
- PreparedQueryObject queryObject, String lockReference) throws MusicServiceException {
- return musicCore.criticalGet(keyspace, table, primaryKeyValue, queryObject,lockReference);
- }
-
- public static ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException,
- MusicQueryException,MusicServiceException {
- return musicCore.atomicPut(keyspaceName, tableName, primaryKey, queryObject, conditionInfo);
- }
-
- public static ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException {
- return musicCore.atomicGet(keyspaceName, tableName, primaryKey, queryObject);
- }
-
- public static List<String> getLockQueue(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException {
- return musicCore.getLockQueue(fullyQualifiedKey);
- }
-
- public static long getLockQueueSize(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException {
- return musicCore.getLockQueueSize(fullyQualifiedKey);
- }
-
- public static void deleteLock(String lockName) throws MusicLockingException {
- musicCore.deleteLock(lockName);
- }
-
- public static ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName,
- String primaryKey, PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException {
- return musicCore.atomicPutWithDeleteLock(keyspaceName, tableName, primaryKey, queryObject, conditionInfo);
- }
-
- public static ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException {
- return musicCore.atomicGetWithDeleteLock(keyspaceName, tableName, primaryKey, queryObject);
- }
-
- public static Map<String, Object> validateLock(String lockName) {
- return musicCore.validateLock(lockName);
- }
-
- public static MusicLockState releaseLock(String lockId, boolean voluntaryRelease) {
- return musicCore.releaseLock(lockId, voluntaryRelease);
- }
-
-
-} \ No newline at end of file
diff --git a/src/main/java/org/onap/music/main/PropertiesLoader.java b/src/main/java/org/onap/music/main/PropertiesLoader.java
deleted file mode 100644
index db04ff4b..00000000
--- a/src/main/java/org/onap/music/main/PropertiesLoader.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.main;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
-import org.springframework.stereotype.Component;
-
-@PropertySource(value = {"file:/opt/app/music/etc/music.properties", "classpath:/project.properties"})
-@Component
-public class PropertiesLoader implements InitializingBean {
-
- @Value("${cassandra.host}")
- public String cassandraHost;
-
- @Value("${music.ip}")
- public String musicIp;
-
- @Value("${debug}")
- public String debug;
-
- @Value("${version}")
- public String version;
-
- @Value("${music.rest.ip}")
- public String musicRestIp;
-
- @Value("${music.properties}")
- public String musicProperties;
-
- @Value("${lock.lease.period}")
- public String lockLeasePeriod;
-
- @Value("${public.ip}")
- public String publicIp;
-
- @Value("${my.id}")
- public String myId;
-
- @Value("${all.ids}")
- public String allIds;
-
- @Value("${all.public.ips}")
- public String allPublicIps;
-
- @Value("${cassandra.user}")
- public String cassandraUser;
-
- @Value("${cassandra.password}")
- public String cassandraPassword;
-
- @Value("${aaf.endpoint.url}")
- public String aafEndpointUrl;
-
- @Value("${admin.username}")
- public String adminUsername;
-
- @Value("${admin.password}")
- public String adminPassword;
-
- @Value("${cassandra.port}")
- public String cassandraPort;
-
- @Value("${aaf.admin.url}")
- public String aafAdminUrl;
-
- @Value("${music.namespace}")
- public String musicNamespace;
-
- @Value("${admin.aaf.role}")
- public String adminAafRole;
-
- @Value("${notify.interval}")
- public String notifyInterval;
-
- @Value("${notify.timeout}")
- public String notifyTimeout;
-
- @Value("${cadi}")
- public String isCadi;
-
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(PropertiesLoader.class);
-
- @Bean
- public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
- //return new PropertySourcesPlaceholderConfigurer();
- PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
- pspc.setIgnoreResourceNotFound(true);
- pspc.setIgnoreUnresolvablePlaceholders(true);
- return pspc;
- }
-
- public void loadProperties () {
- if(aafAdminUrl != null && !aafAdminUrl.equals("${aaf.admin.url}"))
- MusicUtil.setAafAdminUrl(aafAdminUrl);
- if(aafEndpointUrl != null && !aafEndpointUrl.equals("${aaf.endpoint.url}"))
- MusicUtil.setAafEndpointUrl(aafEndpointUrl);
- if(adminAafRole != null && !adminAafRole.equals("${admin.aaf.role}"))
- MusicUtil.setAdminAafRole(adminAafRole);
- //MusicUtil.setAdminId(adminId);
- if(adminPassword != null && !adminPassword.equals("${admin.password}"))
- MusicUtil.setAdminPass(adminPassword);
- if(adminUsername != null && !adminUsername.equals("${admin.username}"))
- MusicUtil.setAdminId(adminUsername);
- if(allIds != null && !allIds.equals("${all.ids}")) {
- String[] ids = allIds.split(":");
- MusicUtil.setAllIds(new ArrayList<String>(Arrays.asList(ids)));
- }
- if(allPublicIps != null && !allPublicIps.equals("${all.public.ips}")) {
- String[] ips = allPublicIps.split(":");
- if (ips.length == 1) {
- // Future use
- } else if (ips.length > 1) {
- MusicUtil.setAllPublicIps(
- new ArrayList<String>(Arrays.asList(ips)));
- }
- }
- if(cassandraPort != null && !cassandraPort.equals("${cassandra.port}"))
- MusicUtil.setCassandraPort(Integer.parseInt(cassandraPort));
- if(cassandraUser != null && !cassandraUser.equals("${cassandra.user}"))
- MusicUtil.setCassName(cassandraUser);
- if(cassandraPassword != null && !cassandraPassword.equals("${cassandra.password}"))
- MusicUtil.setCassPwd(cassandraPassword);
- if(debug != null && !debug.equals("${debug}"))
- MusicUtil.setDebug(Boolean.parseBoolean(debug));
- if(lockLeasePeriod != null && !lockLeasePeriod.equals("${lock.lease.period}"))
- MusicUtil.setDefaultLockLeasePeriod(Long.parseLong(lockLeasePeriod));
- if(musicIp != null && !musicIp.equals("${music.ip}"))
- MusicUtil.setDefaultMusicIp(musicIp);
- if(musicNamespace != null && !musicNamespace.equals("${music.namespace}"))
- MusicUtil.setMusicNamespace(musicNamespace);
- if(musicProperties != null && !musicProperties.equals("${music.properties}"))
- MusicUtil.setMusicPropertiesFilePath(musicProperties);
- if(musicRestIp != null && !musicRestIp.equals("${music.rest.ip}"))
- MusicUtil.setMusicRestIp(musicRestIp);
- if(cassandraHost != null && !cassandraHost.equals("${cassandra.host}"))
- MusicUtil.setMyCassaHost(cassandraHost);
- logger.info("#### Cassandra Host: " + MusicUtil.getMyCassaHost());
- if(myId != null && !myId.equals("${my.id}"))
- MusicUtil.setMyId(Integer.parseInt(myId));
- if(notifyInterval != null && !notifyInterval.equals("${notify.interval}"))
- MusicUtil.setNotifyInterval(Integer.parseInt(notifyInterval));
- if(notifyTimeout != null && !notifyTimeout.equals("${notify.timeout}"))
- MusicUtil.setNotifyTimeOut(Integer.parseInt(notifyTimeout));
- if(allPublicIps != null && !allPublicIps.equals("${public.ip}"))
- MusicUtil.setPublicIp(allPublicIps);
- if(version != null && !version.equals("${version}"))
- MusicUtil.setVersion(version);
- if(isCadi != null && !isCadi.equals("${cadi}"))
- MusicUtil.setIsCadi(Boolean.parseBoolean(isCadi));
- }
-
-
- @Override
- public void afterPropertiesSet() throws Exception {
- // TODO Auto-generated method stub
-
- }
-
-}
diff --git a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java b/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java
deleted file mode 100755
index adcb6584..00000000
--- a/src/main/java/org/onap/music/rest/RestMusicAdminAPI.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * Modifications Copyright (C) 2018 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.rest;
-
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-
-import org.mindrot.jbcrypt.BCrypt;
-import org.onap.music.authentication.CachingUtil;
-import org.onap.music.authentication.MusicAAFAuthentication;
-import org.onap.music.authentication.MusicAuthenticator;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.datastore.jsonobjects.JsonOnboard;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.main.ResultType;
-import org.onap.music.response.jsonobjects.JsonResponse;
-
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-//import java.util.Base64.Encoder;
-//import java.util.Base64.Decoder;
-
-@Path("/v2/admin")
-// @Path("/v{version: [0-9]+}/admin")
-// @Path("/admin")
-@Api(value = "Admin Api", hidden = true)
-public class RestMusicAdminAPI {
- private static EELFLoggerDelegate logger =
- EELFLoggerDelegate.getLogger(RestMusicAdminAPI.class);
- // Set to true in env like ONAP. Where access to creating and dropping keyspaces exist.
- private static final boolean KEYSPACE_ACTIVE = false;
-
- private MusicAuthenticator authenticator = new MusicAAFAuthentication();
-
- /*
- * API to onboard an application with MUSIC. This is the mandatory first step.
- *
- */
- @POST
- @Path("/onboardAppWithMusic")
- @ApiOperation(value = "Onboard application", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response onboardAppWithMusic(JsonOnboard jsonObj,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization) throws Exception {
- logger.info(EELFLoggerDelegate.errorLogger, "oboarding app");
- ResponseBuilder response =
- Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check admin username,password and try again").toMap())
- .build();
- }
-
- Map<String, Object> resultMap = new HashMap<>();
- String appName = jsonObj.getAppname();
- String userId = jsonObj.getUserId();
- String isAAF = jsonObj.getIsAAF();
- String password = jsonObj.getPassword();
- String keyspace_name = jsonObj.getKeyspace();
-
- if (appName == null || userId == null || isAAF == null || password == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check the request parameters. Some of the required values appName(ns), userId, password, isAAF are missing.", AppMessages.MISSINGINFO,
- ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR);
- resultMap.put("Exception",
- "Unauthorized: Please check the request parameters. Some of the required values appName(ns), userId, password, isAAF are missing.");
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
-
- PreparedQueryObject pQuery = new PreparedQueryObject();
- /*
- * pQuery.appendQueryString(
- * "select uuid from admin.keyspace_master where application_name = ? allow filtering"
- * ); pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(),
- * appName)); ResultSet rs = MusicCore.get(pQuery); if (!rs.all().isEmpty()) {
- * logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA
- * ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- * response.status(Status.BAD_REQUEST); return response.entity(new
- * JsonResponse(ResultType.FAILURE).setError("Application " + appName +
- * " has already been onboarded. Please contact admin.").toMap()).build(); }
- */
- //pQuery = new PreparedQueryObject();
- String uuid = MusicUtil.generateUUID();
- pQuery.appendQueryString(
- "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(),keyspace_name));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), BCrypt.hashpw(password, BCrypt.gensalt())));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
-
- String returnStr = MusicCore.eventualPut(pQuery).toString();
- if (returnStr.contains("Failure")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError("Oops. Something wrong with onboarding process. "
- + "Please retry later or contact admin.").toMap()).build();
- }
- CachingUtil.updateisAAFCache(appName, isAAF);
- resultMap.put("Success", "Your application " + appName + " has been onboarded with MUSIC.");
- resultMap.put("Generated AID", uuid);
- return response.status(Status.OK).entity(resultMap).build();
- }
-
-
- @POST
- @Path("/search")
- @ApiOperation(value = "Search Onboard application", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response getOnboardedInfoSearch(JsonOnboard jsonObj,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization) throws Exception {
- ResponseBuilder response = Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
-
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check admin username,password and try again").toMap())
- .build();
- }
-
- Map<String, Object> resultMap = new HashMap<>();
- String appName = jsonObj.getAppname();
- String uuid = jsonObj.getAid();
- String isAAF = jsonObj.getIsAAF();
- if (appName == null && uuid == null && isAAF == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check the request parameters. Enter atleast one of the following parameters: appName(ns), aid, isAAF.", AppMessages.MISSINGINFO,
- ErrorSeverity.CRITICAL, ErrorTypes.AUTHENTICATIONERROR);
- resultMap.put("Exception",
- "Unauthorized: Please check the request parameters. Enter atleast one of the following parameters: appName(ns), aid, isAAF.");
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
-
- PreparedQueryObject pQuery = new PreparedQueryObject();
- String cql = "select uuid, keyspace_name from admin.keyspace_master where ";
- if (appName != null)
- cql = cql + "application_name = ? AND ";
- if (uuid != null)
- cql = cql + "uuid = ? AND ";
- if (isAAF != null)
- cql = cql + "is_aaf = ?";
-
- if (cql.endsWith("AND "))
- cql = cql.trim().substring(0, cql.length() - 4);
- logger.info("Query in callback is: " + cql);
- cql = cql + " allow filtering";
- pQuery.appendQueryString(cql);
- if (appName != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- if (uuid != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- if (isAAF != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(),
- Boolean.parseBoolean(isAAF)));
- ResultSet rs = MusicCore.get(pQuery);
- Iterator<Row> it = rs.iterator();
- while (it.hasNext()) {
- Row row = it.next();
- resultMap.put(row.getUUID("uuid").toString(), row.getString("keyspace_name"));
- }
- if (resultMap.isEmpty()) {
- if (uuid != null) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError("Please make sure Aid is correct and application is onboarded.").toMap()).build();
-
- } else {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError("Application is not onboarded. Please make sure all the information is correct.").toMap()).build();
- }
- }
- return response.status(Status.OK).entity(resultMap).build();
- }
-
-
- @DELETE
- @Path("/onboardAppWithMusic")
- @ApiOperation(value = "Delete Onboard application", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response deleteOnboardApp(JsonOnboard jsonObj,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization) throws Exception {
- ResponseBuilder response = Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
-
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check admin username,password and try again").toMap())
- .build();
- }
-
- Map<String, Object> resultMap = new HashMap<>();
- String appName = jsonObj.getAppname();
- String aid = jsonObj.getAid();
- PreparedQueryObject pQuery = new PreparedQueryObject();
- String consistency = MusicUtil.EVENTUAL;
- if (appName == null && aid == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "Please make sure either appName(ns) or Aid is present", AppMessages.MISSINGINFO,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- resultMap.put("Exception", "Please make sure either appName(ns) or Aid is present");
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
- if (aid != null) {
- if ( KEYSPACE_ACTIVE ) {
- pQuery.appendQueryString(
- "SELECT keyspace_name FROM admin.keyspace_master WHERE uuid = ?");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
- UUID.fromString(aid)));
- Row row = MusicCore.get(pQuery).one();
- if (row != null) {
- String ks = row.getString("keyspace_name");
- if (!ks.equals(MusicUtil.DEFAULTKEYSPACENAME)) {
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("DROP KEYSPACE IF EXISTS " + ks + ";");
- MusicCore.nonKeyRelatedPut(queryObject, consistency);
- }
- }
- }
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString("delete from admin.keyspace_master where uuid = ? IF EXISTS");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
- UUID.fromString(aid)));
- ResultType result = MusicCore.nonKeyRelatedPut(pQuery, consistency);
- if (result == ResultType.SUCCESS) {
- resultMap.put("Success", "Your application has been deleted successfully");
- } else {
- resultMap.put("Exception",
- "Oops. Something went wrong. Please make sure Aid is correct or Application is onboarded");
- logger.error(EELFLoggerDelegate.errorLogger, "Oops. Something went wrong. Please make sure Aid is correct or Application is onboarded", AppMessages.INCORRECTDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
-
- }
- return response.status(Status.OK).entity(resultMap).build();
- }
-
- pQuery.appendQueryString(
- "select uuid from admin.keyspace_master where application_name = ? allow filtering");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- ResultSet rs = MusicCore.get(pQuery);
- List<Row> rows = rs.all();
- String uuid = null;
- if (rows.isEmpty()) {
- resultMap.put("Exception",
- "Application not found. Please make sure Application exists.");
- logger.error(EELFLoggerDelegate.errorLogger, "Application not found. Please make sure Application exists.", AppMessages.INCORRECTDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- } else if (rows.size() == 1) {
- uuid = rows.get(0).getUUID("uuid").toString();
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "SELECT keyspace_name FROM admin.keyspace_master WHERE uuid = ?");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
- UUID.fromString(uuid)));
- Row row = MusicCore.get(pQuery).one();
- String ks = row.getString("keyspace_name");
- if (!ks.equals(MusicUtil.DEFAULTKEYSPACENAME)) {
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("DROP KEYSPACE " + ks + ";");
- MusicCore.nonKeyRelatedPut(queryObject, consistency);
- }
-
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString("delete from admin.keyspace_master where uuid = ?");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),
- UUID.fromString(uuid)));
- MusicCore.eventualPut(pQuery);
- resultMap.put("Success", "Your application " + appName + " has been deleted.");
- return response.status(Status.OK).entity(resultMap).build();
- } else {
- resultMap.put("Failure",
- "More than one Aid exists for this application, so please provide Aid.");
- logger.error(EELFLoggerDelegate.errorLogger, "More than one Aid exists for this application, so please provide Aid.", AppMessages.MULTIPLERECORDS,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
- }
-
-
- @PUT
- @Path("/onboardAppWithMusic")
- @ApiOperation(value = "Update Onboard application", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response updateOnboardApp(JsonOnboard jsonObj,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization) throws Exception {
- ResponseBuilder response = Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check admin username,password and try again").toMap())
- .build();
- }
-
- Map<String, Object> resultMap = new HashMap<>();
- String aid = jsonObj.getAid();
- String appName = jsonObj.getAppname();
- String userId = jsonObj.getUserId();
- String isAAF = jsonObj.getIsAAF();
- String password = jsonObj.getPassword();
- String consistency = "eventual";
- PreparedQueryObject pQuery;
-
- if (aid == null) {
- resultMap.put("Exception", "Please make sure Aid is present");
- logger.error(EELFLoggerDelegate.errorLogger, "Please make sure Aid is present", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
-
- if (appName == null && userId == null && password == null && isAAF == null) {
- resultMap.put("Exception",
- "No parameters found to update. Please update atleast one parameter.");
- logger.error(EELFLoggerDelegate.errorLogger, "No parameters found to update. Please update atleast one parameter.", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
-
- if (appName != null) {
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "select uuid from admin.keyspace_master where application_name = ? allow filtering");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- ResultSet rs = MusicCore.get(pQuery);
- if (!rs.all().isEmpty()) {
- resultMap.put("Exception", "Application " + appName
- + " has already been onboarded. Please contact admin.");
- logger.error(EELFLoggerDelegate.errorLogger, "Application " + appName+"has already been onboarded. Please contact admin.", AppMessages.ALREADYEXIST,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
- }
-
- pQuery = new PreparedQueryObject();
- StringBuilder preCql = new StringBuilder("UPDATE admin.keyspace_master SET ");
- if (appName != null)
- preCql.append(" application_name = ?,");
- if (userId != null)
- preCql.append(" username = ?,");
- if (password != null)
- preCql.append(" password = ?,");
- if (isAAF != null)
- preCql.append(" is_aaf = ?,");
- preCql.deleteCharAt(preCql.length() - 1);
- preCql.append(" WHERE uuid = ? IF EXISTS");
- pQuery.appendQueryString(preCql.toString());
- if (appName != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- if (userId != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- if (password != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), BCrypt.hashpw(password, BCrypt.gensalt())));
- if (isAAF != null)
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
-
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), UUID.fromString(aid)));
- ResultType result = MusicCore.nonKeyRelatedPut(pQuery, consistency);
-
- if (result == ResultType.SUCCESS) {
- resultMap.put("Success", "Your application has been updated successfully");
- } else {
- resultMap.put("Exception",
- "Oops. Something went wrong. Please make sure Aid is correct and application is onboarded");
- logger.error(EELFLoggerDelegate.errorLogger, "Oops. Something went wrong. Please make sure Aid is correct and application is onboarded", AppMessages.INCORRECTDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
-
- return response.status(Status.OK).entity(resultMap).build();
- }
-
-
-
- //Dashboard related calls
- @GET
- @Path("/getall")
- @Produces(MediaType.APPLICATION_JSON)
- @Consumes(MediaType.APPLICATION_JSON)
- public List<Application> getall(@ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization) throws MusicServiceException{
- List<Application> appList = new ArrayList<>();
- ResponseBuilder response =
- Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return appList;
- }
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("SELECT * FROM " + "admin" + "." + "keyspace_master" + ";");
- ResultSet results = MusicCore.get(queryObject);
- for(Row row : results) {
- Application app = new Application();
- app.setApplication_name(row.getString("application_name"));
- app.setIs_aaf(row.getBool("is_aaf"));
- app.setIs_api(row.getBool("is_api"));
- app.setUsername(row.getString("username"));
- app.setKeyspace_name(row.getString("keyspace_name"));
- app.setUuid(row.getUUID("uuid").toString());
- appList.add(app);
- }
- return appList;
-
- //return app;
-
- }
- @DELETE
- @Path("/delete")
- @Produces(MediaType.APPLICATION_JSON)
- @Consumes(MediaType.APPLICATION_JSON)
- public boolean delete(@ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "uuid", required = true) @HeaderParam("uuid") String uuid) throws Exception {
- ResponseBuilder response =
- Response.noContent().header("X-latestVersion", MusicUtil.getVersion());
- if (!authenticator.authenticateAdmin(authorization)) {
- logger.error(EELFLoggerDelegate.errorLogger, "Unauthorized: Please check admin username,password and try again", AppMessages.AUTHENTICATIONERROR, ErrorSeverity.CRITICAL,
- ErrorTypes.AUTHENTICATIONERROR);
- return false;
- }
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("delete from admin.keyspace_master where uuid=?");
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(),uuid));
- ResultType result;
- try {
- result = MusicCore.nonKeyRelatedPut(queryObject, "eventual");
- }catch(Exception ex) {
- return false;
- }
- return true;
- }
-}
diff --git a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java b/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
deleted file mode 100755
index dfcf0bdb..00000000
--- a/src/main/java/org/onap/music/rest/RestMusicDataAPI.java
+++ /dev/null
@@ -1,1531 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * Modifications Copyright (c) 2019 Samsung
- * ===================================================================
- * 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.rest;
-
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-
-import org.apache.commons.lang3.StringUtils;
-import org.mindrot.jbcrypt.BCrypt;
-import org.onap.music.authentication.CachingUtil;
-import org.onap.music.authentication.MusicAAFAuthentication;
-import org.onap.music.authentication.MusicAuthenticator;
-import org.onap.music.authentication.MusicAuthenticator.Operation;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.datastore.jsonobjects.JsonDelete;
-import org.onap.music.datastore.jsonobjects.JsonInsert;
-import org.onap.music.datastore.jsonobjects.JsonKeySpace;
-import org.onap.music.datastore.jsonobjects.JsonTable;
-import org.onap.music.datastore.jsonobjects.JsonUpdate;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.exceptions.MusicLockingException;
-import org.onap.music.exceptions.MusicQueryException;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.main.MusicCore;
-import org.onap.music.datastore.Condition;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.main.ResultType;
-import org.onap.music.main.ReturnType;
-import org.onap.music.response.jsonobjects.JsonResponse;
-
-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 io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import io.swagger.annotations.ApiResponses;
-import io.swagger.annotations.ApiResponse;
-
-/* Version 2 Class */
-//@Path("/v{version: [0-9]+}/keyspaces")
-@Path("/v2/keyspaces")
-@Api(value = "Data Api")
-public class RestMusicDataAPI {
- /*
- * Header values for Versioning X-minorVersion *** - Used to request or communicate a MINOR
- * version back from the client to the server, and from the server back to the client - This
- * will be the MINOR version requested by the client, or the MINOR version of the last MAJOR
- * version (if not specified by the client on the request) - Contains a single position value
- * (e.g. if the full version is 1.24.5, X-minorVersion = "24") - Is optional for the client on
- * request; however, this header should be provided if the client needs to take advantage of
- * MINOR incremented version functionality - Is mandatory for the server on response
- *
- *** X-patchVersion *** - Used only to communicate a PATCH version in a response for
- * troubleshooting purposes only, and will not be provided by the client on request - This will
- * be the latest PATCH version of the MINOR requested by the client, or the latest PATCH version
- * of the MAJOR (if not specified by the client on the request) - Contains a single position
- * value (e.g. if the full version is 1.24.5, X-patchVersion = "5") - Is mandatory for the
- * server on response (CURRENTLY NOT USED)
- *
- *** X-latestVersion *** - Used only to communicate an API's latest version - Is mandatory for the
- * server on response, and shall include the entire version of the API (e.g. if the full version
- * is 1.24.5, X-latestVersion = "1.24.5") - Used in the response to inform clients that they are
- * not using the latest version of the API (CURRENTLY NOT USED)
- *
- */
-
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicDataAPI.class);
- private static final String XMINORVERSION = "X-minorVersion";
- private static final String XPATCHVERSION = "X-patchVersion";
- private static final String NS = "ns";
- private static final String VERSION = "v2";
- private MusicAuthenticator authenticator = new MusicAAFAuthentication();
- // Set to true in env like ONAP. Where access to creating and dropping keyspaces exist.
- private static final boolean KEYSPACE_ACTIVE = false;
-
- private class RowIdentifier {
- public String primarKeyValue;
- public StringBuilder rowIdString;
- @SuppressWarnings("unused")
- public PreparedQueryObject queryObject;// the string with all the row
- // identifiers separated by AND
-
- public RowIdentifier(String primaryKeyValue, StringBuilder rowIdString,
- PreparedQueryObject queryObject) {
- this.primarKeyValue = primaryKeyValue;
- this.rowIdString = rowIdString;
- this.queryObject = queryObject;
- }
- }
-
-
- /**
- * Create Keyspace REST
- *
- * @param kspObject
- * @param keyspaceName
- * @return
- * @throws Exception
- */
- @POST
- @Path("/{name}")
- @ApiOperation(value = "Create Keyspace", response = String.class,hidden = true)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response createKeySpace(
- @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Application namespace",required = true) @HeaderParam(NS) String ns,
- JsonKeySpace kspObject,
- @ApiParam(value = "Keyspace Name",required = true) @PathParam("name") String keyspaceName) {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- logger.info(EELFLoggerDelegate.applicationLogger,"In Create Keyspace " + keyspaceName);
- if ( KEYSPACE_ACTIVE ) {
- logger.info(EELFLoggerDelegate.applicationLogger,"Creating Keyspace " + keyspaceName);
- Map<String,String> userCredentials = MusicUtil.extractBasicAuthentication(authorization);
- String userId = userCredentials.get(MusicUtil.USERID);
- String password = userCredentials.get(MusicUtil.PASSWORD);
- Map<String, Object> authMap = CachingUtil.verifyOnboarding(ns, userId, password);
- if (!authMap.isEmpty()) {
- logger.error(EELFLoggerDelegate.errorLogger,authMap.get("Exception").toString(), 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();
- }
-
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.CREATE_KEYSPACE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String consistency = MusicUtil.EVENTUAL;// for now this needs only
- // eventual consistency
-
- if(kspObject == null || kspObject.getReplicationInfo() == null) {
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(ResultType.BODYMISSING.getResult()).toMap()).build();
- }
- PreparedQueryObject queryObject = new PreparedQueryObject();
- if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && kspObject.getConsistencyInfo().get("consistency") != null) {
- if(MusicUtil.isValidConsistency(kspObject.getConsistencyInfo().get("consistency")))
- queryObject.setConsistency(kspObject.getConsistencyInfo().get("consistency"));
- else
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR).setError("Invalid Consistency type").toMap()).build();
- }
- long start = System.currentTimeMillis();
- Map<String, Object> replicationInfo = kspObject.getReplicationInfo();
- String repString = null;
- try {
- repString = "{" + MusicUtil.jsonMaptoSqlString(replicationInfo, ",") + "}";
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.MISSINGDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
-
- }
- queryObject.appendQueryString(
- "CREATE KEYSPACE " + keyspaceName + " WITH replication = " + repString);
- if (kspObject.getDurabilityOfWrites() != null) {
- queryObject.appendQueryString(
- " AND durable_writes = " + kspObject.getDurabilityOfWrites());
- }
-
- queryObject.appendQueryString(";");
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,
- "Time taken for setting up query in create keyspace:" + (end - start));
-
- ResultType result = ResultType.FAILURE;
- try {
- result = MusicCore.nonKeyRelatedPut(queryObject, consistency);
- logger.info(EELFLoggerDelegate.applicationLogger, "result = " + result);
- } catch ( MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("err:" + ex.getMessage()).toMap()).build();
- }
-
- try {
- queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("CREATE ROLE IF NOT EXISTS '" + userId
- + "' WITH PASSWORD = '" + password + "' AND LOGIN = true;");
- MusicCore.nonKeyRelatedPut(queryObject, consistency);
- queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("GRANT ALL PERMISSIONS on KEYSPACE " + keyspaceName
- + " to '" + userId + "'");
- queryObject.appendQueryString(";");
- MusicCore.nonKeyRelatedPut(queryObject, consistency);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- }
-
- try {
- boolean isAAF = Boolean.valueOf(CachingUtil.isAAFApplication(ns));
- String hashedpwd = BCrypt.hashpw(password, BCrypt.gensalt());
- queryObject = new PreparedQueryObject();
- queryObject.appendQueryString(
- "INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), aid));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspaceName));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), ns));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- queryObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- CachingUtil.updateMusicCache(keyspaceName, ns);
- CachingUtil.updateMusicValidateCache(ns, userId, hashedpwd);
- MusicCore.eventualPut(queryObject);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Response.Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
-
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Keyspace " + keyspaceName + " Created").toMap()).build();
- } else {
- String vError = "Keyspace Creation no longer supported after versions 3.2.x. Contact DBA to create the keyspace.";
- logger.info(EELFLoggerDelegate.applicationLogger,vError);
- logger.error(EELFLoggerDelegate.errorLogger,vError, AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Response.Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(vError).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
-
- }
-
- /**
- *
- * @param kspObject
- * @param keyspaceName
- * @return
- * @throws Exception
- */
- @DELETE
- @Path("/{name}")
- @ApiOperation(value = "Delete Keyspace", response = String.class,hidden=true)
- @Produces(MediaType.APPLICATION_JSON)
- public Response dropKeySpace(
- @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Application namespace",required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Keyspace Name",required = true) @PathParam("name") String keyspaceName) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- logger.info(EELFLoggerDelegate.applicationLogger,"In Drop Keyspace " + keyspaceName);
- if ( KEYSPACE_ACTIVE ) {
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.DROP_KEYSPACE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String consistency = MusicUtil.EVENTUAL;// for now this needs only
- // eventual
- // consistency
- String appName = CachingUtil.getAppName(keyspaceName);
- String uuid = CachingUtil.getUuidFromMusicCache(keyspaceName);
- PreparedQueryObject pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "select count(*) as count from admin.keyspace_master where application_name=? allow filtering;");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- Row row = MusicCore.get(pQuery).one();
- long count = row.getLong(0);
-
- if (count == 0) {
- logger.error(EELFLoggerDelegate.errorLogger,"Keyspace not found. Please make sure keyspace exists.", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Keyspace not found. Please make sure keyspace exists.").toMap()).build();
- // Admin Functions:
- } else if (count == 1) {
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString(
- "UPDATE admin.keyspace_master SET keyspace_name=? where uuid = ?;");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.text(),
- MusicUtil.DEFAULTKEYSPACENAME));
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- MusicCore.nonKeyRelatedPut(pQuery, consistency);
- } else {
- pQuery = new PreparedQueryObject();
- pQuery.appendQueryString("delete from admin.keyspace_master where uuid = ?");
- pQuery.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- MusicCore.nonKeyRelatedPut(pQuery, consistency);
- }
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- queryObject.appendQueryString("DROP KEYSPACE " + keyspaceName + ";");
- ResultType result = MusicCore.nonKeyRelatedPut(queryObject, consistency);
- if ( result.equals(ResultType.FAILURE) ) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError("Error Deleteing Keyspace " + keyspaceName).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("Keyspace " + keyspaceName + " Deleted").toMap()).build();
- } else {
- String vError = "Keyspace Droping no longer supported after versions 3.2.x. Contact DBA to drop the keyspace.";
- logger.info(EELFLoggerDelegate.applicationLogger,vError);
- logger.error(EELFLoggerDelegate.errorLogger,vError, AppMessages.UNKNOWNERROR,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Response.Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(vError).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param tableObj
- * @param version
- * @param keyspace
- * @param tablename
- * @param headers
- * @return
- * @throws Exception
- */
- @POST
- @Path("/{keyspace: .*}/tables/{tablename: .*}")
- @ApiOperation(value = "Create Table", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- @ApiResponses(value={
- @ApiResponse(code= 400, message = "Will return JSON response with message"),
- @ApiResponse(code= 401, message = "Unautorized User")
- })
- public Response createTable(
- @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonTable tableObj,
- @ApiParam(value = "Keyspace Name",required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",required = true) @PathParam("tablename") String tablename) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if(keyspace == null || keyspace.isEmpty() || tablename == null || tablename.isEmpty()){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("One or more path parameters are not set, please check and try again."
- + "Parameter values: keyspace='" + keyspace + "' tablename='" + tablename + "'")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.CREATE_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String consistency = MusicUtil.EVENTUAL;
- // for now this needs only eventual consistency
-
- String primaryKey = null;
- String partitionKey = tableObj.getPartitionKey();
- String clusterKey = tableObj.getClusteringKey();
- String filteringKey = tableObj.getFilteringKey();
- if(filteringKey != null) {
- clusterKey = clusterKey + "," + filteringKey;
- }
- primaryKey = tableObj.getPrimaryKey(); // get primaryKey if available
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- // first read the information about the table fields
- Map<String, String> fields = tableObj.getFields();
- StringBuilder fieldsString = new StringBuilder("(vector_ts text,");
- int counter = 0;
- for (Map.Entry<String, String> entry : fields.entrySet()) {
- if (entry.getKey().equals("PRIMARY KEY")) {
- primaryKey = entry.getValue(); // replaces primaryKey
- primaryKey = primaryKey.trim();
- } else {
- if (counter == 0 ) fieldsString.append("" + entry.getKey() + " " + entry.getValue() + "");
- else fieldsString.append("," + entry.getKey() + " " + entry.getValue() + "");
- }
-
- if (counter != (fields.size() - 1) ) {
-
- counter = counter + 1;
- } else {
-
- if((primaryKey != null) && (partitionKey == null)) {
- primaryKey = primaryKey.trim();
- int count1 = StringUtils.countMatches(primaryKey, ')');
- int count2 = StringUtils.countMatches(primaryKey, '(');
- if (count1 != count2) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("Create Table Error: primary key '(' and ')' do not match, primary key=" + primaryKey)
- .toMap()).build();
- }
-
- if ( primaryKey.indexOf('(') == -1 || ( count2 == 1 && (primaryKey.lastIndexOf(')') +1) == primaryKey.length() ) )
- {
- if (primaryKey.contains(",") ) {
- partitionKey= primaryKey.substring(0,primaryKey.indexOf(','));
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- clusterKey=primaryKey.substring(primaryKey.indexOf(',')+1); // make sure index
- clusterKey=clusterKey.replaceAll("[)]+", "");
- } else {
- partitionKey=primaryKey;
- partitionKey=partitionKey.replaceAll("[\\)]+","");
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- clusterKey="";
- }
- } else { // not null and has ) before the last char
- partitionKey= primaryKey.substring(0,primaryKey.indexOf(')'));
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- partitionKey = partitionKey.trim();
- clusterKey= primaryKey.substring(primaryKey.indexOf(')'));
- clusterKey=clusterKey.replaceAll("[\\(]+","");
- clusterKey=clusterKey.replaceAll("[\\)]+","");
- clusterKey = clusterKey.trim();
- if (clusterKey.indexOf(',') == 0) clusterKey=clusterKey.substring(1);
- clusterKey = clusterKey.trim();
- if (clusterKey.equals(",") ) clusterKey=""; // print error if needed ( ... ),)
- }
-
- if (!(partitionKey.isEmpty() || clusterKey.isEmpty())
- && (partitionKey.equalsIgnoreCase(clusterKey) ||
- clusterKey.contains(partitionKey) || partitionKey.contains(clusterKey)) )
- {
- logger.error("DataAPI createTable partition/cluster key ERROR: partitionKey="+partitionKey+", clusterKey=" + clusterKey + " and primary key=" + primaryKey );
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(
- "Create Table primary key error: clusterKey(" + clusterKey + ") equals/contains/overlaps partitionKey(" +partitionKey+ ") of"
- + " primary key=" + primaryKey)
- .toMap()).build();
-
- }
-
- if (partitionKey.isEmpty() ) primaryKey="";
- else if (clusterKey.isEmpty() ) primaryKey=" (" + partitionKey + ")";
- else primaryKey=" (" + partitionKey + ")," + clusterKey;
-
-
- if (primaryKey != null) fieldsString.append(", PRIMARY KEY (" + primaryKey + " )");
-
- } // end of length > 0
- else {
- if (!(partitionKey.isEmpty() || clusterKey.isEmpty())
- && (partitionKey.equalsIgnoreCase(clusterKey) ||
- clusterKey.contains(partitionKey) || partitionKey.contains(clusterKey)) )
- {
- logger.error("DataAPI createTable partition/cluster key ERROR: partitionKey="+partitionKey+", clusterKey=" + clusterKey);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(
- "Create Table primary key error: clusterKey(" + clusterKey + ") equals/contains/overlaps partitionKey(" +partitionKey+ ")")
- .toMap()).build();
- }
-
- if (partitionKey.isEmpty() ) primaryKey="";
- else if (clusterKey.isEmpty() ) primaryKey=" (" + partitionKey + ")";
- else primaryKey=" (" + partitionKey + ")," + clusterKey;
-
-
- if (primaryKey != null) fieldsString.append(", PRIMARY KEY (" + primaryKey + " )");
- }
- fieldsString.append(")");
-
- } // end of last field check
-
- } // end of for each
- // information about the name-value style properties
- Map<String, Object> propertiesMap = tableObj.getProperties();
- StringBuilder propertiesString = new StringBuilder();
- if (propertiesMap != null) {
- counter = 0;
- for (Map.Entry<String, Object> entry : propertiesMap.entrySet()) {
- Object ot = entry.getValue();
- String value = ot + "";
- if (ot instanceof String) {
- value = "'" + value + "'";
- } else if (ot instanceof Map) {
- @SuppressWarnings("unchecked")
- Map<String, Object> otMap = (Map<String, Object>) ot;
- value = "{" + MusicUtil.jsonMaptoSqlString(otMap, ",") + "}";
- }
-
- propertiesString.append(entry.getKey() + "=" + value + "");
- if (counter != propertiesMap.size() - 1)
- propertiesString.append(" AND ");
-
- counter = counter + 1;
- }
- }
-
- String clusteringOrder = tableObj.getClusteringOrder();
-
- if (clusteringOrder != null && !(clusteringOrder.isEmpty())) {
- String[] arrayClusterOrder = clusteringOrder.split("[,]+");
-
- for (int i = 0; i < arrayClusterOrder.length; i++) {
- String[] clusterS = arrayClusterOrder[i].trim().split("[ ]+");
- if ( (clusterS.length ==2) && (clusterS[1].equalsIgnoreCase("ASC") || clusterS[1].equalsIgnoreCase("DESC"))) {
- continue;
- } else {
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("createTable/Clustering Order vlaue ERROR: valid clustering order is ASC or DESC or expecting colname order; please correct clusteringOrder:"+ clusteringOrder+".")
- .toMap()).build();
- }
- // add validation for column names in cluster key
- }
-
- if (!(clusterKey.isEmpty())) {
- clusteringOrder = "CLUSTERING ORDER BY (" +clusteringOrder +")";
- //cjc check if propertiesString.length() >0 instead propertiesMap
- if (propertiesMap != null) {
- propertiesString.append(" AND "+ clusteringOrder);
- } else {
- propertiesString.append(clusteringOrder);
- }
- } else {
- logger.warn("Skipping clustering order=("+clusteringOrder+ ") since clustering key is empty ");
- }
- } //if non empty
-
- queryObject.appendQueryString(
- "CREATE TABLE " + keyspace + "." + tablename + " " + fieldsString);
-
-
- if (propertiesString != null && propertiesString.length()>0 )
- queryObject.appendQueryString(" WITH " + propertiesString);
- queryObject.appendQueryString(";");
- ResultType result = ResultType.FAILURE;
- try {
- result = MusicCore.createTable(keyspace, tablename, queryObject, consistency);
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.MUSICSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- if ( result.equals(ResultType.FAILURE) ) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError("Error Creating Table " + tablename).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setMessage("TableName " + tablename.trim() + " Created under keyspace " + keyspace.trim()).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @param fieldName
- * @param info
- * @throws Exception
- */
- @POST
- @Path("/{keyspace: .*}/tables/{tablename: .*}/index/{field: .*}")
- @ApiOperation(value = "Create Index", response = String.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response createIndex(
- @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Keyspace Name",required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",required = true) @PathParam("tablename") String tablename,
- @ApiParam(value = "Field Name",required = true) @PathParam("field") String fieldName,
- @Context UriInfo info) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty()) || (fieldName == null || fieldName.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.CREATE_INDEX)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- MultivaluedMap<String, String> rowParams = info.getQueryParameters();
- String indexName = "";
- if (rowParams.getFirst("index_name") != null)
- indexName = rowParams.getFirst("index_name");
- PreparedQueryObject query = new PreparedQueryObject();
- query.appendQueryString("Create index if not exists " + indexName + " on " + keyspace + "."
- + tablename + " (" + fieldName + ");");
-
- ResultType result = ResultType.FAILURE;
- try {
- result = MusicCore.nonKeyRelatedPut(query, "eventual");
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- if ( result.equals(ResultType.SUCCESS) ) {
- return response.status(Status.OK).entity(new JsonResponse(result).setMessage("Index Created on " + keyspace+"."+tablename+"."+fieldName).toMap()).build();
- } else {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result).setError("Unknown Error in create index.").toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param insObj
- * @param keyspace
- * @param tablename
- * @return
- * @throws Exception
- */
- @POST
- @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
- @ApiOperation(value = "Insert Into Table", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response insertIntoTable(
- @ApiParam(value = "Major Version",required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonInsert insObj,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename) {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.INSERT_INTO_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- Map<String, Object> valuesMap = insObj.getValues();
- PreparedQueryObject queryObject = new PreparedQueryObject();
- TableMetadata tableInfo = null;
- try {
- tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
- if(tableInfo == null) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Table name doesn't exists. Please check the table name.").toMap()).build();
- }
- } catch (MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger, e, AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
- String primaryKeyName = tableInfo.getPrimaryKey().get(0).getName();
- StringBuilder fieldsString = new StringBuilder("(vector_ts,");
- String vectorTs =
- String.valueOf(Thread.currentThread().getId() + System.currentTimeMillis());
- StringBuilder valueString = new StringBuilder("(" + "?" + ",");
- queryObject.addValue(vectorTs);
- int counter = 0;
- String primaryKey = "";
- Map<String, byte[]> objectMap = insObj.getObjectMap();
- for (Map.Entry<String, Object> entry : valuesMap.entrySet()) {
- fieldsString.append("" + entry.getKey());
- Object valueObj = entry.getValue();
- if (primaryKeyName.equals(entry.getKey())) {
- primaryKey = entry.getValue() + "";
- primaryKey = primaryKey.replace("'", "''");
- }
- DataType colType = null;
- try {
- colType = tableInfo.getColumn(entry.getKey()).getType();
- } catch(NullPointerException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() +" Invalid column name : "+entry.getKey(), AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Invalid column name : "+entry.getKey()).toMap()).build();
- }
-
- Object formattedValue = null;
- try {
- formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e);
- }
- valueString.append("?");
-
- queryObject.addValue(formattedValue);
-
- if (counter == valuesMap.size() - 1) {
- fieldsString.append(")");
- valueString.append(")");
- } else {
- fieldsString.append(",");
- valueString.append(",");
- }
- counter = counter + 1;
- }
-
- //blobs..
- if(objectMap != null) {
- for (Map.Entry<String, byte[]> entry : objectMap.entrySet()) {
- if(counter > 0) {
- fieldsString.replace(fieldsString.length()-1, fieldsString.length(), ",");
- valueString.replace(valueString.length()-1, valueString.length(), ",");
- }
- fieldsString.append("" + entry.getKey());
- byte[] valueObj = entry.getValue();
- if (primaryKeyName.equals(entry.getKey())) {
- primaryKey = entry.getValue() + "";
- primaryKey = primaryKey.replace("'", "''");
- }
-
- DataType colType = tableInfo.getColumn(entry.getKey()).getType();
-
- ByteBuffer formattedValue = null;
-
- if(colType.toString().toLowerCase().contains("blob"))
- formattedValue = MusicUtil.convertToActualDataType(colType, valueObj);
-
- valueString.append("?");
-
- queryObject.addValue(formattedValue);
- counter = counter + 1;
- /*if (counter == valuesMap.size() - 1) {
- fieldsString.append(")");
- valueString.append(")");
- } else {*/
- fieldsString.append(",");
- valueString.append(",");
- //}
- } }
-
- if(primaryKey == null || primaryKey.length() <= 0) {
- logger.error(EELFLoggerDelegate.errorLogger, "Some required partition key parts are missing: "+primaryKeyName );
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR).setError("Some required partition key parts are missing: "+primaryKeyName).toMap()).build();
- }
-
- fieldsString.replace(fieldsString.length()-1, fieldsString.length(), ")");
- valueString.replace(valueString.length()-1, valueString.length(), ")");
-
- queryObject.appendQueryString("INSERT INTO " + keyspace + "." + tablename + " "
- + fieldsString + " VALUES " + valueString);
-
- String ttl = insObj.getTtl();
- String timestamp = insObj.getTimestamp();
-
- if ((ttl != null) && (timestamp != null)) {
- logger.info(EELFLoggerDelegate.applicationLogger, "both there");
- queryObject.appendQueryString(" USING TTL ? AND TIMESTAMP ?");
- queryObject.addValue(Integer.parseInt(ttl));
- queryObject.addValue(Long.parseLong(timestamp));
- }
-
- if ((ttl != null) && (timestamp == null)) {
- logger.info(EELFLoggerDelegate.applicationLogger, "ONLY TTL there");
- queryObject.appendQueryString(" USING TTL ?");
- queryObject.addValue(Integer.parseInt(ttl));
- }
-
- if ((ttl == null) && (timestamp != null)) {
- logger.info(EELFLoggerDelegate.applicationLogger, "ONLY timestamp there");
- queryObject.appendQueryString(" USING TIMESTAMP ?");
- queryObject.addValue(Long.parseLong(timestamp));
- }
-
- queryObject.appendQueryString(";");
-
- ReturnType result = null;
- String consistency = insObj.getConsistencyInfo().get("type");
- if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && insObj.getConsistencyInfo().get("consistency") != null) {
- if(MusicUtil.isValidConsistency(insObj.getConsistencyInfo().get("consistency")))
- queryObject.setConsistency(insObj.getConsistencyInfo().get("consistency"));
- else
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR).setError("Invalid Consistency type").toMap()).build();
- }
- queryObject.setOperation("insert");
- try {
- if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL)) {
- result = MusicCore.eventualPut(queryObject);
- } else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
- String lockId = insObj.getConsistencyInfo().get("lockId");
- if(lockId == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
- + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
- + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
- }
- result = MusicCore.criticalPut(keyspace, tablename, primaryKey, queryObject, lockId,null);
- } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
-
- result = MusicCore.atomicPut(keyspace, tablename, primaryKey, queryObject, null);
-
- }
- } catch (Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
-
- if (result==null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
- }else if(result.getResult() == ResultType.FAILURE) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(result.getResult()).setError(result.getMessage()).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(result.getResult()).setMessage("Insert Successful").toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param insObj
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws MusicServiceException
- * @throws MusicQueryException
- * @throws Exception
- */
- @PUT
- @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
- @ApiOperation(value = "Update Table", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response updateTable(
- @ApiParam(value = "Major Version",
- required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonUpdate updateObj,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename,
- @Context UriInfo info) throws MusicQueryException, MusicServiceException {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.UPDATE_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- long startTime = System.currentTimeMillis();
- String operationId = UUID.randomUUID().toString();// just for infoging
- // purposes.
- String consistency = updateObj.getConsistencyInfo().get("type");
-
- logger.info(EELFLoggerDelegate.applicationLogger, "--------------Music " + consistency
- + " update-" + operationId + "-------------------------");
- // obtain the field value pairs of the update
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- Map<String, Object> valuesMap = updateObj.getValues();
-
- TableMetadata tableInfo;
- try {
- tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
- } catch (MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
- if (tableInfo == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Table information not found. Please check input for table name= "+tablename, AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.AUTHENTICATIONERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("Table information not found. Please check input for table name= "
- + keyspace + "." + tablename).toMap()).build();
- }
- String vectorTs =
- String.valueOf(Thread.currentThread().getId() + System.currentTimeMillis());
- StringBuilder fieldValueString = new StringBuilder("vector_ts=?,");
- queryObject.addValue(vectorTs);
- int counter = 0;
- for (Map.Entry<String, Object> entry : valuesMap.entrySet()) {
- Object valueObj = entry.getValue();
- DataType colType = null;
- try {
- colType = tableInfo.getColumn(entry.getKey()).getType();
- } catch(NullPointerException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex, "Invalid column name : "+entry.getKey());
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Invalid column name : "+entry.getKey()).toMap()).build();
- }
- Object valueString = null;
- try {
- valueString = MusicUtil.convertToActualDataType(colType, valueObj);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e);
- }
- fieldValueString.append(entry.getKey() + "= ?");
- queryObject.addValue(valueString);
- if (counter != valuesMap.size() - 1)
- fieldValueString.append(",");
- counter = counter + 1;
- }
- String ttl = updateObj.getTtl();
- String timestamp = updateObj.getTimestamp();
-
- queryObject.appendQueryString("UPDATE " + keyspace + "." + tablename + " ");
- if ((ttl != null) && (timestamp != null)) {
-
- logger.info("both there");
- queryObject.appendQueryString(" USING TTL ? AND TIMESTAMP ?");
- queryObject.addValue(Integer.parseInt(ttl));
- queryObject.addValue(Long.parseLong(timestamp));
- }
-
- if ((ttl != null) && (timestamp == null)) {
- logger.info("ONLY TTL there");
- queryObject.appendQueryString(" USING TTL ?");
- queryObject.addValue(Integer.parseInt(ttl));
- }
-
- if ((ttl == null) && (timestamp != null)) {
- logger.info("ONLY timestamp there");
- queryObject.appendQueryString(" USING TIMESTAMP ?");
- queryObject.addValue(Long.parseLong(timestamp));
- }
- // get the row specifier
- RowIdentifier rowId = null;
- try {
- rowId = getRowIdentifier(keyspace, tablename, info.getQueryParameters(), queryObject);
- if(rowId == null || rowId.primarKeyValue.isEmpty()) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("Mandatory WHERE clause is missing. Please check the input request.").toMap()).build();
- }
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
-
- queryObject.appendQueryString(
- " SET " + fieldValueString + " WHERE " + rowId.rowIdString + ";");
-
- // get the conditional, if any
- Condition conditionInfo;
- if (updateObj.getConditions() == null)
- conditionInfo = null;
- else {// to avoid parsing repeatedly, just send the select query to
- // obtain row
- PreparedQueryObject selectQuery = new PreparedQueryObject();
- selectQuery.appendQueryString("SELECT * FROM " + keyspace + "." + tablename + " WHERE "
- + rowId.rowIdString + ";");
- selectQuery.addValue(rowId.primarKeyValue);
- conditionInfo = new Condition(updateObj.getConditions(), selectQuery);
- }
-
- ReturnType operationResult = null;
- long jsonParseCompletionTime = System.currentTimeMillis();
-
- if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && updateObj.getConsistencyInfo().get("consistency") != null) {
- if(MusicUtil.isValidConsistency(updateObj.getConsistencyInfo().get("consistency")))
- queryObject.setConsistency(updateObj.getConsistencyInfo().get("consistency"));
- else
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR).setError("Invalid Consistency type").toMap()).build();
- }
- queryObject.setOperation("update");
- if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL))
- operationResult = MusicCore.eventualPut(queryObject);
- else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
- String lockId = updateObj.getConsistencyInfo().get("lockId");
- if(lockId == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
- + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
- + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
- }
- operationResult = MusicCore.criticalPut(keyspace, tablename, rowId.primarKeyValue,
- queryObject, lockId, conditionInfo);
- } else if (consistency.equalsIgnoreCase("atomic_delete_lock")) {
- // this function is mainly for the benchmarks
- try {
- operationResult = MusicCore.atomicPutWithDeleteLock(keyspace, tablename,
- rowId.primarKeyValue, queryObject, conditionInfo);
- } catch (MusicLockingException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
- } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
- try {
- operationResult = MusicCore.atomicPut(keyspace, tablename, rowId.primarKeyValue,
- queryObject, conditionInfo);
- } catch (MusicLockingException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
- }else if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL_NB)) {
- operationResult = MusicCore.eventualPut_nb(queryObject, keyspace, tablename, rowId.primarKeyValue);
- }
- long actualUpdateCompletionTime = System.currentTimeMillis();
-
- long endTime = System.currentTimeMillis();
- String timingString = "Time taken in ms for Music " + consistency + " update-" + operationId
- + ":" + "|total operation time:" + (endTime - startTime)
- + "|json parsing time:" + (jsonParseCompletionTime - startTime)
- + "|update time:" + (actualUpdateCompletionTime - jsonParseCompletionTime)
- + "|";
-
- if (operationResult != null && operationResult.getTimingInfo() != null) {
- String lockManagementTime = operationResult.getTimingInfo();
- timingString = timingString + lockManagementTime;
- }
- logger.info(EELFLoggerDelegate.applicationLogger, timingString);
-
- if (operationResult==null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
- }
- if ( operationResult.getResult() == ResultType.SUCCESS ) {
- return response.status(Status.OK).entity(new JsonResponse(operationResult.getResult()).setMessage(operationResult.getMessage()).toMap()).build();
- } else {
- logger.error(EELFLoggerDelegate.errorLogger,operationResult.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(operationResult.getResult()).setError(operationResult.getMessage()).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param delObj
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws MusicServiceException
- * @throws MusicQueryException
- * @throws Exception
- */
- @DELETE
- @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
- @ApiOperation(value = "Delete From table", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response deleteFromTable(
- @ApiParam(value = "Major Version",
- required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonDelete delObj,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename,
- @Context UriInfo info) throws MusicQueryException, MusicServiceException {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.DELETE_FROM_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- if(delObj == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Required HTTP Request body is missing.", AppMessages.MISSINGDATA ,ErrorSeverity.WARN, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Required HTTP Request body is missing.").toMap()).build();
- }
- PreparedQueryObject queryObject = new PreparedQueryObject();
- StringBuilder columnString = new StringBuilder();
-
- int counter = 0;
- List<String> columnList = delObj.getColumns();
- if (columnList != null) {
- for (String column : columnList) {
- columnString.append(column);
- if (counter != columnList.size() - 1)
- columnString.append(",");
- counter = counter + 1;
- }
- }
-
- // get the row specifier
- RowIdentifier rowId = null;
- try {
- rowId = getRowIdentifier(keyspace, tablename, info.getQueryParameters(), queryObject);
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- String rowSpec = rowId.rowIdString.toString();
-
- if ((columnList != null) && (!rowSpec.isEmpty())) {
- queryObject.appendQueryString("DELETE " + columnString + " FROM " + keyspace + "."
- + tablename + " WHERE " + rowSpec + ";");
- }
-
- if ((columnList == null) && (!rowSpec.isEmpty())) {
- queryObject.appendQueryString("DELETE FROM " + keyspace + "." + tablename + " WHERE "
- + rowSpec + ";");
- }
-
- if ((columnList != null) && (rowSpec.isEmpty())) {
- queryObject.appendQueryString(
- "DELETE " + columnString + " FROM " + keyspace + "." + rowSpec + ";");
- }
- // get the conditional, if any
- Condition conditionInfo;
- if (delObj.getConditions() == null)
- conditionInfo = null;
- else {// to avoid parsing repeatedly, just send the select query to
- // obtain row
- PreparedQueryObject selectQuery = new PreparedQueryObject();
- selectQuery.appendQueryString("SELECT * FROM " + keyspace + "." + tablename + " WHERE "
- + rowId.rowIdString + ";");
- selectQuery.addValue(rowId.primarKeyValue);
- conditionInfo = new Condition(delObj.getConditions(), selectQuery);
- }
-
- String consistency = delObj.getConsistencyInfo().get("type");
-
-
- if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL) && delObj.getConsistencyInfo().get("consistency")!=null) {
-
- if(MusicUtil.isValidConsistency(delObj.getConsistencyInfo().get("consistency")))
- queryObject.setConsistency(delObj.getConsistencyInfo().get("consistency"));
- else
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.SYNTAXERROR).setError("Invalid Consistency type").toMap()).build();
- }
-
- ReturnType operationResult = null;
- queryObject.setOperation("delete");
- try {
- if (consistency.equalsIgnoreCase(MusicUtil.EVENTUAL))
- operationResult = MusicCore.eventualPut(queryObject);
- else if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
- String lockId = delObj.getConsistencyInfo().get("lockId");
- if(lockId == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
- + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
- + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
- }
- operationResult = MusicCore.criticalPut(keyspace, tablename, rowId.primarKeyValue,
- queryObject, lockId, conditionInfo);
- } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
- operationResult = MusicCore.atomicPut(keyspace, tablename, rowId.primarKeyValue,
- queryObject, conditionInfo);
- } else if(consistency.equalsIgnoreCase(MusicUtil.EVENTUAL_NB)) {
-
- operationResult = MusicCore.eventualPut_nb(queryObject, keyspace, tablename, rowId.primarKeyValue);
- }
- } catch (MusicLockingException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unable to perform Delete operation. Exception from music").toMap()).build();
- }
- if (operationResult==null) {
- logger.error(EELFLoggerDelegate.errorLogger,"Null result - Please Contact admin", AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Null result - Please Contact admin").toMap()).build();
- }
- if (operationResult.getResult().equals(ResultType.SUCCESS)) {
- return response.status(Status.OK).entity(new JsonResponse(operationResult.getResult()).setMessage(operationResult.getMessage()).toMap()).build();
- } else {
- logger.error(EELFLoggerDelegate.errorLogger,operationResult.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(operationResult.getMessage()).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param tabObj
- * @param keyspace
- * @param tablename
- * @throws Exception
- */
- @DELETE
- @Path("/{keyspace: .*}/tables/{tablename: .*}")
- @ApiOperation(value = "Drop Table", response = String.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response dropTable(
- @ApiParam(value = "Major Version",
- required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.DROP_TABLE)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String consistency = "eventual";// for now this needs only eventual
- // consistency
- PreparedQueryObject query = new PreparedQueryObject();
- query.appendQueryString("DROP TABLE " + keyspace + "." + tablename + ";");
- try {
- return response.status(Status.OK).entity(new JsonResponse(MusicCore.nonKeyRelatedPut(query, consistency)).toMap()).build();
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.MISSINGINFO ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param selObj
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- */
- @PUT
- @Path("/{keyspace: .*}/tables/{tablename: .*}/rows/criticalget")
- @ApiOperation(value = "Select Critical", response = Map.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response selectCritical(
- @ApiParam(value = "Major Version",
- required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonInsert selObj,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename,
- @Context UriInfo info) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.SELECT_CRITICAL)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String lockId = selObj.getConsistencyInfo().get("lockId");
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
-
- RowIdentifier rowId = null;
- try {
- rowId = getRowIdentifier(keyspace, tablename, info.getQueryParameters(), queryObject);
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- queryObject.appendQueryString(
- "SELECT * FROM " + keyspace + "." + tablename + " WHERE " + rowId.rowIdString + ";");
-
- ResultSet results = null;
-
- String consistency = selObj.getConsistencyInfo().get("type");
-
- if (consistency.equalsIgnoreCase(MusicUtil.CRITICAL)) {
- if(lockId == null) {
- logger.error(EELFLoggerDelegate.errorLogger,"LockId cannot be null. Create lock reference or"
- + " use ATOMIC instead of CRITICAL", ErrorSeverity.FATAL, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("LockId cannot be null. Create lock "
- + "and acquire lock or use ATOMIC instead of CRITICAL").toMap()).build();
- }
- results = MusicCore.criticalGet(keyspace, tablename, rowId.primarKeyValue, queryObject,
- lockId);
- } else if (consistency.equalsIgnoreCase(MusicUtil.ATOMIC)) {
- results = MusicCore.atomicGet(keyspace, tablename, rowId.primarKeyValue, queryObject);
- }
- if(results!=null && results.getAvailableWithoutFetching() >0) {
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setError("No data found").toMap()).build();
-
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws Exception
- */
- @GET
- @Path("/{keyspace: .*}/tables/{tablename: .*}/rows")
- @ApiOperation(value = "Select All or Select Specific", response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response select(
- @ApiParam(value = "Major Version",
- required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam(NS) String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Keyspace Name",
- required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name",
- required = true) @PathParam("tablename") String tablename,
- @Context UriInfo info) throws Exception {
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- if((keyspace == null || keyspace.isEmpty()) || (tablename == null || tablename.isEmpty())){
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("one or more path parameters are not set, please check and try again")
- .toMap()).build();
- }
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspace+" ) ");
- if (!authenticator.authenticateUser(ns, authorization, keyspace, aid, Operation.SELECT)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
-
- if (info.getQueryParameters().isEmpty())// select all
- queryObject.appendQueryString("SELECT * FROM " + keyspace + "." + tablename + ";");
- else {
- int limit = -1; // do not limit the number of results
- try {
- queryObject = selectSpecificQuery(keyspace, tablename, info, limit);
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- }
-
- try {
- ResultSet results = MusicCore.get(queryObject);
- if(results.getAvailableWithoutFetching() >0) {
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).setDataResult(MusicDataStoreHandle.marshallResults(results)).setError("No data found").toMap()).build();
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex, AppMessages.UNKNOWNERROR ,ErrorSeverity.ERROR, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @param info
- * @param limit
- * @return
- * @throws MusicServiceException
- */
- public PreparedQueryObject selectSpecificQuery(String keyspace,
- String tablename, UriInfo info, int limit)
- throws MusicServiceException {
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- StringBuilder rowIdString = getRowIdentifier(keyspace, tablename, info.getQueryParameters(),
- queryObject).rowIdString;
-
- queryObject.appendQueryString(
- "SELECT * FROM " + keyspace + "." + tablename + " WHERE " + rowIdString);
-
- if (limit != -1) {
- queryObject.appendQueryString(" LIMIT " + limit);
- }
-
- queryObject.appendQueryString(";");
- return queryObject;
-
- }
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @param rowParams
- * @param queryObject
- * @return
- * @throws MusicServiceException
- */
- private RowIdentifier getRowIdentifier(String keyspace, String tablename,
- MultivaluedMap<String, String> rowParams, PreparedQueryObject queryObject)
- throws MusicServiceException {
- StringBuilder rowSpec = new StringBuilder();
- int counter = 0;
- TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, tablename);
- if (tableInfo == null) {
- logger.error(EELFLoggerDelegate.errorLogger,
- "Table information not found. Please check input for table name= "
- + keyspace + "." + tablename);
- throw new MusicServiceException(
- "Table information not found. Please check input for table name= "
- + keyspace + "." + tablename);
- }
- StringBuilder primaryKey = new StringBuilder();
- for (MultivaluedMap.Entry<String, List<String>> entry : rowParams.entrySet()) {
- String keyName = entry.getKey();
- List<String> valueList = entry.getValue();
- String indValue = valueList.get(0);
- DataType colType = null;
- Object formattedValue = null;
- try {
- colType = tableInfo.getColumn(entry.getKey()).getType();
- formattedValue = MusicUtil.convertToActualDataType(colType, indValue);
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e);
- }
- if(tableInfo.getPrimaryKey().get(0).getName().equals(entry.getKey()))
- primaryKey.append(indValue);
- rowSpec.append(keyName + "= ?");
- queryObject.addValue(formattedValue);
- if (counter != rowParams.size() - 1)
- rowSpec.append(" AND ");
- counter = counter + 1;
- }
- return new RowIdentifier(primaryKey.toString(), rowSpec, queryObject);
- }
-}
diff --git a/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java b/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java
deleted file mode 100644
index 943f4ca8..00000000
--- a/src/main/java/org/onap/music/rest/RestMusicLocksAPI.java
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.rest;
-
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-
-import org.onap.music.authentication.MusicAAFAuthentication;
-import org.onap.music.authentication.MusicAuthenticator;
-import org.onap.music.authentication.MusicAuthenticator.Operation;
-import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.lockingservice.cassandra.MusicLockState;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.main.ResultType;
-import org.onap.music.main.ReturnType;
-import org.onap.music.response.jsonobjects.JsonResponse;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-
-
-@Path("/v2/locks/")
-@Api(value="Lock Api")
-public class RestMusicLocksAPI {
-
- private EELFLoggerDelegate logger =EELFLoggerDelegate.getLogger(RestMusicLocksAPI.class);
- private static final String XMINORVERSION = "X-minorVersion";
- private static final String XPATCHVERSION = "X-patchVersion";
- private static final String VERSION = "v2";
-
- private MusicAuthenticator authenticator = new MusicAAFAuthentication();
-
- /**
- * Puts the requesting process in the q for this lock. The corresponding
- * node will be created if it did not already exist
- *
- * @param lockName
- * @return
- * @throws Exception
- */
- @POST
- @Path("/create/{lockname}")
- @ApiOperation(value = "Create Lock",
- notes = "Puts the requesting process in the q for this lock." +
- " The corresponding lock will be created if it did not already exist." +
- " Lock Name is the \"key\" of the form keyspaceName.tableName.rowId",
- response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response createLockReference(
- @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockName);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.MISSINGINFO ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
-
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.CREATE_LOCKREF)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- ResultType status = ResultType.SUCCESS;
- String lockId = MusicCore.createLockReference(lockName);
-
- if (lockId == null) {
- status = ResultType.FAILURE;
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.LOCKINGERROR ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(status).setError("Lock Id is null").toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(status).setLock(lockId).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * Checks if the node is in the top of the queue and hence acquires the lock
- *
- * @param lockId
- * @return
- * @throws Exception
- */
- @GET
- @Path("/acquire/{lockreference}")
- @ApiOperation(value = "Aquire Lock",
- notes = "Checks if the node is in the top of the queue and hence acquires the lock",
- response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response accquireLock(
- @ApiParam(value="Lock Reference",required=true) @PathParam("lockreference") String lockId,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockId);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
-
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
-
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.ACQUIRE_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- try {
- String lockName = lockId.substring(lockId.indexOf('$')+1, lockId.lastIndexOf('$'));
- ReturnType lockStatus = MusicCore.acquireLock(lockName,lockId);
- if ( lockStatus.getResult().equals(ResultType.SUCCESS)) {
- response.status(Status.OK);
- } else {
- response.status(Status.BAD_REQUEST);
- }
- return response.entity(new JsonResponse(lockStatus.getResult()).setLock(lockId).setMessage(lockStatus.getMessage()).toMap()).build();
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,AppMessages.INVALIDLOCK + lockId, ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError("Unable to aquire lock").toMap()).build();
- }
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
-
-
-
- @POST
- @Path("/acquire-with-lease/{lockreference}")
- @ApiOperation(value = "Aquire Lock with Lease", response = Map.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response accquireLockWithLease(JsonLeasedLock lockObj,
- @ApiParam(value="Lock Reference",required=true) @PathParam("lockreference") String lockId,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockId);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- resultMap.remove("keyspace");
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.ACQUIRE_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String lockName = lockId.substring(lockId.indexOf('$')+1, lockId.lastIndexOf('$'));
- ReturnType lockLeaseStatus = MusicCore.acquireLockWithLease(lockName, lockId, lockObj.getLeasePeriod());
- if ( lockLeaseStatus.getResult().equals(ResultType.SUCCESS)) {
- response.status(Status.OK);
- } else {
- response.status(Status.BAD_REQUEST);
- }
- return response.entity(new JsonResponse(lockLeaseStatus.getResult()).setLock(lockName)
- .setMessage(lockLeaseStatus.getMessage())
- .setLockLease(String.valueOf(lockObj.getLeasePeriod())).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
-
- @GET
- @Path("/enquire/{lockname}")
- @ApiOperation(value = "Get Lock Holder",
- notes = "Gets the current Lock Holder",
- response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response currentLockHolder(
- @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockName);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
-
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- resultMap.remove("keyspace");
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.CURRENT_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String who = MusicCore.whoseTurnIsIt(lockName);
- ResultType status = ResultType.SUCCESS;
- String error = "";
- if ( who == null ) {
- status = ResultType.FAILURE;
- error = "There was a problem getting the lock holder";
- logger.error(EELFLoggerDelegate.errorLogger,"There was a problem getting the lock holder", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- @GET
- @Path("/{lockname}")
- @ApiOperation(value = "Lock State",
- notes = "Returns current Lock State and Holder.",
- response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response currentLockState(
- @ApiParam(value="Lock Name",required=true) @PathParam("lockname") String lockName,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockName);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- resultMap.remove("keyspace");
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.CURRENT_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- String who = MusicCore.whoseTurnIsIt(lockName);
- ResultType status = ResultType.SUCCESS;
- String error = "";
- if ( who == null ) {
- status = ResultType.FAILURE;
- error = "There was a problem getting the lock holder";
- logger.error(EELFLoggerDelegate.errorLogger,"There was a problem getting the lock holder", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(status).setError(error).setLock(lockName).setLockHolder(who).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
-
- //MusicLockState mls = MusicZKCore.getMusicLockState(lockName);
-// Map<String,Object> returnMap = null;
-// JsonResponse jsonResponse = new JsonResponse(ResultType.FAILURE).setLock(lockName);
-// if(mls == null) {
-// jsonResponse.setError("");
-// jsonResponse.setMessage("No lock object created yet..");
-// logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
-// return response.status(Status.BAD_REQUEST).entity(jsonResponse.toMap()).build();
-// } else {
-// jsonResponse.setStatus(ResultType.SUCCESS);
-// jsonResponse.setLockStatus(mls.getLockStatus());
-// jsonResponse.setLockHolder(mls.getLockHolder());
-// return response.status(Status.OK).entity(jsonResponse.toMap()).build();
-// }
-
- }
-
- /**
- *
- * deletes the process from the zk queue
- *
- * @param lockId
- * @throws Exception
- */
- @DELETE
- @Path("/release/{lockreference}")
- @ApiOperation(value = "Release Lock",
- notes = "deletes the process from the zk queue",
- response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response unLock(@PathParam("lockreference") String lockId,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockId);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
-
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- resultMap.remove("keyspace");
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.DELETE_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- boolean voluntaryRelease = true;
- MusicLockState mls = MusicCore.releaseLock(lockId,voluntaryRelease);
- if(mls.getErrorMessage() != null) {
- resultMap.put(ResultType.EXCEPTION.getResult(), mls.getErrorMessage());
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.INCORRECTDATA ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST).entity(resultMap).build();
- }
- Map<String,Object> returnMap = null;
- if (mls.getLockStatus() == MusicLockState.LockStatus.UNLOCKED) {
- returnMap = new JsonResponse(ResultType.SUCCESS).setLock(lockId)
- .setLockStatus(mls.getLockStatus()).toMap();
- response.status(Status.OK);
- }
- if (mls.getLockStatus() == MusicLockState.LockStatus.LOCKED) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.LOCKINGERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- returnMap = new JsonResponse(ResultType.FAILURE).setLock(lockId)
- .setLockStatus(mls.getLockStatus()).toMap();
- response.status(Status.BAD_REQUEST);
- }
- return response.entity(returnMap).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
- /**
- *
- * @param lockName
- * @throws Exception
- */
- @DELETE
- @Path("/delete/{lockname}")
- @ApiOperation(value = "Delete Lock", response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- public Response deleteLock(@PathParam("lockname") String lockName,
- @ApiParam(value = "Minor Version",required = false) @HeaderParam(XMINORVERSION) String minorVersion,
- @ApiParam(value = "Patch Version",required = false) @HeaderParam(XPATCHVERSION) String patchVersion,
- @ApiParam(value = "AID", required = true) @HeaderParam("aid") String aid,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Application namespace",
- required = true) @HeaderParam("ns") String ns) throws Exception{
- try {
- ResponseBuilder response = MusicUtil.buildVersionResponse(VERSION, minorVersion, patchVersion);
- Map<String, Object> resultMap = MusicCore.validateLock(lockName);
- if (resultMap.containsKey("Error")) {
- logger.error(EELFLoggerDelegate.errorLogger,"", AppMessages.UNKNOWNERROR ,ErrorSeverity.CRITICAL, ErrorTypes.GENERALSERVICEERROR);
- response.status(Status.BAD_REQUEST);
- return response.entity(new JsonResponse(ResultType.FAILURE).setError(String.valueOf(resultMap.get("Error"))).toMap()).build();
- }
-
- String keyspaceName = (String) resultMap.get("keyspace");
- EELFLoggerDelegate.mdcPut("keyspace", "( "+keyspaceName+" ) ");
- resultMap.remove("keyspace");
- if (!authenticator.authenticateUser(ns, authorization, keyspaceName, aid, Operation.DELETE_LOCK)) {
- return response.status(Status.UNAUTHORIZED)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("Unauthorized: Please check username, password and make sure your app is onboarded")
- .toMap()).build();
- }
-
- try{
- MusicCore.deleteLock(lockName);
- }catch (Exception e) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE).setError(e.getMessage()).toMap()).build();
- }
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS).toMap()).build();
- } finally {
- EELFLoggerDelegate.mdcRemove("keyspace");
- }
- }
-
-}
diff --git a/src/main/java/org/onap/music/rest/RestMusicQAPI.java b/src/main/java/org/onap/music/rest/RestMusicQAPI.java
deleted file mode 100755
index 676730e0..00000000
--- a/src/main/java/org/onap/music/rest/RestMusicQAPI.java
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (C) 2019 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.rest;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import javax.ws.rs.core.Response.Status;
-import org.onap.music.datastore.jsonobjects.JsonDelete;
-import org.onap.music.datastore.jsonobjects.JsonInsert;
-import org.onap.music.datastore.jsonobjects.JsonTable;
-import org.onap.music.datastore.jsonobjects.JsonUpdate;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.apache.commons.lang3.StringUtils;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.datastore.PreparedQueryObject;
-import com.datastax.driver.core.ResultSet;
-import org.onap.music.exceptions.MusicQueryException;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.main.ResultType;
-import org.onap.music.response.jsonobjects.JsonResponse;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-
-@Path("/v2/priorityq/")
-@Api(value = "Q Api")
-public class RestMusicQAPI {
-
- private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(RestMusicQAPI.class);
-
-
- /**
- *
- * @param tableObj
- * @param keyspace
- * @param tablename
- * @throws Exception
- */
-
- @POST
- @Path("/keyspaces/{keyspace}/{qname}") // qname same as tablename
- @ApiOperation(value = "Create Q", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response createQ(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonTable tableObj,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename) throws Exception {
- ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
-
- Map<String, String> fields = tableObj.getFields();
- if (fields == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ/Required table fields are empty or not set").toMap())
- .build();
- }
-
- String primaryKey = tableObj.getPrimaryKey();
- String partitionKey = tableObj.getPartitionKey();
- String clusteringKey = tableObj.getClusteringKey();
- String filteringKey = tableObj.getFilteringKey();
- String clusteringOrder = tableObj.getClusteringOrder();
-
- if(primaryKey == null) {
- primaryKey = tableObj.getFields().get("PRIMARY KEY");
- }
-
- if ((primaryKey == null) && (partitionKey == null)) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Partition key cannot be empty").toMap())
- .build();
- }
-
- if ((primaryKey == null) && (clusteringKey == null)) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Clustering key cannot be empty").toMap())
- .build();
- }
-
- if (clusteringOrder == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Clustering Order cannot be empty").toMap())
- .build();
- }
-
- if ((primaryKey!=null) && (partitionKey == null)) {
- primaryKey = primaryKey.trim();
- int count1 = StringUtils.countMatches(primaryKey,')');
- int count2 = StringUtils.countMatches(primaryKey,'(');
- if (count1 != count2) {
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ Error: primary key '(' and ')' do not match, primary key=" + primaryKey)
- .toMap()).build();
- }
-
- if ( primaryKey.indexOf('(') == -1 || ( count2 == 1 && (primaryKey.lastIndexOf(')') +1) == primaryKey.length() ) )
- {
- if (primaryKey.contains(",") ) {
- partitionKey= primaryKey.substring(0,primaryKey.indexOf(','));
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- clusteringKey=primaryKey.substring(primaryKey.indexOf(',')+1); // make sure index
- clusteringKey=clusteringKey.replaceAll("[)]+", "");
- } else {
- partitionKey=primaryKey;
- partitionKey=partitionKey.replaceAll("[\\)]+","");
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- clusteringKey="";
- }
- } else {
- partitionKey= primaryKey.substring(0,primaryKey.indexOf(')'));
- partitionKey=partitionKey.replaceAll("[\\(]+","");
- partitionKey = partitionKey.trim();
- clusteringKey= primaryKey.substring(primaryKey.indexOf(')'));
- clusteringKey=clusteringKey.replaceAll("[\\(]+","");
- clusteringKey=clusteringKey.replaceAll("[\\)]+","");
- clusteringKey = clusteringKey.trim();
- if (clusteringKey.indexOf(',') == 0) clusteringKey=clusteringKey.substring(1);
- clusteringKey = clusteringKey.trim();
- if (clusteringKey.equals(",") ) clusteringKey=""; // print error if needed ( ... ),)
- }
- }
-
- if (partitionKey.trim().isEmpty()) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Partition key cannot be empty").toMap())
- .build();
- }
-
- if (clusteringKey.trim().isEmpty()) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Clustering key cannot be empty").toMap())
- .build();
- }
-
- if((filteringKey != null) && (filteringKey.equalsIgnoreCase(partitionKey))) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE)
- .setError("CreateQ: Filtering key cannot be same as Partition Key").toMap())
- .build();
- }
-
- return new RestMusicDataAPI().createTable(version, minorVersion, patchVersion, aid, ns, authorization, tableObj, keyspace, tablename);
- }
-
- /**
- *
- * @param insObj
- * @param keyspace
- * @param tablename
- * @throws Exception
- */
- @POST
- @Path("/keyspaces/{keyspace}/{qname}/rows")
- @ApiOperation(value = "", response = Void.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- // public Map<String, Object> insertIntoQ(
- public Response insertIntoQ(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonInsert insObj,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename)
- {
- ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
- if (insObj.getValues().isEmpty()) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("Required HTTP Request body is missing.").toMap()).build();
- }
- return new RestMusicDataAPI().insertIntoTable(version, minorVersion, patchVersion, aid, ns,
- authorization, insObj, keyspace, tablename);
- }
-
- /**
- *
- * @param updateObj
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws Exception
- */
- @PUT
- @Path("/keyspaces/{keyspace}/{qname}/rows")
- @ApiOperation(value = "updateQ", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response updateQ(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonUpdate updateObj,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
- @Context UriInfo info) throws MusicServiceException, MusicQueryException {
-
- ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
- if (updateObj.getValues().isEmpty()) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE).setError(
- "Required HTTP Request body is missing. JsonUpdate updateObj.getValues() is empty. ")
- .toMap())
- .build();
-
-
- }
- return new RestMusicDataAPI().updateTable(version, minorVersion, patchVersion, aid, ns,
- authorization,updateObj, keyspace, tablename, info);
- }
-
- /**
- *
- * @param delObj
- * @param keyspace
- * @param tablename
- * @param info
- *
- * @return
- * @throws Exception
- */
-
- @DELETE
- @Path("/keyspaces/{keyspace}/{qname}/rows")
- @ApiOperation(value = "deleteQ", response = String.class)
- @Consumes(MediaType.APPLICATION_JSON)
- @Produces(MediaType.APPLICATION_JSON)
- public Response deleteFromQ(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- JsonDelete delObj,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
- @Context UriInfo info) throws MusicServiceException, MusicQueryException {
- // added checking as per RestMusicDataAPI
- ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
- if (delObj == null) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.MISSINGDATA,
- ErrorSeverity.CRITICAL, ErrorTypes.DATAERROR);
- return response.status(Status.BAD_REQUEST).entity(new JsonResponse(ResultType.FAILURE)
- .setError("deleteFromQ JsonDelete delObjis empty").toMap()).build();
- }
-
- return new RestMusicDataAPI().deleteFromTable(version, minorVersion, patchVersion, aid, ns,
- authorization, delObj, keyspace, tablename, info);
- }
-
- /**
- *
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws Exception
- */
- @GET
- @Path("/keyspaces/{keyspace}/{qname}/peek")
- @ApiOperation(value = "", response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- //public Map<String, HashMap<String, Object>> peek(
- public Response peek(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
- @Context UriInfo info) {
- int limit =1; //peek must return just the top row
- Map<String ,String> auth = new HashMap<>();
- String userId =auth.get(MusicUtil.USERID);
- String password =auth.get(MusicUtil.PASSWORD);
- ResponseBuilder response = MusicUtil.buildVersionResponse(version, minorVersion, patchVersion);
-
- PreparedQueryObject queryObject = new PreparedQueryObject();
- if (info.getQueryParameters() == null ) //|| info.getQueryParameters().isEmpty())
- queryObject.appendQueryString(
- "SELECT * FROM " + keyspace + "." + tablename + " LIMIT " + limit + ";");
- else {
-
- try {
- queryObject = new RestMusicDataAPI().selectSpecificQuery(keyspace, tablename, info, limit);
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.UNKNOWNERROR,
- ErrorSeverity.WARN, ErrorTypes.GENERALSERVICEERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap())
- .build();
- }
- }
-
- try {
- ResultSet results = MusicCore.get(queryObject);
- return response.status(Status.OK).entity(new JsonResponse(ResultType.SUCCESS)
- .setDataResult(MusicDataStoreHandle.marshallResults(results)).toMap()).build();
- } catch (MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, "", AppMessages.UNKNOWNERROR,
- ErrorSeverity.ERROR, ErrorTypes.MUSICSERVICEERROR);
- return response.status(Status.BAD_REQUEST)
- .entity(new JsonResponse(ResultType.FAILURE).setError(ex.getMessage()).toMap())
- .build();
- }
- }
-
- /**
- *
- *
- * @param keyspace
- * @param tablename
- * @param info
- * @return
- * @throws Exception
- */
- @GET
- @Path("/keyspaces/{keyspace}/{qname}/filter")
- @ApiOperation(value = "filter", response = Map.class)
- @Produces(MediaType.APPLICATION_JSON)
- // public Map<String, HashMap<String, Object>> filter(
- public Response filter(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version", required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version", required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename,
- @Context UriInfo info) throws Exception {
- return new RestMusicDataAPI().select(version, minorVersion, patchVersion, aid, ns, authorization, keyspace, tablename, info);// , limit)
-
- }
-
- /**
- *
- * @param tabObj
- * @param keyspace
- * @param tablename
- * @throws Exception
- */
- @DELETE
- @ApiOperation(value = "DropQ", response = String.class)
- @Path("/keyspaces/{keyspace}/{qname}")
- @Produces(MediaType.APPLICATION_JSON)
- public Response dropQ(
- @ApiParam(value = "Major Version", required = true) @PathParam("version") String version,
- @ApiParam(value = "Minor Version",
- required = false) @HeaderParam("X-minorVersion") String minorVersion,
- @ApiParam(value = "Patch Version",
- required = false) @HeaderParam("X-patchVersion") String patchVersion,
- @ApiParam(value = "AID", required = false) @HeaderParam("aid") String aid,
- @ApiParam(value = "Application namespace", required = true) @HeaderParam("ns") String ns,
- @ApiParam(value = "Authorization", required = true) @HeaderParam(MusicUtil.AUTHORIZATION) String authorization,
- @ApiParam(value = "Key Space", required = true) @PathParam("keyspace") String keyspace,
- @ApiParam(value = "Table Name", required = true) @PathParam("qname") String tablename) throws Exception {
-
- return new RestMusicDataAPI().dropTable(version, minorVersion, patchVersion, aid, ns, authorization, keyspace, tablename);
- }
-}
diff --git a/src/main/java/org/onap/music/service/MusicCoreService.java b/src/main/java/org/onap/music/service/MusicCoreService.java
deleted file mode 100644
index affdc7f2..00000000
--- a/src/main/java/org/onap/music/service/MusicCoreService.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.service;
-
-import java.util.List;
-import java.util.Map;
-
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.exceptions.MusicLockingException;
-import org.onap.music.exceptions.MusicQueryException;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.lockingservice.cassandra.MusicLockState;
-import org.onap.music.main.ResultType;
-import org.onap.music.main.ReturnType;
-import org.onap.music.datastore.*;
-
-import com.datastax.driver.core.ResultSet;
-
-public interface MusicCoreService {
-
-
- // Core Music Database Methods
-
-
- public ReturnType eventualPut(PreparedQueryObject queryObject);
-
- public ReturnType eventualPut_nb(PreparedQueryObject queryObject,String keyspace,String tablename,String primaryKey);
-
- public ReturnType criticalPut(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, String lockId, Condition conditionInfo);
-
- public ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency)
- throws MusicServiceException;
-
- public ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException;
-
- public ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException;
-
- public ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException;
-
- public ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException;
-
- public ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, Condition conditionInfo)
- throws MusicLockingException, MusicQueryException, MusicServiceException;
-
- public ResultSet criticalGet(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, String lockId) throws MusicServiceException;
-
- // Core Music Locking Service Methods
-
- public String createLockReference(String fullyQualifiedKey); // lock name
-
- public ReturnType acquireLockWithLease(String key, String lockReference, long leasePeriod)
- throws MusicLockingException, MusicQueryException, MusicServiceException; // key,lock id,time
-
- public ReturnType acquireLock(String key, String lockReference)
- throws MusicLockingException, MusicQueryException, MusicServiceException; // key,lock id
-
- public ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject,
- String consistency) throws MusicServiceException;
-
- public ResultSet quorumGet(PreparedQueryObject query);
-
- public String whoseTurnIsIt(String fullyQualifiedKey);// lock name
-
- public void destroyLockRef(String lockId);
-
- //public MusicLockState destroyLockRef(String fullyQualifiedKey, String lockReference); // lock name, lock id
-
- //public MusicLockState voluntaryReleaseLock(String fullyQualifiedKey, String lockReference)
- // throws MusicLockingException;// lock name,lock id
-
- public void deleteLock(String lockName) throws MusicLockingException;
-
- //public MusicLockState forciblyReleaseLock(String fullyQualifiedKey, String lockReference) throws MusicLockingException, MusicServiceException, MusicQueryException;
-
- public List<String> getLockQueue(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException;
-
- public long getLockQueueSize(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException;
-
- public Map<String, Object> validateLock(String lockName);
-
- public MusicLockState releaseLock(String lockId, boolean voluntaryRelease);
-}
diff --git a/src/main/java/org/onap/music/service/impl/MusicCassaCore.java b/src/main/java/org/onap/music/service/impl/MusicCassaCore.java
deleted file mode 100644
index cb6e1ce4..00000000
--- a/src/main/java/org/onap/music/service/impl/MusicCassaCore.java
+++ /dev/null
@@ -1,709 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * Modifications Copyright (c) 2018 IBM.
- * ===================================================================
- * Modifications Copyright (c) 2019 Samsung
- * ===================================================================
- * 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.service.impl;
-
-import java.io.StringWriter;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.onap.music.datastore.MusicDataStore;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.eelf.logging.EELFLoggerDelegate;
-import org.onap.music.eelf.logging.format.AppMessages;
-import org.onap.music.eelf.logging.format.ErrorSeverity;
-import org.onap.music.eelf.logging.format.ErrorTypes;
-import org.onap.music.exceptions.MusicLockingException;
-import org.onap.music.exceptions.MusicQueryException;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.lockingservice.cassandra.CassaLockStore;
-import org.onap.music.lockingservice.cassandra.CassaLockStore.LockObject;
-import org.onap.music.lockingservice.cassandra.MusicLockState;
-import org.onap.music.lockingservice.cassandra.MusicLockState.LockStatus;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.main.ResultType;
-import org.onap.music.main.ReturnType;
-import org.onap.music.service.MusicCoreService;
-
-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 org.onap.music.datastore.*;
-
-public class MusicCassaCore implements MusicCoreService {
-
- public static CassaLockStore mLockHandle = null;;
- private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicCassaCore.class);
- private static boolean unitTestRun=true;
- private static MusicCassaCore musicCassaCoreInstance = null;
-
- private MusicCassaCore() {
-
- }
- public static MusicCassaCore getInstance() {
-
- if(musicCassaCoreInstance == null) {
- musicCassaCoreInstance = new MusicCassaCore();
- }
- return musicCassaCoreInstance;
- }
-
- public static CassaLockStore getLockingServiceHandle() throws MusicLockingException {
- logger.info(EELFLoggerDelegate.applicationLogger,"Acquiring lock store handle");
- long start = System.currentTimeMillis();
-
- if (mLockHandle == null) {
- try {
- mLockHandle = new CassaLockStore(MusicDataStoreHandle.getDSHandle());
- } catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.LOCKHANDLE,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- throw new MusicLockingException("Failed to aquire Locl store handle " + e);
- }
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to acquire lock store handle:" + (end - start) + " ms");
- return mLockHandle;
- }
-
-
-
- public String createLockReference(String fullyQualifiedKey) {
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String lockName = splitString[2];
-
- logger.info(EELFLoggerDelegate.applicationLogger,"Creating lock reference for lock name:" + lockName);
- long start = System.currentTimeMillis();
- String lockReference = null;
- try {
- lockReference = "" + getLockingServiceHandle().genLockRefandEnQueue(keyspace, table, lockName);
- } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
- e.printStackTrace();
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to create lock reference:" + (end - start) + " ms");
- return lockReference;
- }
-
-
- public ReturnType acquireLockWithLease(String fullyQualifiedKey, String lockReference, long leasePeriod) throws MusicLockingException, MusicQueryException, MusicServiceException {
- evictExpiredLockHolder(fullyQualifiedKey,leasePeriod);
- return acquireLock(fullyQualifiedKey, lockReference);
- }
-
- private void evictExpiredLockHolder(String fullyQualifiedKey, long leasePeriod) throws MusicLockingException, MusicQueryException, MusicServiceException {
-
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
-
- LockObject currentLockHolderObject = getLockingServiceHandle().peekLockQueue(keyspace, table, primaryKeyValue);
-
- /* Release the lock of the previous holder if it has expired. if the update to the acquire time has not reached due to network delays, simply use the create time as the
- * reference*/
-
- long referenceTime = Math.max(Long.parseLong(currentLockHolderObject.acquireTime), Long.parseLong(currentLockHolderObject.createTime));
- if((System.currentTimeMillis() - referenceTime) > leasePeriod) {
- forciblyReleaseLock(fullyQualifiedKey, currentLockHolderObject.lockRef+"");
- logger.info(EELFLoggerDelegate.applicationLogger, currentLockHolderObject.lockRef+" forcibly released");
- }
- }
-
- private static ReturnType isTopOfLockStore(String keyspace, String table, String primaryKeyValue, String lockReference) throws MusicLockingException, MusicQueryException, MusicServiceException {
-
- //return failure to lock holders too early or already evicted from the lock store
- String topOfLockStoreS = getLockingServiceHandle().peekLockQueue(keyspace, table, primaryKeyValue).lockRef;
- long topOfLockStoreL = Long.parseLong(topOfLockStoreS);
- long lockReferenceL = Long.parseLong(lockReference);
-
- if(lockReferenceL > topOfLockStoreL) {
- logger.info(EELFLoggerDelegate.applicationLogger, lockReference+" is not the lock holder yet");
- return new ReturnType(ResultType.FAILURE, lockReference+" is not the lock holder yet");
- }
-
-
- if(lockReferenceL < topOfLockStoreL) {
- logger.info(EELFLoggerDelegate.applicationLogger, lockReference+" is no longer/or was never in the lock store queue");
- return new ReturnType(ResultType.FAILURE, lockReference+" is no longer/or was never in the lock store queue");
- }
-
- return new ReturnType(ResultType.SUCCESS, lockReference+" is top of lock store");
- }
-
- public ReturnType acquireLock(String fullyQualifiedKey, String lockId)
- throws MusicLockingException, MusicQueryException, MusicServiceException {
- String[] splitString = lockId.split("\\.");
- String keyspace = splitString[0].substring(1);//remove '$'
- String table = splitString[1];
- String primaryKeyValue = splitString[2].substring(0, splitString[2].lastIndexOf("$"));
- String localFullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
- String lockRef = lockId.substring(lockId.lastIndexOf("$")+1); //lockRef is "$" to end
-
- ReturnType result = isTopOfLockStore(keyspace, table, primaryKeyValue, lockRef);
-
- if(result.getResult().equals(ResultType.FAILURE))
- return result;//not top of the lock store q
-
- //check to see if the value of the key has to be synced in case there was a forceful release
- String syncTable = keyspace+".unsyncedKeys_"+table;
- String query = "select * from "+syncTable+" where key='"+localFullyQualifiedKey+"';";
- PreparedQueryObject readQueryObject = new PreparedQueryObject();
- readQueryObject.appendQueryString(query);
- ResultSet results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(readQueryObject);
- if (results.all().size() != 0) {
- logger.info("In acquire lock: Since there was a forcible release, need to sync quorum!");
- try {
- syncQuorum(keyspace, table, primaryKeyValue);
- } catch (Exception e) {
- StringWriter sw = new StringWriter();
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), "[ERR506E] Failed to aquire lock ",ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- String exceptionAsString = sw.toString();
- return new ReturnType(ResultType.FAILURE, "Exception thrown while syncing key:\n" + exceptionAsString);
- }
- String cleanQuery = "delete from music_internal.unsynced_keys where key='"+localFullyQualifiedKey+"';";
- PreparedQueryObject deleteQueryObject = new PreparedQueryObject();
- deleteQueryObject.appendQueryString(cleanQuery);
- MusicDataStoreHandle.getDSHandle().executePut(deleteQueryObject, "critical");
- }
-
- getLockingServiceHandle().updateLockAcquireTime(keyspace, table, primaryKeyValue, lockRef);
-
- return new ReturnType(ResultType.SUCCESS, lockRef+" is the lock holder for the key");
- }
-
-
-
- /**
- *
- * @param tableQueryObject
- * @param consistency
- * @return Boolean Indicates success or failure
- * @throws MusicServiceException
- *
- *
- */
- public ResultType createTable(String keyspace, String table, PreparedQueryObject tableQueryObject, String consistency) throws MusicServiceException {
- boolean result = false;
-
- try {
- //create shadow locking table
- result = getLockingServiceHandle().createLockQueue(keyspace, table);
- if(result == false)
- return ResultType.FAILURE;
-
- result = false;
-
- //create table to track unsynced_keys
- table = "unsyncedKeys_"+table;
-
- String tabQuery = "CREATE TABLE IF NOT EXISTS "+keyspace+"."+table
- + " ( key text,PRIMARY KEY (key) );";
- PreparedQueryObject queryObject = new PreparedQueryObject();
-
- queryObject.appendQueryString(tabQuery);
- result = false;
- result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, "eventual");
-
-
- //create actual table
- result = MusicDataStoreHandle.getDSHandle().executePut(tableQueryObject, consistency);
- } catch (MusicQueryException | MusicServiceException | MusicLockingException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- throw new MusicServiceException(ex.getMessage());
- }
- return result?ResultType.SUCCESS:ResultType.FAILURE;
- }
-
- private static void syncQuorum(String keyspace, String table, String primaryKeyValue) throws Exception {
- logger.info(EELFLoggerDelegate.applicationLogger,"Performing sync operation---");
- PreparedQueryObject selectQuery = new PreparedQueryObject();
- PreparedQueryObject updateQuery = new PreparedQueryObject();
-
- // get the primary key d
- TableMetadata tableInfo = MusicDataStoreHandle.returnColumnMetadata(keyspace, table);
- String primaryKeyName = tableInfo.getPrimaryKey().get(0).getName();// we only support single
- // primary key
- DataType primaryKeyType = tableInfo.getPrimaryKey().get(0).getType();
- Object cqlFormattedPrimaryKeyValue =
- MusicUtil.convertToActualDataType(primaryKeyType, primaryKeyValue);
-
- // get the row of data from a quorum
- selectQuery.appendQueryString("SELECT * FROM " + keyspace + "." + table + " WHERE "
- + primaryKeyName + "= ?" + ";");
- selectQuery.addValue(cqlFormattedPrimaryKeyValue);
- MusicUtil.writeBackToQuorum(selectQuery, primaryKeyName, updateQuery, keyspace, table,
- cqlFormattedPrimaryKeyValue);
-
- }
-
- /**
- *
- * @param query
- * @return ResultSet
- */
- public ResultSet quorumGet(PreparedQueryObject query) {
- ResultSet results = null;
- try {
- results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(query);
- } catch (MusicServiceException | MusicQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.MAJOR, ErrorTypes.GENERALSERVICEERROR);
-
- }
- return results;
-
- }
-
- /**
- *
- * @param fullyQualifiedKey lockName
- * @return
- */
- public String whoseTurnIsIt(String fullyQualifiedKey) {
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
- try {
- return "$" + fullyQualifiedKey + "$"
- + getLockingServiceHandle().peekLockQueue(keyspace, table, primaryKeyValue).lockRef;
- } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.LOCKINGERROR+fullyQualifiedKey ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- }
- return null;
- }
-
- /**
- *
- * @param lockReference
- * @return
- */
- public static String getLockNameFromId(String lockReference) {
- StringTokenizer st = new StringTokenizer(lockReference);
- return st.nextToken("$");
- }
-
- @Override
- public void destroyLockRef(String lockId) {
- long start = System.currentTimeMillis();
- String fullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
- String lockRef = lockId.substring(lockId.lastIndexOf('$')+1);
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
- try {
- getLockingServiceHandle().deQueueLockRef(keyspace, table, primaryKeyValue, lockRef);
- } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.DESTROYLOCK+lockRef ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to destroy lock reference:" + (end - start) + " ms");
- }
-
- public MusicLockState destroyLockRef(String fullyQualifiedKey, String lockReference) {
- long start = System.currentTimeMillis();
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
- try {
- getLockingServiceHandle().deQueueLockRef(keyspace, table, primaryKeyValue, lockReference);
- } catch (MusicLockingException | MusicServiceException | MusicQueryException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.DESTROYLOCK+lockReference ,ErrorSeverity.CRITICAL, ErrorTypes.LOCKINGERROR);
- }
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,"Time taken to destroy lock reference:" + (end - start) + " ms");
- return new MusicLockState(LockStatus.UNLOCKED, "");
- }
-
- @Override
- public MusicLockState releaseLock(String lockId, boolean voluntaryRelease) {
- String fullyQualifiedKey = lockId.substring(1, lockId.lastIndexOf("$"));
- String lockRef = lockId.substring(lockId.lastIndexOf('$')+1);
- if (voluntaryRelease) {
- return voluntaryReleaseLock(fullyQualifiedKey, lockRef);
- } else {
- return forciblyReleaseLock(fullyQualifiedKey, lockRef);
- }
- }
-
- public MusicLockState voluntaryReleaseLock(String fullyQualifiedKey, String lockReference) {
- return destroyLockRef(fullyQualifiedKey, lockReference);
- }
-
- public MusicLockState forciblyReleaseLock(String fullyQualifiedKey, String lockReference) {
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
-
- //leave a signal that this key could potentially be unsynchronized
- String syncTable = keyspace+".unsyncedKeys_"+table;
- PreparedQueryObject queryObject = new PreparedQueryObject();
- String values = "(?)";
- queryObject.addValue(fullyQualifiedKey);
- String insQuery = "insert into "+syncTable+" (key) values "+values+";";
- queryObject.appendQueryString(insQuery);
- try {
- MusicDataStoreHandle.getDSHandle().executePut(queryObject, "critical");
- } catch (Exception e) {
- logger.error("Cannot forcibly release lock: " + fullyQualifiedKey + " " + lockReference + ". "
- + e.getMessage());
- }
-
- //now release the lock
- return destroyLockRef(fullyQualifiedKey, lockReference);
- }
-
- /**
- *
- * @param lockName
- * @throws MusicLockingException
- */
- public void deleteLock(String lockName) throws MusicLockingException {
- //deprecated
- }
-
- // Prepared Query Additions.
-
- /**
- *
- * @param queryObject
- * @return ReturnType
- * @throws MusicServiceException
- */
- public ReturnType eventualPut(PreparedQueryObject queryObject) {
- boolean result = false;
- try {
- result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, MusicUtil.EVENTUAL);
- } catch (MusicServiceException | MusicQueryException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), "[ERR512E] Failed to get ZK Lock Handle " ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() + " " + ex.getCause() + " " + ex);
- return new ReturnType(ResultType.FAILURE, ex.getMessage());
- }
- if (result) {
- return new ReturnType(ResultType.SUCCESS, "Eventual Operation Successfully performed");
- } else {
- return new ReturnType(ResultType.FAILURE, "Eventual Operation failed to perform");
- }
- }
-
- /**
- *
- * @param queryObject
- * @return ReturnType
- * @throws MusicServiceException
- */
- public ReturnType eventualPut_nb(PreparedQueryObject queryObject,String keyspace,String tablename,String primaryKey) {
- boolean result = false;
- long guard = 0;
- PreparedQueryObject getGaurd = new PreparedQueryObject();
- getGaurd.appendQueryString("SELECT guard FROM "+keyspace+".lockq_"+tablename+ " WHERE key = ? ;");
- getGaurd.addValue(primaryKey);
- try {
- ResultSet getGaurdResult = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(getGaurd);
- Row row = getGaurdResult.one();
- if (row != null) {
- guard = row.getLong("guard");
- long timeOfWrite = System.currentTimeMillis();
- long ts = MusicUtil.v2sTimeStampInMicroseconds(guard, timeOfWrite);
- String query = queryObject.getQuery();
- if (!queryObject.getQuery().contains("USING TIMESTAMP")) {
- if (queryObject.getOperation().equalsIgnoreCase("delete"))
- query = query.replaceFirst("WHERE", " USING TIMESTAMP " + ts + " WHERE ");
- else
- query = query.replaceFirst("SET", "USING TIMESTAMP " + ts + " SET");
- }
- queryObject.replaceQueryString(query);
- }
-
- } catch (MusicServiceException | MusicQueryException e) {
- logger.error(EELFLoggerDelegate.applicationLogger,e.getMessage());
- }
- try {
- result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, MusicUtil.EVENTUAL);
- } catch (MusicServiceException | MusicQueryException ex) {
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage(), "[ERR512E] Failed to get ZK Lock Handle " ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- logger.error(EELFLoggerDelegate.errorLogger,ex.getMessage() + " " + ex.getCause() + " " + ex);
- return new ReturnType(ResultType.FAILURE, ex.getMessage());
- }
- if (result) {
- return new ReturnType(ResultType.SUCCESS, "Eventual Operation Successfully performed");
- } else {
- return new ReturnType(ResultType.FAILURE, "Eventual Operation failed to perform");
- }
- }
-
- /**
- *
- * @param keyspace
- * @param table
- * @param primaryKeyValue
- * @param queryObject
- * @param lockId
- * @return
- */
- public ReturnType criticalPut(String keyspace, String table, String primaryKeyValue,
- PreparedQueryObject queryObject, String lockId, Condition conditionInfo) {
- long start = System.currentTimeMillis();
- try {
- ReturnType result = isTopOfLockStore(keyspace, table, primaryKeyValue,
- lockId.substring(lockId.lastIndexOf("$")+1));
- if(result.getResult().equals(ResultType.FAILURE))
- return result;//not top of the lock store q
-
- if (conditionInfo != null)
- try {
- if (conditionInfo.testCondition() == false)
- return new ReturnType(ResultType.FAILURE,
- "Lock acquired but the condition is not true");
- } catch (Exception e) {
- return new ReturnType(ResultType.FAILURE,
- "Exception thrown while checking the condition, check its sanctity:\n"
- + e.getMessage());
- }
-
- String query = queryObject.getQuery();
- long timeOfWrite = System.currentTimeMillis();
- long lockOrdinal = Long.parseLong(lockId.substring(lockId.lastIndexOf("$")+1));
- long ts = MusicUtil.v2sTimeStampInMicroseconds(lockOrdinal, timeOfWrite);
- // TODO: use Statement instead of modifying query
- if (!queryObject.getQuery().contains("USING TIMESTAMP")) {
- if (queryObject.getOperation().equalsIgnoreCase("delete"))
- query = query.replaceFirst("WHERE", " USING TIMESTAMP " + ts + " WHERE ");
- else if (queryObject.getOperation().equalsIgnoreCase("insert"))
- query = query.replaceFirst(";", " USING TIMESTAMP " + ts + " ; ");
- else
- query = query.replaceFirst("SET", "USING TIMESTAMP " + ts + " SET");
- }
- queryObject.replaceQueryString(query);
- MusicDataStore dsHandle = MusicDataStoreHandle.getDSHandle();
- dsHandle.executePut(queryObject, MusicUtil.CRITICAL);
- long end = System.currentTimeMillis();
- logger.info(EELFLoggerDelegate.applicationLogger,"Time taken for the critical put:" + (end - start) + " ms");
- }catch (MusicQueryException | MusicServiceException | MusicLockingException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage());
- return new ReturnType(ResultType.FAILURE,
- "Exception thrown while doing the critical put\n"
- + e.getMessage());
- }
- return new ReturnType(ResultType.SUCCESS, "Update performed");
- }
-
-
- /**
- *
- * @param queryObject
- * @param consistency
- * @return Boolean Indicates success or failure
- * @throws MusicServiceException
- *
- *
- */
- public ResultType nonKeyRelatedPut(PreparedQueryObject queryObject, String consistency) throws MusicServiceException {
- // this is mainly for some functions like keyspace creation etc which does not
- // really need the bells and whistles of Music locking.
- boolean result = false;
- try {
- result = MusicDataStoreHandle.getDSHandle().executePut(queryObject, consistency);
- } catch (MusicQueryException | MusicServiceException ex) {
- logger.error(EELFLoggerDelegate.errorLogger, ex.getMessage(), AppMessages.UNKNOWNERROR,
- ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- throw new MusicServiceException(ex.getMessage());
- }
- return result ? ResultType.SUCCESS : ResultType.FAILURE;
- }
-
- /**
- * This method performs DDL operation on cassandra.
- *
- * @param queryObject query object containing prepared query and values
- * @return ResultSet
- * @throws MusicServiceException
- */
- public ResultSet get(PreparedQueryObject queryObject) throws MusicServiceException {
- ResultSet results = null;
- try {
- results = MusicDataStoreHandle.getDSHandle().executeOneConsistencyGet(queryObject);
- } catch (MusicQueryException | MusicServiceException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage());
- throw new MusicServiceException(e.getMessage());
- }
- return results;
- }
-
- /**
- * This method performs DDL operations on cassandra, if the the resource is available. Lock ID
- * is used to check if the resource is free.
- *
- * @param keyspace name of the keyspace
- * @param table name of the table
- * @param primaryKeyValue primary key value
- * @param queryObject query object containing prepared query and values
- * @param lockId lock ID to check if the resource is free to perform the operation.
- * @return ResultSet
- */
- public ResultSet criticalGet(String keyspace, String table, String primaryKeyValue,
- PreparedQueryObject queryObject, String lockId) throws MusicServiceException {
- ResultSet results = null;
-
- try {
- ReturnType result = isTopOfLockStore(keyspace, table, primaryKeyValue,
- lockId.substring(lockId.lastIndexOf("$")+1));
- if(result.getResult().equals(ResultType.FAILURE))
- return null;//not top of the lock store q
- results = MusicDataStoreHandle.getDSHandle().executeQuorumConsistencyGet(queryObject);
- } catch (MusicQueryException | MusicServiceException | MusicLockingException e) {
- logger.error(EELFLoggerDelegate.errorLogger,e.getMessage(), AppMessages.UNKNOWNERROR ,ErrorSeverity.WARN, ErrorTypes.MUSICSERVICEERROR);
- }
- return results;
- }
-
- /**
- * This method performs DML operation on cassandra, when the lock of the dd is acquired.
- *
- * @param keyspaceName name of the keyspace
- * @param tableName name of the table
- * @param primaryKey primary key value
- * @param queryObject query object containing prepared query and values
- * @return ReturnType
- * @throws MusicLockingException
- * @throws MusicServiceException
- * @throws MusicQueryException
- */
- public ReturnType atomicPut(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException, MusicQueryException, MusicServiceException {
- long start = System.currentTimeMillis();
- String fullyQualifiedKey = keyspaceName + "." + tableName + "." + primaryKey;
- String lockId = createLockReference(fullyQualifiedKey);
- long lockCreationTime = System.currentTimeMillis();
- ReturnType lockAcqResult = acquireLock(fullyQualifiedKey, lockId);
- long lockAcqTime = System.currentTimeMillis();
-
- if (!lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
- logger.info(EELFLoggerDelegate.applicationLogger,"unable to acquire lock, id " + lockId);
- voluntaryReleaseLock(fullyQualifiedKey,lockId);
- return lockAcqResult;
- }
-
- logger.info(EELFLoggerDelegate.applicationLogger,"acquired lock with id " + lockId);
- String lockRef = lockId.substring(lockId.lastIndexOf("$"));
- ReturnType criticalPutResult = criticalPut(keyspaceName, tableName, primaryKey,
- queryObject, lockRef, conditionInfo);
- long criticalPutTime = System.currentTimeMillis();
- voluntaryReleaseLock(fullyQualifiedKey,lockId);
- long lockDeleteTime = System.currentTimeMillis();
- String timingInfo = "|lock creation time:" + (lockCreationTime - start)
- + "|lock accquire time:" + (lockAcqTime - lockCreationTime)
- + "|critical put time:" + (criticalPutTime - lockAcqTime)
- + "|lock delete time:" + (lockDeleteTime - criticalPutTime) + "|";
- criticalPutResult.setTimingInfo(timingInfo);
- return criticalPutResult;
- }
-
-
-
-
- /**
- * This method performs DDL operation on cassasndra, when the lock for the resource is acquired.
- *
- * @param keyspaceName name of the keyspace
- * @param tableName name of the table
- * @param primaryKey primary key value
- * @param queryObject query object containing prepared query and values
- * @return ResultSet
- * @throws MusicServiceException
- * @throws MusicLockingException
- * @throws MusicQueryException
- */
- public ResultSet atomicGet(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException, MusicQueryException {
- String fullyQualifiedKey = keyspaceName + "." + tableName + "." + primaryKey;
- String lockId = createLockReference(fullyQualifiedKey);
- long leasePeriod = MusicUtil.getDefaultLockLeasePeriod();
- ReturnType lockAcqResult = acquireLock(fullyQualifiedKey, lockId);
- if (lockAcqResult.getResult().equals(ResultType.SUCCESS)) {
- logger.info(EELFLoggerDelegate.applicationLogger,"acquired lock with id " + lockId);
- String lockRef = lockId.substring(lockId.lastIndexOf("$"));
- ResultSet result =
- criticalGet(keyspaceName, tableName, primaryKey, queryObject, lockRef);
- voluntaryReleaseLock(fullyQualifiedKey,lockId);
- return result;
- } else {
- voluntaryReleaseLock(fullyQualifiedKey,lockId);
- logger.info(EELFLoggerDelegate.applicationLogger,"unable to acquire lock, id " + lockId);
- return null;
- }
- }
-
-
-
- /**
- * @param lockName
- * @return
- */
- public Map<String, Object> validateLock(String lockName) {
- return MusicUtil.validateLock(lockName);
- }
-
- @Override
- public ReturnType atomicPutWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject, Condition conditionInfo) throws MusicLockingException {
- //Deprecated
- return null;
- }
- @Override
- public List<String> getLockQueue(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException {
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
-
- return getLockingServiceHandle().getLockQueue(keyspace, table, primaryKeyValue);
- }
- @Override
- public long getLockQueueSize(String fullyQualifiedKey)
- throws MusicServiceException, MusicQueryException, MusicLockingException {
- String[] splitString = fullyQualifiedKey.split("\\.");
- String keyspace = splitString[0];
- String table = splitString[1];
- String primaryKeyValue = splitString[2];
-
- return getLockingServiceHandle().getLockQueueSize(keyspace, table, primaryKeyValue);
- }
- @Override
- public ResultSet atomicGetWithDeleteLock(String keyspaceName, String tableName, String primaryKey,
- PreparedQueryObject queryObject) throws MusicServiceException, MusicLockingException {
- //deprecated
- return null;
- }
-
-}
diff --git a/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java b/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java
deleted file mode 100644
index ef2867d8..00000000
--- a/src/test/java/org/onap/music/unittests/TestsUsingCassandra.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2019 AT&T Intellectual Property
- * ===================================================================
- * 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.unittests;
-
-import java.util.List;
-import java.util.UUID;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.junit.runners.Suite.SuiteClasses;
-import org.mindrot.jbcrypt.BCrypt;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.lockingservice.cassandra.CassaLockStore;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.sun.jersey.core.util.Base64;
-
-@RunWith(Suite.class)
-@SuiteClasses({ TstRestMusicDataAPI.class, TstRestMusicLockAPI.class, TstRestMusicAdminAPI.class,
- TstRestMusicConditionalAPI.class, TstCachingUtil.class})
-public class TestsUsingCassandra {
-
- static String appName = "TestApp";
- static String userId = "TestUser";
- static String password = "TestPassword";
- static String authData = userId+":"+password;
- static String wrongAuthData = userId+":"+"pass";
- static String authorization = new String(Base64.encode(authData.getBytes()));
- static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
- static boolean isAAF = false;
- static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
- static String keyspaceName = "testcassa";
- static String tableName = "employees";
- static String xLatestVersion = "X-latestVersion";
- static String onboardUUID = null;
- static String aid = "abc66ccc-d857-4e90-b1e5-df98a3d40ce6";
-
- @BeforeClass
- public static void beforeClass() throws Exception {
- MusicDataStoreHandle.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
- MusicCore.mLockHandle = new CassaLockStore(MusicDataStoreHandle.mDstoreHandle);
- createAdminTable();
- }
-
- @AfterClass
- public static void afterClass() {
- PreparedQueryObject testObject = new PreparedQueryObject();
- testObject.appendQueryString("DROP KEYSPACE IF EXISTS admin");
- MusicCore.eventualPut(testObject);
- if(MusicDataStoreHandle.mDstoreHandle!=null)
- MusicDataStoreHandle.mDstoreHandle.close();
- }
-
- private static void createAdminTable() throws Exception {
- PreparedQueryObject testObject = new PreparedQueryObject();
- testObject.appendQueryString(CassandraCQL.createAdminKeyspace);
- MusicCore.eventualPut(testObject);
- testObject = new PreparedQueryObject();
- testObject.appendQueryString(CassandraCQL.createAdminTable);
- MusicCore.eventualPut(testObject);
-
- testObject = new PreparedQueryObject();
- testObject.appendQueryString(
- "INSERT INTO admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) VALUES (?,?,?,?,?,?,?)");
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(),
- keyspaceName));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), BCrypt.hashpw(password, BCrypt.gensalt())));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- MusicCore.eventualPut(testObject);
-
- testObject = new PreparedQueryObject();
- testObject.appendQueryString(
- "select uuid from admin.keyspace_master where application_name = ? allow filtering");
- testObject.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- ResultSet rs = MusicCore.get(testObject);
- List<Row> rows = rs.all();
- if (rows.size() > 0) {
- System.out.println("#######UUID is:" + rows.get(0).getUUID("uuid"));
- onboardUUID = rows.get(0).getUUID("uuid").toString();
- }
- }
-}
diff --git a/src/test/java/org/onap/music/unittests/TstCachingUtil.java b/src/test/java/org/onap/music/unittests/TstCachingUtil.java
deleted file mode 100644
index ea47b7c1..00000000
--- a/src/test/java/org/onap/music/unittests/TstCachingUtil.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * ============LICENSE_START========================================== org.onap.music
- * =================================================================== Copyright (c) 2017 AT&T
- * Intellectual Property ===================================================================
- * 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.unittests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.core.Response;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mindrot.jbcrypt.BCrypt;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.music.authentication.CachingUtil;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.datastore.jsonobjects.JsonInsert;
-import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
-import org.onap.music.datastore.jsonobjects.JsonTable;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.lockingservice.cassandra.CassaLockStore;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.rest.RestMusicDataAPI;
-import org.onap.music.rest.RestMusicLocksAPI;
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.sun.jersey.core.util.Base64;
-
-@RunWith(MockitoJUnitRunner.class)
-public class TstCachingUtil {
-
- RestMusicLocksAPI lock = new RestMusicLocksAPI();
- RestMusicDataAPI data = new RestMusicDataAPI();
- static PreparedQueryObject testObject;
-
- static String appName = TestsUsingCassandra.appName;
- static String userId = TestsUsingCassandra.userId;
- static String password = TestsUsingCassandra.password;
- static String authData = TestsUsingCassandra.authData;
- static String authorization = TestsUsingCassandra.authorization;
- static boolean isAAF = TestsUsingCassandra.isAAF;
- static UUID uuid = TestsUsingCassandra.uuid;
- static String keyspaceName = TestsUsingCassandra.keyspaceName;
- static String tableName = TestsUsingCassandra.tableName;
- static String onboardUUID = null;
-
- @BeforeClass
- public static void init() throws Exception {
- System.out.println("Testing CachingUtil class");
- try {
-
- } catch (Exception e) {
- e.printStackTrace();
- throw new Exception("Unable to initialize before TestRestMusicData test class. " + e.getMessage());
- }
- }
-
- @After
- public void afterEachTest( ) throws MusicServiceException {
-
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- testObject = new PreparedQueryObject();
- testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
- MusicCore.eventualPut(testObject);
- }
-
- @Test
- public void test_verifyOnboard() throws Exception {
- System.out.println("Testing onboarding of app");
- CachingUtil cache = new CachingUtil();
- cache.initializeAafCache();
- Map<String, Object> authMap = CachingUtil.verifyOnboarding(appName, userId, password);
- assertEquals(0, authMap.size());
- }
-
- @Test
- public void test_authenticateAIDUser() throws Exception {
- System.out.println("Testing authentication of AID user");
- createKeyspace();
- CachingUtil cache = new CachingUtil();
- cache.initializeAafCache();
- Map<String, Object> authMap = CachingUtil.authenticateAIDUser(appName,
- userId, password, keyspaceName);
- System.out.println("authMap is: " + authMap);
- assertEquals(0, authMap.size());
- }
-
- @Test
- public void test_getAppName() throws MusicServiceException {
- System.out.println("Testing getAppName");
- CachingUtil cache = new CachingUtil();
- cache.initializeAafCache();
- assertEquals(appName, CachingUtil.getAppName(keyspaceName));
- }
-
- @Test
- public void test_getUUIDFromCache() throws MusicServiceException {
- System.out.println("Testing getUUID");
- CachingUtil cache = new CachingUtil();
- cache.initializeAafCache();
- assertEquals(uuid.toString(), CachingUtil.getUuidFromMusicCache(keyspaceName));
- }
-
- @Test
- public void test_isAAFApplcation() throws MusicServiceException {
- System.out.println("Testing to see if cache gets correct isAAF info");
- CachingUtil cache = new CachingUtil();
- cache.initializeAafCache();
- assertEquals(isAAF, Boolean.valueOf(CachingUtil.isAAFApplication(appName)));
- }
-
- private static void createKeyspace() throws Exception {
- //shouldn't really be doing this here, but create keyspace is currently turned off
- PreparedQueryObject query = new PreparedQueryObject();
- query.appendQueryString(CassandraCQL.createKeySpace);
- MusicCore.eventualPut(query);
-
- boolean isAAF = false;
- String hashedpwd = BCrypt.hashpw(password, BCrypt.gensalt());
- query = new PreparedQueryObject();
- query.appendQueryString(
- "INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
- query.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspaceName));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- CachingUtil.updateMusicCache(keyspaceName, appName);
- CachingUtil.updateMusicValidateCache(appName, userId, hashedpwd);
- MusicCore.eventualPut(query);
- }
-
-}
diff --git a/src/test/java/org/onap/music/unittests/TstRestMusicAdminAPI.java b/src/test/java/org/onap/music/unittests/TstRestMusicAdminAPI.java
deleted file mode 100644
index 02b7f3a4..00000000
--- a/src/test/java/org/onap/music/unittests/TstRestMusicAdminAPI.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2019 AT&T Intellectual Property
- * ===================================================================
- * 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.unittests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.core.Response;
-
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.internal.util.reflection.FieldSetter;
-import org.onap.music.authentication.MusicAAFAuthentication;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.datastore.jsonobjects.JsonOnboard;
-import org.onap.music.main.MusicCore;
-import org.onap.music.rest.RestMusicAdminAPI;
-import com.sun.jersey.core.util.Base64;
-
-public class TstRestMusicAdminAPI {
-
- RestMusicAdminAPI admin = new RestMusicAdminAPI();
- static PreparedQueryObject testObject;
-
- @Mock
- MusicAAFAuthentication authMock;
-
- static String appName = "TestApp";
- static String userId = "TestUser";
- static String password = "TestPassword";
- static String adminName = "username";
- static String adminPassword = "password";
- static String adminAuthData = adminName +":"+adminPassword;
- static String wrongAdminAuthData = adminName+"123"+":"+adminPassword;
- static String authData = userId+":"+password;
- static String wrongAuthData = userId+":"+"pass";
- static String authorization = new String(Base64.encode(authData.getBytes()));
- static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
- static String adminAuthorization = new String(Base64.encode(adminAuthData.getBytes()));
- static String wrongAdminAuthorization = new String(Base64.encode(wrongAdminAuthData.getBytes()));
-
- static boolean isAAF = false;
- static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
- static String keyspaceName = "testCassa";
- static String tableName = "employees";
- static String tableNameConditional = "Conductor";
- static String xLatestVersion = "X-latestVersion";
- static String onboardUUID = TestsUsingCassandra.onboardUUID;
- static String lockId = null;
- static String lockName = "testCassa.employees.sample3";
-
- @BeforeClass
- public static void init() throws Exception {
- System.out.println("Testing RestMusicAdmin class");
- //PowerMockito.mockStatic(MusicAuthentication.class);
- try {
- //MusicDataStoreHandle.mDstoreHandle = CassandraCQL.connectToEmbeddedCassandra();
- } catch (Exception e) {
- e.printStackTrace();
- throw new Exception("Unable to initialize before TestRestMusicData test class. " + e.getMessage());
- }
- }
-
- @Before
- public void beforeEach() throws NoSuchFieldException {
- authenticateAdminTrue();
- }
-
- @After
- public void afterEach() {
- testObject = new PreparedQueryObject();
- testObject.appendQueryString("DELETE * FROM admin.keyspace_master;");
- MusicCore.eventualPut(testObject);
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- testObject = new PreparedQueryObject();
- testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
- MusicCore.eventualPut(testObject);
- }
-
- @Test
- public void test6_onboard() throws Exception {
- System.out.println("Testing application onboarding");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false"); jsonOnboard.setUserId("TestUser2");
- jsonOnboard.setPassword("TestPassword2");
-
- Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
-
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test6_onboard_wrongCredentials() throws Exception {
- System.out.println("Testing application onboarding wrong credentials");
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false"); jsonOnboard.setUserId("TestUser2");
- jsonOnboard.setPassword("TestPassword2");
-
- Response response = admin.onboardAppWithMusic(jsonOnboard,wrongAdminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test6_onboard_duplicate() throws Exception {
- System.out.println("Testing a duplicate onboarding call");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser2");
- jsonOnboard.setPassword("TestPassword2");
- Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- // Missing appname
- @Test
- public void test6_onboard_noAppName() throws Exception {
- System.out.println("Testing onboard missing app name");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser2");
- jsonOnboard.setPassword("TestPassword2");
- Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(400, response.getStatus());
- }
-
-
- @Test
- public void test7_onboardSearch_notOnboarded() throws Exception {
- System.out.println("Testing application onboarding search for app that isn't onboarded");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- //Application is not onboarded
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test7_onboardSearch() throws Exception {
- System.out.println("Testing application onboarding search no matching app");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setAid(onboardUUID);
-
- Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test7_onboardSearch_wrongCredentials() throws Exception {
- System.out.println("Testing application onboarding search w/ wrong credentials");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.getOnboardedInfoSearch(jsonOnboard,wrongAdminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
- // Missing appname
- @Test
- public void test7_onboardSearch_noAppName() throws Exception {
- System.out.println("Testing application onboarding search w/o appname");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test7_onboardSearch_empty() throws Exception {
- System.out.println("Testing onboard search no app information");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- Response response = admin.getOnboardedInfoSearch(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test8_onboardUpdate() throws Exception {
- System.out.println("Testing application onboarding update");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser3");
- jsonOnboard.setPassword("TestPassword3");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.updateOnboardApp(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(200, response.getStatus());
- }
-
- @Ignore //not working correctly
- @Test
- public void test8_onboardUpdate_withAppName() throws Exception {
- System.out.println("Testing application onboarding update w appname");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser3");
- jsonOnboard.setPassword("TestPassword3");
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.updateOnboardApp(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test8_onboardUpdate_noUUID() throws Exception {
- System.out.println("Testing application onboarding update null uuid");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser3");
- jsonOnboard.setPassword("TestPassword3");
- jsonOnboard.setAid(null);
- Response response = admin.updateOnboardApp(jsonOnboard,adminAuthorization);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test8_onboardUpdate_wrongCredentialsNoAAF() throws Exception {
- System.out.println("Testing update application onboarding search w/ wrong credentials");
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser3");
- jsonOnboard.setPassword("TestPassword3");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.updateOnboardApp(jsonOnboard,wrongAdminAuthorization);
-
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- // All null
- @Test
- public void test8_onboardUpdate_noAppInfo() throws Exception {
- System.out.println("Testing update application onboarding update no app information");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.updateOnboardApp(jsonOnboard,adminAuthorization);
-
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test9_onboardDelete() throws Exception {
- System.out.println("Testing update application onboarding delete");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
-
- //only 1 app matches keyspace
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Ignore //not working as expected
- @Test
- public void test9_onboardDelete_noAID() throws Exception {
- System.out.println("Testing update application onboarding delete no AID");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(null);
- Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
-
- //only 1 app matches name
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test9_onboardDelete_noAIDManyMatch() throws Exception {
- System.out.println("Testing update application onboarding delete no AID many apps in namespace");
- onboardApp();
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(null);
- Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
-
- //multiple apps matches name
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test9_onboardDelete_noAID_noApp() throws Exception {
- System.out.println("Testing update application onboarding delete no AID, app not onboarded");
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(null);
- Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
-
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test9_onboardDelete_noAppToDelete() throws Exception {
- System.out.println("Testing update application onboarding delete no app information");
- onboardApp();
-
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname(null);
- jsonOnboard.setAid(null);
- Response response = admin.deleteOnboardApp(jsonOnboard,adminAuthorization);
-
- //only 1 app matches keyspace
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test9_onboardDelete_wrongCredentials() throws Exception {
- System.out.println("Testing onboard delete with wrong credentials");
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setAid(onboardUUID);
- Response response = admin.deleteOnboardApp(jsonOnboard,wrongAdminAuthorization);
-
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test10_delete() throws Exception {
- System.out.println("Testing GUI delete call");
- onboardApp();
-
- assertTrue(admin.delete(adminAuthorization, onboardUUID));
- }
-
- @Test
- public void test11_getAll() {
- System.out.println("Testing GUI getall call");
-
- System.out.println("admin.getall(adminAuthorization)");
- }
-
- /**
- * Inject our mocked class and accept admin credentials
- * @throws NoSuchFieldException
- */
- public void authenticateAdminTrue() throws NoSuchFieldException {
- authMock = Mockito.mock(MusicAAFAuthentication.class);
- FieldSetter.setField(admin, admin.getClass().getDeclaredField("authenticator"), authMock);
-
- Mockito.when(authMock.authenticateAdmin(Mockito.matches(adminAuthorization))).thenReturn(true);
- }
-
- /**
- * onboard the application and store generate uuid into {@link onboardUUID}
- * @param onboard
- * @throws Exception
- */
- public void onboardApp() throws Exception {
- JsonOnboard jsonOnboard = new JsonOnboard();
- jsonOnboard.setAppname("TestApp2");
- jsonOnboard.setIsAAF("false");
- jsonOnboard.setUserId("TestUser2");
- jsonOnboard.setPassword("TestPassword2");
-
- Response response = admin.onboardAppWithMusic(jsonOnboard,adminAuthorization);
- Map<String, String> respMap = (Map<String, String>) response.getEntity();
- onboardUUID = respMap.get("Generated AID");
- }
-
-} \ No newline at end of file
diff --git a/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java b/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java
deleted file mode 100644
index 92c5d818..00000000
--- a/src/test/java/org/onap/music/unittests/TstRestMusicLockAPI.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.unittests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.ws.rs.core.Response;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mindrot.jbcrypt.BCrypt;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.onap.music.authentication.CachingUtil;
-import org.onap.music.datastore.MusicDataStoreHandle;
-import org.onap.music.datastore.PreparedQueryObject;
-import org.onap.music.datastore.jsonobjects.JsonInsert;
-import org.onap.music.datastore.jsonobjects.JsonLeasedLock;
-import org.onap.music.datastore.jsonobjects.JsonTable;
-import org.onap.music.exceptions.MusicServiceException;
-import org.onap.music.lockingservice.cassandra.CassaLockStore;
-import org.onap.music.main.MusicCore;
-import org.onap.music.main.MusicUtil;
-import org.onap.music.rest.RestMusicDataAPI;
-import org.onap.music.rest.RestMusicLocksAPI;
-import com.datastax.driver.core.DataType;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.sun.jersey.core.util.Base64;
-
-@RunWith(MockitoJUnitRunner.class)
-public class TstRestMusicLockAPI {
-
- RestMusicLocksAPI lock = new RestMusicLocksAPI();
- RestMusicDataAPI data = new RestMusicDataAPI();
- static PreparedQueryObject testObject;
-
- static String appName = "TestApp";
- static String userId = "TestUser";
- static String password = "TestPassword";
- static String authData = userId+":"+password;
- static String wrongAuthData = userId+":"+"pass";
- static String authorization = new String(Base64.encode(authData.getBytes()));
- static String wrongAuthorization = new String(Base64.encode(wrongAuthData.getBytes()));
- static boolean isAAF = false;
- static UUID uuid = UUID.fromString("abc66ccc-d857-4e90-b1e5-df98a3d40ce6");
- static String keyspaceName = "testcassa";
- static String tableName = "employees";
- static String onboardUUID = null;
- static String lockName = "testcassa.employees.testname";
- static String malformedLock = "malformedLock";
-
- @BeforeClass
- public static void init() throws Exception {
- System.out.println("Testing RestMusicLock class");
- try {
- createKeyspace();
- } catch (Exception e) {
- e.printStackTrace();
- throw new Exception("Unable to initialize before TestRestMusicData test class. " + e.getMessage());
- }
- }
-
- @After
- public void afterEachTest( ) throws MusicServiceException {
- clearAllTablesFromKeyspace();
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- testObject = new PreparedQueryObject();
- testObject.appendQueryString("DROP KEYSPACE IF EXISTS " + keyspaceName);
- MusicCore.eventualPut(testObject);
- }
-
- @SuppressWarnings("unchecked")
- @Test
- public void test_createLockReference() throws Exception {
- System.out.println("Testing create lockref");
- createAndInsertIntoTable();
- Response response =lock.createLockReference(lockName,"1","1",authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- Map<String,Object> respMap = (Map<String, Object>) response.getEntity();
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(200, response.getStatus());
- assertTrue(respMap.containsKey("lock"));
- assertTrue(((Map<String,String>) respMap.get("lock")).containsKey("lock"));
- }
-
- @Test
- public void test_createLockReference_wrongAuth() throws Exception {
- System.out.println("Testing create lockref with wrong auth");
- createAndInsertIntoTable();
- Response response =lock.createLockReference(lockName,"1","1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_createLockReference_malformedLockName() throws Exception {
- System.out.println("Testing create lockref w/ malformed lock");
- createAndInsertIntoTable();
- Response response =lock.createLockReference(malformedLock,"1","1",authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
-
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_accquireLock() throws Exception {
- System.out.println("Testing acquire lock");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- Response response = lock.accquireLock(lockRef, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test_accquireLock_wrongAuth() throws Exception {
- System.out.println("Testing acquire lock w/ wrong auth");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- Response response = lock.accquireLock(lockRef, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_accquireBadLock() throws Exception {
- System.out.println("Testing acquire lock that is not lock-holder");
- createAndInsertIntoTable();
-
- String lockRef1 = createLockReference();
- String lockRef2 = createLockReference();
-
-
- Response response = lock.accquireLock(lockRef2, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_accquireLock_malformedLock() throws Exception {
- System.out.println("Testing acquire lock w/ malformedLock");
- createAndInsertIntoTable();
-
- Response response = lock.accquireLock(malformedLock, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_accquireLockWLease() throws Exception {
- System.out.println("Testing acquire lock with lease");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- JsonLeasedLock jsonLock = new JsonLeasedLock();
- jsonLock.setLeasePeriod(10000); //10 second lease period?
- Response response = lock.accquireLockWithLease(jsonLock, lockRef, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test_accquireLockWLease_wrongAuth() throws Exception {
- System.out.println("Testing acquire lock with lease w/ wrong Auth");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- JsonLeasedLock jsonLock = new JsonLeasedLock();
- jsonLock.setLeasePeriod(10000); //10 second lease period?
- Response response = lock.accquireLockWithLease(jsonLock, lockRef, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_accquireLockWLease_malformedLock() throws Exception {
- System.out.println("Testing acquire lock with lease w/ malformed lock");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- JsonLeasedLock jsonLock = new JsonLeasedLock();
- jsonLock.setLeasePeriod(10000); //10 second lease period?
- Response response = lock.accquireLockWithLease(jsonLock, malformedLock, "1", "1",
- wrongAuthorization, "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_currentLockHolder() throws Exception {
- System.out.println("Testing get current lock holder");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockHolder(lockName, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- Map<String,Object> respMap = (Map<String, Object>) response.getEntity();
- assertEquals(lockRef, ((Map<String,String>) respMap.get("lock")).get("lock-holder"));
- }
-
- @Test
- public void test_currentLockHolder_wrongAuth() throws Exception {
- System.out.println("Testing get current lock holder w/ wrong Auth");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockHolder(lockName, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_currentLockHolder_malformedLock() throws Exception {
- System.out.println("Testing get current lock holder w/ malformed lock");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockHolder(malformedLock, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_unLock() throws Exception {
- System.out.println("Testing unlock");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- Response response = lock.unLock(lockRef, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test_unLock_wrongAuth() throws Exception {
- System.out.println("Testing unlock w/ wrong auth");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- Response response = lock.unLock(lockRef, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_unLock_malformedLock() throws Exception {
- System.out.println("Testing unlock w/ malformedLock");
- createAndInsertIntoTable();
- String lockRef = createLockReference();
-
- Response response = lock.unLock("malformedLock", "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_getLockState() throws Exception {
- System.out.println("Testing get lock state");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockState(lockName, "1", "1", authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- Map<String,Object> respMap = (Map<String, Object>) response.getEntity();
- assertEquals(lockRef, ((Map<String,String>) respMap.get("lock")).get("lock-holder"));
- }
-
- @Test
- public void test_getLockState_wrongAuth() throws Exception {
- System.out.println("Testing get lock state w/ wrong auth");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockState(lockName, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_getLockState_malformedLock() throws Exception {
- System.out.println("Testing get lock state w/ malformedLock");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.currentLockState(malformedLock, "1", "1", wrongAuthorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- @Test
- public void test_deleteLock() throws Exception {
- System.out.println("Testing delete lock");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.deleteLock(lockName, "1", "1",
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", authorization, appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(200, response.getStatus());
- }
-
- @Test
- public void test_deleteLock_wrongAuth() throws Exception {
- System.out.println("Testing delete lock w/ wrong auth");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.deleteLock(lockName, "1", "1",
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", wrongAuthorization, appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(401, response.getStatus());
- }
-
- @Test
- public void test_deleteLock_malformedLock() throws Exception {
- System.out.println("Testing delete lock w/ malformed lock");
- createAndInsertIntoTable();
-
- String lockRef = createLockReference();
-
- Response response = lock.deleteLock(malformedLock, "1", "1",
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", wrongAuthorization, appName);
- System.out.println("Status: " + response.getStatus() + ". Entity " + response.getEntity());
- assertEquals(400, response.getStatus());
- }
-
- /**
- * Create table and lock reference
- * @return the lock ref created
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- private String createLockReference() throws Exception {
- Response response =lock.createLockReference(lockName,"1","1",authorization,
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6", appName);
- Map<String,Object> respMap = (Map<String, Object>) response.getEntity();
- return ((Map<String,String>) respMap.get("lock")).get("lock");
- }
-
-
-
-
- private static void createKeyspace() throws Exception {
- //shouldn't really be doing this here, but create keyspace is currently turned off
- PreparedQueryObject query = new PreparedQueryObject();
- query.appendQueryString(CassandraCQL.createKeySpace);
- MusicCore.eventualPut(query);
-
- boolean isAAF = false;
- String hashedpwd = BCrypt.hashpw(password, BCrypt.gensalt());
- query = new PreparedQueryObject();
- query.appendQueryString(
- "INSERT into admin.keyspace_master (uuid, keyspace_name, application_name, is_api, "
- + "password, username, is_aaf) values (?,?,?,?,?,?,?)");
- query.addValue(MusicUtil.convertToActualDataType(DataType.uuid(), uuid));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), keyspaceName));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), appName));
- query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), "True"));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), hashedpwd));
- query.addValue(MusicUtil.convertToActualDataType(DataType.text(), userId));
- query.addValue(MusicUtil.convertToActualDataType(DataType.cboolean(), isAAF));
- CachingUtil.updateMusicCache(keyspaceName, appName);
- CachingUtil.updateMusicValidateCache(appName, userId, hashedpwd);
- MusicCore.eventualPut(query);
- }
-
- private void clearAllTablesFromKeyspace() throws MusicServiceException {
- ArrayList<String> tableNames = new ArrayList<>();
- PreparedQueryObject query = new PreparedQueryObject();
- query.appendQueryString("SELECT table_name FROM system_schema.tables WHERE keyspace_name = '"+keyspaceName+"';");
- ResultSet rs = MusicCore.get(query);
- for (Row row: rs) {
- tableNames.add(row.getString("table_name"));
- }
- for (String table: tableNames) {
- query = new PreparedQueryObject();
- query.appendQueryString("DROP TABLE " + keyspaceName + "." + table);
- MusicCore.eventualPut(query);
- }
- }
-
- /**
- * Create a table {@link tableName} in {@link keyspaceName}
- * @throws Exception
- */
- private void createTable() throws Exception {
- JsonTable jsonTable = new JsonTable();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, String> fields = new HashMap<>();
- fields.put("uuid", "text");
- fields.put("emp_name", "text");
- fields.put("emp_salary", "varint");
- fields.put("PRIMARY KEY", "(emp_name)");
- consistencyInfo.put("type", "eventual");
- jsonTable.setConsistencyInfo(consistencyInfo);
- jsonTable.setKeyspaceName(keyspaceName);
- jsonTable.setPrimaryKey("emp_name");
- jsonTable.setTableName(tableName);
- jsonTable.setFields(fields);
- //Mockito.doNothing().when(http).addHeader(xLatestVersion, MusicUtil.getVersion());
- Response response = data.createTable("1", "1", "1",
- "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",appName, authorization,
- jsonTable, keyspaceName, tableName);
- }
-
- /**
- * Create table {@link createTable} and insert into said table
- * @throws Exception
- */
- private void createAndInsertIntoTable() throws Exception {
- createTable();
-
- JsonInsert jsonInsert = new JsonInsert();
- Map<String, String> consistencyInfo = new HashMap<>();
- Map<String, Object> values = new HashMap<>();
- values.put("uuid", "cfd66ccc-d857-4e90-b1e5-df98a3d40cd6");
- values.put("emp_name", "testname");
- values.put("emp_salary", 500);
- consistencyInfo.put("type", "eventual");
- jsonInsert.setConsistencyInfo(consistencyInfo);
- jsonInsert.setKeyspaceName(keyspaceName);
- jsonInsert.setTableName(tableName);
- jsonInsert.setValues(values);
- Response response = data.insertIntoTable("1", "1", "1", "abc66ccc-d857-4e90-b1e5-df98a3d40ce6",
- appName, authorization, jsonInsert, keyspaceName, tableName);
- }
-}
diff --git a/src/test/java/org/onap/music/unittests/jsonobjects/JsonInsertTest.java b/src/test/java/org/onap/music/unittests/jsonobjects/JsonInsertTest.java
deleted file mode 100644
index 69403cc7..00000000
--- a/src/test/java/org/onap/music/unittests/jsonobjects/JsonInsertTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * ============LICENSE_START==========================================
- * org.onap.music
- * ===================================================================
- * Copyright (c) 2017 AT&T Intellectual Property
- * ===================================================================
- * 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.unittests.jsonobjects;
-
-import static org.junit.Assert.*;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.Test;
-import org.onap.music.datastore.jsonobjects.JsonInsert;
-
-public class JsonInsertTest {
-
- JsonInsert ji = new JsonInsert();
-
- @Test
- public void testGetKeyspaceName() {
- ji.setKeyspaceName("keyspace");
- assertEquals("keyspace",ji.getKeyspaceName());
- }
-
- @Test
- public void testGetTableName() {
- ji.setTableName("table");
- assertEquals("table",ji.getTableName());
- }
-
- @Test
- public void testGetConsistencyInfo() {
- Map<String,String> cons = new HashMap<>();
- cons.put("test","true");
- ji.setConsistencyInfo(cons);
- assertEquals("true",ji.getConsistencyInfo().get("test"));
- }
-
- @Test
- public void testGetTtl() {
- ji.setTtl("ttl");
- assertEquals("ttl",ji.getTtl());
- }
-
- @Test
- public void testGetTimestamp() {
- ji.setTimestamp("10:30");
- assertEquals("10:30",ji.getTimestamp());
- }
-
- @Test
- public void testGetValues() {
- Map<String,Object> cons = new HashMap<>();
- cons.put("val1","one");
- cons.put("val2","two");
- ji.setValues(cons);
- assertEquals("one",ji.getValues().get("val1"));
- }
-
- @Test
- public void testGetRow_specification() {
- Map<String,Object> cons = new HashMap<>();
- cons.put("val1","one");
- cons.put("val2","two");
- ji.setRow_specification(cons);
- assertEquals("two",ji.getRow_specification().get("val2"));
- }
-
-
-}
diff --git a/version.properties b/version.properties
index 17eef360..246c08f5 100755
--- a/version.properties
+++ b/version.properties
@@ -4,7 +4,7 @@
major=3
minor=2
-patch=18
+patch=40
base_version=${major}.${minor}.${patch}