2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.api.main.rest;
24 import static org.assertj.core.api.Assertions.assertThatCode;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
29 import static org.junit.Assert.fail;
31 import java.io.IOException;
32 import java.lang.reflect.Constructor;
33 import java.lang.reflect.Modifier;
34 import java.security.SecureRandom;
35 import java.security.cert.X509Certificate;
36 import java.util.Properties;
38 import javax.net.ssl.SSLContext;
39 import javax.net.ssl.TrustManager;
40 import javax.net.ssl.X509TrustManager;
41 import javax.ws.rs.client.Client;
42 import javax.ws.rs.client.ClientBuilder;
43 import javax.ws.rs.client.Entity;
44 import javax.ws.rs.client.Invocation;
45 import javax.ws.rs.client.WebTarget;
46 import javax.ws.rs.core.MediaType;
47 import javax.ws.rs.core.Response;
49 import org.glassfish.jersey.client.ClientConfig;
50 import org.glassfish.jersey.client.ClientProperties;
51 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
52 import org.junit.After;
53 import org.junit.Test;
54 import org.onap.policy.api.main.exception.PolicyApiException;
55 import org.onap.policy.api.main.parameters.CommonTestData;
56 import org.onap.policy.api.main.parameters.RestServerParameters;
57 import org.onap.policy.api.main.startstop.Main;
58 import org.onap.policy.common.endpoints.report.HealthCheckReport;
59 import org.onap.policy.common.gson.GsonMessageBodyHandler;
60 import org.onap.policy.common.utils.coder.StandardCoder;
61 import org.onap.policy.common.utils.network.NetworkUtil;
62 import org.onap.policy.common.utils.resources.ResourceUtils;
63 import org.onap.policy.models.errors.concepts.ErrorResponse;
64 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
65 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
66 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
71 * Class to perform unit test of {@link ApiRestServer}.
73 * @author Chenfei Gao (cgao@research.att.com)
75 public class TestApiRestServer {
77 private static final Logger LOGGER = LoggerFactory.getLogger(TestApiRestServer.class);
78 private static final String NOT_ALIVE = "not alive";
79 private static final String ALIVE = "alive";
80 private static final String SELF = "self";
81 private static final String NAME = "Policy API";
83 private static final String HEALTHCHECK_ENDPOINT = "healthcheck";
84 private static final String STATISTICS_ENDPOINT = "statistics";
86 private static final String POLICYTYPES = "policytypes";
87 private static final String POLICYTYPES_TCA = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app";
88 private static final String POLICYTYPES_COLLECTOR =
89 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server";
90 private static final String POLICYTYPES_TCA_VERSION =
91 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0";
92 private static final String POLICYTYPES_TCA_LATEST =
93 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/latest";
94 private static final String POLICYTYPES_COLLECTOR_VERSION =
95 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/1.0.0";
96 private static final String POLICYTYPES_COLLECTOR_LATEST =
97 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/latest";
99 private static final String POLICYTYPES_TCA_POLICIES =
100 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies";
101 private static final String POLICYTYPES_TCA_POLICIES_VCPE =
102 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca";
103 private static final String POLICYTYPES_TCA_POLICIES_VCPE_VERSION = "policytypes/"
104 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/1.0.0";
105 private static final String POLICYTYPES_TCA_POLICIES_VCPE_LATEST = "policytypes/"
106 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/latest";
108 private static final String GUARD_POLICIES =
109 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies";
110 private static final String GUARD_POLICIES_VDNS_FL =
111 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout";
112 private static final String GUARD_POLICIES_VDNS_MINMAX =
113 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout";
114 private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
115 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1.0.0";
116 private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
117 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1.0.0";
119 private static final String OPS_POLICIES =
120 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
121 private static final String OPS_POLICIES_VCPE =
122 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart";
123 private static final String OPS_POLICIES_VDNS =
124 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout";
125 private static final String OPS_POLICIES_VFIREWALL =
126 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig";
127 private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
128 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart/versions/1.0.0";
129 private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
130 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout/versions/1.0.0";
131 private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
132 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig/versions/1.0.0";
134 private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
136 private ApiRestServer restServer;
137 private StandardCoder standardCoder = new StandardCoder();
140 private String[] toscaPolicyResourceNames = {
141 "policies/vCPE.policy.monitoring.input.tosca.json",
142 "policies/vDNS.policy.monitoring.input.tosca.json",
143 "policies/vFirewall.policy.monitoring.input.tosca.json",
146 private String[] toscaPolicyTypeResourceNames = {
147 "policytypes/onap.policy.monitoring.cdap.tca.hi.lo.app.json",
148 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
151 private String[] legacyGuardPolicyResourceNames = {
152 "policies/vDNS.policy.guard.frequency.input.json",
153 "policies/vDNS.policy.guard.minmax.input.json",
156 private String[] legacyOperationalPolicyResourceNames = {
157 "policies/vCPE.policy.operational.input.json",
158 "policies/vDNS.policy.operational.input.json",
159 "policies/vFirewall.policy.operational.input.json"
164 * Method for cleanup after each test.
167 public void teardown() {
170 if (NetworkUtil.isTcpPortOpen("localhost", 6969, 1, 1000L)) {
172 stopApiService(main);
173 } else if (restServer != null) {
177 } catch (InterruptedException | IOException | PolicyApiException exp) {
178 LOGGER.error("teardown failed", exp);
183 public void testHealthCheckSuccess() {
186 main = startApiService(true);
187 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
188 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
189 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
190 } catch (final Exception exp) {
191 LOGGER.error("testHealthCheckSuccess failed", exp);
192 fail("Test should not throw an exception");
197 public void testHealthCheckFailure() throws InterruptedException, IOException {
199 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
200 restServerParams.setName(CommonTestData.API_GROUP_NAME);
201 restServer = new ApiRestServer(restServerParams);
204 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
205 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
206 validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
207 assertTrue(restServer.isAlive());
208 assertTrue(restServer.toString().startsWith("ApiRestServer [servers="));
209 } catch (final Exception exp) {
210 LOGGER.error("testHealthCheckFailure failed", exp);
211 fail("Test should not throw an exception");
216 public void testHttpsHealthCheckSuccess() {
219 main = startApiService(false);
220 final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
221 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
222 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
223 } catch (final Exception exp) {
224 LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
225 fail("Test should not throw an exception");
230 public void testApiStatistics_200() {
233 main = startApiService(true);
234 Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
235 StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
236 validateStatisticsReport(report, 200);
237 updateApiStatistics();
238 invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
239 report = invocationBuilder.get(StatisticsReport.class);
240 validateStatisticsReport(report, 200);
241 ApiStatisticsManager.resetAllStatistics();
242 } catch (final Exception exp) {
243 LOGGER.error("testApiStatistics_200 failed", exp);
244 fail("Test should not throw an exception");
249 public void testApiStatistics_500() {
251 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
252 restServerParams.setName(CommonTestData.API_GROUP_NAME);
253 restServer = new ApiRestServer(restServerParams);
256 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
257 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
258 validateStatisticsReport(report, 500);
259 ApiStatisticsManager.resetAllStatistics();
260 } catch (final Exception exp) {
261 LOGGER.error("testApiStatistics_500 failed", exp);
262 fail("Test should not throw an exception");
267 public void testHttpsApiStatistics() {
270 main = startApiService(false);
271 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
272 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
273 validateStatisticsReport(report, 200);
274 } catch (final Exception exp) {
275 LOGGER.error("testHttpsApiStatistics failed", exp);
276 fail("Test should not throw an exception");
281 public void testApiStatisticsConstructorIsPrivate() {
284 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
285 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
286 constructor.setAccessible(true);
287 constructor.newInstance();
288 } catch (final Exception exp) {
289 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
294 public void testCreatePolicyTypes() {
296 assertThatCode(() -> {
297 main = startApiService(true);
298 for (String resrcName : toscaPolicyTypeResourceNames) {
299 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
300 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
301 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
302 assertNotNull(response);
303 assertFalse(response.getPolicyTypes().get(0).isEmpty());
305 }).doesNotThrowAnyException();
309 public void testReadPolicyTypes() {
311 assertThatCode(() -> {
312 main = startApiService(true);
313 Response rawResponse = readResource(POLICYTYPES, true);
314 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
315 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
316 assertTrue(response.getPolicyTypes().get(0).isEmpty());
318 rawResponse = readResource(POLICYTYPES_TCA, true);
319 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
320 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
321 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
322 error.getErrorMessage());
324 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
325 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
326 error = rawResponse.readEntity(ErrorResponse.class);
327 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
328 error.getErrorMessage());
330 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
331 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
332 error = rawResponse.readEntity(ErrorResponse.class);
333 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
334 error.getErrorMessage());
336 rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
337 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
338 error = rawResponse.readEntity(ErrorResponse.class);
339 assertEquals("policy type with ID "
340 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
341 error.getErrorMessage());
343 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
344 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
345 error = rawResponse.readEntity(ErrorResponse.class);
346 assertEquals("policy type with ID "
347 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
348 error.getErrorMessage());
350 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
351 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
352 error = rawResponse.readEntity(ErrorResponse.class);
353 assertEquals("policy type with ID "
354 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
355 error.getErrorMessage());
356 }).doesNotThrowAnyException();
360 public void testDeletePolicyType() {
362 assertThatCode(() -> {
363 main = startApiService(true);
364 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
365 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
366 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
367 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
368 error.getErrorMessage());
370 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
371 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
372 error = rawResponse.readEntity(ErrorResponse.class);
373 assertEquals("policy type with ID "
374 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
375 error.getErrorMessage());
376 }).doesNotThrowAnyException();
380 public void testCreatePolicies() {
382 assertThatCode(() -> {
383 main = startApiService(true);
384 for (String resrcName : toscaPolicyResourceNames) {
385 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
386 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
387 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
388 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
389 error.getErrorMessage());
391 }).doesNotThrowAnyException();
395 public void testReadPolicies() {
397 assertThatCode(() -> {
398 main = startApiService(true);
399 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
400 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
401 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
402 assertEquals("policy with ID null:null and "
403 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
404 error.getErrorMessage());
406 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
407 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
408 error = rawResponse.readEntity(ErrorResponse.class);
409 assertEquals("policy with ID onap.restart.tca:null and "
410 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
411 error.getErrorMessage());
413 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
414 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
415 error = rawResponse.readEntity(ErrorResponse.class);
416 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
417 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
418 error.getErrorMessage());
420 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
421 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
422 error = rawResponse.readEntity(ErrorResponse.class);
423 assertEquals("policy with ID onap.restart.tca:null and "
424 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
425 error.getErrorMessage());
426 }).doesNotThrowAnyException();
430 public void testDeletePolicies() {
432 assertThatCode(() -> {
433 main = startApiService(true);
434 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
435 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
436 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
437 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
438 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
439 error.getErrorMessage());
440 }).doesNotThrowAnyException();
444 public void testCreateGuardPolicies() {
446 assertThatCode(() -> {
447 main = startApiService(true);
448 for (String resrcName : legacyGuardPolicyResourceNames) {
449 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
450 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
452 }).doesNotThrowAnyException();
456 public void testCreateOperationalPolicies() {
458 assertThatCode(() -> {
459 main = startApiService(true);
460 for (String resrcName : legacyOperationalPolicyResourceNames) {
461 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
462 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
464 }).doesNotThrowAnyException();
468 public void testReadGuardPolicies() {
470 assertThatCode(() -> {
471 main = startApiService(true);
472 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL, true);
473 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
474 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
475 assertEquals("no policy found for policy ID: guard.frequency.scaleout",
476 error.getErrorMessage());
478 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
479 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
480 error = rawResponse.readEntity(ErrorResponse.class);
481 assertEquals("no policy found for policy ID: guard.frequency.scaleout",
482 error.getErrorMessage());
484 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX, true);
485 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
486 error = rawResponse.readEntity(ErrorResponse.class);
487 assertEquals("no policy found for policy ID: guard.minmax.scaleout",
488 error.getErrorMessage());
490 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
491 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
492 error = rawResponse.readEntity(ErrorResponse.class);
493 assertEquals("no policy found for policy ID: guard.minmax.scaleout",
494 error.getErrorMessage());
495 }).doesNotThrowAnyException();
499 public void testReadOperationalPolicies() {
501 assertThatCode(() -> {
502 main = startApiService(true);
503 Response rawResponse = readResource(OPS_POLICIES_VCPE, true);
504 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
505 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
506 assertEquals("no policy found for policy ID: operational.restart",
507 error.getErrorMessage());
509 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
510 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
511 error = rawResponse.readEntity(ErrorResponse.class);
512 assertEquals("no policy found for policy ID: operational.restart",
513 error.getErrorMessage());
515 rawResponse = readResource(OPS_POLICIES_VDNS, true);
516 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
517 error = rawResponse.readEntity(ErrorResponse.class);
518 assertEquals("no policy found for policy ID: operational.scaleout",
519 error.getErrorMessage());
521 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
522 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
523 error = rawResponse.readEntity(ErrorResponse.class);
524 assertEquals("no policy found for policy ID: operational.scaleout",
525 error.getErrorMessage());
527 rawResponse = readResource(OPS_POLICIES_VFIREWALL, true);
528 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
529 error = rawResponse.readEntity(ErrorResponse.class);
530 assertEquals("no policy found for policy ID: operational.modifyconfig",
531 error.getErrorMessage());
533 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
534 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
535 error = rawResponse.readEntity(ErrorResponse.class);
536 assertEquals("no policy found for policy ID: operational.modifyconfig",
537 error.getErrorMessage());
538 }).doesNotThrowAnyException();
542 public void testDeleteGuardPolicy() {
544 assertThatCode(() -> {
545 main = startApiService(true);
546 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
547 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
548 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
549 assertEquals("no policy found for policy ID: guard.frequency.scaleout",
550 error.getErrorMessage());
551 }).doesNotThrowAnyException();
555 public void testDeleteOperationalPolicy() {
557 assertThatCode(() -> {
558 main = startApiService(true);
559 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
560 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
561 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
562 assertEquals("no policy found for policy ID: operational.restart",
563 error.getErrorMessage());
564 }).doesNotThrowAnyException();
568 public void testHttpsCreatePolicyTypes() {
570 assertThatCode(() -> {
571 main = startApiService(false);
572 for (String resrcName : toscaPolicyTypeResourceNames) {
573 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
574 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
575 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
576 assertNotNull(response);
577 assertFalse(response.getPolicyTypes().get(0).isEmpty());
579 }).doesNotThrowAnyException();
583 public void testHttpsCreatePolicies() {
585 assertThatCode(() -> {
586 main = startApiService(false);
587 for (String resrcName : toscaPolicyResourceNames) {
588 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
589 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
590 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
591 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
592 error.getErrorMessage());
594 }).doesNotThrowAnyException();
598 public void testHttpsCreateGuardPolicies() {
600 assertThatCode(() -> {
601 main = startApiService(false);
602 for (String resrcName : legacyGuardPolicyResourceNames) {
603 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
604 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
606 }).doesNotThrowAnyException();
610 public void testHttpsCreateOperationalPolicies() {
612 assertThatCode(() -> {
613 main = startApiService(false);
614 for (String resrcName : legacyOperationalPolicyResourceNames) {
615 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
616 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
618 }).doesNotThrowAnyException();
621 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
623 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
624 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
625 final Invocation.Builder invocationBuilder;
628 invocationBuilder = sendHttpRequest(endpoint);
630 invocationBuilder = sendHttpsRequest(endpoint);
633 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
634 return invocationBuilder.post(entity);
637 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
639 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
640 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
641 final Invocation.Builder invocationBuilder;
644 invocationBuilder = sendHttpRequest(endpoint);
646 invocationBuilder = sendHttpsRequest(endpoint);
649 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
650 return invocationBuilder.post(entity);
653 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
655 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
656 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
657 final Invocation.Builder invocationBuilder;
660 invocationBuilder = sendHttpRequest(endpoint);
662 invocationBuilder = sendHttpsRequest(endpoint);
665 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
666 return invocationBuilder.post(entity);
669 private Response readResource(String endpoint, boolean http) throws Exception {
671 final Invocation.Builder invocationBuilder;
674 invocationBuilder = sendHttpRequest(endpoint);
676 invocationBuilder = sendHttpsRequest(endpoint);
679 return invocationBuilder.get();
683 private Response deleteResource(String endpoint, boolean http) throws Exception {
685 final Invocation.Builder invocationBuilder;
688 invocationBuilder = sendHttpRequest(endpoint);
690 invocationBuilder = sendHttpsRequest(endpoint);
693 return invocationBuilder.delete();
696 private Main startApiService(final boolean http) {
698 final String[] apiConfigParameters = new String[2];
700 apiConfigParameters[0] = "-c";
701 apiConfigParameters[1] = "parameters/ApiConfigParameters.json";
703 final Properties systemProps = System.getProperties();
704 systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
705 systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
706 System.setProperties(systemProps);
707 apiConfigParameters[0] = "-c";
708 apiConfigParameters[1] = "parameters/ApiConfigParameters_Https.json";
710 return new Main(apiConfigParameters);
713 private void stopApiService(final Main main) throws PolicyApiException {
718 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
720 final ClientConfig clientConfig = new ClientConfig();
722 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
723 clientConfig.register(feature);
725 final Client client = ClientBuilder.newClient(clientConfig);
727 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
728 client.register(GsonMessageBodyHandler.class);
730 final WebTarget webTarget = client.target("http://localhost:6969/policy/api/v1/" + endpoint);
732 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
734 if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
735 throw new IllegalStateException("cannot connect to port 6969");
737 return invocationBuilder;
740 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
742 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
745 public X509Certificate[] getAcceptedIssuers() {
746 return new X509Certificate[0];
750 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
753 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
756 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
757 sc.init(null, noopTrustManager, new SecureRandom());
758 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
760 final Client client = clientBuilder.build();
761 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
762 client.register(feature);
764 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
765 client.register(GsonMessageBodyHandler.class);
767 final WebTarget webTarget = client.target("https://localhost:6969/policy/api/v1/" + endpoint);
769 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
771 if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
772 throw new IllegalStateException("cannot connect to port 6969");
774 return invocationBuilder;
777 private void updateApiStatistics() {
779 ApiStatisticsManager.updateTotalApiCallCount();
780 ApiStatisticsManager.updateApiCallSuccessCount();
781 ApiStatisticsManager.updateApiCallFailureCount();
782 ApiStatisticsManager.updateTotalPolicyGetCount();
783 ApiStatisticsManager.updateTotalPolicyPostCount();
784 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
785 ApiStatisticsManager.updateTotalPolicyTypePostCount();
786 ApiStatisticsManager.updatePolicyGetSuccessCount();
787 ApiStatisticsManager.updatePolicyGetFailureCount();
788 ApiStatisticsManager.updatePolicyPostSuccessCount();
789 ApiStatisticsManager.updatePolicyPostFailureCount();
790 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
791 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
792 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
793 ApiStatisticsManager.updatePolicyTypePostFailureCount();
796 private void validateStatisticsReport(final StatisticsReport report, final int code) {
798 assertEquals(code, report.getCode());
801 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
802 final String message, final HealthCheckReport report) {
804 assertEquals(name, report.getName());
805 assertEquals(url, report.getUrl());
806 assertEquals(healthy, report.isHealthy());
807 assertEquals(code, report.getCode());
808 assertEquals(message, report.getMessage());