Add get deployed endpoints for legacy policies
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / TestApiRestServer.java
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.api.main.rest;
23
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;
30
31 import java.io.IOException;
32 import java.lang.reflect.Constructor;
33 import java.lang.reflect.Modifier;
34 import java.security.SecureRandom;
35 import java.security.cert.X509Certificate;
36 import java.util.Properties;
37
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;
48
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;
70
71 /**
72  * Class to perform unit test of {@link ApiRestServer}.
73  *
74  * @author Chenfei Gao (cgao@research.att.com)
75  */
76 public class TestApiRestServer {
77
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";
83
84     private static final String HEALTHCHECK_ENDPOINT = "healthcheck";
85     private static final String STATISTICS_ENDPOINT = "statistics";
86
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";
99
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";
110
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";
126
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";
147
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();
150     private Main main;
151     private RestServer restServer;
152     private StandardCoder standardCoder = new StandardCoder();
153     private int port;
154
155     // @formatter:off
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",
160     };
161
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"
165     };
166
167     private String[] legacyGuardPolicyResourceNames = {
168         "policies/vDNS.policy.guard.frequency.input.json",
169         "policies/vDNS.policy.guard.minmax.input.json",
170     };
171
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"
176     };
177     // @formatter:on
178
179     /**
180      * Method for cleanup after each test.
181      */
182     @After
183     public void teardown() throws Exception {
184         if (main != null) {
185             stopApiService(main);
186         } else if (restServer != null) {
187             restServer.stop();
188         }
189     }
190
191     @Test
192     public void testHealthCheckSuccess() {
193
194         try {
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");
202         }
203     }
204
205     @Test
206     public void testHealthCheckFailure() throws InterruptedException, IOException {
207
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);
212         try {
213             restServer.start();
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");
222         }
223     }
224
225     @Test
226     public void testHttpsHealthCheckSuccess() {
227
228         try {
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");
236         }
237     }
238
239     @Test
240     public void testApiStatistics_200() {
241
242         try {
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");
255         }
256     }
257
258     @Test
259     public void testApiStatistics_500() throws Exception {
260
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);
265         try {
266             restServer.start();
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");
274         }
275     }
276
277     @Test
278     public void testHttpsApiStatistics() {
279
280         try {
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");
288         }
289     }
290
291     @Test
292     public void testApiStatisticsConstructorIsPrivate() {
293
294         try {
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"));
301         }
302     }
303
304     @Test
305     public void testCreatePolicyTypes() {
306
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());
315             }
316         }).doesNotThrowAnyException();
317     }
318
319     @Test
320     public void testReadPolicyTypes() {
321
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());
328
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());
334
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());
340
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());
346
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());
353
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());
360
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();
368     }
369
370     @Test
371     public void testDeletePolicyType() {
372
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());
380
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();
388     }
389
390     @Test
391     public void testCreatePolicies() {
392
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());
401             }
402         }).doesNotThrowAnyException();
403     }
404
405     @Test
406     public void testReadPolicies() {
407
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());
416
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());
423
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());
430
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();
438     }
439
440     @Test
441     public void testDeletePolicies() {
442
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();
452     }
453
454     @Test
455     public void testCreateGuardPolicies() {
456
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());
462             }
463         }).doesNotThrowAnyException();
464     }
465
466     @Test
467     public void testCreateOperationalPolicies() {
468
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());
474             }
475         }).doesNotThrowAnyException();
476     }
477
478     @Test
479     public void testReadGuardPolicies() {
480
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());
488
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());
494
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());
500
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();
507     }
508
509     @Test
510     public void testReadOperationalPolicies() {
511
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());
519
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());
525
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());
531
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());
537
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());
543
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();
550     }
551
552     @Test
553     public void testDeleteGuardPolicy() {
554
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();
563     }
564
565     @Test
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();
572     }
573
574     @Test
575     public void testDeleteOperationalPolicy() {
576
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();
585     }
586
587     @Test
588     public void testHttpsCreatePolicyTypes() {
589
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());
598             }
599         }).doesNotThrowAnyException();
600     }
601
602     @Test
603     public void testHttpsCreatePolicies() {
604
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());
613             }
614         }).doesNotThrowAnyException();
615     }
616
617     @Test
618     public void testHttpsCreateGuardPolicies() {
619
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());
625             }
626         }).doesNotThrowAnyException();
627     }
628
629     @Test
630     public void testHttpsCreateOperationalPolicies() {
631
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());
637             }
638         }).doesNotThrowAnyException();
639     }
640
641     @Test
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();
648     }
649
650     @Test
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();
657     }
658
659     @Test
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();
666     }
667
668     @Test
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();
675     }
676
677     @Test
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();
684     }
685
686     private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
687
688         ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
689                 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
690         final Invocation.Builder invocationBuilder;
691
692         if (http) {
693             invocationBuilder = sendHttpRequest(endpoint);
694         } else {
695             invocationBuilder = sendHttpsRequest(endpoint);
696         }
697
698         Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
699         return invocationBuilder.post(entity);
700     }
701
702     private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
703
704         LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
705                 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
706         final Invocation.Builder invocationBuilder;
707
708         if (http) {
709             invocationBuilder = sendHttpRequest(endpoint);
710         } else {
711             invocationBuilder = sendHttpsRequest(endpoint);
712         }
713
714         Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
715         return invocationBuilder.post(entity);
716     }
717
718     private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
719
720         LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
721                 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
722         final Invocation.Builder invocationBuilder;
723
724         if (http) {
725             invocationBuilder = sendHttpRequest(endpoint);
726         } else {
727             invocationBuilder = sendHttpsRequest(endpoint);
728         }
729
730         Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
731         return invocationBuilder.post(entity);
732     }
733
734     private Response readResource(String endpoint, boolean http) throws Exception {
735
736         final Invocation.Builder invocationBuilder;
737
738         if (http) {
739             invocationBuilder = sendHttpRequest(endpoint);
740         } else {
741             invocationBuilder = sendHttpsRequest(endpoint);
742         }
743
744         return invocationBuilder.get();
745
746     }
747
748     private Response deleteResource(String endpoint, boolean http) throws Exception {
749
750         final Invocation.Builder invocationBuilder;
751
752         if (http) {
753             invocationBuilder = sendHttpRequest(endpoint);
754         } else {
755             invocationBuilder = sendHttpsRequest(endpoint);
756         }
757
758         return invocationBuilder.delete();
759     }
760
761     private Main startApiService(final boolean http) throws Exception {
762         port = NetworkUtil.allocPort();
763
764         final String[] apiConfigParameters = new String[2];
765         if (http) {
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";
770         } else {
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";
779         }
780         return new Main(apiConfigParameters);
781     }
782
783     private void stopApiService(final Main main) throws PolicyApiException {
784
785         main.shutdown();
786     }
787
788     private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
789
790         final ClientConfig clientConfig = new ClientConfig();
791
792         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
793         clientConfig.register(feature);
794
795         final Client client = ClientBuilder.newClient(clientConfig);
796
797         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
798         client.register(GsonMessageBodyHandler.class);
799
800         final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
801
802         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
803
804         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
805             throw new IllegalStateException("cannot connect to port " + port);
806         }
807         return invocationBuilder;
808     }
809
810     private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
811
812         final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
813
814             @Override
815             public X509Certificate[] getAcceptedIssuers() {
816                 return new X509Certificate[0];
817             }
818
819             @Override
820             public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
821
822             @Override
823             public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
824         } };
825
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,
829                 session) -> true);
830         final Client client = clientBuilder.build();
831         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
832         client.register(feature);
833
834         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
835         client.register(GsonMessageBodyHandler.class);
836
837         final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
838
839         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
840
841         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
842             throw new IllegalStateException("cannot connect to port " + port);
843         }
844         return invocationBuilder;
845     }
846
847     private void updateApiStatistics() {
848
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();
864     }
865
866     private void validateStatisticsReport(final StatisticsReport report, final int code) {
867
868         assertEquals(code, report.getCode());
869     }
870
871     private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
872             final String message, final HealthCheckReport report) {
873
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());
879     }
880 }