diff options
-rw-r--r-- | CHANGELOG.md | 5 | ||||
-rw-r--r-- | INFO.yaml | 36 | ||||
-rw-r--r-- | pom.xml | 26 | ||||
-rw-r--r-- | releases/3.4.0.yaml | 4 | ||||
-rw-r--r-- | src/gen/java/io/swagger/api/HealthCheckApi.java | 35 | ||||
-rw-r--r-- | src/gen/java/io/swagger/api/ServiceHealthCheckApi.java | 138 | ||||
-rw-r--r-- | src/main/java/org/onap/dcae/inventory/InventoryApplication.java | 46 | ||||
-rw-r--r-- | src/main/java/org/onap/dcae/inventory/daos/InventoryDAOManager.java | 4 | ||||
-rw-r--r-- | src/test/java/org/onap/dcae/inventory/InventoryApplicationTest.java | 115 | ||||
-rw-r--r-- | src/test/java/org/onap/dcae/inventory/InventoryConfigurationTest.java | 9 | ||||
-rw-r--r-- | src/test/java/org/onap/dcae/inventory/dbthings/StringListArgumentTest.java | 126 | ||||
-rw-r--r-- | src/test/java/org/onap/dcae/inventory/dbthings/models/DCAEServiceTypeObjectTests.java | 71 | ||||
-rw-r--r-- | swagger_inventory.yaml | 27 | ||||
-rw-r--r-- | version.properties | 22 |
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 @@ -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' @@ -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 |