aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md5
-rw-r--r--INFO.yaml36
-rw-r--r--pom.xml26
-rw-r--r--releases/3.4.0.yaml4
-rw-r--r--src/gen/java/io/swagger/api/HealthCheckApi.java35
-rw-r--r--src/gen/java/io/swagger/api/ServiceHealthCheckApi.java138
-rw-r--r--src/main/java/org/onap/dcae/inventory/InventoryApplication.java46
-rw-r--r--src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java4
-rw-r--r--src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java115
-rw-r--r--src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java9
-rw-r--r--src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java126
-rw-r--r--src/test/java/org/onap/dcae/inventory/dbthings/models/DCAEServiceTypeObjectTests.java71
-rw-r--r--swagger_inventory.yaml27
-rw-r--r--version.properties22
14 files changed, 593 insertions, 71 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c27804..1bc6986 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
The version in the brackets represents the version of DCAE inventory and not the ONAP DCAE version.
+## [3.4.0]
+
+* Add non-root user in Docker image so that the inventory service can be run in non-privileged mode for security reasons DCAEGEN2-1554
+* Change base image to alpine based DCAEGEN2-1565
+
## [3.0.1]
* Explicitly use 5.3.6.Final for hibernate-validator and 9.4.6 for jetty-util to address security issues
diff --git a/INFO.yaml b/INFO.yaml
index 3d9a48a..3282fc6 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -28,32 +28,7 @@ meetings:
repeats: 'weekly'
time: '13:00 UTC (DST), 15:30 UTC (post DST)'
repositories:
- - 'dcaegen2'
- - 'dcaegen2-analytics'
- - 'dcaegen2-analytics-flink'
- - 'dcaegen2-analytics-pnda'
- - 'dcaegen2-analytics-tca'
- - 'dcaegen2-analytics-tca-gen2'
- - 'dcaegen2-collectors'
- - 'dcaegen2-collectors-datafile'
- - 'dcaegen2-collectors-hv-ves'
- - 'dcaegen2-collectors-snmptrap'
- - 'dcaegen2-collectors-ves'
- - 'dcaegen2-deployments'
- - 'dcaegen2-platform-blueprints'
- - 'dcaegen2-platform-cdapbroker'
- - 'dcaegen2-platform-cli'
- - 'dcaegen2-platform-configbinding'
- - 'dcaegen2-platform-deployment-handler'
- - 'dcaegen2-platform-inventory-api'
- - 'dcaegen2-platform-plugins'
- - 'dcaegen2-platform-policy-handler'
- - 'dcaegen2-platform-registrator'
- - 'dcaegen2-platform-servicechange-handler'
- - 'dcaegen2-services-heartbeat'
- - 'dcaegen2-services-mapper'
- - 'dcaegen2-services-pm-mapper'
- - 'dcaegen2-services-prh'
+ - 'dcaegen2/platform/inventory-api'
committers:
- <<: *onap_dcaegen2_ptl
- name: 'Lusheng Ji'
@@ -86,5 +61,14 @@ committers:
company: 'ATT'
id: 'jflucas'
timezone: 'America/New_York'
+ - name: 'Joseph O Leary'
+ email: 'joseph.o.leary@est.tech'
+ company: 'EST'
+ id: 'JoeOLeary'
+ timezone: 'Ireland/UTC'
tsc:
approval: 'https://lists.onap.org/pipermail/onap-tsc'
+ changes:
+ - type: 'Addition'
+ name: 'Joseph O Leary'
+ link: 'https://lists.onap.org/g/onap-tsc/message/5715'
diff --git a/pom.xml b/pom.xml
index e511b29..b1071ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!--
================================================================================
-Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved.
+Copyright (c) 2017-2019 AT&T Intellectual Property. 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.
@@ -24,12 +24,12 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property.
<parent>
<groupId>org.onap.oparent</groupId>
<artifactId>oparent</artifactId>
- <version>1.2.0</version>
+ <version>2.0.0</version>
</parent>
<groupId>org.onap.dcaegen2.platform</groupId>
<artifactId>inventory-api</artifactId>
- <version>3.1.1</version>
+ <version>3.4.0-SNAPSHOT</version>
<name>dcaegen2-platform-inventory-api</name>
<!--internal <version>3.0.0</version>-->
@@ -348,7 +348,12 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property.
<version>1.0.0</version>
<configuration>
<imageName>${onap.nexus.dockerregistry.daily}/onap/${project.groupId}.${project.artifactId}</imageName>
- <baseImage>openjdk:8-jre</baseImage>
+ <baseImage>openjdk:8-jre-alpine</baseImage>
+ <user>inventory</user>
+ <runs>
+ <run>addgroup -S inventory</run>
+ <run>adduser -S -G inventory inventory</run>
+ </runs>
<entryPoint>["java", "-jar", "/opt/${project.build.finalName}.jar", "server"]</entryPoint>
<resources>
<resource>
@@ -361,7 +366,7 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property.
<expose>8080</expose>
</exposes>
<imageTags>
- <imageTag>${project.version}-SNAPSHOT-${maven.build.timestamp}Z</imageTag>
+ <imageTag>${project.version}-${maven.build.timestamp}Z</imageTag>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
@@ -387,17 +392,6 @@ ECOMP is a trademark and service mark of AT&T Intellectual Property.
<artifactId>sonar-maven-plugin</artifactId>
<version>3.2</version>
</plugin>
- <plugin>
- <groupId>org.sonatype.plugins</groupId>
- <artifactId>nexus-staging-maven-plugin</artifactId>
- <version>1.6.7</version>
- <extensions>true</extensions>
- <configuration>
- <serverId>ecomp-staging</serverId>
- <nexusUrl>${nexusproxy}</nexusUrl>
- <stagingProfileId>176c31dfe190a</stagingProfileId>
- </configuration>
- </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
diff --git a/releases/3.4.0.yaml b/releases/3.4.0.yaml
new file mode 100644
index 0000000..19144bc
--- /dev/null
+++ b/releases/3.4.0.yaml
@@ -0,0 +1,4 @@
+distribution_type: 'maven'
+version: '3.4.0'
+project: 'dcaegen2-platform-inventory-api'
+log_dir: 'dcaegen2-platform-inventory-api-maven-stage-master/24/'
diff --git a/src/gen/java/io/swagger/api/HealthCheckApi.java b/src/gen/java/io/swagger/api/HealthCheckApi.java
new file mode 100644
index 0000000..54b2b9e
--- /dev/null
+++ b/src/gen/java/io/swagger/api/HealthCheckApi.java
@@ -0,0 +1,35 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package io.swagger.api;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.*;
+
+@Path("/healthcheck")
+public class HealthCheckApi {
+
+ @GET
+ @Path("/")
+ public Response dcaeServiceTypesGet() throws NotFoundException {
+ return Response.ok("OK", MediaType.TEXT_PLAIN).build();
+ }
+
+}
diff --git a/src/gen/java/io/swagger/api/ServiceHealthCheckApi.java b/src/gen/java/io/swagger/api/ServiceHealthCheckApi.java
new file mode 100644
index 0000000..fc82ace
--- /dev/null
+++ b/src/gen/java/io/swagger/api/ServiceHealthCheckApi.java
@@ -0,0 +1,138 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package io.swagger.api;
+
+import io.swagger.api.factories.DcaeServiceTypesApiServiceFactory;
+
+import io.swagger.annotations.ApiParam;
+
+import io.swagger.model.InlineResponse200;
+import io.swagger.model.DCAEServiceType;
+import io.swagger.model.DCAEServiceTypeRequest;
+
+import javax.validation.Valid;
+import javax.ws.rs.core.*;
+import javax.ws.rs.*;
+
+@Path("/servicehealth")
+@Consumes({"application/json", "application/vnd.dcae.inventory.v1+json"})
+@Produces({"application/json", "application/vnd.dcae.inventory.v1+json"})
+@io.swagger.annotations.Api(description = "the dcae-service-types API")
+@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaJerseyServerCodegen", date = "2016-04-18T20:16:22.119Z")
+public class ServiceHealthCheckApi {
+ private final DcaeServiceTypesApiService delegate = DcaeServiceTypesApiServiceFactory.getDcaeServiceTypesApi();
+
+ @Context
+ UriInfo uriInfo;
+
+ public static Link buildLinkForGet(UriInfo uriInfo, String rel, String typeName, Boolean onlyLatest, Boolean onlyActive,
+ String vnfType, String serviceId, String serviceLocation, String asdcServiceId,
+ String asdcResourceId, Integer offset, String application, String component, String owner) {
+ UriBuilder ub = uriInfo.getBaseUriBuilder().path(ServiceHealthCheckApi.class)
+ .path(ServiceHealthCheckApi.class, "dcaeServiceTypesGet");
+
+ if (typeName != null) {
+ ub.queryParam("typeName", typeName);
+ }
+ if (onlyLatest != null) {
+ ub.queryParam("onlyLatest", onlyLatest);
+ }
+ if (onlyActive != null) {
+ ub.queryParam("onlyActive", onlyActive);
+ }
+ if (vnfType != null) {
+ ub.queryParam("vnfType", vnfType);
+ }
+ if (serviceId != null) {
+ ub.queryParam("serviceId", serviceId);
+ }
+ if (serviceLocation != null) {
+ ub.queryParam("serviceLocation", serviceLocation);
+ }
+ if (asdcServiceId != null) {
+ ub.queryParam("asdcServiceId", asdcServiceId);
+ }
+ if (asdcResourceId != null) {
+ ub.queryParam("asdcResourceId", asdcResourceId);
+ }
+ if (offset != null) {
+ ub.queryParam("offset", offset);
+ }
+ if (application != null) {
+ ub.queryParam("application", application);
+ }
+ if (component != null) {
+ ub.queryParam("component", component);
+ }
+ if (owner != null) {
+ ub.queryParam("owner", owner);
+ }
+
+ Link.Builder lb = Link.fromUri(ub.build());
+ lb.rel(rel);
+ return lb.build();
+ }
+
+ @GET
+ @Path("/")
+ @Consumes({"application/json", "application/vnd.dcae.inventory.v1+json"})
+ @Produces({"application/json", "application/vnd.dcae.inventory.v1+json"})
+ @io.swagger.annotations.ApiOperation(value = "", notes = "Get a list of `DCAEServiceType` objects.", response = InlineResponse200.class, tags = {})
+ @io.swagger.annotations.ApiResponses(value = {
+ @io.swagger.annotations.ApiResponse(code = 200, message = "List of `DCAEServiceType` objects", response = InlineResponse200.class)})
+ public Response dcaeServiceTypesGet(
+ @ApiParam(value = "Filter by service type name. Wildcards matches with asterick(s) allowed.") @QueryParam("typeName") String typeName,
+ @ApiParam(value = "If set to true, query returns just the latest versions of DCAE service types. If set to false, then all versions are returned. Default is true")
+ @DefaultValue("true") @QueryParam("onlyLatest") Boolean onlyLatest,
+ @ApiParam(value = "If set to true, query returns only *active* DCAE service types. If set to false, then all DCAE service types are returned. Default is true")
+ @DefaultValue("true") @QueryParam("onlyActive") Boolean onlyActive,
+ @ApiParam(value = "Filter by associated vnf type. No wildcards, matches are explicit. This field is treated case insensitive.")
+ @QueryParam("vnfType") String vnfType,
+ @ApiParam(value = "Filter by assocaited service id. Instances with service id null or empty is always returned.")
+ @QueryParam("serviceId") String serviceId,
+ @ApiParam(value = "Filter by associated service location. Instances with service location null or empty is always returned.")
+ @QueryParam("serviceLocation") String serviceLocation,
+ @ApiParam(value = "Filter by associated asdc design service id. Setting this to `NONE` will return instances that have asdc service id set to null")
+ @QueryParam("asdcServiceId") String asdcServiceId,
+ @ApiParam(value = "Filter by associated asdc design resource id. Setting this to `NONE` will return instances that have asdc resource id set to null")
+ @QueryParam("asdcResourceId") String asdcResourceId,
+ @ApiParam(value = "Query resultset offset used for pagination (zero-based)") @QueryParam("offset") Integer offset,
+ @Context SecurityContext securityContext,
+ @ApiParam(value = "Filter by associated application.") @QueryParam("application") String application,
+ @ApiParam(value = "Filter by associated component or sub-application module.") @QueryParam("component") String component,
+ @ApiParam(value = "Filter by associated owner.") @QueryParam("owner") String owner
+ )
+ throws NotFoundException {
+ return delegate.dcaeServiceTypesGet(typeName, onlyLatest, onlyActive, vnfType, serviceId, serviceLocation,
+ asdcServiceId, asdcResourceId, offset, uriInfo, securityContext, application, component, owner);
+ }
+
+ public static Link buildLinkForGet(UriInfo uriInfo, String rel, String typeId) {
+ // This same method can be used for PUTs as well
+
+ UriBuilder ub = uriInfo.getBaseUriBuilder().path(ServiceHealthCheckApi.class)
+ .path(ServiceHealthCheckApi.class, "dcaeServiceTypesTypeIdGet");
+ Link.Builder lb = Link.fromUri(ub.build(typeId));
+ lb.rel(rel);
+ return lb.build();
+ }
+
+}
diff --git a/src/main/java/org/onap/dcae/inventory/InventoryApplication.java b/src/main/java/org/onap/dcae/inventory/InventoryApplication.java
index 259ce93..7b0911e 100644
--- a/src/main/java/org/onap/dcae/inventory/InventoryApplication.java
+++ b/src/main/java/org/onap/dcae/inventory/InventoryApplication.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* dcae-inventory
* ================================================================================
- * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. 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.
@@ -37,6 +37,8 @@ import io.dropwizard.setup.Environment;
import io.swagger.api.DcaeServiceTypesApi;
import io.swagger.api.DcaeServicesApi;
import io.swagger.api.DcaeServicesGroupbyApi;
+import io.swagger.api.HealthCheckApi;
+import io.swagger.api.ServiceHealthCheckApi;
import io.swagger.api.factories.DcaeServicesApiServiceFactory;
import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.jaxrs.listing.ApiListingResource;
@@ -68,27 +70,41 @@ public class InventoryApplication extends Application<InventoryConfiguration> {
static final Logger debugLogger = LoggerFactory.getLogger("debugLogger");
static boolean shouldRemoteFetchConfig = false;
- public static void main(String[] args) throws Exception {
- metricsLogger.info("DCAE inventory application main Startup");
- // This is here to try to fix a "high" issue caught by Fortify. Did this **plus** setting locale for each of the
- // string comparisons that use `toUpper` because of this StackOverflow post:
- // http://stackoverflow.com/questions/38308777/fixed-fortify-scan-locale-changes-are-reappearing
- Locale.setDefault(Locale.ENGLISH);
-
- if (args.length < 2 && "server".equals(args[0])) {
+ /**
+ * Parses user's args and makes adjustments if necessary
+ *
+ * NOTE: This function adjusts global state of InventoryApplication - shouldRemoteFetchConfig
+ *
+ * @param userArgs
+ * @return Adjusted user's args or just the user's args untouched either way a String[]
+ */
+ public static String[] processArgs(String[] userArgs) {
+ if (userArgs.length < 2 && "server".equals(userArgs[0])) {
// When the start command is just "server", this will trigger inventory to look for its configuration
// from Consul's KV store. The url is hardcoded here which should be used as the "path" variable into
// the UrlConfigurationSourceProvider.
- String[] customArgs = new String[args.length+1];
- System.arraycopy(args, 0, customArgs, 0, args.length);
- customArgs[args.length] = "http://consul:8500/v1/kv/inventory?raw=true";
+ String[] customArgs = new String[userArgs.length+1];
+ System.arraycopy(userArgs, 0, customArgs, 0, userArgs.length);
+ customArgs[userArgs.length] = "http://consul:8500/v1/kv/inventory?raw=true";
shouldRemoteFetchConfig = true;
- new InventoryApplication().run(customArgs);
+ return customArgs;
} else {
// You are here because you want to use the default way of configuring inventory - YAML file.
- new InventoryApplication().run(args);
+ return userArgs;
}
+ }
+
+ public static void main(String[] args) throws Exception {
+ metricsLogger.info("DCAE inventory application main Startup");
+ // This is here to try to fix a "high" issue caught by Fortify. Did this **plus** setting locale for each of the
+ // string comparisons that use `toUpper` because of this StackOverflow post:
+ // http://stackoverflow.com/questions/38308777/fixed-fortify-scan-locale-changes-are-reappearing
+ Locale.setDefault(Locale.ENGLISH);
+
+ final String[] processedArgs = processArgs(args);
+ new InventoryApplication().run(processedArgs);
+
// revert to using logback.xml:
LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
context.reset();
@@ -178,6 +194,8 @@ public class InventoryApplication extends Application<InventoryConfiguration> {
environment.jersey().register(new DcaeServicesApi());
environment.jersey().register(new DcaeServiceTypesApi());
environment.jersey().register(new DcaeServicesGroupbyApi());
+ environment.jersey().register(new HealthCheckApi());
+ environment.jersey().register(new ServiceHealthCheckApi());
// https://github.com/swagger-api/swagger-core/wiki/Swagger-Core-Jersey-2.X-Project-Setup-1.5
environment.jersey().register(new ApiListingResource());
diff --git a/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java b/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java
index 7039700..6a32708 100644
--- a/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java
+++ b/src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* dcae-inventory
* ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2019 AT&T Intellectual Property. 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.
@@ -113,7 +113,7 @@ public final class InventoryDAOManager implements InventoryDataAccessManager {
debugLogger.info(String.format("Sql table created: %s", daoClass.getSimpleName()));
}
// dcae_service_types DB table has been enhanced to include 2 new columns which need to be added if they don't already exist
- if ( daoClass.getSimpleName().equals("DCAEServiceTypesDAO") ) {
+ if (daoClass.isInstance(DCAEServiceTypesDAO.class)) {
if (dao.checkIfApplicationColumnExists()) {
debugLogger.info(String.format("ApplicationColumn exists: %s", daoClass.getSimpleName()));
} else {
diff --git a/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java b/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java
new file mode 100644
index 0000000..8011452
--- /dev/null
+++ b/src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java
@@ -0,0 +1,115 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.inventory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.dropwizard.db.DataSourceFactory;
+import io.dropwizard.jersey.setup.JerseyEnvironment;
+import io.dropwizard.jetty.setup.ServletEnvironment;
+import io.dropwizard.setup.Bootstrap;
+import io.dropwizard.setup.Environment;
+import org.eclipse.jetty.servlets.CrossOriginFilter;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runner.manipulation.Filter;
+import org.onap.dcae.inventory.daos.InventoryDAOManager;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import javax.servlet.FilterRegistration;
+import java.util.HashMap;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Created by mhwang on 3/14/19.
+ */
+@PrepareForTest({InventoryDAOManager.class})
+@RunWith(PowerMockRunner.class)
+public class InventoryApplicationTest {
+
+ @Test
+ public void testProcessArgs() {
+ String userArgs[] = {"server"};
+ assertEquals(InventoryApplication.processArgs(userArgs).length, 2);
+
+ userArgs = new String[] {"server some-yaml.yaml"};
+ assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+
+ userArgs = new String[] {"foo"};
+ assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+
+ userArgs = new String[] {"foo bar"};
+ assertArrayEquals(InventoryApplication.processArgs(userArgs), userArgs);
+ }
+
+ @Test
+ public void testAppInit() {
+ InventoryApplication app = new InventoryApplication();
+ assertEquals(app.getName(), "dcae-inventory");
+
+ Bootstrap<InventoryConfiguration> mockBootstrap = mock(Bootstrap.class);
+ app.initialize(mockBootstrap);
+
+ InventoryApplication.shouldRemoteFetchConfig = !InventoryApplication.shouldRemoteFetchConfig;
+ app.initialize(mockBootstrap);
+ }
+
+ @Test
+ public void testAppRun() {
+ InventoryApplication app = new InventoryApplication();
+
+ ServletEnvironment mockEnvServlet = mock(ServletEnvironment.class);
+ FilterRegistration.Dynamic mockFilters = mock(FilterRegistration.Dynamic.class);
+ when(mockEnvServlet.addFilter("CORSFilter", CrossOriginFilter.class)).thenReturn(mockFilters);
+ Environment mockEnv = mock(Environment.class);
+ when(mockEnv.servlets()).thenReturn(mockEnvServlet);
+ when(mockEnv.getObjectMapper()).thenReturn(new ObjectMapper());
+ JerseyEnvironment mockEnvJersey = mock(JerseyEnvironment.class);
+ when(mockEnv.jersey()).thenReturn(mockEnvJersey);
+
+ DataSourceFactory mockDSF = mock(DataSourceFactory.class);
+ when(mockDSF.getProperties()).thenReturn(new HashMap<String, String>());
+ InventoryConfiguration.DatabusControllerConnectionConfiguration mockConfigBus = mock(InventoryConfiguration.DatabusControllerConnectionConfiguration.class);
+ InventoryConfiguration mockConfig = mock(InventoryConfiguration.class);
+ when(mockConfig.getDataSourceFactory()).thenReturn(mockDSF);
+ when(mockConfig.getDatabusControllerConnection()).thenReturn(mockConfigBus);
+ when(mockConfigBus.getRequired()).thenReturn(Boolean.FALSE);
+
+ // PowerMockito does bytecode magic to mock static methods and use final classes
+ PowerMockito.mockStatic(InventoryDAOManager.class);
+ InventoryDAOManager mockDaoManager = mock(InventoryDAOManager.class);
+
+ when(InventoryDAOManager.getInstance()).thenReturn(mockDaoManager);
+ doAnswer((a) -> {return null;}).when(mockDaoManager).initialize();
+
+ app.run(mockConfig, mockEnv);
+ }
+
+}
diff --git a/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java b/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java
index 1848a42..1935d8d 100644
--- a/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java
+++ b/src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* dcae-inventory
* ================================================================================
- * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2018-2019 AT&T Intellectual Property. 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.
@@ -21,6 +21,7 @@
package org.onap.dcae.inventory;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.io.File;
@@ -55,6 +56,12 @@ public class InventoryConfigurationTest {
assertEquals(configuration.getDatabusControllerConnection().getHost(), "databus-controller-hostname");
assertEquals((long) configuration.getDatabusControllerConnection().getPort(), 8443);
assertEquals(configuration.getDatabusControllerConnection().getRequired(), true);
+ assertEquals(configuration.getDatabusControllerConnection().getMechId(), "some-mech-id");
+ assertEquals(configuration.getDatabusControllerConnection().getPassword(), "some-password");
+
+ configuration.setDefaultName("foo-config");
+ assertEquals(configuration.getDefaultName(), "foo-config");
+ assertNotNull(configuration.getJerseyClientConfiguration());
assertEquals(configuration.getDataSourceFactory().getUrl(), "jdbc:postgresql://127.0.0.1:5432/dcae_inv");
} catch (Exception e) {
diff --git a/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java b/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java
new file mode 100644
index 0000000..4fc2c6c
--- /dev/null
+++ b/src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java
@@ -0,0 +1,126 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.inventory.dbthings;
+
+import org.junit.Test;
+import org.skife.jdbi.v2.tweak.Argument;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+/**
+ * Created by mhwang on 3/14/19.
+ */
+public class StringListArgumentTest {
+
+ @Test
+ public void testAccepts() {
+ StringListArgument test = new StringListArgument();
+ assertEquals(test.accepts(null, new ArrayList<>(), null), true);
+ assertEquals(test.accepts(null, null, null), false);
+ assertEquals(test.accepts(null, "fail case", null), false);
+ }
+
+ @Test
+ public void testStringListArgumentBuild() {
+ StringListArgument test = new StringListArgument();
+ assertNotNull(test.build(null, null, null));
+
+ List<String> value = new ArrayList<>();
+ Argument func = test.build(null, value, null);
+
+ try {
+ PreparedStatement statement = mock(PreparedStatement.class);
+ Connection conn = mock(Connection.class);
+ when(conn.createArrayOf(any(), any())).thenReturn(new Array() {
+ @Override
+ public String getBaseTypeName() throws SQLException {
+ return null;
+ }
+
+ @Override
+ public int getBaseType() throws SQLException {
+ return 0;
+ }
+
+ @Override
+ public Object getArray() throws SQLException {
+ return null;
+ }
+
+ @Override
+ public Object getArray(Map<String, Class<?>> map) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public Object getArray(long index, int count) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public Object getArray(long index, int count, Map<String, Class<?>> map) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public ResultSet getResultSet() throws SQLException {
+ return null;
+ }
+
+ @Override
+ public ResultSet getResultSet(Map<String, Class<?>> map) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public ResultSet getResultSet(long index, int count) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public ResultSet getResultSet(long index, int count, Map<String, Class<?>> map) throws SQLException {
+ return null;
+ }
+
+ @Override
+ public void free() throws SQLException {
+
+ }
+ });
+ when(statement.getConnection()).thenReturn(conn);
+ func.apply(0, statement, null);
+ } catch (SQLException e) {
+ fail("Unexpected SQLException");
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/src/test/java/org/onap/dcae/inventory/dbthings/models/DCAEServiceTypeObjectTests.java b/src/test/java/org/onap/dcae/inventory/dbthings/models/DCAEServiceTypeObjectTests.java
new file mode 100644
index 0000000..8972beb
--- /dev/null
+++ b/src/test/java/org/onap/dcae/inventory/dbthings/models/DCAEServiceTypeObjectTests.java
@@ -0,0 +1,71 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * dcae-inventory
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcae.inventory.dbthings.models;
+
+import static org.junit.Assert.assertEquals;
+import org.junit.Test;
+import io.swagger.model.DCAEServiceTypeRequest;
+
+/**
+ * Created by sh1986 on 2/28/19.
+ */
+public class DCAEServiceTypeObjectTests {
+
+ @Test
+ public void testConstructionByRequest() {
+ DCAEServiceTypeObject object = new DCAEServiceTypeObject();
+ object.setTypeVersion(1);
+ object.setTypeName("abc");
+ object.setOwner("tester");
+ object.setBlueprintTemplate("{ blueprint template goes here }");
+ object.setTypeId("some-type-id");
+
+ String typeId = "some-type-id";
+
+ assertEquals(object.getTypeId(), typeId);
+ }
+
+ @Test
+ public void testConstructionByUpdating() {
+
+ DCAEServiceTypeObject objectFirst = new DCAEServiceTypeObject();
+
+ objectFirst.setTypeVersion(1);
+ objectFirst.setTypeName("abc");
+ objectFirst.setOwner("tester");
+ objectFirst.setBlueprintTemplate("{ blueprint template goes here }");
+ objectFirst.setTypeId("some-type-id");
+
+ DCAEServiceTypeObject objectUpdated = new DCAEServiceTypeObject();
+
+ objectUpdated.setTypeVersion(1);
+ objectUpdated.setTypeName("abc");
+ objectUpdated.setOwner("tester");
+ objectUpdated.setBlueprintTemplate("{ blueprint template goes here }");
+ objectUpdated.setTypeId("some-type-id");
+
+ assertEquals(objectUpdated.getTypeId(), objectFirst.getTypeId());
+ assertEquals(objectUpdated.getTypeId(), objectUpdated.getTypeId());
+ assertEquals(objectUpdated.getTypeVersion(), objectUpdated.getTypeVersion());
+ assertEquals(objectUpdated.getBlueprintTemplate(), objectUpdated.getBlueprintTemplate());
+ }
+
+}
diff --git a/swagger_inventory.yaml b/swagger_inventory.yaml
index c06368d..f8de1dd 100644
--- a/swagger_inventory.yaml
+++ b/swagger_inventory.yaml
@@ -17,7 +17,7 @@
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
swagger: '2.0'
info:
- version: "3.1.1"
+ version: "3.2.0"
title: DCAE Inventory API
description: |
DCAE Inventory is a web service that provides the following:
@@ -356,6 +356,31 @@ paths:
description: "Unknown DCAE service"
schema:
$ref: "#/definitions/ApiResponseMessage"
+ /servicehealth:
+ get:
+ summary: "Check for external dependencies for inventory."
+ description: "Get a list of `DCAEServiceType` objects."
+ operationId: "dcaeServiceTypesGet"
+ consumes:
+ - "application/json"
+ - "application/vnd.dcae.inventory.v1+json"
+ produces:
+ - "application/json"
+ - "application/vnd.dcae.inventory.v1+json"
+ responses:
+ 200:
+ description: "List of `DCAEServiceType` objects"
+ schema:
+ $ref: "#/definitions/InlineResponse200"
+ /healthcheck:
+ get:
+ summary: ""
+ description: "Basic test to check inventory internals, that process and web api are running."
+ produces:
+ - "text/plain"
+ responses:
+ 200:
+ description: "OK response to indicate success"
definitions:
DCAEServiceTypeRequest:
type: "object"
diff --git a/version.properties b/version.properties
index 2f59e59..1ba9fb5 100644
--- a/version.properties
+++ b/version.properties
@@ -1,11 +1,11 @@
-# Versioning variables
-# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
-# because they are used in Jenkins, whose plug-in doesn't support
-major=3
-minor=1
-patch=1
-base_version=${major}.${minor}.${patch}
-# Release must be completed with git revision # in Jenkins
-
-release_version=${base_version}
-snapshot_version=${base_version}-SNAPSHOT
+# Versioning variables
+# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
+# because they are used in Jenkins, whose plug-in doesn't support
+major=3
+minor=4
+patch=0
+base_version=${major}.${minor}.${patch}
+# Release must be completed with git revision # in Jenkins
+
+release_version=${base_version}
+snapshot_version=${base_version}-SNAPSHOT