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;
37 import javax.net.ssl.SSLContext;
38 import javax.net.ssl.TrustManager;
39 import javax.net.ssl.X509TrustManager;
40 import javax.ws.rs.client.Client;
41 import javax.ws.rs.client.ClientBuilder;
42 import javax.ws.rs.client.Entity;
43 import javax.ws.rs.client.Invocation;
44 import javax.ws.rs.client.WebTarget;
45 import javax.ws.rs.core.MediaType;
46 import javax.ws.rs.core.Response;
47 import org.glassfish.jersey.client.ClientConfig;
48 import org.glassfish.jersey.client.ClientProperties;
49 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
50 import org.junit.After;
51 import org.junit.Test;
52 import org.onap.policy.api.main.exception.PolicyApiException;
53 import org.onap.policy.api.main.parameters.CommonTestData;
54 import org.onap.policy.api.main.startstop.Main;
55 import org.onap.policy.common.endpoints.http.server.RestServer;
56 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
57 import org.onap.policy.common.endpoints.report.HealthCheckReport;
58 import org.onap.policy.common.gson.GsonMessageBodyHandler;
59 import org.onap.policy.common.utils.coder.StandardCoder;
60 import org.onap.policy.common.utils.network.NetworkUtil;
61 import org.onap.policy.common.utils.resources.ResourceUtils;
62 import org.onap.policy.models.errors.concepts.ErrorResponse;
63 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
64 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
65 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
70 * Class to perform unit test of {@link ApiRestServer}.
72 * @author Chenfei Gao (cgao@research.att.com)
74 public class TestApiRestServer {
76 private static final Logger LOGGER = LoggerFactory.getLogger(TestApiRestServer.class);
77 private static final String NOT_ALIVE = "not alive";
78 private static final String ALIVE = "alive";
79 private static final String SELF = "self";
80 private static final String NAME = "Policy API";
82 private static final String HEALTHCHECK_ENDPOINT = "healthcheck";
83 private static final String STATISTICS_ENDPOINT = "statistics";
85 private static final String POLICYTYPES = "policytypes";
86 private static final String POLICYTYPES_TCA = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app";
87 private static final String POLICYTYPES_COLLECTOR =
88 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server";
89 private static final String POLICYTYPES_TCA_VERSION =
90 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0";
91 private static final String POLICYTYPES_TCA_LATEST =
92 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/latest";
93 private static final String POLICYTYPES_COLLECTOR_VERSION =
94 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/1.0.0";
95 private static final String POLICYTYPES_COLLECTOR_LATEST =
96 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/latest";
98 private static final String POLICYTYPES_TCA_POLICIES =
99 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies";
100 private static final String POLICYTYPES_TCA_POLICIES_VCPE =
101 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca";
102 private static final String POLICYTYPES_TCA_POLICIES_VCPE_VERSION = "policytypes/"
103 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/1.0.0";
104 private static final String POLICYTYPES_TCA_POLICIES_VCPE_LATEST = "policytypes/"
105 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/latest";
107 private static final String GUARD_POLICIES =
108 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies";
109 private static final String GUARD_POLICIES_VDNS_FL_LATEST =
110 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
111 + "/versions/latest";
112 private static final String GUARD_POLICIES_VDNS_MINMAX_LATEST =
113 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout"
114 + "/versions/latest";
115 private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
116 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1";
117 private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
118 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1";
120 private static final String OPS_POLICIES =
121 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
122 private static final String OPS_POLICIES_VCPE_LATEST =
123 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart"
124 + "/versions/latest";
125 private static final String OPS_POLICIES_VDNS_LATEST =
126 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout"
127 + "/versions/latest";
128 private static final String OPS_POLICIES_VFIREWALL_LATEST =
129 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig"
130 + "/versions/latest";
131 private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
132 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart/versions/1";
133 private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
134 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout/versions/1";
135 private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
136 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig/versions/1";
138 private static final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
139 private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
141 private RestServer restServer;
142 private StandardCoder standardCoder = new StandardCoder();
146 private String[] toscaPolicyResourceNames = {
147 "policies/vCPE.policy.monitoring.input.tosca.json",
148 "policies/vDNS.policy.monitoring.input.tosca.json",
149 "policies/vFirewall.policy.monitoring.input.tosca.json",
152 private String[] toscaPolicyTypeResourceNames = {
153 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
154 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
157 private String[] legacyGuardPolicyResourceNames = {
158 "policies/vDNS.policy.guard.frequency.input.json",
159 "policies/vDNS.policy.guard.minmax.input.json",
162 private String[] legacyOperationalPolicyResourceNames = {
163 "policies/vCPE.policy.operational.input.json",
164 "policies/vDNS.policy.operational.input.json",
165 "policies/vFirewall.policy.operational.input.json"
170 * Method for cleanup after each test.
173 public void teardown() throws Exception {
175 stopApiService(main);
176 } else if (restServer != null) {
182 public void testHealthCheckSuccess() {
185 main = startApiService(true);
186 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
187 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
188 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
189 } catch (final Exception exp) {
190 LOGGER.error("testHealthCheckSuccess failed", exp);
191 fail("Test should not throw an exception");
196 public void testHealthCheckFailure() throws InterruptedException, IOException {
198 port = NetworkUtil.allocPort();
199 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
200 restServerParams.setName(CommonTestData.API_GROUP_NAME);
201 restServer = new RestServer(restServerParams, null, ApiRestController.class);
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("RestServer [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() throws Exception {
251 port = NetworkUtil.allocPort();
252 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
253 restServerParams.setName(CommonTestData.API_GROUP_NAME);
254 restServer = new RestServer(restServerParams, null, ApiRestController.class);
257 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
258 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
259 validateStatisticsReport(report, 500);
260 ApiStatisticsManager.resetAllStatistics();
261 } catch (final Exception exp) {
262 LOGGER.error("testApiStatistics_500 failed", exp);
263 fail("Test should not throw an exception");
268 public void testHttpsApiStatistics() {
271 main = startApiService(false);
272 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
273 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
274 validateStatisticsReport(report, 200);
275 } catch (final Exception exp) {
276 LOGGER.error("testHttpsApiStatistics failed", exp);
277 fail("Test should not throw an exception");
282 public void testApiStatisticsConstructorIsPrivate() {
285 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
286 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
287 constructor.setAccessible(true);
288 constructor.newInstance();
289 } catch (final Exception exp) {
290 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
295 public void testCreatePolicyTypes() {
297 assertThatCode(() -> {
298 main = startApiService(true);
299 for (String resrcName : toscaPolicyTypeResourceNames) {
300 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
301 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
302 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
303 assertNotNull(response);
304 assertFalse(response.getPolicyTypes().get(0).isEmpty());
306 }).doesNotThrowAnyException();
310 public void testReadPolicyTypes() {
312 assertThatCode(() -> {
313 main = startApiService(true);
314 Response rawResponse = readResource(POLICYTYPES, true);
315 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
316 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
317 assertTrue(response.getPolicyTypes().isEmpty());
319 rawResponse = readResource(POLICYTYPES_TCA, true);
320 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
321 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
322 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
323 error.getErrorMessage());
325 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
326 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
327 error = rawResponse.readEntity(ErrorResponse.class);
328 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
329 error.getErrorMessage());
331 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
332 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
333 error = rawResponse.readEntity(ErrorResponse.class);
334 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
335 error.getErrorMessage());
337 rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
338 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
339 error = rawResponse.readEntity(ErrorResponse.class);
340 assertEquals("policy type with ID "
341 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
342 error.getErrorMessage());
344 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
345 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
346 error = rawResponse.readEntity(ErrorResponse.class);
347 assertEquals("policy type with ID "
348 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
349 error.getErrorMessage());
351 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
352 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
353 error = rawResponse.readEntity(ErrorResponse.class);
354 assertEquals("policy type with ID "
355 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
356 error.getErrorMessage());
357 }).doesNotThrowAnyException();
361 public void testDeletePolicyType() {
363 assertThatCode(() -> {
364 main = startApiService(true);
365 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
366 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
367 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
368 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
369 error.getErrorMessage());
371 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
372 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
373 error = rawResponse.readEntity(ErrorResponse.class);
374 assertEquals("policy type with ID "
375 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
376 error.getErrorMessage());
377 }).doesNotThrowAnyException();
381 public void testCreatePolicies() {
383 assertThatCode(() -> {
384 main = startApiService(true);
385 for (String resrcName : toscaPolicyResourceNames) {
386 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
387 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
388 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
389 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
390 error.getErrorMessage());
392 }).doesNotThrowAnyException();
396 public void testReadPolicies() {
398 assertThatCode(() -> {
399 main = startApiService(true);
400 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
401 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
402 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
403 assertEquals("policy with ID null:null and "
404 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
405 error.getErrorMessage());
407 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
408 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
409 error = rawResponse.readEntity(ErrorResponse.class);
410 assertEquals("policy with ID onap.restart.tca:null and "
411 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
412 error.getErrorMessage());
414 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
415 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
416 error = rawResponse.readEntity(ErrorResponse.class);
417 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
418 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
419 error.getErrorMessage());
421 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
422 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
423 error = rawResponse.readEntity(ErrorResponse.class);
424 assertEquals("policy with ID onap.restart.tca:null and "
425 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
426 error.getErrorMessage());
427 }).doesNotThrowAnyException();
431 public void testDeletePolicies() {
433 assertThatCode(() -> {
434 main = startApiService(true);
435 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
436 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
437 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
438 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
439 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
440 error.getErrorMessage());
441 }).doesNotThrowAnyException();
445 public void testCreateGuardPolicies() {
447 assertThatCode(() -> {
448 main = startApiService(true);
449 for (String resrcName : legacyGuardPolicyResourceNames) {
450 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
451 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
453 }).doesNotThrowAnyException();
457 public void testCreateOperationalPolicies() {
459 assertThatCode(() -> {
460 main = startApiService(true);
461 for (String resrcName : legacyOperationalPolicyResourceNames) {
462 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
463 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
465 }).doesNotThrowAnyException();
469 public void testReadGuardPolicies() {
471 assertThatCode(() -> {
472 main = startApiService(true);
473 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
474 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
475 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
476 assertEquals("no policy found for policy: guard.frequency.scaleout:null",
477 error.getErrorMessage());
479 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
480 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
481 error = rawResponse.readEntity(ErrorResponse.class);
482 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
483 error.getErrorMessage());
485 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
486 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
487 error = rawResponse.readEntity(ErrorResponse.class);
488 assertEquals("no policy found for policy: guard.minmax.scaleout:null",
489 error.getErrorMessage());
491 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
492 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
493 error = rawResponse.readEntity(ErrorResponse.class);
494 assertEquals("no policy found for policy: guard.minmax.scaleout:1",
495 error.getErrorMessage());
496 }).doesNotThrowAnyException();
500 public void testReadOperationalPolicies() {
502 assertThatCode(() -> {
503 main = startApiService(true);
504 Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
505 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
506 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
507 assertEquals("no policy found for policy: operational.restart:null",
508 error.getErrorMessage());
510 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
511 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
512 error = rawResponse.readEntity(ErrorResponse.class);
513 assertEquals("no policy found for policy: operational.restart:1",
514 error.getErrorMessage());
516 rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
517 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
518 error = rawResponse.readEntity(ErrorResponse.class);
519 assertEquals("no policy found for policy: operational.scaleout:null",
520 error.getErrorMessage());
522 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
523 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
524 error = rawResponse.readEntity(ErrorResponse.class);
525 assertEquals("no policy found for policy: operational.scaleout:1",
526 error.getErrorMessage());
528 rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
529 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
530 error = rawResponse.readEntity(ErrorResponse.class);
531 assertEquals("no policy found for policy: operational.modifyconfig:null",
532 error.getErrorMessage());
534 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
535 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
536 error = rawResponse.readEntity(ErrorResponse.class);
537 assertEquals("no policy found for policy: operational.modifyconfig:1",
538 error.getErrorMessage());
539 }).doesNotThrowAnyException();
543 public void testDeleteGuardPolicy() {
545 assertThatCode(() -> {
546 main = startApiService(true);
547 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
548 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
549 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
550 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
551 error.getErrorMessage());
552 }).doesNotThrowAnyException();
556 public void testDeleteOperationalPolicy() {
558 assertThatCode(() -> {
559 main = startApiService(true);
560 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
561 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
562 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
563 assertEquals("no policy found for policy: operational.restart:1",
564 error.getErrorMessage());
565 }).doesNotThrowAnyException();
569 public void testHttpsCreatePolicyTypes() {
571 assertThatCode(() -> {
572 main = startApiService(false);
573 for (String resrcName : toscaPolicyTypeResourceNames) {
574 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
575 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
576 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
577 assertNotNull(response);
578 assertFalse(response.getPolicyTypes().get(0).isEmpty());
580 }).doesNotThrowAnyException();
584 public void testHttpsCreatePolicies() {
586 assertThatCode(() -> {
587 main = startApiService(false);
588 for (String resrcName : toscaPolicyResourceNames) {
589 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
590 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
591 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
592 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
593 error.getErrorMessage());
595 }).doesNotThrowAnyException();
599 public void testHttpsCreateGuardPolicies() {
601 assertThatCode(() -> {
602 main = startApiService(false);
603 for (String resrcName : legacyGuardPolicyResourceNames) {
604 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
605 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
607 }).doesNotThrowAnyException();
611 public void testHttpsCreateOperationalPolicies() {
613 assertThatCode(() -> {
614 main = startApiService(false);
615 for (String resrcName : legacyOperationalPolicyResourceNames) {
616 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
617 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
619 }).doesNotThrowAnyException();
622 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
624 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
625 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
626 final Invocation.Builder invocationBuilder;
629 invocationBuilder = sendHttpRequest(endpoint);
631 invocationBuilder = sendHttpsRequest(endpoint);
634 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
635 return invocationBuilder.post(entity);
638 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
640 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
641 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
642 final Invocation.Builder invocationBuilder;
645 invocationBuilder = sendHttpRequest(endpoint);
647 invocationBuilder = sendHttpsRequest(endpoint);
650 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
651 return invocationBuilder.post(entity);
654 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
656 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
657 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
658 final Invocation.Builder invocationBuilder;
661 invocationBuilder = sendHttpRequest(endpoint);
663 invocationBuilder = sendHttpsRequest(endpoint);
666 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
667 return invocationBuilder.post(entity);
670 private Response readResource(String endpoint, boolean http) throws Exception {
672 final Invocation.Builder invocationBuilder;
675 invocationBuilder = sendHttpRequest(endpoint);
677 invocationBuilder = sendHttpsRequest(endpoint);
680 return invocationBuilder.get();
684 private Response deleteResource(String endpoint, boolean http) throws Exception {
686 final Invocation.Builder invocationBuilder;
689 invocationBuilder = sendHttpRequest(endpoint);
691 invocationBuilder = sendHttpsRequest(endpoint);
694 return invocationBuilder.delete();
697 private Main startApiService(final boolean http) throws Exception {
698 port = NetworkUtil.allocPort();
700 final String[] apiConfigParameters = new String[2];
702 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters.json",
703 "src/test/resources/parameters/ApiConfigParametersXXX.json", port);
704 apiConfigParameters[0] = "-c";
705 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParametersXXX.json";
707 final Properties systemProps = System.getProperties();
708 systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
709 systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
710 System.setProperties(systemProps);
711 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json",
712 "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", port);
713 apiConfigParameters[0] = "-c";
714 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json";
716 return new Main(apiConfigParameters);
719 private void stopApiService(final Main main) throws PolicyApiException {
724 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
726 final ClientConfig clientConfig = new ClientConfig();
728 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
729 clientConfig.register(feature);
731 final Client client = ClientBuilder.newClient(clientConfig);
733 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
734 client.register(GsonMessageBodyHandler.class);
736 final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
738 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
740 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
741 throw new IllegalStateException("cannot connect to port " + port);
743 return invocationBuilder;
746 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
748 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
751 public X509Certificate[] getAcceptedIssuers() {
752 return new X509Certificate[0];
756 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
759 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
762 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
763 sc.init(null, noopTrustManager, new SecureRandom());
764 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
766 final Client client = clientBuilder.build();
767 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
768 client.register(feature);
770 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
771 client.register(GsonMessageBodyHandler.class);
773 final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
775 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
777 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
778 throw new IllegalStateException("cannot connect to port " + port);
780 return invocationBuilder;
783 private void updateApiStatistics() {
785 ApiStatisticsManager.updateTotalApiCallCount();
786 ApiStatisticsManager.updateApiCallSuccessCount();
787 ApiStatisticsManager.updateApiCallFailureCount();
788 ApiStatisticsManager.updateTotalPolicyGetCount();
789 ApiStatisticsManager.updateTotalPolicyPostCount();
790 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
791 ApiStatisticsManager.updateTotalPolicyTypePostCount();
792 ApiStatisticsManager.updatePolicyGetSuccessCount();
793 ApiStatisticsManager.updatePolicyGetFailureCount();
794 ApiStatisticsManager.updatePolicyPostSuccessCount();
795 ApiStatisticsManager.updatePolicyPostFailureCount();
796 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
797 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
798 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
799 ApiStatisticsManager.updatePolicyTypePostFailureCount();
802 private void validateStatisticsReport(final StatisticsReport report, final int code) {
804 assertEquals(code, report.getCode());
807 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
808 final String message, final HealthCheckReport report) {
810 assertEquals(name, report.getName());
811 assertEquals(url, report.getUrl());
812 assertEquals(healthy, report.isHealthy());
813 assertEquals(code, report.getCode());
814 assertEquals(message, report.getMessage());