aboutsummaryrefslogtreecommitdiffstats
path: root/openecomp-be/api
diff options
context:
space:
mode:
authorMurali-P <murali.p@huawei.com>2018-03-29 17:46:39 +0530
committerVitaly Emporopulo <Vitaliy.Emporopulo@amdocs.com>2018-04-30 13:51:11 +0000
commit72d62fb1aaaaeaed462083e232f3571b3bde6b08 (patch)
tree0691b2378b76270b7b7dbd8e32aff2afe895042f /openecomp-be/api
parentdb69b87869091b774d6d87f3b6a9155d34d26b12 (diff)
Integrate VNF Repository in Beijing release
Migrate the code Change-Id: Ifccacf83634af32b034fd9c413e68f894f06d2f7 Issue-ID: VNFSDK-155 Signed-off-by: Murali-P <murali.p@huawei.com>
Diffstat (limited to 'openecomp-be/api')
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/pom.xml5
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml1
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/pom.xml1
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/pom.xml99
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/VnfPackageRepository.java72
-rw-r--r--openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VnfPackageRepositoryImpl.java223
6 files changed, 401 insertions, 0 deletions
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/pom.xml
index c8b238389a..f2913ff522 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/pom.xml
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/pom.xml
@@ -35,6 +35,11 @@
<artifactId>openecomp-sdc-notification-core</artifactId>
<version>${project.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc.onboarding</groupId>
+ <artifactId>vnf-repository-rest-services</artifactId>
+ <version>${project.version}</version>
+ </dependency>
<dependency>
<groupId>org.openecomp.sdc.onboarding</groupId>
<artifactId>vendor-software-products-rest-services</artifactId>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
index ef1e7247dc..6b812cc995 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/onboarding-rest-war/src/main/webapp/WEB-INF/beans-services.xml
@@ -70,6 +70,7 @@
<ref bean="deploymentFlavors"/>
<ref bean="images"/>
<ref bean="orchestrationTemplateCandidate"/>
+ <ref bean="vnfPackageRepository"/>
<ref bean="componentDependencies"/>
<ref bean="healthCheck"/>
<ref bean="itemPermissions"/>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/pom.xml
index cef2e711b8..a88733e60a 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/pom.xml
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/pom.xml
@@ -17,5 +17,6 @@
<modules>
<module>/vendor-software-products-rest-services</module>
<module>/vendor-software-products-rest-types</module>
+ <module>/vnf-repository-rest-services</module>
</modules>
</project>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/pom.xml b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/pom.xml
new file mode 100644
index 0000000000..1829ceb542
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/pom.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+ <artifactId>vnf-repository-rest-services</artifactId>
+
+ <parent>
+ <groupId>org.openecomp.sdc.onboarding</groupId>
+ <artifactId>vendor-software-products-rest</artifactId>
+ <version>1.2.0-SNAPSHOT</version>
+ </parent>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${spring.framework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring.framework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ <version>${spring.framework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ <version>${spring.framework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring.framework.version}</version>
+ </dependency>
+
+ <!-- CXF -->
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+ <version>${cxf.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>${http.client.version}</version>
+ </dependency>
+
+
+ <!-- Java Stuff -->
+ <dependency>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ <version>${javax.inject.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>openecomp-sdc-common-rest</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc</groupId>
+ <artifactId>common-app-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc.common</groupId>
+ <artifactId>openecomp-configuration-management-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc.common</groupId>
+ <artifactId>openecomp-configuration-management-core</artifactId>
+ <version>${project.version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.openecomp.sdc.onboarding</groupId>
+ <artifactId>vendor-software-products-rest-services</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/VnfPackageRepository.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/VnfPackageRepository.java
new file mode 100644
index 0000000000..1a16e1f0fb
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/VnfPackageRepository.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2017 Huawei Technologies Co., Ltd.
+ *
+ * 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.openecomp.sdcrests.vsp.rest;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.UploadFileResponseDto;
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotNull;
+import javax.ws.rs.Consumes;
+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 java.io.File;
+import static org.openecomp.sdcrests.common.RestConstants.USER_ID_HEADER_PARAM;
+import static org.openecomp.sdcrests.common.RestConstants.USER_MISSING_ERROR_MSG;
+
+@Path("/v1.0/vendor-software-products/{vspId}/versions/{versionId}/vnfrepository")
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Api(value = "VNF Repository packages")
+@Validated
+public interface VnfPackageRepository extends VspEntities {
+
+ @GET
+ @Path("/vnfpackages")
+ @Produces(MediaType.APPLICATION_OCTET_STREAM)
+ @ApiOperation(value = "Get VNF packages from VNF Repository", notes = "Call VNF Repostory to get VNF package details", response = File.class)
+ Response getVnfPackages(@PathParam("vspId") String vspId,
+ @ApiParam(value = "Version Id") @PathParam("versionId") String versionId,
+ @NotNull(message = USER_MISSING_ERROR_MSG) @HeaderParam(USER_ID_HEADER_PARAM) String user) throws Exception;
+
+ @GET
+ @Path("/vnfpackage/{csarId}/download")
+ @Produces(MediaType.APPLICATION_OCTET_STREAM)
+ @ApiOperation(value = "Download VNF package from VNF Repository", notes = "Download VNF package from VNF repository and send to client", response = File.class)
+ Response downloadVnfPackage(@PathParam("vspId") String vspId,
+ @ApiParam(value = "Version Id") @PathParam("versionId") String versionId,
+ @PathParam("csarId") String csarId,
+ @NotNull(message = USER_MISSING_ERROR_MSG) @HeaderParam(USER_ID_HEADER_PARAM) String user) throws Exception;
+
+ @POST
+ @Path("/vnfpackage/{csarId}/import")
+ @Produces(MediaType.APPLICATION_JSON)
+ @ApiOperation(value = "Import VNF package from VNF Repository", notes = "Call VNF Repostory to download VNF package, validate it and send the response", response = UploadFileResponseDto.class)
+ Response importVnfPackage(@PathParam("vspId") String vspId,
+ @ApiParam(value = "Version Id") @PathParam("versionId") String versionId,
+ @PathParam("csarId") String csarId,
+ @NotNull(message = USER_MISSING_ERROR_MSG) @HeaderParam(USER_ID_HEADER_PARAM) String user) throws Exception;
+
+}
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VnfPackageRepositoryImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VnfPackageRepositoryImpl.java
new file mode 100644
index 0000000000..439fd1475f
--- /dev/null
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vnf-repository-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/VnfPackageRepositoryImpl.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2017 Huawei Technologies Co., Ltd.
+ *
+ * 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.openecomp.sdcrests.vsp.rest.services;
+
+import static javax.ws.rs.core.HttpHeaders.CONTENT_DISPOSITION;
+import static org.openecomp.core.utilities.file.FileUtils.getFileExtension;
+import static org.openecomp.core.utilities.file.FileUtils.getNetworkPackageName;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+
+import javax.inject.Named;
+import javax.ws.rs.core.Response;
+
+import org.apache.http.HttpStatus;
+import org.openecomp.config.api.Configuration;
+import org.openecomp.config.api.ConfigurationManager;
+import org.openecomp.sdc.common.http.client.api.HttpRequest;
+import org.openecomp.sdc.common.http.client.api.HttpResponse;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManager;
+import org.openecomp.sdc.vendorsoftwareproduct.OrchestrationTemplateCandidateManagerFactory;
+import org.openecomp.sdc.vendorsoftwareproduct.types.UploadFileResponse;
+import org.openecomp.sdc.versioning.VersioningManager;
+import org.openecomp.sdc.versioning.VersioningManagerFactory;
+import org.openecomp.sdc.versioning.dao.types.Version;
+import org.openecomp.sdcrests.vendorsoftwareproducts.types.UploadFileResponseDto;
+import org.openecomp.sdcrests.vsp.rest.VnfPackageRepository;
+import org.openecomp.sdcrests.vsp.rest.mapping.MapUploadFileResponseToUploadFileResponseDto;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Service;
+
+/**
+ * The class implements the API interface with VNF Repository (VNFSDK) such as
+ * i) Get all the VNF Package Meta-data ii) Download the VNF Package iii) Import
+ * VNF package to SDC catalog (Download & validate)
+ *
+ * @version Amsterdam release (ONAP 1.0)
+ */
+@Named
+@Service("vnfPackageRepository")
+@Scope(value = "prototype")
+public class VnfPackageRepositoryImpl implements VnfPackageRepository {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(VnfPackageRepositoryImpl.class);
+
+ private static boolean initFlag = false;
+
+ // Default VNF Repository configuration
+ private static final String CONFIG_NAMESPACE = "vnfrepo";
+
+ // Default address for VNF repository docker
+ private static final String DEF_DOCKER_COMPOSE_ADDR = "127.0.0.1";
+
+ private static String ipAddress = DEF_DOCKER_COMPOSE_ADDR;
+
+ // Default Download package URI and Get VNF package meta-data URI -
+ // configurable
+ private static String getVnfPkgUri = "/onapapi/vnfsdk-marketplace/v1/PackageResource/csars";
+
+ private static String downldPkgUri = "/onapapi/vnfsdk-marketplace/v1/PackageResource/csars/%s/files";
+
+ // Default port for VNF Repository
+ private static String port = "8702";
+
+ @Override
+ public Response getVnfPackages(String vspId, String versionId, String user) throws Exception {
+
+ LOGGER.debug("Get VNF Packages from Repository:{}", vspId);
+
+ // Step 1: Create REST client and configuration and prepare URI
+ init();
+
+ // Step 2: Build URI based on the IP address and port allocated
+ HttpResponse<String> rsp = HttpRequest.get(getVnfPkgUri);
+ if(HttpStatus.SC_OK != rsp.getStatusCode()) {
+ LOGGER.error("Failed to query VNF package metadata:uri={}, Response={}", getVnfPkgUri, rsp);
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+ }
+
+ // Step 3: Send the response to the client
+ LOGGER.debug("Response from VNF Repository: {}", rsp.getResponse());
+
+ return Response.ok(rsp.getResponse()).build();
+ }
+
+ @Override
+ public Response importVnfPackage(String vspId, String versionId, String csarId, String user) throws Exception {
+
+ LOGGER.debug("Import VNF Packages from Repository:{}", csarId);
+
+ // Step 1: Create REST client and configuration and prepare URI
+ init();
+
+ // Step 2: Build URI based on the IP address and port allocated
+ String uri = String.format(downldPkgUri, csarId);
+ HttpResponse<String> rsp = HttpRequest.get(uri);
+ if(HttpStatus.SC_OK != rsp.getStatusCode()) {
+ LOGGER.error("Failed to download package from VNF Repository:uri={}, Response={}", uri, rsp);
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+ }
+ LOGGER.debug("Response from VNF Repository for download package is success ");
+
+ // Step 3: Import the file to SDC and validate and send the response
+ try (InputStream fileStream = new BufferedInputStream(
+ new ByteArrayInputStream(rsp.getResponse().getBytes(StandardCharsets.ISO_8859_1)))) {
+
+ String filename = "temp_" + csarId + ".csar";
+ OrchestrationTemplateCandidateManager candidateManager =
+ OrchestrationTemplateCandidateManagerFactory.getInstance().createInterface();
+ UploadFileResponse uploadFileResponse = candidateManager.upload(vspId, getVersion(vspId, versionId),
+ fileStream, getFileExtension(filename), getNetworkPackageName(filename));
+
+ UploadFileResponseDto uploadFileResponseDto = new MapUploadFileResponseToUploadFileResponseDto()
+ .applyMapping(uploadFileResponse, UploadFileResponseDto.class);
+
+ return Response.ok(uploadFileResponseDto).build();
+ } catch(Exception e) {
+ // Exception while uploading file
+
+ LOGGER.error("Exception while uploading VNF package received from VNF Repository:", e);
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+ }
+ }
+
+ @Override
+ public Response downloadVnfPackage(String vspId, String versionId, String csarId, String user) throws Exception {
+
+ LOGGER.debug("Download VNF Packages from Repository:csarId={}", csarId);
+
+ // Step 1: Create REST client and configuration and prepare URI
+ init();
+
+ // Step 2: Build URI based on the IP address and port allocated
+ String uri = String.format(downldPkgUri, csarId);
+ HttpResponse<String> rsp = HttpRequest.get(uri);
+ if(HttpStatus.SC_OK != rsp.getStatusCode()) {
+ LOGGER.error("Failed to download package from VNF Repository:uri={}, Response={}", uri, rsp);
+ return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
+ }
+
+ // Step 3:Send response to the client
+ String filename = "temp_" + csarId + ".csar";
+ Response.ResponseBuilder response = Response.ok(rsp.getResponse().getBytes(StandardCharsets.ISO_8859_1));
+ response.header(CONTENT_DISPOSITION, "attachment; filename=" + filename);
+
+ LOGGER.debug("Response from VNF Repository for download package is success ");
+
+ return response.build();
+ }
+
+ private Version getVersion(String vspId, String versionId) {
+ // Get list of Versions from the rest call
+ VersioningManager versioningManager = VersioningManagerFactory.getInstance().createInterface();
+
+ // Find the corresponding version from versionId
+ return versioningManager.list(vspId).stream().filter(ver -> ver.getId() != versionId).findAny()
+ .orElse(new Version(versionId));
+ }
+
+ private static void setVnfRepoConfig() {
+
+ try {
+ // Step 1: Fetch the on-boarding configuration
+ Configuration config = ConfigurationManager.lookup();
+
+ String vnfRepoHost = config.getAsString(CONFIG_NAMESPACE, "vnfRepoHost");
+ if(null != vnfRepoHost) {
+ ipAddress = vnfRepoHost;
+ }
+
+ String vnfRepoPort = config.getAsString(CONFIG_NAMESPACE, "vnfRepoPort");
+ if(null != vnfRepoPort) {
+ port = vnfRepoPort;
+ }
+
+ String getVnfUri = config.getAsString(CONFIG_NAMESPACE, "getVnfUri");
+ if(null != getVnfUri) {
+ getVnfPkgUri = getVnfUri;
+ }
+
+ String downloadVnfUri = config.getAsString(CONFIG_NAMESPACE, "downloadVnfUri");
+ if(null != downloadVnfUri) {
+ downldPkgUri = downloadVnfUri;
+ }
+
+ } catch(Exception e) {
+ LOGGER.error("Failed to load configuration, Exception caught, using default configuration", e);
+ }
+
+ getVnfPkgUri =
+ new StringBuilder("http://").append(ipAddress).append(":").append(port).append(getVnfPkgUri).toString();
+
+ downldPkgUri =
+ new StringBuilder("http://").append(ipAddress).append(":").append(port).append(downldPkgUri).toString();
+ }
+
+ private static synchronized void init() throws Exception {
+ if(!initFlag) {
+ // Step 1: Initialize configuration
+ setVnfRepoConfig();
+
+ initFlag = true;
+ }
+ }
+}