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.startstop.Main;
57 import org.onap.policy.common.endpoints.http.server.RestServer;
58 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
59 import org.onap.policy.common.endpoints.report.HealthCheckReport;
60 import org.onap.policy.common.gson.GsonMessageBodyHandler;
61 import org.onap.policy.common.utils.coder.StandardCoder;
62 import org.onap.policy.common.utils.network.NetworkUtil;
63 import org.onap.policy.common.utils.resources.ResourceUtils;
64 import org.onap.policy.models.errors.concepts.ErrorResponse;
65 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
66 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
67 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
72 * Class to perform unit test of {@link ApiRestServer}.
74 * @author Chenfei Gao (cgao@research.att.com)
76 public class TestApiRestServer {
78 private static final Logger LOGGER = LoggerFactory.getLogger(TestApiRestServer.class);
79 private static final String NOT_ALIVE = "not alive";
80 private static final String ALIVE = "alive";
81 private static final String SELF = "self";
82 private static final String NAME = "Policy API";
84 private static final String HEALTHCHECK_ENDPOINT = "healthcheck";
85 private static final String STATISTICS_ENDPOINT = "statistics";
87 private static final String POLICYTYPES = "policytypes";
88 private static final String POLICYTYPES_TCA = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app";
89 private static final String POLICYTYPES_COLLECTOR =
90 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server";
91 private static final String POLICYTYPES_TCA_VERSION =
92 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0";
93 private static final String POLICYTYPES_TCA_LATEST =
94 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/latest";
95 private static final String POLICYTYPES_COLLECTOR_VERSION =
96 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/1.0.0";
97 private static final String POLICYTYPES_COLLECTOR_LATEST =
98 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/latest";
100 private static final String POLICYTYPES_TCA_POLICIES =
101 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies";
102 private static final String POLICYTYPES_TCA_POLICIES_VCPE =
103 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca";
104 private static final String POLICYTYPES_TCA_POLICIES_VCPE_VERSION = "policytypes/"
105 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/1.0.0";
106 private static final String POLICYTYPES_TCA_POLICIES_VCPE_LATEST = "policytypes/"
107 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/latest";
109 private static final String GUARD_POLICIES =
110 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies";
111 private static final String GUARD_POLICIES_VDNS_FL_LATEST =
112 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
113 + "/versions/latest";
114 private static final String GUARD_POLICIES_VDNS_MINMAX_LATEST =
115 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout"
116 + "/versions/latest";
117 private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
118 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1";
119 private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
120 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1";
122 private static final String OPS_POLICIES =
123 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
124 private static final String OPS_POLICIES_VCPE_LATEST =
125 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart"
126 + "/versions/latest";
127 private static final String OPS_POLICIES_VDNS_LATEST =
128 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout"
129 + "/versions/latest";
130 private static final String OPS_POLICIES_VFIREWALL_LATEST =
131 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig"
132 + "/versions/latest";
133 private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
134 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart/versions/1";
135 private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
136 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout/versions/1";
137 private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
138 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig/versions/1";
140 private static final String GET_DEPLOYED_VERSION_OF_POLICY =
141 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/"
142 + "1.0.0/policies/onap.restart.tca/versions/deployed";
143 private static final String GET_LATEST_VERSION_OF_OPERATIONAL_POLICY =
144 "policytypes/onap.policies.controlloop.Operational/versions/"
145 + "1.0.0/policies/operational.scaleout/versions/latest";
146 private static final String GET_SPECIFIC_VERSION_OF_OPERATIONAL_POLICY =
147 "policytypes/onap.policies.controlloop.Operational/versions/"
148 + "1.0.0/policies/operational.scaleout/versions/3";
149 private static final String DEL_SPECIFIC_VERSION_OF_OPERATIONAL_POLICY =
150 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/"
151 + "policies/operational.scaleout/versions/1";
153 private static final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
154 private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
156 private RestServer restServer;
157 private StandardCoder standardCoder = new StandardCoder();
161 private String[] toscaPolicyResourceNames = {
162 "policies/vCPE.policy.monitoring.input.tosca.json",
163 "policies/vDNS.policy.monitoring.input.tosca.json",
164 "policies/vFirewall.policy.monitoring.input.tosca.json",
167 private String[] toscaPolicyTypeResourceNames = {
168 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
169 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
172 private String[] legacyGuardPolicyResourceNames = {
173 "policies/vDNS.policy.guard.frequency.input.json",
174 "policies/vDNS.policy.guard.minmax.input.json",
177 private String[] legacyOperationalPolicyResourceNames = {
178 "policies/vCPE.policy.operational.input.json",
179 "policies/vDNS.policy.operational.input.json",
180 "policies/vFirewall.policy.operational.input.json"
185 * Method for cleanup after each test.
188 public void teardown() throws Exception {
190 stopApiService(main);
191 } else if (restServer != null) {
197 public void testHealthCheckSuccess() {
200 main = startApiService(true);
201 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
202 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
203 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
204 } catch (final Exception exp) {
205 LOGGER.error("testHealthCheckSuccess failed", exp);
206 fail("Test should not throw an exception");
211 public void testHealthCheckFailure() throws InterruptedException, IOException {
213 port = NetworkUtil.allocPort();
214 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
215 restServerParams.setName(CommonTestData.API_GROUP_NAME);
216 restServer = new RestServer(restServerParams, null, ApiRestController.class);
219 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
220 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
221 validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
222 assertTrue(restServer.isAlive());
223 assertTrue(restServer.toString().startsWith("RestServer [servers="));
224 } catch (final Exception exp) {
225 LOGGER.error("testHealthCheckFailure failed", exp);
226 fail("Test should not throw an exception");
231 public void testHttpsHealthCheckSuccess() {
234 main = startApiService(false);
235 final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
236 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
237 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
238 } catch (final Exception exp) {
239 LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
240 fail("Test should not throw an exception");
245 public void testApiStatistics_200() {
248 main = startApiService(true);
249 Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
250 StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
251 validateStatisticsReport(report, 200);
252 updateApiStatistics();
253 invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
254 report = invocationBuilder.get(StatisticsReport.class);
255 validateStatisticsReport(report, 200);
256 ApiStatisticsManager.resetAllStatistics();
257 } catch (final Exception exp) {
258 LOGGER.error("testApiStatistics_200 failed", exp);
259 fail("Test should not throw an exception");
264 public void testApiStatistics_500() throws Exception {
266 port = NetworkUtil.allocPort();
267 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
268 restServerParams.setName(CommonTestData.API_GROUP_NAME);
269 restServer = new RestServer(restServerParams, null, ApiRestController.class);
272 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
273 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
274 validateStatisticsReport(report, 500);
275 ApiStatisticsManager.resetAllStatistics();
276 } catch (final Exception exp) {
277 LOGGER.error("testApiStatistics_500 failed", exp);
278 fail("Test should not throw an exception");
283 public void testHttpsApiStatistics() {
286 main = startApiService(false);
287 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
288 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
289 validateStatisticsReport(report, 200);
290 } catch (final Exception exp) {
291 LOGGER.error("testHttpsApiStatistics failed", exp);
292 fail("Test should not throw an exception");
297 public void testApiStatisticsConstructorIsPrivate() {
300 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
301 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
302 constructor.setAccessible(true);
303 constructor.newInstance();
304 } catch (final Exception exp) {
305 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
310 public void testCreatePolicyTypes() {
312 assertThatCode(() -> {
313 main = startApiService(true);
314 for (String resrcName : toscaPolicyTypeResourceNames) {
315 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
316 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
317 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
318 assertNotNull(response);
319 assertFalse(response.getPolicyTypes().get(0).isEmpty());
321 }).doesNotThrowAnyException();
325 public void testReadPolicyTypes() {
327 assertThatCode(() -> {
328 main = startApiService(true);
329 Response rawResponse = readResource(POLICYTYPES, true);
330 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
331 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
332 assertTrue(response.getPolicyTypes().isEmpty());
334 rawResponse = readResource(POLICYTYPES_TCA, true);
335 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
336 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
337 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
338 error.getErrorMessage());
340 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
341 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
342 error = rawResponse.readEntity(ErrorResponse.class);
343 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
344 error.getErrorMessage());
346 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
347 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
348 error = rawResponse.readEntity(ErrorResponse.class);
349 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
350 error.getErrorMessage());
352 rawResponse = readResource(POLICYTYPES_COLLECTOR, 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());
359 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
360 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
361 error = rawResponse.readEntity(ErrorResponse.class);
362 assertEquals("policy type with ID "
363 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
364 error.getErrorMessage());
366 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
367 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
368 error = rawResponse.readEntity(ErrorResponse.class);
369 assertEquals("policy type with ID "
370 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
371 error.getErrorMessage());
372 }).doesNotThrowAnyException();
376 public void testDeletePolicyType() {
378 assertThatCode(() -> {
379 main = startApiService(true);
380 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
381 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
382 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
383 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
384 error.getErrorMessage());
386 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
387 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
388 error = rawResponse.readEntity(ErrorResponse.class);
389 assertEquals("policy type with ID "
390 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
391 error.getErrorMessage());
392 }).doesNotThrowAnyException();
396 public void testCreatePolicies() {
398 assertThatCode(() -> {
399 main = startApiService(true);
400 for (String resrcName : toscaPolicyResourceNames) {
401 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
402 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
403 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
404 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
405 error.getErrorMessage());
407 }).doesNotThrowAnyException();
411 public void testReadPolicies() {
413 assertThatCode(() -> {
414 main = startApiService(true);
415 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
416 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
417 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
418 assertEquals("policy with ID null:null 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, 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());
429 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
430 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
431 error = rawResponse.readEntity(ErrorResponse.class);
432 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
433 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
434 error.getErrorMessage());
436 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
437 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
438 error = rawResponse.readEntity(ErrorResponse.class);
439 assertEquals("policy with ID onap.restart.tca:null 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 testDeletePolicies() {
448 assertThatCode(() -> {
449 main = startApiService(true);
450 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
451 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
452 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
453 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
454 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
455 error.getErrorMessage());
456 }).doesNotThrowAnyException();
460 public void testCreateGuardPolicies() {
462 assertThatCode(() -> {
463 main = startApiService(true);
464 for (String resrcName : legacyGuardPolicyResourceNames) {
465 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
466 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
468 }).doesNotThrowAnyException();
472 public void testCreateOperationalPolicies() {
474 assertThatCode(() -> {
475 main = startApiService(true);
476 for (String resrcName : legacyOperationalPolicyResourceNames) {
477 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
478 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
480 }).doesNotThrowAnyException();
484 public void testReadGuardPolicies() {
486 assertThatCode(() -> {
487 main = startApiService(true);
488 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
489 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
490 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
491 assertEquals("no policy found for policy: guard.frequency.scaleout:null",
492 error.getErrorMessage());
494 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
495 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
496 error = rawResponse.readEntity(ErrorResponse.class);
497 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
498 error.getErrorMessage());
500 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
501 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
502 error = rawResponse.readEntity(ErrorResponse.class);
503 assertEquals("no policy found for policy: guard.minmax.scaleout:null",
504 error.getErrorMessage());
506 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
507 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
508 error = rawResponse.readEntity(ErrorResponse.class);
509 assertEquals("no policy found for policy: guard.minmax.scaleout:1",
510 error.getErrorMessage());
511 }).doesNotThrowAnyException();
515 public void testReadOperationalPolicies() {
517 assertThatCode(() -> {
518 main = startApiService(true);
519 Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
520 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
521 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
522 assertEquals("no policy found for policy: operational.restart:null",
523 error.getErrorMessage());
525 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
526 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
527 error = rawResponse.readEntity(ErrorResponse.class);
528 assertEquals("no policy found for policy: operational.restart:1",
529 error.getErrorMessage());
531 rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
532 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
533 error = rawResponse.readEntity(ErrorResponse.class);
534 assertEquals("no policy found for policy: operational.scaleout:null",
535 error.getErrorMessage());
537 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
538 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
539 error = rawResponse.readEntity(ErrorResponse.class);
540 assertEquals("no policy found for policy: operational.scaleout:1",
541 error.getErrorMessage());
543 rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
544 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
545 error = rawResponse.readEntity(ErrorResponse.class);
546 assertEquals("no policy found for policy: operational.modifyconfig:null",
547 error.getErrorMessage());
549 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
550 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
551 error = rawResponse.readEntity(ErrorResponse.class);
552 assertEquals("no policy found for policy: operational.modifyconfig:1",
553 error.getErrorMessage());
554 }).doesNotThrowAnyException();
558 public void testDeleteGuardPolicy() {
560 assertThatCode(() -> {
561 main = startApiService(true);
562 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
563 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
564 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
565 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
566 error.getErrorMessage());
567 }).doesNotThrowAnyException();
571 public void testDeleteOperationalPolicy() {
573 assertThatCode(() -> {
574 main = startApiService(true);
575 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
576 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
577 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
578 assertEquals("no policy found for policy: operational.restart:1",
579 error.getErrorMessage());
580 }).doesNotThrowAnyException();
584 public void testHttpsCreatePolicyTypes() {
586 assertThatCode(() -> {
587 main = startApiService(false);
588 for (String resrcName : toscaPolicyTypeResourceNames) {
589 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
590 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
591 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
592 assertNotNull(response);
593 assertFalse(response.getPolicyTypes().get(0).isEmpty());
595 }).doesNotThrowAnyException();
599 public void testHttpsCreatePolicies() {
601 assertThatCode(() -> {
602 main = startApiService(false);
603 for (String resrcName : toscaPolicyResourceNames) {
604 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
605 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
606 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
607 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
608 error.getErrorMessage());
610 }).doesNotThrowAnyException();
614 public void testHttpsCreateGuardPolicies() {
616 assertThatCode(() -> {
617 main = startApiService(false);
618 for (String resrcName : legacyGuardPolicyResourceNames) {
619 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
620 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
622 }).doesNotThrowAnyException();
626 public void testHttpsCreateOperationalPolicies() {
628 assertThatCode(() -> {
629 main = startApiService(false);
630 for (String resrcName : legacyOperationalPolicyResourceNames) {
631 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
632 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
634 }).doesNotThrowAnyException();
638 public void testGetDeployedVersionsOfPolicy() {
639 assertThatCode(() -> {
640 main = startApiService(true);
641 Response rawResponse = readResource(GET_DEPLOYED_VERSION_OF_POLICY, true);
642 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
643 }).doesNotThrowAnyException();
647 public void testGetLatestVersionOfOperationalPolicy() {
648 assertThatCode(() -> {
649 main = startApiService(true);
650 Response rawResponse = readResource(GET_LATEST_VERSION_OF_OPERATIONAL_POLICY, true);
651 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
652 }).doesNotThrowAnyException();
656 public void testGetSpecificVersionOfOperationalPolicy() {
657 assertThatCode(() -> {
658 main = startApiService(true);
659 Response rawResponse = readResource(GET_SPECIFIC_VERSION_OF_OPERATIONAL_POLICY, true);
660 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
661 }).doesNotThrowAnyException();
665 public void testDeleteSpecificVersionOfOperationalPolicy() {
666 assertThatCode(() -> {
667 main = startApiService(true);
668 Response rawResponse = deleteResource(DEL_SPECIFIC_VERSION_OF_OPERATIONAL_POLICY, true);
669 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
670 }).doesNotThrowAnyException();
673 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
675 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
676 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
677 final Invocation.Builder invocationBuilder;
680 invocationBuilder = sendHttpRequest(endpoint);
682 invocationBuilder = sendHttpsRequest(endpoint);
685 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
686 return invocationBuilder.post(entity);
689 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
691 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
692 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
693 final Invocation.Builder invocationBuilder;
696 invocationBuilder = sendHttpRequest(endpoint);
698 invocationBuilder = sendHttpsRequest(endpoint);
701 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
702 return invocationBuilder.post(entity);
705 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
707 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
708 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
709 final Invocation.Builder invocationBuilder;
712 invocationBuilder = sendHttpRequest(endpoint);
714 invocationBuilder = sendHttpsRequest(endpoint);
717 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
718 return invocationBuilder.post(entity);
721 private Response readResource(String endpoint, boolean http) throws Exception {
723 final Invocation.Builder invocationBuilder;
726 invocationBuilder = sendHttpRequest(endpoint);
728 invocationBuilder = sendHttpsRequest(endpoint);
731 return invocationBuilder.get();
735 private Response deleteResource(String endpoint, boolean http) throws Exception {
737 final Invocation.Builder invocationBuilder;
740 invocationBuilder = sendHttpRequest(endpoint);
742 invocationBuilder = sendHttpsRequest(endpoint);
745 return invocationBuilder.delete();
748 private Main startApiService(final boolean http) throws Exception {
749 port = NetworkUtil.allocPort();
751 final String[] apiConfigParameters = new String[2];
753 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters.json",
754 "src/test/resources/parameters/ApiConfigParametersXXX.json", port);
755 apiConfigParameters[0] = "-c";
756 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParametersXXX.json";
758 final Properties systemProps = System.getProperties();
759 systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
760 systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
761 System.setProperties(systemProps);
762 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json",
763 "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", port);
764 apiConfigParameters[0] = "-c";
765 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json";
767 return new Main(apiConfigParameters);
770 private void stopApiService(final Main main) throws PolicyApiException {
775 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
777 final ClientConfig clientConfig = new ClientConfig();
779 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
780 clientConfig.register(feature);
782 final Client client = ClientBuilder.newClient(clientConfig);
784 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
785 client.register(GsonMessageBodyHandler.class);
787 final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
789 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
791 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
792 throw new IllegalStateException("cannot connect to port " + port);
794 return invocationBuilder;
797 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
799 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
802 public X509Certificate[] getAcceptedIssuers() {
803 return new X509Certificate[0];
807 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
810 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
813 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
814 sc.init(null, noopTrustManager, new SecureRandom());
815 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
817 final Client client = clientBuilder.build();
818 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
819 client.register(feature);
821 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
822 client.register(GsonMessageBodyHandler.class);
824 final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
826 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
828 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
829 throw new IllegalStateException("cannot connect to port " + port);
831 return invocationBuilder;
834 private void updateApiStatistics() {
836 ApiStatisticsManager.updateTotalApiCallCount();
837 ApiStatisticsManager.updateApiCallSuccessCount();
838 ApiStatisticsManager.updateApiCallFailureCount();
839 ApiStatisticsManager.updateTotalPolicyGetCount();
840 ApiStatisticsManager.updateTotalPolicyPostCount();
841 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
842 ApiStatisticsManager.updateTotalPolicyTypePostCount();
843 ApiStatisticsManager.updatePolicyGetSuccessCount();
844 ApiStatisticsManager.updatePolicyGetFailureCount();
845 ApiStatisticsManager.updatePolicyPostSuccessCount();
846 ApiStatisticsManager.updatePolicyPostFailureCount();
847 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
848 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
849 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
850 ApiStatisticsManager.updatePolicyTypePostFailureCount();
853 private void validateStatisticsReport(final StatisticsReport report, final int code) {
855 assertEquals(code, report.getCode());
858 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
859 final String message, final HealthCheckReport report) {
861 assertEquals(name, report.getName());
862 assertEquals(url, report.getUrl());
863 assertEquals(healthy, report.isHealthy());
864 assertEquals(code, report.getCode());
865 assertEquals(message, report.getMessage());