be80937b2c7fc751420ae5b767530ff924886bf9
[vnfsdk/refrepo.git] /
1 /**
2  * Copyright 2017-18 Huawei Technologies Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.vnfsdk.marketplace.resource;
18
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.util.ArrayList;
22 import java.util.List;
23 import java.util.Map.Entry;
24
25 import javax.servlet.http.HttpServletRequest;
26 import javax.ws.rs.Consumes;
27 import javax.ws.rs.DELETE;
28 import javax.ws.rs.GET;
29 import javax.ws.rs.POST;
30 import javax.ws.rs.Path;
31 import javax.ws.rs.PathParam;
32 import javax.ws.rs.Produces;
33 import javax.ws.rs.QueryParam;
34 import javax.ws.rs.core.Context;
35 import javax.ws.rs.core.HttpHeaders;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.Response;
38
39 import org.apache.commons.io.IOUtils;
40 import org.eclipse.jetty.http.HttpStatus;
41 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
42 import org.glassfish.jersey.media.multipart.FormDataParam;
43 import org.onap.vnfsdk.marketplace.common.CommonConstant;
44 import org.onap.vnfsdk.marketplace.common.ToolUtil;
45 import org.onap.vnfsdk.marketplace.db.exception.MarketplaceResourceException;
46 import org.onap.vnfsdk.marketplace.db.resource.PackageManager;
47 import org.onap.vnfsdk.marketplace.entity.response.CsarFileUriResponse;
48 import org.onap.vnfsdk.marketplace.entity.response.PackageMeta;
49 import org.onap.vnfsdk.marketplace.entity.response.UploadPackageResponse;
50 import org.onap.vnfsdk.marketplace.onboarding.entity.OnBoardingResult;
51 import org.onap.vnfsdk.marketplace.rest.RestConstant;
52 import org.onap.vnfsdk.marketplace.rest.RestResponse;
53 import org.onap.vnfsdk.marketplace.rest.RestfulClient;
54 import org.onap.vnfsdk.marketplace.wrapper.PackageWrapper;
55 import org.open.infc.grpc.Result;
56 import org.open.infc.grpc.client.OpenRemoteCli;
57
58 import com.google.gson.internal.LinkedTreeMap;
59
60 import io.swagger.annotations.Api;
61 import io.swagger.annotations.ApiOperation;
62 import io.swagger.annotations.ApiParam;
63 import io.swagger.annotations.ApiResponse;
64 import io.swagger.annotations.ApiResponses;
65
66
67 @Path("/PackageResource")
68 @Api(tags = { "Package Resource" })
69 public class PackageResource {
70
71     static {
72
73     }
74     @Path("/updatestatus")
75     @POST
76     @ApiOperation(value = "update validate and lifecycle test status", response = UploadPackageResponse.class)
77     @Consumes(MediaType.APPLICATION_JSON)
78     @Produces(MediaType.APPLICATION_JSON)
79     @ApiResponses(value = {
80             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
81             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
82             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "update  error", response = String.class) })
83     public Response updateValidateStatus(@ApiParam(value = "http request body") @Context HttpServletRequest request,
84             @ApiParam(value = "http header") @Context HttpHeaders head) throws IOException {
85         InputStream input = request.getInputStream();
86         return PackageWrapper.getInstance().updateValidateStatus(input);
87
88     }
89
90     @Path("/csars")
91     @GET
92     @ApiOperation(value = "get csar package list by condition", response = PackageMeta.class, responseContainer = "List")
93     @Produces(MediaType.APPLICATION_JSON)
94     @ApiResponses(value = {
95             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
96             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
97             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
98     public Response queryPackageListByCond(@ApiParam(value = "csar name") @QueryParam("name") String name,
99             @ApiParam(value = "csar provider") @QueryParam("provider") String provider,
100             @ApiParam(value = "csar version") @QueryParam("version") String version,
101             @ApiParam(value = "delay to delete") @QueryParam("deletionPending") String deletionPending,
102             @ApiParam(value = "csar type") @QueryParam("type") String type) {
103         return PackageWrapper.getInstance().queryPackageListByCond(name, provider, version, deletionPending, type);
104     }
105
106     @Path("/csars/{csarId}")
107     @GET
108     @ApiOperation(value = "get csar package list", response = PackageMeta.class, responseContainer = "List")
109     @Produces(MediaType.APPLICATION_JSON)
110     @ApiResponses(value = {
111             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
112             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
113             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
114     public Response queryPackageById(@ApiParam(value = "csar id") @PathParam("csarId") String csarId) {
115         return PackageWrapper.getInstance().queryPackageById(csarId);
116     }
117
118     @Path("/csars")
119     @POST
120     @ApiOperation(value = "upload csar package", response = UploadPackageResponse.class)
121     @Consumes(MediaType.MULTIPART_FORM_DATA)
122     @Produces(MediaType.APPLICATION_JSON)
123     @ApiResponses(value = {
124             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
125             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
126             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
127     public Response uploadPackage(
128             @ApiParam(value = "file inputstream", required = true) @FormDataParam("file") InputStream uploadedInputStream,
129             @FormDataParam("params") String details,
130             @ApiParam(value = "file detail", required = false) @FormDataParam("file") FormDataContentDisposition fileDetail,
131             @ApiParam(value = "http header") @Context HttpHeaders head)
132             throws IOException, MarketplaceResourceException {
133         return PackageWrapper.getInstance().uploadPackage(uploadedInputStream, fileDetail, details, head);
134     }
135
136     @Path("/vtp/tests")
137     @GET
138     @ApiOperation(value = "VTP Test cases", response = String.class)
139     @Produces(MediaType.APPLICATION_JSON)
140     @ApiResponses(value = {
141             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Failed to retrieve the tests", response = String.class) })
142     public Response listTests() throws IOException, MarketplaceResourceException {
143         Result result = null;
144         try {
145             result = OpenRemoteCli.run(new String[] { "-P", "open-cli", "schema-list", "--product", "onap-vtp", "--format", "json" });
146         } catch (Exception e) {
147             return Response.serverError().build();
148         }
149
150         if (result.getExitCode() != 0) {
151             return Response.serverError().entity(result.getOutput()).build();
152         }
153
154         return Response.ok(result.getOutput(), MediaType.APPLICATION_JSON).build();
155     }
156
157     @Path("/vtp/tests/{testName}/run")
158     @POST
159     @ApiOperation(value = "Run VTP testcase")
160     @Consumes(MediaType.APPLICATION_JSON)
161     @Produces(MediaType.APPLICATION_JSON)
162     @ApiResponses(value = {
163             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "Test case not found", response = String.class),
164             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "VTP internal failure", response = String.class) })
165     public Response runTest(@ApiParam(value = "test Name") @PathParam("testName") String testName,
166             @Context HttpServletRequest request)
167             throws IOException, MarketplaceResourceException {
168         String details = IOUtils.toString(request.getInputStream());
169         Result result = null;
170         try {
171             List<String> cmdArgsList = new ArrayList<>();
172             for (String defaultArg: new String[] { "-P", "onap-vtp", testName, "--format", "json" }) {
173                 cmdArgsList.add(defaultArg);
174             }
175
176             LinkedTreeMap<String, String> cmdArgs = ToolUtil.fromJson(details, LinkedTreeMap.class);
177             for (Entry<String, String> arg : cmdArgs.entrySet()) {
178                 cmdArgsList.add("--" + arg.getKey());
179                 cmdArgsList.add(arg.getValue());
180             }
181
182             result = OpenRemoteCli.run(cmdArgsList.toArray(new String []{}));
183         } catch (Exception e) {
184             return Response.serverError().build();
185         }
186
187         if (result.getExitCode() != 0) {
188             return Response.serverError().entity(result.getOutput()).build();
189         }
190
191         return Response.ok(result.getOutput(), MediaType.APPLICATION_JSON).build();
192     }
193
194     @Path("/csars/{csarId}")
195     @DELETE
196     @ApiOperation(value = "delete a package")
197     @ApiResponses(value = {
198             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
199             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
200             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
201     public Response delPackage(@ApiParam(value = "csar Id") @PathParam("csarId") String csarId) {
202         return PackageWrapper.getInstance().delPackage(csarId);
203     }
204
205     @Path("/csars/{csarId}/files")
206     @GET
207     @ApiOperation(value = "get csar file uri by csarId", response = CsarFileUriResponse.class)
208     @Produces(MediaType.APPLICATION_JSON)
209     @ApiResponses(value = {
210             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
211             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
212             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
213     public Response getCsarFileUri(@ApiParam(value = "csar Id", required = true) @PathParam("csarId") String csarId) {
214         return PackageWrapper.getInstance().getCsarFileUri(csarId);
215     }
216
217     @Path("/csars/{csarId}/downloaded")
218     @GET
219     @ApiOperation(value = "update download count for a package", response = Response.class)
220     public Response updateDwonloadCount(@ApiParam(value = "csar Id") @PathParam("csarId") String csarId) {
221         return PackageWrapper.getInstance().updateDwonloadCount(csarId);
222     }
223
224     @Path("/csars/{csarId}/reupload")
225     @POST
226     @ApiOperation(value = "re-upload csar package", response = UploadPackageResponse.class)
227     @Consumes(MediaType.MULTIPART_FORM_DATA)
228     @Produces(MediaType.APPLICATION_JSON)
229     @ApiResponses(value = {
230             @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "microservice not found", response = String.class),
231             @ApiResponse(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE_415, message = "Unprocessable MicroServiceInfo Entity ", response = String.class),
232             @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "resource grant error", response = String.class) })
233     public Response reUploadPackage(@ApiParam(value = "csar Id") @PathParam("csarId") String csarId,
234             @ApiParam(value = "file inputstream", required = true) @FormDataParam("file") InputStream uploadedInputStream,
235             @FormDataParam("params") String details,
236             @ApiParam(value = "file detail", required = false) @FormDataParam("file") FormDataContentDisposition fileDetail,
237             @ApiParam(value = "http header") @Context HttpHeaders head)
238             throws IOException, MarketplaceResourceException {
239         return PackageWrapper.getInstance().reUploadPackage(csarId, uploadedInputStream, fileDetail, details, head);
240     }
241
242     @Path("/csars/{csarId}/onboardstatus")
243     @GET
244     @ApiOperation(value = "Get VNF OnBoarding Result", response = OnBoardingResult.class)
245     @Produces(MediaType.APPLICATION_JSON)
246     public Response getOnBoardingResult(@ApiParam("csar Id") @PathParam("csarId") String csarId,
247             @ApiParam("operation type") @QueryParam("operTypeId") String operTypeId,
248             @ApiParam("operation id") @QueryParam("operId") String operId) {
249         return PackageWrapper.getInstance().getOnBoardingResult(csarId, operTypeId, operId);
250     }
251
252     @Path("/csars/{csarId}/operresult")
253     @GET
254     @ApiOperation(value = "Get VNF OnBoarded Opeartion Result", response = Response.class)
255     @Produces(MediaType.APPLICATION_JSON)
256     public Response getOperStatus(@ApiParam(value = "csar Id") @PathParam("csarId") String csarId,
257             @ApiParam(value = "operation type") @QueryParam("operTypeId") String operTypeId) {
258         return PackageWrapper.getInstance().getOperResultByOperTypeId(csarId, operTypeId);
259     }
260
261     @Path("/csars/onboardsteps")
262     @GET
263     @ApiOperation(value = "Get VNF OnBoarded Steps", response = Response.class)
264     @Produces(MediaType.APPLICATION_JSON)
265     public Response getOnBoardingSteps() {
266         return PackageWrapper.getInstance().getOnBoardingSteps();
267     }
268
269     @Path("/healthcheck")
270     @GET
271     @ApiOperation(value = "Health for VNF Repository", response = Response.class)
272     @Produces(MediaType.APPLICATION_JSON)
273     public Response healthCheck() {
274
275         // Step 1: Check whether tomcat server is up
276         RestResponse resp = RestfulClient.get("127.0.0.1", CommonConstant.HTTP_PORT, CommonConstant.BASE_URL);
277         if (RestConstant.RESPONSE_CODE_200 != resp.getStatusCode()) {
278             return Response.serverError().build();
279         }
280
281         // Step 2: Check whether postgres database is up
282         try {
283             PackageManager.getInstance().queryPackageByCsarId("01");
284         } catch (Exception e) {
285             return Response.serverError().build();
286         }
287
288         return Response.ok().build();
289     }
290
291 }