aboutsummaryrefslogtreecommitdiffstats
path: root/models-interactions/model-actors/actor.aai/src/main/java/org/onap/policy/controlloop/actor/aai/AaiGetOperation.java
blob: a202008078e98e6b45a47c2a4eaa1d008bd91cef (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
/*-
 * ============LICENSE_START=======================================================
 * ONAP
 * ================================================================================
 * Copyright (C) 2020 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.
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.controlloop.actor.aai;

import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import javax.ws.rs.client.Invocation.Builder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.onap.policy.aai.AaiConstants;
import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
import org.onap.policy.common.utils.coder.StandardCoderObject;
import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
import org.onap.policy.controlloop.actorserviceprovider.impl.HttpOperation;
import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Superclass of A&AI operators that use "get" to perform their request and store their
 * response within the context as a {@link StandardCoderObject}. The property name under
 * which they are stored is ${actor}.${operation}.${targetEntity}.
 */
public class AaiGetOperation extends HttpOperation<StandardCoderObject> {
    private static final Logger logger = LoggerFactory.getLogger(AaiGetOperation.class);

    public static final int DEFAULT_RETRY = 3;

    // operation names
    public static final String TENANT = "Tenant";

    // property prefixes
    private static final String TENANT_KEY_PREFIX = AaiConstants.CONTEXT_PREFIX + TENANT + ".";

    /**
     * Operation names supported by this operator.
     */
    public static final Set<String> OPERATIONS = Set.of(TENANT);


    /**
     * Responses that are retrieved from A&AI are placed in the operation context under
     * the name "${propertyPrefix}.${targetEntity}".
     */
    private final String propertyPrefix;

    /**
     * Constructs the object.
     *
     * @param params operation parameters
     * @param config configuration for this operation
     */
    public AaiGetOperation(ControlLoopOperationParams params, HttpConfig config) {
        super(params, config, StandardCoderObject.class);
        this.propertyPrefix = getFullName() + ".";
    }

    /**
     * Gets the "context key" for the tenant query response associated with the given
     * target entity.
     *
     * @param targetEntity target entity
     * @return the "context key" for the response associated with the given target
     */
    public static String getTenantKey(String targetEntity) {
        return (TENANT_KEY_PREFIX + targetEntity);
    }

    @Override
    public void generateSubRequestId(int attempt) {
        setSubRequestId(String.valueOf(attempt));
    }

    @Override
    protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
        Map<String, Object> headers = makeHeaders();

        headers.put("Accept", MediaType.APPLICATION_JSON);

        StringBuilder str = new StringBuilder(getClient().getBaseUrl());

        String path = getPath();
        WebTarget web = getClient().getWebTarget().path(path);
        str.append(path);

        web = addQuery(web, str, "?", "search-node-type", "vserver");
        web = addQuery(web, str, "&", "filter", "vserver-name:EQUALS:" + params.getTargetEntity());

        Builder webldr = web.request();
        for (Entry<String, Object> header : headers.entrySet()) {
            webldr.header(header.getKey(), header.getValue());
        }

        String url = str.toString();

        logMessage(EventType.OUT, CommInfrastructure.REST, url, null);

        return handleResponse(outcome, url, callback -> webldr.async().get(callback));
    }

    private WebTarget addQuery(WebTarget web, StringBuilder str, String separator, String name, String value) {
        str.append(separator);
        str.append(name);
        str.append('=');
        str.append(value);

        return web.queryParam(name, value);
    }

    @Override
    protected Map<String, Object> makeHeaders() {
        return AaiUtil.makeHeaders(params);
    }

    /**
     * Injects the response into the context.
     */
    @Override
    protected CompletableFuture<OperationOutcome> postProcessResponse(OperationOutcome outcome, String url,
                    Response rawResponse, StandardCoderObject response) {
        String entity = params.getTargetEntity();

        logger.info("{}: caching response of {} for {}", getFullName(), entity, params.getRequestId());

        params.getContext().setProperty(propertyPrefix + entity, response);

        return super.postProcessResponse(outcome, url, rawResponse, response);
    }

    /**
     * Provides a default retry value, if none specified.
     */
    @Override
    protected int getRetry(Integer retry) {
        return (retry == null ? DEFAULT_RETRY : retry);
    }
}