aboutsummaryrefslogtreecommitdiffstats
path: root/testsuites/performance/performance-benchmark-test/src/main/java/org/onap/policy/apex/testsuites/performance/benchmark/eventgenerator/EventGeneratorEndpoint.java
blob: 8e8a699c6d25382861327ac5d44f21c75b856236 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*-
 * ============LICENSE_START=======================================================
 *  Copyright (C) 2018 Ericsson. All rights reserved.
 *  Modifications Copyright (C) 2020, 2023 Nordix Foundation.
 *  Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.apex.testsuites.performance.benchmark.eventgenerator;

import com.google.gson.Gson;
import jakarta.inject.Inject;
import jakarta.inject.Provider;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.Response;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.glassfish.grizzly.http.server.Request;
import org.onap.policy.apex.core.infrastructure.threading.ThreadUtilities;
import org.onap.policy.apex.testsuites.performance.benchmark.eventgenerator.events.OutputEvent;
import org.slf4j.ext.XLogger;
import org.slf4j.ext.XLoggerFactory;

/**
 * This class is the REST end point for event simulator REST calls.
 */
@Path("/")
public class EventGeneratorEndpoint {

    // Get a reference to the logger
    private static final XLogger LOGGER = XLoggerFactory.getXLogger(EventGeneratorEndpoint.class);

    // Parameters for event generation
    private static AtomicReference<EventGeneratorParameters> parameters = new AtomicReference<>(
        new EventGeneratorParameters());

    // The map of event batches sent in the test
    private static ConcurrentHashMap<Integer, EventBatch> batchMap = new ConcurrentHashMap<>();

    // Flag indicating that event processing has finished
    @Getter(AccessLevel.PROTECTED)
    @Setter(AccessLevel.PROTECTED)
    private static boolean finished = false;

    // The current HTTP request
    private final Provider<Request> httpRequest;

    /**
     * Inject the HTTP request with a constructor.
     *
     * @param httpRequest the current request
     */
    @Inject
    public EventGeneratorEndpoint(final Provider<Request> httpRequest) {
        this.httpRequest = httpRequest;
    }

    /**
     * Set the parameters for the end point.
     *
     * @param incomingParameters the new parameters
     */
    public static void setParameters(EventGeneratorParameters incomingParameters) {
        parameters.set(incomingParameters);
    }

    /**
     * Get event generator statistics.
     *
     * @return the response
     */
    @Path("/Stats")
    @GET
    public Response serviceGetStats() {
        return Response.status(200).entity(new EventGeneratorStats(batchMap).getStatsAsJsonString()).build();
    }

    /**
     * Generate a single event.
     *
     * @return the event
     */
    @Path("/GetEvents")
    @GET
    public Response getEvents() {
        ThreadUtilities.sleep(parameters.get().getDelayBetweenBatches());

        // Check if event generation is finished
        if (isFinished()) {
            return Response.status(204).build();
        }

        // A batch count of 0 means to continue to handle events for ever
        if (parameters.get().getBatchCount() > 0 && batchMap.size() >= parameters.get().getBatchCount()) {
            setFinished(true);
            return Response.status(204).build();
        }

        var batch = new EventBatch(parameters.get().getBatchSize(), getApexClient());
        batchMap.put(batch.getBatchNumber(), batch);

        return Response.status(200).entity(batch.getBatchAsJsonString()).build();
    }

    /**
     * Get a single response to an event.
     *
     * @param jsonString the json string
     * @return the response
     */
    @Path("/PostEvent")
    @POST
    public Response postEventResponse(final String jsonString) {
        final var outputEvent = new Gson().fromJson(jsonString, OutputEvent.class);

        EventBatch batch = batchMap.get(outputEvent.findBatchNumber());

        if (batch == null) {
            String errorMessage = "no input event found for received output event " + outputEvent;
            LOGGER.warn(errorMessage);
            return Response.status(409).build();
        }

        batch.handleResponse(outputEvent);
        return Response.status(200).build();
    }

    /**
     * Get the name, address, and port of the Apex client getting the events.
     *
     * @return the Apex client
     */
    private String getApexClient() {
        return httpRequest.get().getRemoteHost() + '(' + httpRequest.get().getRemoteAddr() + "):" + httpRequest.get()
            .getRemotePort();
    }

    /**
     * Get event generation statistics.
     *
     * @return the statistics on event generation
     */
    protected static String getEventGenerationStats() {
        return new EventGeneratorStats(batchMap).getStatsAsJsonString();
    }

    /**
     * Clear event generation statistics.
     */
    protected static void clearEventGenerationStats() {
        batchMap.clear();
    }
}