3d5adfc09ad99c8d09481a43c72f44767b222b3b
[policy/apex-pdp.git] / testsuites / performance / performance-benchmark-test / src / main / java / org / onap / policy / apex / testsuites / performance / benchmark / eventgenerator / EventGeneratorEndpoint.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  *  Modifications Copyright (C) 2020 Nordix Foundation.
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.apex.testsuites.performance.benchmark.eventgenerator;
23
24 import com.google.gson.Gson;
25
26 import java.util.concurrent.ConcurrentHashMap;
27
28 import java.util.concurrent.atomic.AtomicReference;
29 import javax.inject.Inject;
30 import javax.inject.Provider;
31 import javax.ws.rs.GET;
32 import javax.ws.rs.POST;
33 import javax.ws.rs.Path;
34 import javax.ws.rs.core.Response;
35
36 import org.glassfish.grizzly.http.server.Request;
37 import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
38 import org.onap.policy.apex.testsuites.performance.benchmark.eventgenerator.events.OutputEvent;
39 import org.slf4j.ext.XLogger;
40 import org.slf4j.ext.XLoggerFactory;
41
42 /**
43  * This class is the REST end point for event simulator REST calls.
44  */
45 @Path("/")
46 public class EventGeneratorEndpoint {
47
48     // Get a reference to the logger
49     private static final XLogger LOGGER = XLoggerFactory.getXLogger(EventGeneratorEndpoint.class);
50
51     // Parameters for event generation
52     private static AtomicReference<EventGeneratorParameters> parameters = new AtomicReference<>(
53         new EventGeneratorParameters());
54
55     // The map of event batches sent in the test
56     private static ConcurrentHashMap<Integer, EventBatch> batchMap = new ConcurrentHashMap<>();
57
58     // Flag indicating that event processing has finished
59     private static boolean finished = false;
60
61     // The current HTTP request
62     private final Provider<Request> httpRequest;
63
64     /**
65      * Inject the HTTP request with a constructor.
66      *
67      * @param httpRequest the current request
68      */
69     @Inject
70     public EventGeneratorEndpoint(final Provider<Request> httpRequest) {
71         this.httpRequest = httpRequest;
72     }
73
74     /**
75      * Set the parameters for the end point.
76      *
77      * @param incomingParameters the new parameters
78      */
79     public static void setParameters(EventGeneratorParameters incomingParameters) {
80         parameters.set(incomingParameters);
81     }
82
83     /**
84      * Get event generator statistics.
85      *
86      * @return the response
87      */
88     @Path("/Stats")
89     @GET
90     public Response serviceGetStats() {
91         return Response.status(200).entity(new EventGeneratorStats(batchMap).getStatsAsJsonString()).build();
92     }
93
94     /**
95      * Generate a single event.
96      *
97      * @return the event
98      */
99     @Path("/GetEvents")
100     @GET
101     public Response getEvents() {
102         ThreadUtilities.sleep(parameters.get().getDelayBetweenBatches());
103
104         // Check if event generation is finished
105         if (isFinished()) {
106             return Response.status(204).build();
107         }
108
109         // A batch count of 0 means to continue to handle events for ever
110         if (parameters.get().getBatchCount() > 0 && batchMap.size() >= parameters.get().getBatchCount()) {
111             setFinished(true);
112             return Response.status(204).build();
113         }
114
115         EventBatch batch = new EventBatch(parameters.get().getBatchSize(), getApexClient());
116         batchMap.put(batch.getBatchNumber(), batch);
117
118         return Response.status(200).entity(batch.getBatchAsJsonString()).build();
119     }
120
121     /**
122      * Get a single response to an event.
123      *
124      * @param jsonString the json string
125      * @return the response
126      */
127     @Path("/PostEvent")
128     @POST
129     public Response postEventResponse(final String jsonString) {
130         final OutputEvent outputEvent = new Gson().fromJson(jsonString, OutputEvent.class);
131
132         EventBatch batch = batchMap.get(outputEvent.findBatchNumber());
133
134         if (batch == null) {
135             String errorMessage = "no input event found for received output event " + outputEvent;
136             LOGGER.warn(errorMessage);
137             return Response.status(409).build();
138         }
139
140         batch.handleResponse(outputEvent);
141         return Response.status(200).build();
142     }
143
144     /**
145      * Get the name, address, and port of the Apex client getting the events.
146      *
147      * @return the Apex client
148      */
149     private String getApexClient() {
150         return httpRequest.get().getRemoteHost() + '(' + httpRequest.get().getRemoteAddr() + "):" + httpRequest.get()
151             .getRemotePort();
152     }
153
154     /**
155      * Get event generation statistics.
156      *
157      * @return the statistics on event generation
158      */
159     protected static String getEventGenerationStats() {
160         return new EventGeneratorStats(batchMap).getStatsAsJsonString();
161     }
162
163     /**
164      * Clear event generation statistics.
165      */
166     protected static void clearEventGenerationStats() {
167         batchMap.clear();
168     }
169
170     /**
171      * Check if event generation has finished.
172      *
173      * @return true if event generation has finished
174      */
175     protected static boolean isFinished() {
176         return finished;
177     }
178
179     protected static void setFinished(boolean finished) {
180         EventGeneratorEndpoint.finished = finished;
181     }
182 }