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 final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
140 private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
142 private ApiRestServer restServer;
143 private StandardCoder standardCoder = new StandardCoder();
147 private String[] toscaPolicyResourceNames = {
148 "policies/vCPE.policy.monitoring.input.tosca.json",
149 "policies/vDNS.policy.monitoring.input.tosca.json",
150 "policies/vFirewall.policy.monitoring.input.tosca.json",
153 private String[] toscaPolicyTypeResourceNames = {
154 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
155 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
158 private String[] legacyGuardPolicyResourceNames = {
159 "policies/vDNS.policy.guard.frequency.input.json",
160 "policies/vDNS.policy.guard.minmax.input.json",
163 private String[] legacyOperationalPolicyResourceNames = {
164 "policies/vCPE.policy.operational.input.json",
165 "policies/vDNS.policy.operational.input.json",
166 "policies/vFirewall.policy.operational.input.json"
171 * Method for cleanup after each test.
174 public void teardown() throws Exception {
176 stopApiService(main);
177 } else if (restServer != null) {
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 port = NetworkUtil.allocPort();
200 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
201 restServerParams.setName(CommonTestData.API_GROUP_NAME);
202 restServer = new ApiRestServer(restServerParams);
205 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
206 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
207 validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
208 assertTrue(restServer.isAlive());
209 assertTrue(restServer.toString().startsWith("ApiRestServer [servers="));
210 } catch (final Exception exp) {
211 LOGGER.error("testHealthCheckFailure failed", exp);
212 fail("Test should not throw an exception");
217 public void testHttpsHealthCheckSuccess() {
220 main = startApiService(false);
221 final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
222 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
223 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
224 } catch (final Exception exp) {
225 LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
226 fail("Test should not throw an exception");
231 public void testApiStatistics_200() {
234 main = startApiService(true);
235 Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
236 StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
237 validateStatisticsReport(report, 200);
238 updateApiStatistics();
239 invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
240 report = invocationBuilder.get(StatisticsReport.class);
241 validateStatisticsReport(report, 200);
242 ApiStatisticsManager.resetAllStatistics();
243 } catch (final Exception exp) {
244 LOGGER.error("testApiStatistics_200 failed", exp);
245 fail("Test should not throw an exception");
250 public void testApiStatistics_500() throws Exception {
252 port = NetworkUtil.allocPort();
253 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
254 restServerParams.setName(CommonTestData.API_GROUP_NAME);
255 restServer = new ApiRestServer(restServerParams);
258 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
259 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
260 validateStatisticsReport(report, 500);
261 ApiStatisticsManager.resetAllStatistics();
262 } catch (final Exception exp) {
263 LOGGER.error("testApiStatistics_500 failed", exp);
264 fail("Test should not throw an exception");
269 public void testHttpsApiStatistics() {
272 main = startApiService(false);
273 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
274 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
275 validateStatisticsReport(report, 200);
276 } catch (final Exception exp) {
277 LOGGER.error("testHttpsApiStatistics failed", exp);
278 fail("Test should not throw an exception");
283 public void testApiStatisticsConstructorIsPrivate() {
286 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
287 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
288 constructor.setAccessible(true);
289 constructor.newInstance();
290 } catch (final Exception exp) {
291 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
296 public void testCreatePolicyTypes() {
298 assertThatCode(() -> {
299 main = startApiService(true);
300 for (String resrcName : toscaPolicyTypeResourceNames) {
301 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
302 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
303 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
304 assertNotNull(response);
305 assertFalse(response.getPolicyTypes().get(0).isEmpty());
307 }).doesNotThrowAnyException();
311 public void testReadPolicyTypes() {
313 assertThatCode(() -> {
314 main = startApiService(true);
315 Response rawResponse = readResource(POLICYTYPES, true);
316 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
317 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
318 assertTrue(response.getPolicyTypes().isEmpty());
320 rawResponse = readResource(POLICYTYPES_TCA, true);
321 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
322 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
323 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
324 error.getErrorMessage());
326 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
327 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
328 error = rawResponse.readEntity(ErrorResponse.class);
329 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
330 error.getErrorMessage());
332 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
333 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
334 error = rawResponse.readEntity(ErrorResponse.class);
335 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
336 error.getErrorMessage());
338 rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
339 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
340 error = rawResponse.readEntity(ErrorResponse.class);
341 assertEquals("policy type with ID "
342 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
343 error.getErrorMessage());
345 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
346 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
347 error = rawResponse.readEntity(ErrorResponse.class);
348 assertEquals("policy type with ID "
349 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
350 error.getErrorMessage());
352 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
353 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
354 error = rawResponse.readEntity(ErrorResponse.class);
355 assertEquals("policy type with ID "
356 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
357 error.getErrorMessage());
358 }).doesNotThrowAnyException();
362 public void testDeletePolicyType() {
364 assertThatCode(() -> {
365 main = startApiService(true);
366 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
367 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
368 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
369 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
370 error.getErrorMessage());
372 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
373 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
374 error = rawResponse.readEntity(ErrorResponse.class);
375 assertEquals("policy type with ID "
376 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
377 error.getErrorMessage());
378 }).doesNotThrowAnyException();
382 public void testCreatePolicies() {
384 assertThatCode(() -> {
385 main = startApiService(true);
386 for (String resrcName : toscaPolicyResourceNames) {
387 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
388 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
389 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
390 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
391 error.getErrorMessage());
393 }).doesNotThrowAnyException();
397 public void testReadPolicies() {
399 assertThatCode(() -> {
400 main = startApiService(true);
401 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
402 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
403 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
404 assertEquals("policy with ID null:null and "
405 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
406 error.getErrorMessage());
408 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
409 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
410 error = rawResponse.readEntity(ErrorResponse.class);
411 assertEquals("policy with ID onap.restart.tca:null and "
412 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
413 error.getErrorMessage());
415 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
416 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
417 error = rawResponse.readEntity(ErrorResponse.class);
418 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
419 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
420 error.getErrorMessage());
422 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
423 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
424 error = rawResponse.readEntity(ErrorResponse.class);
425 assertEquals("policy with ID onap.restart.tca:null and "
426 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
427 error.getErrorMessage());
428 }).doesNotThrowAnyException();
432 public void testDeletePolicies() {
434 assertThatCode(() -> {
435 main = startApiService(true);
436 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
437 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
438 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
439 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
440 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
441 error.getErrorMessage());
442 }).doesNotThrowAnyException();
446 public void testCreateGuardPolicies() {
448 assertThatCode(() -> {
449 main = startApiService(true);
450 for (String resrcName : legacyGuardPolicyResourceNames) {
451 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
452 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
454 }).doesNotThrowAnyException();
458 public void testCreateOperationalPolicies() {
460 assertThatCode(() -> {
461 main = startApiService(true);
462 for (String resrcName : legacyOperationalPolicyResourceNames) {
463 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
464 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
466 }).doesNotThrowAnyException();
470 public void testReadGuardPolicies() {
472 assertThatCode(() -> {
473 main = startApiService(true);
474 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
475 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
476 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
477 assertEquals("no policy found for policy: guard.frequency.scaleout:null",
478 error.getErrorMessage());
480 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
481 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
482 error = rawResponse.readEntity(ErrorResponse.class);
483 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
484 error.getErrorMessage());
486 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
487 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
488 error = rawResponse.readEntity(ErrorResponse.class);
489 assertEquals("no policy found for policy: guard.minmax.scaleout:null",
490 error.getErrorMessage());
492 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
493 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
494 error = rawResponse.readEntity(ErrorResponse.class);
495 assertEquals("no policy found for policy: guard.minmax.scaleout:1",
496 error.getErrorMessage());
497 }).doesNotThrowAnyException();
501 public void testReadOperationalPolicies() {
503 assertThatCode(() -> {
504 main = startApiService(true);
505 Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
506 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
507 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
508 assertEquals("no policy found for policy: operational.restart:null",
509 error.getErrorMessage());
511 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
512 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
513 error = rawResponse.readEntity(ErrorResponse.class);
514 assertEquals("no policy found for policy: operational.restart:1",
515 error.getErrorMessage());
517 rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
518 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
519 error = rawResponse.readEntity(ErrorResponse.class);
520 assertEquals("no policy found for policy: operational.scaleout:null",
521 error.getErrorMessage());
523 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
524 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
525 error = rawResponse.readEntity(ErrorResponse.class);
526 assertEquals("no policy found for policy: operational.scaleout:1",
527 error.getErrorMessage());
529 rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
530 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
531 error = rawResponse.readEntity(ErrorResponse.class);
532 assertEquals("no policy found for policy: operational.modifyconfig:null",
533 error.getErrorMessage());
535 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
536 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
537 error = rawResponse.readEntity(ErrorResponse.class);
538 assertEquals("no policy found for policy: operational.modifyconfig:1",
539 error.getErrorMessage());
540 }).doesNotThrowAnyException();
544 public void testDeleteGuardPolicy() {
546 assertThatCode(() -> {
547 main = startApiService(true);
548 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
549 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
550 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
551 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
552 error.getErrorMessage());
553 }).doesNotThrowAnyException();
557 public void testDeleteOperationalPolicy() {
559 assertThatCode(() -> {
560 main = startApiService(true);
561 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
562 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
563 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
564 assertEquals("no policy found for policy: operational.restart:1",
565 error.getErrorMessage());
566 }).doesNotThrowAnyException();
570 public void testHttpsCreatePolicyTypes() {
572 assertThatCode(() -> {
573 main = startApiService(false);
574 for (String resrcName : toscaPolicyTypeResourceNames) {
575 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
576 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
577 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
578 assertNotNull(response);
579 assertFalse(response.getPolicyTypes().get(0).isEmpty());
581 }).doesNotThrowAnyException();
585 public void testHttpsCreatePolicies() {
587 assertThatCode(() -> {
588 main = startApiService(false);
589 for (String resrcName : toscaPolicyResourceNames) {
590 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
591 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
592 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
593 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
594 error.getErrorMessage());
596 }).doesNotThrowAnyException();
600 public void testHttpsCreateGuardPolicies() {
602 assertThatCode(() -> {
603 main = startApiService(false);
604 for (String resrcName : legacyGuardPolicyResourceNames) {
605 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
606 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
608 }).doesNotThrowAnyException();
612 public void testHttpsCreateOperationalPolicies() {
614 assertThatCode(() -> {
615 main = startApiService(false);
616 for (String resrcName : legacyOperationalPolicyResourceNames) {
617 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
618 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
620 }).doesNotThrowAnyException();
623 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
625 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
626 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
627 final Invocation.Builder invocationBuilder;
630 invocationBuilder = sendHttpRequest(endpoint);
632 invocationBuilder = sendHttpsRequest(endpoint);
635 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
636 return invocationBuilder.post(entity);
639 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
641 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
642 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
643 final Invocation.Builder invocationBuilder;
646 invocationBuilder = sendHttpRequest(endpoint);
648 invocationBuilder = sendHttpsRequest(endpoint);
651 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
652 return invocationBuilder.post(entity);
655 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
657 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
658 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
659 final Invocation.Builder invocationBuilder;
662 invocationBuilder = sendHttpRequest(endpoint);
664 invocationBuilder = sendHttpsRequest(endpoint);
667 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
668 return invocationBuilder.post(entity);
671 private Response readResource(String endpoint, boolean http) throws Exception {
673 final Invocation.Builder invocationBuilder;
676 invocationBuilder = sendHttpRequest(endpoint);
678 invocationBuilder = sendHttpsRequest(endpoint);
681 return invocationBuilder.get();
685 private Response deleteResource(String endpoint, boolean http) throws Exception {
687 final Invocation.Builder invocationBuilder;
690 invocationBuilder = sendHttpRequest(endpoint);
692 invocationBuilder = sendHttpsRequest(endpoint);
695 return invocationBuilder.delete();
698 private Main startApiService(final boolean http) throws Exception {
699 port = NetworkUtil.allocPort();
701 final String[] apiConfigParameters = new String[2];
703 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters.json",
704 "src/test/resources/parameters/ApiConfigParametersXXX.json", port);
705 apiConfigParameters[0] = "-c";
706 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParametersXXX.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 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json",
713 "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", port);
714 apiConfigParameters[0] = "-c";
715 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json";
717 return new Main(apiConfigParameters);
720 private void stopApiService(final Main main) throws PolicyApiException {
725 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
727 final ClientConfig clientConfig = new ClientConfig();
729 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
730 clientConfig.register(feature);
732 final Client client = ClientBuilder.newClient(clientConfig);
734 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
735 client.register(GsonMessageBodyHandler.class);
737 final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
739 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
741 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
742 throw new IllegalStateException("cannot connect to port " + port);
744 return invocationBuilder;
747 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
749 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
752 public X509Certificate[] getAcceptedIssuers() {
753 return new X509Certificate[0];
757 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
760 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
763 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
764 sc.init(null, noopTrustManager, new SecureRandom());
765 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
767 final Client client = clientBuilder.build();
768 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
769 client.register(feature);
771 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
772 client.register(GsonMessageBodyHandler.class);
774 final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
776 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
778 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
779 throw new IllegalStateException("cannot connect to port " + port);
781 return invocationBuilder;
784 private void updateApiStatistics() {
786 ApiStatisticsManager.updateTotalApiCallCount();
787 ApiStatisticsManager.updateApiCallSuccessCount();
788 ApiStatisticsManager.updateApiCallFailureCount();
789 ApiStatisticsManager.updateTotalPolicyGetCount();
790 ApiStatisticsManager.updateTotalPolicyPostCount();
791 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
792 ApiStatisticsManager.updateTotalPolicyTypePostCount();
793 ApiStatisticsManager.updatePolicyGetSuccessCount();
794 ApiStatisticsManager.updatePolicyGetFailureCount();
795 ApiStatisticsManager.updatePolicyPostSuccessCount();
796 ApiStatisticsManager.updatePolicyPostFailureCount();
797 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
798 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
799 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
800 ApiStatisticsManager.updatePolicyTypePostFailureCount();
803 private void validateStatisticsReport(final StatisticsReport report, final int code) {
805 assertEquals(code, report.getCode());
808 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
809 final String message, final HealthCheckReport report) {
811 assertEquals(name, report.getName());
812 assertEquals(url, report.getUrl());
813 assertEquals(healthy, report.isHealthy());
814 assertEquals(code, report.getCode());
815 assertEquals(message, report.getMessage());