aboutsummaryrefslogtreecommitdiffstats
path: root/mso-api-handlers/mso-api-handler-infra
diff options
context:
space:
mode:
authorLukasz Rajewski <lukasz.rajewski@t-mobile.pl>2023-04-12 08:05:16 +0000
committerGerrit Code Review <gerrit@onap.org>2023-04-12 08:05:16 +0000
commit53448a95871868d5009958ede72e724bc80c0961 (patch)
tree92a1bbe0b2127521f608131c05b017fd5e83a996 /mso-api-handlers/mso-api-handler-infra
parentc41c04b7b53bce7354d8cd1d47db3144e267a599 (diff)
parent4647e3ef6c87e271794e06fb1660cad5ee72ab04 (diff)
Merge "Code changes in SO api-handler for RAN Slice"
Diffstat (limited to 'mso-api-handlers/mso-api-handler-infra')
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java3
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java1
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManagedObject3gppServiceInstances.java568
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfile.json26
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfileBadGateWay.json26
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/DeleteSliceProfile.json9
-rw-r--r--mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/ModifySliceProfile.json13
7 files changed, 646 insertions, 0 deletions
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java
index 5d238112cc..a5f5a72cc7 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/Action.java
@@ -49,5 +49,8 @@ public enum Action implements Actions {
addMembers,
removeMembers,
forCustomWorkflow,
+ createRanSlice,
+ modifyRanSlice,
+ deleteRanSlice,
upgradeCnf
}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
index 031e9eee2a..43fbb0b409 100644
--- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/JerseyConfiguration.java
@@ -93,6 +93,7 @@ public class JerseyConfiguration extends ResourceConfig {
register(RequestConflictMapper.class);
register(WorkflowEngineConnectionMapper.class);
register(OrchestrationTasks.class);
+ register(ManagedObject3gppServiceInstances.class);
// this registration seems to be needed to get predictable
// execution behavior for the above JSON Exception Mappers
register(com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider.class);
diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManagedObject3gppServiceInstances.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManagedObject3gppServiceInstances.java
new file mode 100644
index 0000000000..605e2a8386
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManagedObject3gppServiceInstances.java
@@ -0,0 +1,568 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (c) 2022 Deutsche telekom
+ * ================================================================================
+ * 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.so.apihandlerinfra;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import org.apache.http.HttpStatus;
+import org.onap.aai.domain.yang.Relationship;
+import org.onap.aai.domain.yang.RelationshipData;
+import org.onap.aai.domain.yang.ServiceInstance;
+import org.onap.aai.domain.yang.SliceProfile;
+import org.onap.aaiclient.client.aai.AAIRestClientImpl;
+import org.onap.logging.filter.base.ErrorCode;
+import org.onap.so.apihandler.camundabeans.CamundaResponse;
+import org.onap.so.apihandler.common.*;
+import org.onap.so.apihandlerinfra.exceptions.ApiException;
+import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
+import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
+import org.onap.so.apihandlerinfra.exceptions.ValidateException;
+import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
+import org.onap.so.moi.*;
+import org.onap.so.constants.Status;
+import org.onap.so.db.catalog.beans.Service;
+import org.onap.so.db.catalog.beans.ServiceRecipe;
+import org.onap.so.db.catalog.client.CatalogDbClient;
+import org.onap.so.db.request.beans.InfraActiveRequests;
+import org.onap.so.db.request.client.RequestsDbClient;
+import org.onap.so.logger.LogConstants;
+import org.onap.so.logger.LoggingAnchor;
+import org.onap.so.logger.MessageEnum;
+import org.onap.so.rest.catalog.beans.Vnf;
+import org.onap.so.serviceinstancebeans.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import javax.ws.rs.*;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+@Path("/onap/so/infra/moi/api/rest/")
+@OpenAPIDefinition(
+ info = @Info(title = "/onap/so/infra/moi/api/rest/", description = "API Requests for 3gpp MO Instances"))
+public class ManagedObject3gppServiceInstances {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ManagedObject3gppServiceInstances.class);
+
+ private static final String MSO_PROP_APIHANDLER_INFRA = "MSO_PROP_APIHANDLER_INFRA";
+
+ private static final String END_OF_THE_TRANSACTION = "End of the transaction, the final response is: ";
+
+ private static final String SAVE_TO_DB = "save instance to db";
+
+ private static final String URI_PREFIX = "/moi/api/rest/";
+
+ @Autowired
+ private MsoRequest msoRequest;
+
+ @Autowired
+ private CatalogDbClient catalogDbClient;
+
+ @Autowired
+ private RequestsDbClient requestsDbClient;
+
+ @Autowired
+ private RequestHandlerUtils requestHandlerUtils;
+
+ @Autowired
+ private ResponseBuilder builder;
+
+ @Autowired
+ private CamundaClient camundaClient;
+
+ @Autowired
+ private ResponseHandler responseHandler;
+
+ private AAIRestClientImpl aaiRestClient = new AAIRestClientImpl();
+
+ /**
+ * POST Requests for 3GPP MOI Service create nssi on a version provided
+ *
+ * @throws ApiException
+ */
+
+ @PUT
+ @Path("/{version:[vV][1]}/NetworkSliceSubnet/{id}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Operation(description = "Create a 3GPP MOI NSSI on a version provided", responses = @ApiResponse(
+ content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+ public Response allocateNssi(MoiAllocateRequest request, @PathParam("version") String version,
+ @PathParam("id") String id, @Context ContainerRequestContext requestContext) throws ApiException {
+ String requestId = requestHandlerUtils.getRequestId(requestContext);
+ HashMap<String, String> instanceIdMap = new HashMap<>();
+ instanceIdMap.put("serviceInstanceId", id);
+ return processAllocateRequest(request, Action.createRanSlice, version, requestId, instanceIdMap,
+ requestHandlerUtils.getRequestUri(requestContext, URI_PREFIX));
+ }
+
+ @PATCH
+ @Path("/{version:[vV][1]}/NetworkSliceSubnet/{id}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Operation(description = "Modify a 3GPP MOI NSSI on a version provided", responses = @ApiResponse(
+ content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+ public Response modifyNssi(MoiAllocateRequest request, @PathParam("version") String version,
+ @PathParam("id") String id, @Context ContainerRequestContext requestContext) throws ApiException {
+ String requestId = requestHandlerUtils.getRequestId(requestContext);
+ HashMap<String, String> instanceIdMap = new HashMap<>();
+ instanceIdMap.put("serviceInstanceId", id);
+ return processAllocateRequest(request, Action.modifyRanSlice, version, requestId, instanceIdMap,
+ requestHandlerUtils.getRequestUri(requestContext, URI_PREFIX));
+ }
+
+ /**
+ * DELETE Requests to delete 3GPP MOI Service instance on a version provided
+ *
+ * @throws ApiException
+ */
+ @DELETE
+ @Path("/{version:[vV][1]}/NetworkSliceSubnet/{id}")
+ @Consumes(MediaType.APPLICATION_JSON)
+ @Produces(MediaType.APPLICATION_JSON)
+ @Operation(description = "Delete a 3GPP MOI NSSI on a version provided", responses = @ApiResponse(
+ content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
+ public Response deleteNssi(MoiAllocateRequest request, @PathParam("version") String version,
+ @PathParam("id") String id, @Context ContainerRequestContext requestContext) throws ApiException {
+ String requestId = requestHandlerUtils.getRequestId(requestContext);
+ HashMap<String, String> instanceIdMap = new HashMap<>();
+ instanceIdMap.put("serviceInstanceId", id);
+ return processAllocateRequest(request, Action.deleteRanSlice, version, requestId, instanceIdMap,
+ requestHandlerUtils.getRequestUri(requestContext, URI_PREFIX));
+ }
+
+ /**
+ * GET Requests for 3GPP MOI Service get nssi on a version provided
+ *
+ * @throws ApiException
+ */
+ @GET
+ @Operation(description = "Find slice Profile for nssi id", responses = @ApiResponse(
+ content = @Content(array = @ArraySchema(schema = @Schema(implementation = Vnf.class)))))
+ @Path("/{version:[vV][1]}/NetworkSliceSubnet/{id}")
+ @Produces({MediaType.APPLICATION_JSON})
+ @Transactional(readOnly = true)
+ public Response getMOIAttributes(@PathParam("version") String version, @PathParam("id") String id)
+ throws ApiException {
+ GETMoiResponse mOIResponse = new GETMoiResponse();
+ String response = null;
+
+ Optional<ServiceInstance> serviceInstance = aaiRestClient.getServiceInstanceById(id, "5G", "5GCustomer");
+ if (serviceInstance.isPresent()) {
+ LOGGER.info("Id from request {}", id);
+ ServiceInstance serviceInstanceObj = serviceInstance.get();
+ mOIResponse.setId(serviceInstanceObj.getServiceInstanceId());
+ mOIResponse.setAdministrativeState(serviceInstanceObj.getOperationalStatus());
+ mOIResponse.setOperationalState(serviceInstanceObj.getOrchestrationStatus());
+
+
+ Attributes attributes = new Attributes();
+ List<org.onap.so.moi.SliceProfile> sliceProfileList = new ArrayList<org.onap.so.moi.SliceProfile>();
+
+ List<Relationship> listOfNssiRelationship = serviceInstanceObj.getRelationshipList().getRelationship();
+
+ List<Relationship> listOfNssiRelationshipAR = listOfNssiRelationship.stream()
+ .filter(relationship -> relationship.getRelatedTo().equalsIgnoreCase("allotted-resource"))
+ .collect(Collectors.toList());
+
+ for (Relationship relationship : listOfNssiRelationshipAR) {
+ org.onap.so.moi.SliceProfile sliceProfile = new org.onap.so.moi.SliceProfile();
+ for (RelationshipData relationshipData : relationship.getRelationshipData()) {
+ if (relationshipData.getRelationshipKey()
+ .equalsIgnoreCase("service-instance.service-instance-id")) {
+ String sliceProfileInstanceId = relationshipData.getRelationshipValue();
+ LOGGER.debug(">>> sliceProfileInstance: {}", sliceProfileInstanceId);
+
+ Optional<ServiceInstance> sliceProfileServiceInstance = aaiRestClient
+ .getServiceInstanceByIdWithDepth(sliceProfileInstanceId, "5G", "5GCustomer");
+ if (sliceProfileServiceInstance.isPresent()) {
+ ServiceInstance sliceProfileServiceInstanceObj = sliceProfileServiceInstance.get();
+ SliceProfile sliceProfile1 =
+ sliceProfileServiceInstanceObj.getSliceProfiles().getSliceProfile().get(0);
+ try {
+ sliceProfileList
+ .add(AAISliceProfileToMOISlice(sliceProfile1, sliceProfileServiceInstanceObj));
+ } catch (Exception e) {
+ LOGGER.info("Can not construct responce {}", e);
+ }
+
+ }
+
+
+ }
+ }
+
+ }
+
+ attributes.setSliceProfileList(sliceProfileList);
+ mOIResponse.setAttributes(attributes);
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ response = mapper.writeValueAsString(mOIResponse);
+ } catch (Exception exception) {
+ LOGGER.error("Error while creating MOIResponse JSON" + exception.getMessage());
+ }
+
+ return builder.buildResponse(HttpStatus.SC_OK, null, response, version);
+
+
+ }
+ return builder.buildResponse(HttpStatus.SC_NOT_FOUND, null, null, version);
+ }
+
+ private org.onap.so.moi.SliceProfile AAISliceProfileToMOISlice(SliceProfile sliceProfile,
+ ServiceInstance serviceInstance) {
+ org.onap.so.moi.SliceProfile sliceProfileMoi = new org.onap.so.moi.SliceProfile();
+
+ sliceProfileMoi.setSliceProfileId(sliceProfile.getProfileId());
+
+ String serviceType = serviceInstance.getServiceType();
+
+ // rANSliceSubnetProfile
+ RANSliceSubnetProfile ranSliceSubnetProfile = new RANSliceSubnetProfile();
+ ranSliceSubnetProfile.setServiceType(serviceType);
+ ranSliceSubnetProfile.setdLLatency(sliceProfile.getLatency());
+ ranSliceSubnetProfile.setCoverageAreaTAList(Integer.valueOf(sliceProfile.getCoverageAreaTAList()));
+ ranSliceSubnetProfile.setMaxNumberofUEs(sliceProfile.getMaxNumberOfUEs());
+ ranSliceSubnetProfile.setResourceSharingLevel(sliceProfile.getResourceSharingLevel());
+ ranSliceSubnetProfile.setAreaTrafficCapDL(sliceProfile.getAreaTrafficCapDL());
+
+ // plmnId
+ String[] plmnIdData = serviceInstance.getServiceInstanceLocationId().split("-");
+ PlmnId plmnId = new PlmnId();
+ plmnId.setMcc(Integer.valueOf(plmnIdData[0]));
+ plmnId.setMnc(Integer.valueOf(plmnIdData[1]));
+
+ // snssai
+ String[] snssaiData = serviceInstance.getEnvironmentContext().split("-");
+ Snssai snssai = new Snssai();
+ snssai.setSst(snssaiData[0]);
+ snssai.setSd(snssaiData[1]);
+
+ // Plmninfo
+ PlmnInfo plmnInfo = new PlmnInfo();
+ plmnInfo.setPlmnId(plmnId);
+ plmnInfo.setSnssai(snssai);
+
+ List<PlmnInfo> plmnInfoList = new ArrayList<PlmnInfo>();
+ plmnInfoList.add(plmnInfo);
+
+ sliceProfileMoi.setrANSliceSubnetProfile(ranSliceSubnetProfile);
+ sliceProfileMoi.setPlmnInfoList(plmnInfoList);
+
+ return sliceProfileMoi;
+
+ }
+
+ /**
+ * Process allocate service request and send request to corresponding workflow
+ *
+ * @param request
+ * @param action
+ * @param version
+ * @return
+ * @throws ApiException
+ */
+ private Response processAllocateRequest(MoiAllocateRequest request, Action action, String version, String requestId,
+ HashMap<String, String> instanceIdMap, String requestUri) throws ApiException {
+ String defaultServiceModelName = "UUI_DEFAULT";
+ String requestScope = ModelType.service.name();
+ String apiVersion = version.substring(1);
+ String serviceRequestJson = toString.apply(request);
+
+ ServiceInstancesRequest sir = createServiceInstanceRequest(request, requestId);
+ String requestDetails = null;
+ try {
+ requestDetails = new ObjectMapper().writeValueAsString(sir);
+ LOGGER.debug(">>> sir: {}", sir);
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ if (serviceRequestJson != null) {
+ InfraActiveRequests currentActiveReq = createRequestObject(request, action, requestId, Status.IN_PROGRESS,
+ requestScope, serviceRequestJson);
+ // instanceName ???
+ String instanceId = instanceIdMap.get("serviceInstanceId");
+ String instanceName = sir.getRequestDetails().getRequestInfo().getInstanceName();
+ requestHandlerUtils.checkForDuplicateRequests(action, instanceIdMap, requestScope, currentActiveReq,
+ instanceName);
+
+ requestHandlerUtils.setInstanceId(currentActiveReq, requestScope, instanceId, instanceIdMap);
+ try {
+ requestsDbClient.save(currentActiveReq);
+ } catch (Exception e) {
+ LOGGER.error("Exception occurred", e);
+ ErrorLoggerInfo errorLoggerInfo =
+ new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, ErrorCode.DataError)
+ .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+ throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(),
+ HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+ .errorInfo(errorLoggerInfo).build();
+ }
+
+ RecipeLookupResult recipeLookupResult;
+ try {
+ recipeLookupResult = getServiceInstanceOrchestrationURI("123", action, defaultServiceModelName);
+
+ LOGGER.debug("recipeLookupResult: {}", recipeLookupResult);
+ } catch (Exception e) {
+ LOGGER.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ACCESS_EXC.toString(), MSO_PROP_APIHANDLER_INFRA,
+ ErrorCode.AvailabilityError.getValue(), "Exception while communciate with Catalog DB", e);
+ Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
+ MsoException.ServiceException, "No communication to catalog DB " + e.getMessage(),
+ ErrorNumbers.SVC_NO_SERVER_RESOURCES, null, version);
+ LOGGER.debug(END_OF_THE_TRANSACTION + response.getEntity());
+ return response;
+ }
+
+ if (recipeLookupResult == null) {
+ LOGGER.error(LoggingAnchor.FOUR, MessageEnum.APIH_DB_ATTRIBUTE_NOT_FOUND.toString(),
+ MSO_PROP_APIHANDLER_INFRA, ErrorCode.DataError.getValue(), "No recipe found in DB");
+ Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_NOT_FOUND,
+ MsoException.ServiceException, "Recipe does not exist in catalog DB",
+ ErrorNumbers.SVC_GENERAL_SERVICE_ERROR, null, version);
+ LOGGER.debug(END_OF_THE_TRANSACTION + response.getEntity());
+ return response;
+ }
+
+ String serviceInstanceType = sir.getRequestDetails().getRequestParameters().getSubscriptionServiceType();
+ RequestClientParameter parameter;
+ try {
+ parameter = new RequestClientParameter.Builder().setRequestId(requestId).setBaseVfModule(false)
+ .setRecipeTimeout(recipeLookupResult.getRecipeTimeout()).setRequestAction(action.name())
+ .setServiceInstanceId(instanceId).setServiceType(serviceInstanceType)
+ .setRequestDetails(requestDetails).setApiVersion(version).setALaCarte(false)
+ .setRecipeParamXsd(recipeLookupResult.getRecipeParamXsd()).setApiVersion(apiVersion)
+ .setRequestUri(requestUri).build();
+ } catch (Exception e) {
+ LOGGER.error("Exception occurred", e);
+ ErrorLoggerInfo errorLoggerInfo =
+ new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, ErrorCode.SchemaError)
+ .errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+ throw new ValidateException.Builder("Unable to generate RequestClientParamter object" + e.getMessage(),
+ HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).errorInfo(errorLoggerInfo)
+ .build();
+ }
+ return postBPELRequest(currentActiveReq, parameter, recipeLookupResult.getOrchestrationURI(), requestScope);
+ } else {
+ Response response = msoRequest.buildServiceErrorResponse(HttpStatus.SC_INTERNAL_SERVER_ERROR,
+ MsoException.ServiceException, "JsonProcessingException occurred - serviceRequestJson is null",
+ ErrorNumbers.SVC_BAD_PARAMETER, null, version);
+ return response;
+ }
+ }
+
+
+ private ServiceInstancesRequest createServiceInstanceRequest(MoiAllocateRequest request, String id) {
+
+ RequestDetails requestDetails = new RequestDetails();
+ RequestInfo requestInfo = new RequestInfo();
+ requestInfo.setInstanceName("ran_nssi_" + id);
+ requestInfo.setRequestorId("MO");
+ requestInfo.setProductFamilyId("5G");
+ requestInfo.setSource("MO");
+
+ requestDetails.setRequestInfo(requestInfo);
+
+ SubscriberInfo subscriberInfo = new SubscriberInfo();
+ subscriberInfo.setGlobalSubscriberId("5GCustomer");
+ requestDetails.setSubscriberInfo(subscriberInfo);
+
+ Project project = new Project();
+ project.setProjectName("basicnw-project");
+ requestDetails.setProject(project);
+
+ OwningEntity owningEntity = new OwningEntity();
+ owningEntity.setOwningEntityId("67f2e84c-734d-4e90-a1e4-d2ffa2e75849");
+ owningEntity.setOwningEntityName("OE-5GCustomer");
+ requestDetails.setOwningEntity(owningEntity);
+
+ RequestParameters requestParameters = new RequestParameters();
+ requestParameters.setaLaCarte(false);
+ requestParameters.setSubscriptionServiceType("5G");
+
+ Map<String, Object> nssiUserParams = new HashMap<>();
+ Attributes attributes = request.getAttributes();
+ nssiUserParams.put("nssi", attributes);
+
+ Map<String, Object> homingSolution = new HashMap<>();
+ homingSolution.put("Homing_Solution", "true");
+
+ List<Map<String, Object>> userParams = new ArrayList<>();
+
+ userParams.add(nssiUserParams);
+ userParams.add(homingSolution);
+
+ requestParameters.setUserParams(userParams);
+
+ requestDetails.setRequestParameters(requestParameters);
+
+ ServiceInstancesRequest sir = new ServiceInstancesRequest();
+ sir.setServiceInstanceId(id);
+ sir.setRequestDetails(requestDetails);
+
+ return sir;
+ }
+
+ public InfraActiveRequests createRequestObject(Object request, Action action, String requestId, Status status,
+ String requestScope, String requestJson) {
+ InfraActiveRequests aq = new InfraActiveRequests();
+ try {
+ String serviceInstanceName = null;
+ String serviceInstanceId = null;
+ if (action.name().equals("ranSlice")) {
+ serviceInstanceName = "ran_nssi_" + requestId;
+ aq.setServiceInstanceName(serviceInstanceName);
+ } else if (action.name().equals("updateInstance")) {
+ LOGGER.debug(">>>>> updateInstance");
+ }
+
+ aq.setRequestId(requestId);
+ aq.setRequestAction(action.toString());
+ aq.setRequestUrl(MDC.get(LogConstants.HTTP_URL));
+ Timestamp startTimeStamp = new Timestamp(System.currentTimeMillis());
+ aq.setStartTime(startTimeStamp);
+ aq.setRequestScope(requestScope);
+ aq.setRequestBody(requestJson);
+ aq.setRequestStatus(status.toString());
+ aq.setLastModifiedBy(Constants.MODIFIED_BY_APIHANDLER);
+ } catch (Exception e) {
+ LOGGER.error("Exception when creation record request", e);
+
+ if (!status.equals(Status.FAILED)) {
+ throw e;
+ }
+ }
+ return aq;
+ }
+
+ /**
+ * Getting recipes from catalogDb
+ *
+ * @param serviceModelUUID the service model version uuid
+ * @param action the action for the service
+ * @param defaultServiceModelName default service name
+ * @return the service recipe result
+ */
+ private RecipeLookupResult getServiceInstanceOrchestrationURI(String serviceModelUUID, Action action,
+ String defaultServiceModelName) {
+
+ RecipeLookupResult recipeLookupResult = getServiceURI(serviceModelUUID, action, defaultServiceModelName);
+
+ if (recipeLookupResult != null) {
+ LOGGER.debug("Orchestration URI is: " + recipeLookupResult.getOrchestrationURI() + ", recipe Timeout is: "
+ + Integer.toString(recipeLookupResult.getRecipeTimeout()));
+ } else {
+ LOGGER.debug("No matching recipe record found");
+ }
+ return recipeLookupResult;
+ }
+
+ Function<Object, String> toString = serviceRequest -> {
+ ObjectMapper mapper = new ObjectMapper();
+ String requestAsString = null;
+ try {
+ requestAsString = mapper.writeValueAsString(serviceRequest);
+ } catch (JsonProcessingException e) {
+ LOGGER.debug("Exception while converting service request object to String {}", e);
+ }
+ return requestAsString;
+ };
+
+ /**
+ * Getting recipes from catalogDb If Service recipe is not set, use default recipe, if set , use special recipe.
+ *
+ * @param serviceModelUUID the service version uuid
+ * @param action the action of the service.
+ * @param defaultServiceModelName default service name
+ * @return the service recipe result.
+ */
+ private RecipeLookupResult getServiceURI(String serviceModelUUID, Action action, String defaultServiceModelName) {
+
+ Service defaultServiceRecord =
+ catalogDbClient.getFirstByModelNameOrderByModelVersionDesc(defaultServiceModelName);
+ // set recipe as default generic recipe
+ ServiceRecipe recipe =
+ catalogDbClient.getFirstByServiceModelUUIDAndAction(defaultServiceRecord.getModelUUID(), action.name());
+ // check the service special recipe
+ if (null != serviceModelUUID && !serviceModelUUID.isEmpty()) {
+ ServiceRecipe serviceSpecialRecipe =
+ catalogDbClient.getFirstByServiceModelUUIDAndAction(serviceModelUUID, action.name());
+ if (null != serviceSpecialRecipe) {
+ // set service special recipe.
+ recipe = serviceSpecialRecipe;
+ }
+ }
+
+ if (recipe == null) {
+ return null;
+ }
+ return new RecipeLookupResult(recipe.getOrchestrationUri(), recipe.getRecipeTimeout(), recipe.getParamXsd());
+
+ }
+
+ private Response postBPELRequest(InfraActiveRequests currentActiveReq, RequestClientParameter parameter,
+ String orchestrationURI, String requestScope) throws ApiException {
+ ResponseEntity<String> response =
+ requestHandlerUtils.postRequest(currentActiveReq, parameter, orchestrationURI);
+ LOGGER.debug("BPEL response : " + response);
+ int bpelStatus = responseHandler.setStatus(response.getStatusCodeValue());
+ String jsonResponse;
+ try {
+ responseHandler.acceptedResponse(response);
+ CamundaResponse camundaResponse = responseHandler.getCamundaResponse(response);
+ String responseBody = camundaResponse.getResponse();
+ if ("Success".equalsIgnoreCase(camundaResponse.getMessage())) {
+ jsonResponse = responseBody;
+ } else {
+ BPMNFailureException bpmnException =
+ new BPMNFailureException.Builder(String.valueOf(bpelStatus) + responseBody, bpelStatus,
+ ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).build();
+ requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, bpmnException.getMessage());
+ throw bpmnException;
+ }
+ } catch (ApiException e) {
+ requestHandlerUtils.updateStatus(currentActiveReq, Status.FAILED, e.getMessage());
+ throw e;
+ }
+ return builder.buildResponse(HttpStatus.SC_ACCEPTED, parameter.getRequestId(), jsonResponse,
+ parameter.getApiVersion());
+ }
+}
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfile.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfile.json
new file mode 100644
index 0000000000..4ad4b8dc93
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfile.json
@@ -0,0 +1,26 @@
+{
+ "sliceProfileList": [
+ {
+ "plmnInfoList": [
+ {
+ "plmnId": {
+ "mcc": 260,
+ "mnc": 70
+ },
+ "snssai": {
+ "sst": "001",
+ "sd": "300"
+ }
+ }
+ ],
+ "rANSliceSubnetProfile": {
+ "coverageAreaTAList": 888,
+ "dLLatency": 20,
+ "uLLatency": 20,
+ "resourceSharingLevel": "SHARED",
+ "serviceType": "eMBB",
+ "maxNumberofUEs": 2000
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfileBadGateWay.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfileBadGateWay.json
new file mode 100644
index 0000000000..ecf636d532
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/CreateSliceProfileBadGateWay.json
@@ -0,0 +1,26 @@
+{
+ "sliceProfileList": [
+ {
+ "plmnInfoList": [
+ {
+ "plmnId": {
+ "mcc": 260,
+ "mnc": 70
+ },
+ "snssai": {
+ "sst": "test",
+ "sd": "test"
+ }
+ }
+ ],
+ "rANSliceSubnetProfile": {
+ "coverageAreaTAList": "test",
+ "dLLatency": 20,
+ "uLLatency": 20,
+ "resourceSharingLevel": "SHARED",
+ "serviceType": "eMBB",
+ "maxNumberofUEs": 2000
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/DeleteSliceProfile.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/DeleteSliceProfile.json
new file mode 100644
index 0000000000..15cc4d4989
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/DeleteSliceProfile.json
@@ -0,0 +1,9 @@
+{
+ "attributes": {
+ "sliceProfileList": [
+ {
+ "sliceProfileId": "f832ea13-04c2-4bd5-b93e-4cb7e1fd7f44"
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/ModifySliceProfile.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/ModifySliceProfile.json
new file mode 100644
index 0000000000..f03a7beb6f
--- /dev/null
+++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/ManagedObject3gppServiceInstancesTest/ModifySliceProfile.json
@@ -0,0 +1,13 @@
+{
+ "attributes": {
+ "sliceProfileList": [{
+ "sliceProfileId": "a1e5d51f-4bcb-42f0-83e2-cde6ac0a2e66",
+ "RANSliceSubnetProfile": {
+ "coverageAreaTAList": 777,
+ "dLLatency": 200,
+ "uLLatency": 200,
+ "resourceSharingLevel":"SHARED"
+ }
+ }]
+ }
+} \ No newline at end of file