Java 17 Upgrade
[policy/models.git] / models-interactions / model-actors / actor.so / src / main / java / org / onap / policy / controlloop / actor / so / VfModuleCreate.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2020 Wipro Limited.
7  * Modifications Copyright (C) 2023 Nordix Foundation.
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.controlloop.actor.so;
24
25 import jakarta.ws.rs.client.Entity;
26 import jakarta.ws.rs.core.MediaType;
27 import jakarta.ws.rs.core.Response;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.concurrent.CompletableFuture;
31 import org.apache.commons.lang3.tuple.Pair;
32 import org.onap.aai.domain.yang.ModelVer;
33 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
34 import org.onap.policy.common.endpoints.utils.NetLoggerUtil.EventType;
35 import org.onap.policy.controlloop.actorserviceprovider.OperationOutcome;
36 import org.onap.policy.controlloop.actorserviceprovider.OperationProperties;
37 import org.onap.policy.controlloop.actorserviceprovider.parameters.ControlLoopOperationParams;
38 import org.onap.policy.controlloop.actorserviceprovider.parameters.HttpPollingConfig;
39 import org.onap.policy.so.SoModelInfo;
40 import org.onap.policy.so.SoOperationType;
41 import org.onap.policy.so.SoRelatedInstance;
42 import org.onap.policy.so.SoRelatedInstanceListElement;
43 import org.onap.policy.so.SoRequest;
44 import org.onap.policy.so.SoRequestDetails;
45 import org.onap.policy.so.SoRequestParameters;
46 import org.onap.policy.so.SoResponse;
47
48 /**
49  * Operation to create a VF Module. When this completes successfully, it increments its VF
50  * Count property.
51  */
52 public class VfModuleCreate extends SoOperation {
53     public static final String NAME = "VF Module Create";
54
55     private static final String PATH_PREFIX = "/";
56
57     // @formatter:off
58     private static final List<String> PROPERTY_NAMES = List.of(
59                             OperationProperties.AAI_SERVICE,
60                             OperationProperties.AAI_SERVICE_MODEL,
61                             OperationProperties.AAI_VNF,
62                             OperationProperties.AAI_VNF_MODEL,
63                             OperationProperties.AAI_DEFAULT_CLOUD_REGION,
64                             OperationProperties.AAI_DEFAULT_TENANT,
65                             OperationProperties.DATA_VF_COUNT);
66     // @formatter:off
67
68     /**
69      * Constructs the object.
70      *
71      * @param params operation parameters
72      * @param config configuration for this operation
73      */
74     public VfModuleCreate(ControlLoopOperationParams params, HttpPollingConfig config) {
75         super(params, config, PROPERTY_NAMES, params.getTargetEntityIds());
76
77         setUsePolling();
78         // ensure we have the necessary parameters
79         validateTarget();
80     }
81
82     @Override
83     protected CompletableFuture<OperationOutcome> startOperationAsync(int attempt, OperationOutcome outcome) {
84
85         // starting a whole new attempt - reset the count
86         resetPollCount();
87
88         Pair<String, SoRequest> pair = makeRequest();
89         String path = getPath() + pair.getLeft();
90         SoRequest request = pair.getRight();
91
92         String url = getClient().getBaseUrl() + path;
93
94         String strRequest = prettyPrint(request);
95         logMessage(EventType.OUT, CommInfrastructure.REST, url, strRequest);
96
97         Entity<String> entity = Entity.entity(strRequest, MediaType.APPLICATION_JSON);
98
99         Map<String, Object> headers = createSimpleHeaders();
100
101         return handleResponse(outcome, url, callback -> getClient().post(callback, path, entity, headers));
102     }
103
104     /**
105      * Increments the VF count that's stored in the context, if the request was
106      * successful.
107      */
108     @Override
109     protected Status detmStatus(Response rawResponse, SoResponse response) {
110         var status = super.detmStatus(rawResponse, response);
111
112         if (status == Status.SUCCESS) {
113             setVfCount(getVfCount() + 1);
114         }
115
116         return status;
117     }
118
119     /**
120      * Makes a request.
121      *
122      * @return a pair containing the request URL and the new request
123      */
124     protected Pair<String, SoRequest> makeRequest() {
125         final var soModelInfo = prepareSoModelInfo();
126         final var vnfItem = getVnfItem();
127         final var vnfServiceItem = getServiceInstance();
128         final var tenantItem = getDefaultTenant();
129         final var cloudRegionItem = getDefaultCloudRegion();
130         final ModelVer vnfModel = getVnfModel();
131         final ModelVer vnfServiceModel = getServiceModel();
132
133         var request = new SoRequest();
134         request.setOperationType(SoOperationType.SCALE_OUT);
135
136         //
137         //
138         // Do NOT send SO the requestId, they do not support this field
139         //
140         request.setRequestDetails(new SoRequestDetails());
141         request.getRequestDetails().setRequestParameters(new SoRequestParameters());
142         request.getRequestDetails().getRequestParameters().setUserParams(null);
143
144         // cloudConfiguration
145         request.getRequestDetails().setCloudConfiguration(constructCloudConfiguration(tenantItem, cloudRegionItem));
146
147         // modelInfo
148         request.getRequestDetails().setModelInfo(soModelInfo);
149
150         // requestInfo
151         request.getRequestDetails().setRequestInfo(constructRequestInfo());
152         request.getRequestDetails().getRequestInfo().setInstanceName("vfModuleName");
153
154         // relatedInstanceList
155         var relatedInstanceListElement1 = new SoRelatedInstanceListElement();
156         var relatedInstanceListElement2 = new SoRelatedInstanceListElement();
157         relatedInstanceListElement1.setRelatedInstance(new SoRelatedInstance());
158         relatedInstanceListElement2.setRelatedInstance(new SoRelatedInstance());
159
160         // Service Item
161         relatedInstanceListElement1.getRelatedInstance().setInstanceId(vnfServiceItem.getServiceInstanceId());
162         relatedInstanceListElement1.getRelatedInstance().setModelInfo(new SoModelInfo());
163         relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelType("service");
164         relatedInstanceListElement1.getRelatedInstance().getModelInfo()
165                         .setModelInvariantId(vnfServiceItem.getModelInvariantId());
166         relatedInstanceListElement1.getRelatedInstance().getModelInfo()
167                         .setModelVersionId(vnfServiceItem.getModelVersionId());
168         relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelName(vnfModel.getModelName());
169         relatedInstanceListElement1.getRelatedInstance().getModelInfo().setModelVersion(vnfModel.getModelVersion());
170
171         // VNF Item
172         relatedInstanceListElement2.getRelatedInstance().setInstanceId(vnfItem.getVnfId());
173         relatedInstanceListElement2.getRelatedInstance().setModelInfo(new SoModelInfo());
174         relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelType("vnf");
175         relatedInstanceListElement2.getRelatedInstance().getModelInfo()
176                         .setModelInvariantId(vnfItem.getModelInvariantId());
177         relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelVersionId(vnfItem.getModelVersionId());
178
179         relatedInstanceListElement2.getRelatedInstance().getModelInfo().setModelName(vnfServiceModel.getModelName());
180         relatedInstanceListElement2.getRelatedInstance().getModelInfo()
181                         .setModelVersion(vnfServiceModel.getModelVersion());
182
183         relatedInstanceListElement2.getRelatedInstance().getModelInfo()
184                         .setModelCustomizationId(vnfItem.getModelCustomizationId());
185
186         // Insert the Service Item and VNF Item
187         request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement1);
188         request.getRequestDetails().getRelatedInstanceList().add(relatedInstanceListElement2);
189
190         // Request Parameters
191         buildRequestParameters().ifPresent(request.getRequestDetails()::setRequestParameters);
192
193         // Configuration Parameters
194         buildConfigurationParameters().ifPresent(request.getRequestDetails()::setConfigurationParameters);
195
196         // compute the path
197         String svcId = getRequiredText("service instance ID", vnfServiceItem.getServiceInstanceId());
198         String path = PATH_PREFIX + svcId + "/vnfs/" + vnfItem.getVnfId() + "/vfModules/scaleOut";
199
200         return Pair.of(path, request);
201     }
202 }