Policy API Junit tests
[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
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";
121
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";
139
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";
152
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();
155     private Main main;
156     private RestServer restServer;
157     private StandardCoder standardCoder = new StandardCoder();
158     private int port;
159
160     // @formatter:off
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",
165     };
166
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"
170     };
171
172     private String[] legacyGuardPolicyResourceNames = {
173         "policies/vDNS.policy.guard.frequency.input.json",
174         "policies/vDNS.policy.guard.minmax.input.json",
175     };
176
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"
181     };
182     // @formatter:on
183
184     /**
185      * Method for cleanup after each test.
186      */
187     @After
188     public void teardown() throws Exception {
189         if (main != null) {
190             stopApiService(main);
191         } else if (restServer != null) {
192             restServer.stop();
193         }
194     }
195
196     @Test
197     public void testHealthCheckSuccess() {
198
199         try {
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");
207         }
208     }
209
210     @Test
211     public void testHealthCheckFailure() throws InterruptedException, IOException {
212
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);
217         try {
218             restServer.start();
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");
227         }
228     }
229
230     @Test
231     public void testHttpsHealthCheckSuccess() {
232
233         try {
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");
241         }
242     }
243
244     @Test
245     public void testApiStatistics_200() {
246
247         try {
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");
260         }
261     }
262
263     @Test
264     public void testApiStatistics_500() throws Exception {
265
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);
270         try {
271             restServer.start();
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");
279         }
280     }
281
282     @Test
283     public void testHttpsApiStatistics() {
284
285         try {
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");
293         }
294     }
295
296     @Test
297     public void testApiStatisticsConstructorIsPrivate() {
298
299         try {
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"));
306         }
307     }
308
309     @Test
310     public void testCreatePolicyTypes() {
311
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());
320             }
321         }).doesNotThrowAnyException();
322     }
323
324     @Test
325     public void testReadPolicyTypes() {
326
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());
333
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());
339
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());
345
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());
351
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());
358
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());
365
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();
373     }
374
375     @Test
376     public void testDeletePolicyType() {
377
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());
385
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();
393     }
394
395     @Test
396     public void testCreatePolicies() {
397
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());
406             }
407         }).doesNotThrowAnyException();
408     }
409
410     @Test
411     public void testReadPolicies() {
412
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());
421
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());
428
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());
435
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();
443     }
444
445     @Test
446     public void testDeletePolicies() {
447
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();
457     }
458
459     @Test
460     public void testCreateGuardPolicies() {
461
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());
467             }
468         }).doesNotThrowAnyException();
469     }
470
471     @Test
472     public void testCreateOperationalPolicies() {
473
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());
479             }
480         }).doesNotThrowAnyException();
481     }
482
483     @Test
484     public void testReadGuardPolicies() {
485
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());
493
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());
499
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());
505
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();
512     }
513
514     @Test
515     public void testReadOperationalPolicies() {
516
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());
524
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());
530
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());
536
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());
542
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());
548
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();
555     }
556
557     @Test
558     public void testDeleteGuardPolicy() {
559
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();
568     }
569
570     @Test
571     public void testDeleteOperationalPolicy() {
572
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();
581     }
582
583     @Test
584     public void testHttpsCreatePolicyTypes() {
585
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());
594             }
595         }).doesNotThrowAnyException();
596     }
597
598     @Test
599     public void testHttpsCreatePolicies() {
600
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());
609             }
610         }).doesNotThrowAnyException();
611     }
612
613     @Test
614     public void testHttpsCreateGuardPolicies() {
615
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());
621             }
622         }).doesNotThrowAnyException();
623     }
624
625     @Test
626     public void testHttpsCreateOperationalPolicies() {
627
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());
633             }
634         }).doesNotThrowAnyException();
635     }
636
637     @Test
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();
644     }
645
646     @Test
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();
653     }
654
655     @Test
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();
662     }
663
664     @Test
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();
671     }
672
673     private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
674
675         ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
676                 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
677         final Invocation.Builder invocationBuilder;
678
679         if (http) {
680             invocationBuilder = sendHttpRequest(endpoint);
681         } else {
682             invocationBuilder = sendHttpsRequest(endpoint);
683         }
684
685         Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
686         return invocationBuilder.post(entity);
687     }
688
689     private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
690
691         LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
692                 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
693         final Invocation.Builder invocationBuilder;
694
695         if (http) {
696             invocationBuilder = sendHttpRequest(endpoint);
697         } else {
698             invocationBuilder = sendHttpsRequest(endpoint);
699         }
700
701         Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
702         return invocationBuilder.post(entity);
703     }
704
705     private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
706
707         LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
708                 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
709         final Invocation.Builder invocationBuilder;
710
711         if (http) {
712             invocationBuilder = sendHttpRequest(endpoint);
713         } else {
714             invocationBuilder = sendHttpsRequest(endpoint);
715         }
716
717         Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
718         return invocationBuilder.post(entity);
719     }
720
721     private Response readResource(String endpoint, boolean http) throws Exception {
722
723         final Invocation.Builder invocationBuilder;
724
725         if (http) {
726             invocationBuilder = sendHttpRequest(endpoint);
727         } else {
728             invocationBuilder = sendHttpsRequest(endpoint);
729         }
730
731         return invocationBuilder.get();
732
733     }
734
735     private Response deleteResource(String endpoint, boolean http) throws Exception {
736
737         final Invocation.Builder invocationBuilder;
738
739         if (http) {
740             invocationBuilder = sendHttpRequest(endpoint);
741         } else {
742             invocationBuilder = sendHttpsRequest(endpoint);
743         }
744
745         return invocationBuilder.delete();
746     }
747
748     private Main startApiService(final boolean http) throws Exception {
749         port = NetworkUtil.allocPort();
750
751         final String[] apiConfigParameters = new String[2];
752         if (http) {
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";
757         } else {
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";
766         }
767         return new Main(apiConfigParameters);
768     }
769
770     private void stopApiService(final Main main) throws PolicyApiException {
771
772         main.shutdown();
773     }
774
775     private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
776
777         final ClientConfig clientConfig = new ClientConfig();
778
779         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
780         clientConfig.register(feature);
781
782         final Client client = ClientBuilder.newClient(clientConfig);
783
784         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
785         client.register(GsonMessageBodyHandler.class);
786
787         final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
788
789         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
790
791         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
792             throw new IllegalStateException("cannot connect to port " + port);
793         }
794         return invocationBuilder;
795     }
796
797     private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
798
799         final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
800
801             @Override
802             public X509Certificate[] getAcceptedIssuers() {
803                 return new X509Certificate[0];
804             }
805
806             @Override
807             public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
808
809             @Override
810             public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
811         } };
812
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,
816                 session) -> true);
817         final Client client = clientBuilder.build();
818         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
819         client.register(feature);
820
821         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
822         client.register(GsonMessageBodyHandler.class);
823
824         final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
825
826         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
827
828         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
829             throw new IllegalStateException("cannot connect to port " + port);
830         }
831         return invocationBuilder;
832     }
833
834     private void updateApiStatistics() {
835
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();
851     }
852
853     private void validateStatisticsReport(final StatisticsReport report, final int code) {
854
855         assertEquals(code, report.getCode());
856     }
857
858     private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
859             final String message, final HealthCheckReport report) {
860
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());
866     }
867 }