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_LATEST =
111 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
112 + "/versions/latest";
113 private static final String GUARD_POLICIES_VDNS_MINMAX_LATEST =
114 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout"
115 + "/versions/latest";
116 private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
117 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1";
118 private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
119 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1";
121 private static final String OPS_POLICIES =
122 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
123 private static final String OPS_POLICIES_VCPE_LATEST =
124 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart"
125 + "/versions/latest";
126 private static final String OPS_POLICIES_VDNS_LATEST =
127 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout"
128 + "/versions/latest";
129 private static final String OPS_POLICIES_VFIREWALL_LATEST =
130 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig"
131 + "/versions/latest";
132 private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
133 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart/versions/1";
134 private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
135 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout/versions/1";
136 private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
137 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig/versions/1";
139 private static String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
141 private ApiRestServer restServer;
142 private StandardCoder standardCoder = new StandardCoder();
145 private String[] toscaPolicyResourceNames = {
146 "policies/vCPE.policy.monitoring.input.tosca.json",
147 "policies/vDNS.policy.monitoring.input.tosca.json",
148 "policies/vFirewall.policy.monitoring.input.tosca.json",
151 private String[] toscaPolicyTypeResourceNames = {
152 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
153 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
156 private String[] legacyGuardPolicyResourceNames = {
157 "policies/vDNS.policy.guard.frequency.input.json",
158 "policies/vDNS.policy.guard.minmax.input.json",
161 private String[] legacyOperationalPolicyResourceNames = {
162 "policies/vCPE.policy.operational.input.json",
163 "policies/vDNS.policy.operational.input.json",
164 "policies/vFirewall.policy.operational.input.json"
169 * Method for cleanup after each test.
172 public void teardown() {
175 if (NetworkUtil.isTcpPortOpen("localhost", 6969, 1, 1000L)) {
177 stopApiService(main);
178 } else if (restServer != null) {
182 } catch (InterruptedException | IOException | PolicyApiException exp) {
183 LOGGER.error("teardown failed", exp);
188 public void testHealthCheckSuccess() {
191 main = startApiService(true);
192 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
193 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
194 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
195 } catch (final Exception exp) {
196 LOGGER.error("testHealthCheckSuccess failed", exp);
197 fail("Test should not throw an exception");
202 public void testHealthCheckFailure() throws InterruptedException, IOException {
204 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
205 restServerParams.setName(CommonTestData.API_GROUP_NAME);
206 restServer = new ApiRestServer(restServerParams);
209 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
210 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
211 validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
212 assertTrue(restServer.isAlive());
213 assertTrue(restServer.toString().startsWith("ApiRestServer [servers="));
214 } catch (final Exception exp) {
215 LOGGER.error("testHealthCheckFailure failed", exp);
216 fail("Test should not throw an exception");
221 public void testHttpsHealthCheckSuccess() {
224 main = startApiService(false);
225 final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
226 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
227 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
228 } catch (final Exception exp) {
229 LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
230 fail("Test should not throw an exception");
235 public void testApiStatistics_200() {
238 main = startApiService(true);
239 Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
240 StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
241 validateStatisticsReport(report, 200);
242 updateApiStatistics();
243 invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
244 report = invocationBuilder.get(StatisticsReport.class);
245 validateStatisticsReport(report, 200);
246 ApiStatisticsManager.resetAllStatistics();
247 } catch (final Exception exp) {
248 LOGGER.error("testApiStatistics_200 failed", exp);
249 fail("Test should not throw an exception");
254 public void testApiStatistics_500() {
256 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
257 restServerParams.setName(CommonTestData.API_GROUP_NAME);
258 restServer = new ApiRestServer(restServerParams);
261 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
262 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
263 validateStatisticsReport(report, 500);
264 ApiStatisticsManager.resetAllStatistics();
265 } catch (final Exception exp) {
266 LOGGER.error("testApiStatistics_500 failed", exp);
267 fail("Test should not throw an exception");
272 public void testHttpsApiStatistics() {
275 main = startApiService(false);
276 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
277 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
278 validateStatisticsReport(report, 200);
279 } catch (final Exception exp) {
280 LOGGER.error("testHttpsApiStatistics failed", exp);
281 fail("Test should not throw an exception");
286 public void testApiStatisticsConstructorIsPrivate() {
289 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
290 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
291 constructor.setAccessible(true);
292 constructor.newInstance();
293 } catch (final Exception exp) {
294 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
299 public void testCreatePolicyTypes() {
301 assertThatCode(() -> {
302 main = startApiService(true);
303 for (String resrcName : toscaPolicyTypeResourceNames) {
304 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
305 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
306 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
307 assertNotNull(response);
308 assertFalse(response.getPolicyTypes().get(0).isEmpty());
310 }).doesNotThrowAnyException();
314 public void testReadPolicyTypes() {
316 assertThatCode(() -> {
317 main = startApiService(true);
318 Response rawResponse = readResource(POLICYTYPES, true);
319 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
320 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
321 assertTrue(response.getPolicyTypes().get(0).isEmpty());
323 rawResponse = readResource(POLICYTYPES_TCA, true);
324 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
325 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
326 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
327 error.getErrorMessage());
329 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
330 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
331 error = rawResponse.readEntity(ErrorResponse.class);
332 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
333 error.getErrorMessage());
335 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
336 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
337 error = rawResponse.readEntity(ErrorResponse.class);
338 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
339 error.getErrorMessage());
341 rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
342 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
343 error = rawResponse.readEntity(ErrorResponse.class);
344 assertEquals("policy type with ID "
345 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
346 error.getErrorMessage());
348 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
349 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
350 error = rawResponse.readEntity(ErrorResponse.class);
351 assertEquals("policy type with ID "
352 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
353 error.getErrorMessage());
355 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
356 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
357 error = rawResponse.readEntity(ErrorResponse.class);
358 assertEquals("policy type with ID "
359 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
360 error.getErrorMessage());
361 }).doesNotThrowAnyException();
365 public void testDeletePolicyType() {
367 assertThatCode(() -> {
368 main = startApiService(true);
369 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
370 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
371 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
372 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
373 error.getErrorMessage());
375 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
376 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
377 error = rawResponse.readEntity(ErrorResponse.class);
378 assertEquals("policy type with ID "
379 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
380 error.getErrorMessage());
381 }).doesNotThrowAnyException();
385 public void testCreatePolicies() {
387 assertThatCode(() -> {
388 main = startApiService(true);
389 for (String resrcName : toscaPolicyResourceNames) {
390 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
391 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
392 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
393 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
394 error.getErrorMessage());
396 }).doesNotThrowAnyException();
400 public void testReadPolicies() {
402 assertThatCode(() -> {
403 main = startApiService(true);
404 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
405 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
406 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
407 assertEquals("policy with ID null:null and "
408 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
409 error.getErrorMessage());
411 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
412 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
413 error = rawResponse.readEntity(ErrorResponse.class);
414 assertEquals("policy with ID onap.restart.tca:null and "
415 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
416 error.getErrorMessage());
418 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
419 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
420 error = rawResponse.readEntity(ErrorResponse.class);
421 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
422 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
423 error.getErrorMessage());
425 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
426 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
427 error = rawResponse.readEntity(ErrorResponse.class);
428 assertEquals("policy with ID onap.restart.tca:null and "
429 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
430 error.getErrorMessage());
431 }).doesNotThrowAnyException();
435 public void testDeletePolicies() {
437 assertThatCode(() -> {
438 main = startApiService(true);
439 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
440 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
441 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
442 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
443 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
444 error.getErrorMessage());
445 }).doesNotThrowAnyException();
449 public void testCreateGuardPolicies() {
451 assertThatCode(() -> {
452 main = startApiService(true);
453 for (String resrcName : legacyGuardPolicyResourceNames) {
454 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
455 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
457 }).doesNotThrowAnyException();
461 public void testCreateOperationalPolicies() {
463 assertThatCode(() -> {
464 main = startApiService(true);
465 for (String resrcName : legacyOperationalPolicyResourceNames) {
466 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
467 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
469 }).doesNotThrowAnyException();
473 public void testReadGuardPolicies() {
475 assertThatCode(() -> {
476 main = startApiService(true);
477 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
478 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
479 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
480 assertEquals("no policy found for policy: guard.frequency.scaleout:null",
481 error.getErrorMessage());
483 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
484 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
485 error = rawResponse.readEntity(ErrorResponse.class);
486 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
487 error.getErrorMessage());
489 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
490 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
491 error = rawResponse.readEntity(ErrorResponse.class);
492 assertEquals("no policy found for policy: guard.minmax.scaleout:null",
493 error.getErrorMessage());
495 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
496 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
497 error = rawResponse.readEntity(ErrorResponse.class);
498 assertEquals("no policy found for policy: guard.minmax.scaleout:1",
499 error.getErrorMessage());
500 }).doesNotThrowAnyException();
504 public void testReadOperationalPolicies() {
506 assertThatCode(() -> {
507 main = startApiService(true);
508 Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
509 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
510 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
511 assertEquals("no policy found for policy: operational.restart:null",
512 error.getErrorMessage());
514 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
515 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
516 error = rawResponse.readEntity(ErrorResponse.class);
517 assertEquals("no policy found for policy: operational.restart:1",
518 error.getErrorMessage());
520 rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
521 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
522 error = rawResponse.readEntity(ErrorResponse.class);
523 assertEquals("no policy found for policy: operational.scaleout:null",
524 error.getErrorMessage());
526 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
527 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
528 error = rawResponse.readEntity(ErrorResponse.class);
529 assertEquals("no policy found for policy: operational.scaleout:1",
530 error.getErrorMessage());
532 rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
533 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
534 error = rawResponse.readEntity(ErrorResponse.class);
535 assertEquals("no policy found for policy: operational.modifyconfig:null",
536 error.getErrorMessage());
538 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
539 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
540 error = rawResponse.readEntity(ErrorResponse.class);
541 assertEquals("no policy found for policy: operational.modifyconfig:1",
542 error.getErrorMessage());
543 }).doesNotThrowAnyException();
547 public void testDeleteGuardPolicy() {
549 assertThatCode(() -> {
550 main = startApiService(true);
551 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
552 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
553 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
554 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
555 error.getErrorMessage());
556 }).doesNotThrowAnyException();
560 public void testDeleteOperationalPolicy() {
562 assertThatCode(() -> {
563 main = startApiService(true);
564 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
565 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
566 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
567 assertEquals("no policy found for policy: operational.restart:1",
568 error.getErrorMessage());
569 }).doesNotThrowAnyException();
573 public void testHttpsCreatePolicyTypes() {
575 assertThatCode(() -> {
576 main = startApiService(false);
577 for (String resrcName : toscaPolicyTypeResourceNames) {
578 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
579 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
580 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
581 assertNotNull(response);
582 assertFalse(response.getPolicyTypes().get(0).isEmpty());
584 }).doesNotThrowAnyException();
588 public void testHttpsCreatePolicies() {
590 assertThatCode(() -> {
591 main = startApiService(false);
592 for (String resrcName : toscaPolicyResourceNames) {
593 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
594 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
595 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
596 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
597 error.getErrorMessage());
599 }).doesNotThrowAnyException();
603 public void testHttpsCreateGuardPolicies() {
605 assertThatCode(() -> {
606 main = startApiService(false);
607 for (String resrcName : legacyGuardPolicyResourceNames) {
608 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
609 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
611 }).doesNotThrowAnyException();
615 public void testHttpsCreateOperationalPolicies() {
617 assertThatCode(() -> {
618 main = startApiService(false);
619 for (String resrcName : legacyOperationalPolicyResourceNames) {
620 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
621 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
623 }).doesNotThrowAnyException();
626 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
628 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
629 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
630 final Invocation.Builder invocationBuilder;
633 invocationBuilder = sendHttpRequest(endpoint);
635 invocationBuilder = sendHttpsRequest(endpoint);
638 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
639 return invocationBuilder.post(entity);
642 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
644 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
645 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
646 final Invocation.Builder invocationBuilder;
649 invocationBuilder = sendHttpRequest(endpoint);
651 invocationBuilder = sendHttpsRequest(endpoint);
654 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
655 return invocationBuilder.post(entity);
658 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
660 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
661 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
662 final Invocation.Builder invocationBuilder;
665 invocationBuilder = sendHttpRequest(endpoint);
667 invocationBuilder = sendHttpsRequest(endpoint);
670 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
671 return invocationBuilder.post(entity);
674 private Response readResource(String endpoint, boolean http) throws Exception {
676 final Invocation.Builder invocationBuilder;
679 invocationBuilder = sendHttpRequest(endpoint);
681 invocationBuilder = sendHttpsRequest(endpoint);
684 return invocationBuilder.get();
688 private Response deleteResource(String endpoint, boolean http) throws Exception {
690 final Invocation.Builder invocationBuilder;
693 invocationBuilder = sendHttpRequest(endpoint);
695 invocationBuilder = sendHttpsRequest(endpoint);
698 return invocationBuilder.delete();
701 private Main startApiService(final boolean http) {
703 final String[] apiConfigParameters = new String[2];
705 apiConfigParameters[0] = "-c";
706 apiConfigParameters[1] = "parameters/ApiConfigParameters.json";
708 final Properties systemProps = System.getProperties();
709 systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
710 systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
711 System.setProperties(systemProps);
712 apiConfigParameters[0] = "-c";
713 apiConfigParameters[1] = "parameters/ApiConfigParameters_Https.json";
715 return new Main(apiConfigParameters);
718 private void stopApiService(final Main main) throws PolicyApiException {
723 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
725 final ClientConfig clientConfig = new ClientConfig();
727 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
728 clientConfig.register(feature);
730 final Client client = ClientBuilder.newClient(clientConfig);
732 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
733 client.register(GsonMessageBodyHandler.class);
735 final WebTarget webTarget = client.target("http://localhost:6969/policy/api/v1/" + endpoint);
737 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
739 if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
740 throw new IllegalStateException("cannot connect to port 6969");
742 return invocationBuilder;
745 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
747 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
750 public X509Certificate[] getAcceptedIssuers() {
751 return new X509Certificate[0];
755 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
758 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
761 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
762 sc.init(null, noopTrustManager, new SecureRandom());
763 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
765 final Client client = clientBuilder.build();
766 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
767 client.register(feature);
769 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
770 client.register(GsonMessageBodyHandler.class);
772 final WebTarget webTarget = client.target("https://localhost:6969/policy/api/v1/" + endpoint);
774 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
776 if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
777 throw new IllegalStateException("cannot connect to port 6969");
779 return invocationBuilder;
782 private void updateApiStatistics() {
784 ApiStatisticsManager.updateTotalApiCallCount();
785 ApiStatisticsManager.updateApiCallSuccessCount();
786 ApiStatisticsManager.updateApiCallFailureCount();
787 ApiStatisticsManager.updateTotalPolicyGetCount();
788 ApiStatisticsManager.updateTotalPolicyPostCount();
789 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
790 ApiStatisticsManager.updateTotalPolicyTypePostCount();
791 ApiStatisticsManager.updatePolicyGetSuccessCount();
792 ApiStatisticsManager.updatePolicyGetFailureCount();
793 ApiStatisticsManager.updatePolicyPostSuccessCount();
794 ApiStatisticsManager.updatePolicyPostFailureCount();
795 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
796 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
797 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
798 ApiStatisticsManager.updatePolicyTypePostFailureCount();
801 private void validateStatisticsReport(final StatisticsReport report, final int code) {
803 assertEquals(code, report.getCode());
806 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
807 final String message, final HealthCheckReport report) {
809 assertEquals(name, report.getName());
810 assertEquals(url, report.getUrl());
811 assertEquals(healthy, report.isHealthy());
812 assertEquals(code, report.getCode());
813 assertEquals(message, report.getMessage());