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";
108 private static final String POLICYTYPES_TCA_POLICIES_VCPE_DEPLOYED = "policytypes/"
109 + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/deployed";
111 private static final String GUARD_POLICIES =
112 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies";
113 private static final String GUARD_POLICIES_VDNS_FL_LATEST =
114 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
115 + "/versions/latest";
116 private static final String GUARD_POLICIES_VDNS_FL_DEPLOYED =
117 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
118 + "/versions/deployed";
119 private static final String GUARD_POLICIES_VDNS_MINMAX_LATEST =
120 "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout"
121 + "/versions/latest";
122 private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
123 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1";
124 private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
125 + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1";
127 private static final String OPS_POLICIES =
128 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
129 private static final String OPS_POLICIES_VCPE_LATEST =
130 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.restart"
131 + "/versions/latest";
132 private static final String OPS_POLICIES_VCPE_DEPLOYED =
133 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.restart"
134 + "/versions/deployed";
135 private static final String OPS_POLICIES_VDNS_LATEST =
136 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.scaleout"
137 + "/versions/latest";
138 private static final String OPS_POLICIES_VFIREWALL_LATEST =
139 "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.modifyconfig"
140 + "/versions/latest";
141 private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
142 + "onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.restart/versions/1";
143 private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
144 + "onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.scaleout/versions/1";
145 private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
146 + "onap.policies.controlloop.Operational/versions/1.0.0/policies/operational.modifyconfig/versions/1";
148 private static final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
149 private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
151 private RestServer restServer;
152 private StandardCoder standardCoder = new StandardCoder();
156 private String[] toscaPolicyResourceNames = {
157 "policies/vCPE.policy.monitoring.input.tosca.json",
158 "policies/vDNS.policy.monitoring.input.tosca.json",
159 "policies/vFirewall.policy.monitoring.input.tosca.json",
162 private String[] toscaPolicyTypeResourceNames = {
163 "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
164 "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
167 private String[] legacyGuardPolicyResourceNames = {
168 "policies/vDNS.policy.guard.frequency.input.json",
169 "policies/vDNS.policy.guard.minmax.input.json",
172 private String[] legacyOperationalPolicyResourceNames = {
173 "policies/vCPE.policy.operational.input.json",
174 "policies/vDNS.policy.operational.input.json",
175 "policies/vFirewall.policy.operational.input.json"
180 * Method for cleanup after each test.
183 public void teardown() throws Exception {
185 stopApiService(main);
186 } else if (restServer != null) {
192 public void testHealthCheckSuccess() {
195 main = startApiService(true);
196 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
197 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
198 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
199 } catch (final Exception exp) {
200 LOGGER.error("testHealthCheckSuccess failed", exp);
201 fail("Test should not throw an exception");
206 public void testHealthCheckFailure() throws InterruptedException, IOException {
208 port = NetworkUtil.allocPort();
209 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
210 restServerParams.setName(CommonTestData.API_GROUP_NAME);
211 restServer = new RestServer(restServerParams, null, ApiRestController.class);
214 final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
215 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
216 validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
217 assertTrue(restServer.isAlive());
218 assertTrue(restServer.toString().startsWith("RestServer [servers="));
219 } catch (final Exception exp) {
220 LOGGER.error("testHealthCheckFailure failed", exp);
221 fail("Test should not throw an exception");
226 public void testHttpsHealthCheckSuccess() {
229 main = startApiService(false);
230 final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
231 final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
232 validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
233 } catch (final Exception exp) {
234 LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
235 fail("Test should not throw an exception");
240 public void testApiStatistics_200() {
243 main = startApiService(true);
244 Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
245 StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
246 validateStatisticsReport(report, 200);
247 updateApiStatistics();
248 invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
249 report = invocationBuilder.get(StatisticsReport.class);
250 validateStatisticsReport(report, 200);
251 ApiStatisticsManager.resetAllStatistics();
252 } catch (final Exception exp) {
253 LOGGER.error("testApiStatistics_200 failed", exp);
254 fail("Test should not throw an exception");
259 public void testApiStatistics_500() throws Exception {
261 port = NetworkUtil.allocPort();
262 final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
263 restServerParams.setName(CommonTestData.API_GROUP_NAME);
264 restServer = new RestServer(restServerParams, null, ApiRestController.class);
267 final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
268 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
269 validateStatisticsReport(report, 500);
270 ApiStatisticsManager.resetAllStatistics();
271 } catch (final Exception exp) {
272 LOGGER.error("testApiStatistics_500 failed", exp);
273 fail("Test should not throw an exception");
278 public void testHttpsApiStatistics() {
281 main = startApiService(false);
282 final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
283 final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
284 validateStatisticsReport(report, 200);
285 } catch (final Exception exp) {
286 LOGGER.error("testHttpsApiStatistics failed", exp);
287 fail("Test should not throw an exception");
292 public void testApiStatisticsConstructorIsPrivate() {
295 final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
296 assertTrue(Modifier.isPrivate(constructor.getModifiers()));
297 constructor.setAccessible(true);
298 constructor.newInstance();
299 } catch (final Exception exp) {
300 assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
305 public void testCreatePolicyTypes() {
307 assertThatCode(() -> {
308 main = startApiService(true);
309 for (String resrcName : toscaPolicyTypeResourceNames) {
310 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
311 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
312 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
313 assertNotNull(response);
314 assertFalse(response.getPolicyTypes().get(0).isEmpty());
316 }).doesNotThrowAnyException();
320 public void testReadPolicyTypes() {
322 assertThatCode(() -> {
323 main = startApiService(true);
324 Response rawResponse = readResource(POLICYTYPES, true);
325 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
326 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
327 assertTrue(response.getPolicyTypes().isEmpty());
329 rawResponse = readResource(POLICYTYPES_TCA, true);
330 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
331 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
332 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
333 error.getErrorMessage());
335 rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
336 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
337 error = rawResponse.readEntity(ErrorResponse.class);
338 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
339 error.getErrorMessage());
341 rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
342 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
343 error = rawResponse.readEntity(ErrorResponse.class);
344 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
345 error.getErrorMessage());
347 rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
348 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
349 error = rawResponse.readEntity(ErrorResponse.class);
350 assertEquals("policy type with ID "
351 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
352 error.getErrorMessage());
354 rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
355 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
356 error = rawResponse.readEntity(ErrorResponse.class);
357 assertEquals("policy type with ID "
358 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
359 error.getErrorMessage());
361 rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
362 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
363 error = rawResponse.readEntity(ErrorResponse.class);
364 assertEquals("policy type with ID "
365 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
366 error.getErrorMessage());
367 }).doesNotThrowAnyException();
371 public void testDeletePolicyType() {
373 assertThatCode(() -> {
374 main = startApiService(true);
375 Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
376 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
377 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
378 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
379 error.getErrorMessage());
381 rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
382 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
383 error = rawResponse.readEntity(ErrorResponse.class);
384 assertEquals("policy type with ID "
385 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
386 error.getErrorMessage());
387 }).doesNotThrowAnyException();
391 public void testCreatePolicies() {
393 assertThatCode(() -> {
394 main = startApiService(true);
395 for (String resrcName : toscaPolicyResourceNames) {
396 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
397 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
398 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
399 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
400 error.getErrorMessage());
402 }).doesNotThrowAnyException();
406 public void testReadPolicies() {
408 assertThatCode(() -> {
409 main = startApiService(true);
410 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
411 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
412 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
413 assertEquals("policy with ID null:null and "
414 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
415 error.getErrorMessage());
417 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
418 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
419 error = rawResponse.readEntity(ErrorResponse.class);
420 assertEquals("policy with ID onap.restart.tca:null and "
421 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
422 error.getErrorMessage());
424 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
425 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
426 error = rawResponse.readEntity(ErrorResponse.class);
427 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
428 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
429 error.getErrorMessage());
431 rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
432 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
433 error = rawResponse.readEntity(ErrorResponse.class);
434 assertEquals("policy with ID onap.restart.tca:null and "
435 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
436 error.getErrorMessage());
437 }).doesNotThrowAnyException();
441 public void testDeletePolicies() {
443 assertThatCode(() -> {
444 main = startApiService(true);
445 Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
446 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
447 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
448 assertEquals("policy with ID onap.restart.tca:1.0.0 and "
449 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
450 error.getErrorMessage());
451 }).doesNotThrowAnyException();
455 public void testCreateGuardPolicies() {
457 assertThatCode(() -> {
458 main = startApiService(true);
459 for (String resrcName : legacyGuardPolicyResourceNames) {
460 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
461 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
463 }).doesNotThrowAnyException();
467 public void testCreateOperationalPolicies() {
469 assertThatCode(() -> {
470 main = startApiService(true);
471 for (String resrcName : legacyOperationalPolicyResourceNames) {
472 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
473 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
475 }).doesNotThrowAnyException();
479 public void testReadGuardPolicies() {
481 assertThatCode(() -> {
482 main = startApiService(true);
483 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
484 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
485 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
486 assertEquals("no policy found for policy: guard.frequency.scaleout:null",
487 error.getErrorMessage());
489 rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
490 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
491 error = rawResponse.readEntity(ErrorResponse.class);
492 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
493 error.getErrorMessage());
495 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
496 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
497 error = rawResponse.readEntity(ErrorResponse.class);
498 assertEquals("no policy found for policy: guard.minmax.scaleout:null",
499 error.getErrorMessage());
501 rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
502 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
503 error = rawResponse.readEntity(ErrorResponse.class);
504 assertEquals("no policy found for policy: guard.minmax.scaleout:1",
505 error.getErrorMessage());
506 }).doesNotThrowAnyException();
510 public void testReadOperationalPolicies() {
512 assertThatCode(() -> {
513 main = startApiService(true);
514 Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
515 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
516 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
517 assertEquals("no policy found for policy: operational.restart:null",
518 error.getErrorMessage());
520 rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
521 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
522 error = rawResponse.readEntity(ErrorResponse.class);
523 assertEquals("no policy found for policy: operational.restart:1",
524 error.getErrorMessage());
526 rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
527 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
528 error = rawResponse.readEntity(ErrorResponse.class);
529 assertEquals("no policy found for policy: operational.scaleout:null",
530 error.getErrorMessage());
532 rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
533 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
534 error = rawResponse.readEntity(ErrorResponse.class);
535 assertEquals("no policy found for policy: operational.scaleout:1",
536 error.getErrorMessage());
538 rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
539 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
540 error = rawResponse.readEntity(ErrorResponse.class);
541 assertEquals("no policy found for policy: operational.modifyconfig:null",
542 error.getErrorMessage());
544 rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
545 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
546 error = rawResponse.readEntity(ErrorResponse.class);
547 assertEquals("no policy found for policy: operational.modifyconfig:1",
548 error.getErrorMessage());
549 }).doesNotThrowAnyException();
553 public void testDeleteGuardPolicy() {
555 assertThatCode(() -> {
556 main = startApiService(true);
557 Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
558 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
559 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
560 assertEquals("no policy found for policy: guard.frequency.scaleout:1",
561 error.getErrorMessage());
562 }).doesNotThrowAnyException();
566 public void testGetDeployedVersionsOfGuardPolicy() {
567 assertThatCode(() -> {
568 main = startApiService(true);
569 Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_DEPLOYED, true);
570 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
571 }).doesNotThrowAnyException();
575 public void testDeleteOperationalPolicy() {
577 assertThatCode(() -> {
578 main = startApiService(true);
579 Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
580 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
581 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
582 assertEquals("no policy found for policy: operational.restart:1",
583 error.getErrorMessage());
584 }).doesNotThrowAnyException();
588 public void testHttpsCreatePolicyTypes() {
590 assertThatCode(() -> {
591 main = startApiService(false);
592 for (String resrcName : toscaPolicyTypeResourceNames) {
593 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
594 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
595 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
596 assertNotNull(response);
597 assertFalse(response.getPolicyTypes().get(0).isEmpty());
599 }).doesNotThrowAnyException();
603 public void testHttpsCreatePolicies() {
605 assertThatCode(() -> {
606 main = startApiService(false);
607 for (String resrcName : toscaPolicyResourceNames) {
608 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
609 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
610 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
611 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
612 error.getErrorMessage());
614 }).doesNotThrowAnyException();
618 public void testHttpsCreateGuardPolicies() {
620 assertThatCode(() -> {
621 main = startApiService(false);
622 for (String resrcName : legacyGuardPolicyResourceNames) {
623 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
624 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
626 }).doesNotThrowAnyException();
630 public void testHttpsCreateOperationalPolicies() {
632 assertThatCode(() -> {
633 main = startApiService(false);
634 for (String resrcName : legacyOperationalPolicyResourceNames) {
635 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
636 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
638 }).doesNotThrowAnyException();
642 public void testGetDeployedVersionsOfPolicy() {
643 assertThatCode(() -> {
644 main = startApiService(true);
645 Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_DEPLOYED, true);
646 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
647 }).doesNotThrowAnyException();
651 public void testGetLatestVersionOfOperationalPolicy() {
652 assertThatCode(() -> {
653 main = startApiService(true);
654 Response rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
655 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
656 }).doesNotThrowAnyException();
660 public void testGetSpecificVersionOfOperationalPolicy() {
661 assertThatCode(() -> {
662 main = startApiService(true);
663 Response rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
664 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
665 }).doesNotThrowAnyException();
669 public void testGetDeployedVersionsOfOperationalPolicy() {
670 assertThatCode(() -> {
671 main = startApiService(true);
672 Response rawResponse = readResource(OPS_POLICIES_VCPE_DEPLOYED, true);
673 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
674 }).doesNotThrowAnyException();
678 public void testDeleteSpecificVersionOfOperationalPolicy() {
679 assertThatCode(() -> {
680 main = startApiService(true);
681 Response rawResponse = deleteResource(OPS_POLICIES_VDNS_VERSION, true);
682 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
683 }).doesNotThrowAnyException();
686 private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
688 ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
689 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
690 final Invocation.Builder invocationBuilder;
693 invocationBuilder = sendHttpRequest(endpoint);
695 invocationBuilder = sendHttpsRequest(endpoint);
698 Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
699 return invocationBuilder.post(entity);
702 private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
704 LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
705 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
706 final Invocation.Builder invocationBuilder;
709 invocationBuilder = sendHttpRequest(endpoint);
711 invocationBuilder = sendHttpsRequest(endpoint);
714 Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
715 return invocationBuilder.post(entity);
718 private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
720 LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
721 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
722 final Invocation.Builder invocationBuilder;
725 invocationBuilder = sendHttpRequest(endpoint);
727 invocationBuilder = sendHttpsRequest(endpoint);
730 Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
731 return invocationBuilder.post(entity);
734 private Response readResource(String endpoint, boolean http) throws Exception {
736 final Invocation.Builder invocationBuilder;
739 invocationBuilder = sendHttpRequest(endpoint);
741 invocationBuilder = sendHttpsRequest(endpoint);
744 return invocationBuilder.get();
748 private Response deleteResource(String endpoint, boolean http) throws Exception {
750 final Invocation.Builder invocationBuilder;
753 invocationBuilder = sendHttpRequest(endpoint);
755 invocationBuilder = sendHttpsRequest(endpoint);
758 return invocationBuilder.delete();
761 private Main startApiService(final boolean http) throws Exception {
762 port = NetworkUtil.allocPort();
764 final String[] apiConfigParameters = new String[2];
766 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters.json",
767 "src/test/resources/parameters/ApiConfigParametersXXX.json", port);
768 apiConfigParameters[0] = "-c";
769 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParametersXXX.json";
771 final Properties systemProps = System.getProperties();
772 systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
773 systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
774 System.setProperties(systemProps);
775 COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json",
776 "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", port);
777 apiConfigParameters[0] = "-c";
778 apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json";
780 return new Main(apiConfigParameters);
783 private void stopApiService(final Main main) throws PolicyApiException {
788 private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
790 final ClientConfig clientConfig = new ClientConfig();
792 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
793 clientConfig.register(feature);
795 final Client client = ClientBuilder.newClient(clientConfig);
797 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
798 client.register(GsonMessageBodyHandler.class);
800 final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
802 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
804 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
805 throw new IllegalStateException("cannot connect to port " + port);
807 return invocationBuilder;
810 private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
812 final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
815 public X509Certificate[] getAcceptedIssuers() {
816 return new X509Certificate[0];
820 public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
823 public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
826 final SSLContext sc = SSLContext.getInstance("TLSv1.2");
827 sc.init(null, noopTrustManager, new SecureRandom());
828 final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
830 final Client client = clientBuilder.build();
831 final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
832 client.register(feature);
834 client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
835 client.register(GsonMessageBodyHandler.class);
837 final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
839 final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
841 if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
842 throw new IllegalStateException("cannot connect to port " + port);
844 return invocationBuilder;
847 private void updateApiStatistics() {
849 ApiStatisticsManager.updateTotalApiCallCount();
850 ApiStatisticsManager.updateApiCallSuccessCount();
851 ApiStatisticsManager.updateApiCallFailureCount();
852 ApiStatisticsManager.updateTotalPolicyGetCount();
853 ApiStatisticsManager.updateTotalPolicyPostCount();
854 ApiStatisticsManager.updateTotalPolicyTypeGetCount();
855 ApiStatisticsManager.updateTotalPolicyTypePostCount();
856 ApiStatisticsManager.updatePolicyGetSuccessCount();
857 ApiStatisticsManager.updatePolicyGetFailureCount();
858 ApiStatisticsManager.updatePolicyPostSuccessCount();
859 ApiStatisticsManager.updatePolicyPostFailureCount();
860 ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
861 ApiStatisticsManager.updatePolicyTypeGetFailureCount();
862 ApiStatisticsManager.updatePolicyTypePostSuccessCount();
863 ApiStatisticsManager.updatePolicyTypePostFailureCount();
866 private void validateStatisticsReport(final StatisticsReport report, final int code) {
868 assertEquals(code, report.getCode());
871 private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
872 final String message, final HealthCheckReport report) {
874 assertEquals(name, report.getName());
875 assertEquals(url, report.getUrl());
876 assertEquals(healthy, report.isHealthy());
877 assertEquals(code, report.getCode());
878 assertEquals(message, report.getMessage());