Dependency inject Retrofit client for SlicingService 15/140015/3
authorFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Thu, 23 Jan 2025 14:33:34 +0000 (15:33 +0100)
committerFiete Ostkamp <Fiete.Ostkamp@telekom.de>
Fri, 24 Jan 2025 11:06:28 +0000 (12:06 +0100)
- same change as previous commit for SlicingService related classes
- make slicing attributes configurable via application.properties

Issue-ID: USECASEUI-859
Change-Id: Ie7f56a346520d796f9f1ff6fd9ec481f84956925
Signed-off-by: Fiete Ostkamp <Fiete.Ostkamp@telekom.de>
18 files changed:
server/pom.xml
server/src/main/java/org/onap/usecaseui/server/UuiServerApplication.java
server/src/main/java/org/onap/usecaseui/server/config/AAIClientConfig.java
server/src/main/java/org/onap/usecaseui/server/config/SOClientConfig.java [new file with mode: 0644]
server/src/main/java/org/onap/usecaseui/server/service/csmf/config/SlicingProperties.java [new file with mode: 0644]
server/src/main/java/org/onap/usecaseui/server/service/csmf/impl/SlicingServiceImpl.java
server/src/main/java/org/onap/usecaseui/server/service/lcm/domain/so/SOService.java
server/src/main/java/org/onap/usecaseui/server/service/lcm/impl/DefaultServiceLcmService.java
server/src/main/java/org/onap/usecaseui/server/service/slicingdomain/aai/AAISliceService.java
server/src/main/java/org/onap/usecaseui/server/service/slicingdomain/so/SOSliceService.java
server/src/main/resources/application.properties
server/src/test/java/org/onap/usecaseui/server/service/csmf/impl/SlicingServiceImplIntegrationTest.java [new file with mode: 0644]
server/src/test/java/org/onap/usecaseui/server/service/csmf/impl/SlicingServiceImplTest.java
server/src/test/java/org/onap/usecaseui/server/service/lcm/impl/DefaultCustomerServiceIntegrationTest.java
server/src/test/java/org/onap/usecaseui/server/service/lcm/impl/DefaultServiceLcmServiceTest.java
server/src/test/resources/__files/requests/submitOrdersRequest.json [new file with mode: 0644]
server/src/test/resources/__files/serviceInstancesResponse.json [new file with mode: 0644]
server/src/test/resources/__files/submitOrdersResponse.json [new file with mode: 0644]

index bf60ab8..b81bf27 100644 (file)
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
index 88b9569..a1e3643 100644 (file)
@@ -21,6 +21,7 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.boot.web.servlet.MultipartConfigFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
@@ -30,8 +31,9 @@ import org.springframework.web.client.RestTemplate;
 import jakarta.servlet.MultipartConfigElement;
 
 @SpringBootApplication
-@EnableAutoConfiguration(exclude={JpaRepositoriesAutoConfiguration.class})
+@EnableConfigurationProperties
 @ComponentScan(basePackages = "org.onap.usecaseui.server")
+@EnableAutoConfiguration(exclude={JpaRepositoriesAutoConfiguration.class})
 public class UuiServerApplication {
     public static DmaapSubscriber dmaapSubscriber;
 
@@ -39,7 +41,7 @@ public class UuiServerApplication {
     public void setDatastore(DmaapSubscriber dmaapSubscriber) {
         UuiServerApplication.dmaapSubscriber = dmaapSubscriber;
     }
-    
+
     @Bean
     public RestTemplate getRestTemplate(){
         return new RestTemplate();
index f27a72e..148b907 100644 (file)
@@ -19,6 +19,7 @@ package org.onap.usecaseui.server.config;
 import java.io.IOException;
 
 import org.onap.usecaseui.server.service.lcm.domain.aai.AAIService;
+import org.onap.usecaseui.server.service.slicingdomain.aai.AAISliceService;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -34,11 +35,11 @@ import retrofit2.converter.jackson.JacksonConverterFactory;
 @Configuration
 public class AAIClientConfig {
 
-    @Value("${client.aai.baseUrl}")
+    @Value("${uui-server.client.aai.baseUrl}")
     String baseUrl;
-    @Value("${client.aai.username}")
+    @Value("${uui-server.client.aai.username}")
     String username;
-    @Value("${client.aai.password}")
+    @Value("${uui-server.client.aai.password}")
     String password;
 
     @Bean
@@ -71,4 +72,9 @@ public class AAIClientConfig {
     AAIService aaiService(Retrofit retrofit) {
         return retrofit.create(AAIService.class);
     }
+
+    @Bean
+    AAISliceService aaiSliceService(Retrofit retrofit) {
+        return retrofit.create(AAISliceService.class);
+    }
 }
diff --git a/server/src/main/java/org/onap/usecaseui/server/config/SOClientConfig.java b/server/src/main/java/org/onap/usecaseui/server/config/SOClientConfig.java
new file mode 100644 (file)
index 0000000..3eca259
--- /dev/null
@@ -0,0 +1,78 @@
+/**
+ * Copyright 2025 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.
+ */
+
+package org.onap.usecaseui.server.config;
+
+import java.io.IOException;
+
+import org.onap.usecaseui.server.service.lcm.domain.so.SOService;
+import org.onap.usecaseui.server.service.slicingdomain.so.SOSliceService;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+
+import okhttp3.Credentials;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import retrofit2.Retrofit;
+import retrofit2.converter.jackson.JacksonConverterFactory;
+
+@Configuration
+public class SOClientConfig {
+
+    @Value("${uui-server.client.so.baseUrl}")
+    String baseUrl;
+    @Value("${uui-server.client.so.username}")
+    String username;
+    @Value("${uui-server.client.so.password}")
+    String password;
+
+    OkHttpClient okHttpClient() {
+        return new OkHttpClient().newBuilder().addInterceptor(new Interceptor() {
+            @Override
+            public okhttp3.Response intercept(Chain chain) throws IOException {
+                Request originalRequest = chain.request();
+                Request.Builder builder = originalRequest.newBuilder()
+                    .header("Authorization", Credentials.basic(username, password))
+                    .header(HttpHeaders.ACCEPT, "application/json")
+                    .header("X-TransactionId", "9999")
+                    .header("X-FromAppId", "onap-cli");
+                Request newRequest = builder.build();
+                return chain.proceed(newRequest);
+            }
+        }).build();
+    }
+
+    Retrofit retrofit() {
+        return new Retrofit.Builder()
+            .baseUrl(baseUrl)
+            .addConverterFactory(JacksonConverterFactory.create())
+            .client(okHttpClient())
+            .build();
+    }
+
+    @Bean
+    SOService soService() {
+        return retrofit().create(SOService.class);
+    }
+
+    @Bean
+    SOSliceService soSliceService() {
+        return retrofit().create(SOSliceService.class);
+    }
+}
diff --git a/server/src/main/java/org/onap/usecaseui/server/service/csmf/config/SlicingProperties.java b/server/src/main/java/org/onap/usecaseui/server/service/csmf/config/SlicingProperties.java
new file mode 100644 (file)
index 0000000..47ad089
--- /dev/null
@@ -0,0 +1,16 @@
+package org.onap.usecaseui.server.service.csmf.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.Data;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "uui-server.slicing")
+public class SlicingProperties {
+  String serviceInvariantUuid;
+  String serviceUuid;
+  String globalSubscriberId;
+  String serviceType;
+}
index f24ac13..2771d7d 100644 (file)
@@ -21,6 +21,7 @@ import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Type;
@@ -29,7 +30,8 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 import java.util.stream.Collectors;
-import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import okhttp3.MediaType;
 import okhttp3.RequestBody;
 import org.onap.usecaseui.server.bean.ServiceInstanceOperations;
@@ -50,93 +52,52 @@ import org.onap.usecaseui.server.constant.csmf.CsmfParamConstant;
 import org.onap.usecaseui.server.constant.nsmf.NsmfCodeConstant;
 import org.onap.usecaseui.server.constant.nsmf.NsmfParamConstant;
 import org.onap.usecaseui.server.service.csmf.SlicingService;
+import org.onap.usecaseui.server.service.csmf.config.SlicingProperties;
 import org.onap.usecaseui.server.service.lcm.ServiceLcmService;
 import org.onap.usecaseui.server.service.slicingdomain.aai.AAISliceService;
 import org.onap.usecaseui.server.service.slicingdomain.aai.bean.AAIServiceInstance;
 import org.onap.usecaseui.server.service.slicingdomain.so.SOSliceService;
 import org.onap.usecaseui.server.service.slicingdomain.so.bean.SOOperation;
-import org.onap.usecaseui.server.util.RestfulServices;
 import org.onap.usecaseui.server.util.nsmf.NsmfCommonUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.stereotype.Service;
 import retrofit2.Response;
 
+@Slf4j
+@RequiredArgsConstructor
 @Service("SlicingService")
-@org.springframework.context.annotation.Configuration
-@EnableAspectJAutoProxy
 public class SlicingServiceImpl implements SlicingService {
 
-    private final static Logger logger = LoggerFactory.getLogger(SlicingServiceImpl.class);
-
-    @Resource(name = "ServiceLcmService")
-    private ServiceLcmService serviceLcmService;
-
-    private AAISliceService aaiSliceService;
-
-    private SOSliceService soSliceService;
-
-    public SlicingServiceImpl() {
-        this(RestfulServices.create(AAISliceService.class), RestfulServices.create(SOSliceService.class));
-    }
-
-    public SlicingServiceImpl(AAISliceService aaiSliceService, SOSliceService soSliceService) {
-        this.aaiSliceService = aaiSliceService;
-        this.soSliceService = soSliceService;
-    }
+    private static final Gson gson = new Gson();
+    private final ServiceLcmService serviceLcmService;
+    private final AAISliceService aaiSliceService;
+    private final SOSliceService soSliceService;
+    private final SlicingProperties slicingProperties;
 
     @Override
     public ServiceResult createSlicingService(SlicingOrder slicingOrder) {
 
-        ServiceCreateResult createResult = new ServiceCreateResult();
         String resultCode;
         String resultMsg;
-        Gson gson = new Gson();
+
         ResultHeader resultHeader = new ResultHeader();
+        ServiceCreateResult createResult = new ServiceCreateResult();
         try {
             // request bean for create slicing service
-            CreationRequestInputs requestInputs = new CreationRequestInputs();
-            requestInputs.setExpDataRateDL(slicingOrder.getSlicing_order_info().getExpDataRateDL());
-            requestInputs.setExpDataRateUL(slicingOrder.getSlicing_order_info().getExpDataRateUL());
-            requestInputs.setLatency(slicingOrder.getSlicing_order_info().getLatency());
-            requestInputs.setMaxNumberofUEs(slicingOrder.getSlicing_order_info().getMaxNumberofUEs());
-            requestInputs.setUEMobilityLevel(slicingOrder.getSlicing_order_info().getUEMobilityLevel());
-            requestInputs.setResourceSharingLevel(slicingOrder.getSlicing_order_info().getResourceSharingLevel());
-            requestInputs.setCoverageAreaList(slicingOrder.getSlicing_order_info().getCoverageArea());
-            //use default value
-            requestInputs.setUseInterval("20");
-            CreationParameters parameters = new CreationParameters();
-            parameters.setRequestInputs(requestInputs);
-            CreationService creationService = new CreationService();
-            creationService.setName(slicingOrder.getSlicing_order_info().getName());
-            creationService.setDescription(CommonConstant.BLANK);
-            String slicingPath = System.getProperty("user.dir") + File.separator + "config" + File.separator + "slicing.properties";
-            InputStream inputStream = new FileInputStream(new File(slicingPath));
-            Properties environment = new Properties();
-            environment.load(inputStream);
-            String serviceInvariantUuid = environment.getProperty("slicing.serviceInvariantUuid");
-            creationService.setServiceInvariantUuid(serviceInvariantUuid);
-            String serviceUuid = environment.getProperty("slicing.serviceUuid");
-            creationService.setServiceUuid(serviceUuid);
-            logger.info("serviceInvariantUuid is {}, serviceUuid is {}.", serviceInvariantUuid, serviceUuid);
-
-            creationService.setGlobalSubscriberId(environment.getProperty("slicing.globalSubscriberId"));
-            creationService.setServiceType(environment.getProperty("slicing.serviceType"));
-            creationService.setParameters(parameters);
+            CreationRequestInputs requestInputs = mapCreationRequest(slicingOrder);
+            CreationService creationService = buildCreationService(slicingOrder, requestInputs);
 
             CreationRequest creationRequest = new CreationRequest();
             creationRequest.setService(creationService);
 
             String jsonstr = gson.toJson(creationRequest);
-            logger.info("createSlicingService:creationRequest request is:{}", jsonstr);
+            log.info("createSlicingService:creationRequest request is:{}", jsonstr);
             RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonstr.toString());
             Response<CreateResponse> updateResponse = soSliceService
                 .submitOrders(requestBody).execute();
 
             if (updateResponse.isSuccessful()) {
                 CreateResponse createResponse = updateResponse.body();
-                logger.info("createSlicingService: submitOrders reponse is:{}",
+                log.info("createSlicingService: submitOrders reponse is:{}",
                     gson.toJson(createResponse).toString());
 
                 // set create operation result
@@ -146,7 +107,7 @@ public class SlicingServiceImpl implements SlicingService {
                 resultMsg = "5G slicing order created normally.";
                 resultHeader.setResult_code(NsmfCodeConstant.SUCCESS_CODE);
             } else {
-                logger.error(String
+                log.error(String
                     .format("createSlicingService: Can not submitOrders [code={}, message={}]", updateResponse.code(),
                         updateResponse.message()));
                 resultMsg = "5G slicing order created failed.";
@@ -156,16 +117,72 @@ public class SlicingServiceImpl implements SlicingService {
             // set error message
             resultMsg = "5G slicing order created failed. Unknown exception occurred!";
             resultHeader.setResult_code(NsmfCodeConstant.ERROR_CODE_UNKNOWN);
-            logger.error(e.getMessage());
+            log.error(e.getMessage());
         }
 
-        logger.info(resultMsg);
-        logger.info("createSlicingService: 5G slicing order creation has been finished.");
+        log.info(resultMsg);
+        log.info("createSlicingService: 5G slicing order creation has been finished.");
         resultHeader.setResult_message(resultMsg);
         ServiceResult serviceResult = new ServiceResult(resultHeader, createResult);
         return serviceResult;
     }
 
+    private CreationRequestInputs mapCreationRequest(SlicingOrder slicingOrder) {
+        CreationRequestInputs requestInputs = new CreationRequestInputs();
+        requestInputs.setExpDataRateDL(slicingOrder.getSlicing_order_info().getExpDataRateDL());
+        requestInputs.setExpDataRateUL(slicingOrder.getSlicing_order_info().getExpDataRateUL());
+        requestInputs.setLatency(slicingOrder.getSlicing_order_info().getLatency());
+        requestInputs.setMaxNumberofUEs(slicingOrder.getSlicing_order_info().getMaxNumberofUEs());
+        requestInputs.setUEMobilityLevel(slicingOrder.getSlicing_order_info().getUEMobilityLevel());
+        requestInputs.setResourceSharingLevel(slicingOrder.getSlicing_order_info().getResourceSharingLevel());
+        requestInputs.setCoverageAreaList(slicingOrder.getSlicing_order_info().getCoverageArea());
+        //use default value
+        requestInputs.setUseInterval("20");
+        return requestInputs;
+    }
+
+    private CreationService buildCreationService(SlicingOrder slicingOrder, CreationRequestInputs requestInputs)
+            throws FileNotFoundException, IOException {
+        CreationParameters parameters = new CreationParameters();
+        parameters.setRequestInputs(requestInputs);
+        CreationService creationService = new CreationService();
+        creationService.setName(slicingOrder.getSlicing_order_info().getName());
+        creationService.setDescription(CommonConstant.BLANK);
+
+        String slicingPath = System.getProperty("user.dir") + File.separator + "config" + File.separator + "slicing.properties";
+        try {
+            // kept for compatibility reasons
+            InputStream inputStream = new FileInputStream(new File(slicingPath));
+            setEnvironmentProperties(creationService, inputStream);
+        } catch (FileNotFoundException e) {
+            addConfigurationProperties(creationService);
+        }
+
+        creationService.setParameters(parameters);
+        return creationService;
+    }
+
+    private void addConfigurationProperties(CreationService creationService) {
+        creationService.setServiceInvariantUuid(slicingProperties.getServiceInvariantUuid());
+        creationService.setServiceUuid(slicingProperties.getServiceUuid());
+        creationService.setGlobalSubscriberId(slicingProperties.getGlobalSubscriberId());
+        creationService.setServiceType(slicingProperties.getServiceType());
+    }
+
+    private void setEnvironmentProperties(CreationService creationService, InputStream inputStream)
+            throws IOException {
+        Properties environment = new Properties();
+        environment.load(inputStream);
+        String serviceInvariantUuid = environment.getProperty("slicing.serviceInvariantUuid");
+        creationService.setServiceInvariantUuid(serviceInvariantUuid);
+        String serviceUuid = environment.getProperty("slicing.serviceUuid");
+        creationService.setServiceUuid(serviceUuid);
+        log.info("serviceInvariantUuid is {}, serviceUuid is {}.", serviceInvariantUuid, serviceUuid);
+
+        creationService.setGlobalSubscriberId(environment.getProperty("slicing.globalSubscriberId"));
+        creationService.setServiceType(environment.getProperty("slicing.serviceType"));
+    }
+
     @Override
     public ServiceResult querySlicingOrderList(String status, String pageNo, String pageSize) {
 
@@ -179,7 +196,7 @@ public class SlicingServiceImpl implements SlicingService {
             Response<JSONObject> response = this.aaiSliceService
                 .listOrders(NsmfParamConstant.CUSTOM_5G, NsmfParamConstant.SERVICE_TYPE_5G).execute();
             if (response.isSuccessful()) {
-                logger.info("querySlicingOrderList: listService reponse is:{}", response.body());
+                log.info("querySlicingOrderList: listService reponse is:{}", response.body());
                 Type type = new TypeToken<List<AAIServiceInstance>>() {
                 }.getType();
 
@@ -190,7 +207,7 @@ public class SlicingServiceImpl implements SlicingService {
                 resultMsg = "5G slicing order query result.";
                 resultHeader.setResult_code(NsmfCodeConstant.SUCCESS_CODE);
             } else {
-                logger.error(String.format("querySlicingOrderList: Can not get listOrders[code={}, message={}]",
+                log.error(String.format("querySlicingOrderList: Can not get listOrders[code={}, message={}]",
                     response.code(),
                     response.message()));
                 resultMsg = "\"5G slicing order query failed!";
@@ -204,7 +221,7 @@ public class SlicingServiceImpl implements SlicingService {
             Exception e) {
             resultMsg = "5G slicing order query failed. Unknown exception occurred!";
             resultHeader.setResult_code(NsmfCodeConstant.ERROR_CODE_UNKNOWN);
-            logger.error(e.getMessage());
+            log.error(e.getMessage());
         }
 
         // Filter by status and paginate
@@ -221,8 +238,8 @@ public class SlicingServiceImpl implements SlicingService {
         // return API result for calling [Query Slicing Order List]
         OrderList responseOrderList = new OrderList(orderList.size(), pagedOrderList.getPagedList());
         addProgressToOrder(responseOrderList);
-        logger.info(resultMsg);
-        logger.info("querySlicingOrderList: 5G slicing order query has been finished.");
+        log.info(resultMsg);
+        log.info("querySlicingOrderList: 5G slicing order query has been finished.");
         resultHeader.setResult_message(resultMsg);
         serviceResult.setResult_header(resultHeader);
         serviceResult.setResult_body(responseOrderList);
@@ -235,7 +252,12 @@ public class SlicingServiceImpl implements SlicingService {
             OrderInfo order = new OrderInfo();
             order.setOrder_id(object.getString("service-instance-id"));
             order.setOrder_name(object.getString("service-instance-name"));
-            order.setOrder_creation_time(NsmfCommonUtil.timestamp2Time(object.getString("created-at")));
+            String createdAt = object.getString("created-at");
+            // do not fail when createdAt is null
+            if(createdAt != null) {
+                String timestamp = NsmfCommonUtil.timestamp2Time(createdAt);
+                order.setOrder_creation_time(timestamp);
+            }
             order.setOrder_status(object.getString("service-type"));
             order.setService_snssai(object.getString("environment-context"));
             order.setOrder_status(object.getString("orchestration-status"));
@@ -246,7 +268,7 @@ public class SlicingServiceImpl implements SlicingService {
     public void addProgressToOrder(OrderList responseOrderList)  {
         if (responseOrderList.getSlicing_order_list() == null
             || responseOrderList.getSlicing_order_list().size() == 0) {
-            logger.error(
+            log.error(
                 "addProgressToOrder: responseOrderList.getSlicing_order_list() is null or responseOrderList.getSlicing_order_list() size is 0.");
             return;
         }
@@ -259,7 +281,7 @@ public class SlicingServiceImpl implements SlicingService {
             ServiceInstanceOperations serviceInstanceOperations = serviceLcmService
                 .getServiceInstanceOperationById(businessId);
             if (null == serviceInstanceOperations || serviceInstanceOperations.getOperationId() == null) {
-                logger.error(
+                log.error(
                     "addProgressToOrder: null == serviceInstanceOperations for businessId:{}.",
                     businessId);
                 continue;
@@ -272,27 +294,27 @@ public class SlicingServiceImpl implements SlicingService {
                 if (response.isSuccessful()) {
                     SOOperation soOperation = response.body();
                     Gson gson = new Gson();
-                    logger.info("addProgressToOrder: queryOperationProgress reponse is:{}",
+                    log.info("addProgressToOrder: queryOperationProgress reponse is:{}",
                         gson.toJson(soOperation).toString());
                     if (soOperation == null || soOperation.getOperation() == null) {
-                        logger.error("addProgressToOrder: soOperation is null or getOperation() is null for businessId {}!", businessId);
+                        log.error("addProgressToOrder: soOperation is null or getOperation() is null for businessId {}!", businessId);
                         continue;
                     }
                     String operationResult = soOperation.getOperation().getResult();
                     String operationType = soOperation.getOperation().getOperation();
                     int progress = soOperation.getOperation().getProgress();
-                    logger.info("addProgressToOrder: operationResult is:{}, operationType is {}, progress is {}",
+                    log.info("addProgressToOrder: operationResult is:{}, operationType is {}, progress is {}",
                         operationResult, operationType, progress);
                     if (operationResult.equals(NsmfCodeConstant.OPERATION_ERROR_STATUS)) {
-                        logger.error("addProgressToOrder: progress is ok, but operationResult is error for businessId {}!", businessId);
+                        log.error("addProgressToOrder: progress is ok, but operationResult is error for businessId {}!", businessId);
                         continue;
                     }
                     orderInfo.setLast_operation_type(operationType);
                     orderInfo.setLast_operation_progress(String.valueOf(progress));
                 }
             } catch (IOException e) {
-                logger.error(e.getMessage());
-                logger.error("addProgressToOrder: catch an IOException for businessId {}!", businessId);
+                log.error(e.getMessage());
+                log.error("addProgressToOrder: catch an IOException for businessId {}!", businessId);
                 continue;
             }
         }
index dd9a241..86ae7f6 100644 (file)
@@ -27,47 +27,22 @@ import retrofit2.http.*;
 
 public interface SOService {
 
-    @Headers({
-            "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-            "Accept: application/json"
-    })
     @POST("/api/so-serviceInstances/v3")
     Call<ServiceOperation> instantiateService(@Body RequestBody body);
 
-    @Headers({
-            "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-            "Accept: application/json"
-    })
     @GET("/api/so-serviceInstances/v3/{serviceId}/operations/{operationId}")
     Call<OperationProgressInformation> queryOperationProgress(@Path("serviceId") String serviceId, @Path("operationId") String operationId);
 
-    @Headers({
-            "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-            "Accept: application/json"
-    })
 //    @DELETE("/ecomp/mso/infra/e2eServiceInstances/v3/{serviceId}")
     @HTTP(method="DELETE", path="/api/so-serviceInstances/v3/{serviceId}", hasBody = true)
     Call<DeleteOperationRsp> terminateService(@Path("serviceId") String serviceId, @Body RequestBody body);
-    
-    @Headers({
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-    })
+
        @POST("/api/so-serviceInstances/v3/{serviceId}/scale")
        Call<SaveOrUpdateOperationRsp> scaleService(@Path("serviceId") String serviceId, @Body RequestBody body);
-    
-    @Headers({
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-    })
+
        @PUT("/api/so-serviceInstances/v3/{serviceId}")
        Call<SaveOrUpdateOperationRsp> updateService(@Path("serviceId") String serviceId, @Body RequestBody body);
 
-    @Headers({
-            "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-            "Accept: application/json"
-    })
-    //@POST("/onap/so/infra/e2eServiceInstances/v3")
     @POST("/api/so-serviceInstances/v5")
     Call<ServiceOperation> instantiateSOTNService(@Body E2EServiceInstanceRequest body);
 }
index 0866471..c11b2f4 100644 (file)
@@ -27,6 +27,9 @@ import jakarta.servlet.http.HttpServletRequest;
 
 import com.google.common.base.Throwables;
 import jakarta.transaction.Transactional;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
 import org.hibernate.query.Query;
 import org.hibernate.Session;
 import org.hibernate.SessionFactory;
@@ -41,47 +44,34 @@ import org.onap.usecaseui.server.service.lcm.domain.so.bean.SaveOrUpdateOperatio
 import org.onap.usecaseui.server.service.lcm.domain.so.bean.ServiceOperation;
 import org.onap.usecaseui.server.service.lcm.domain.so.exceptions.SOException;
 import org.onap.usecaseui.server.util.DateUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import okhttp3.RequestBody;
 import retrofit2.Response;
 
-@Service("ServiceLcmService")
+@Slf4j
 @Transactional
+@Service("ServiceLcmService")
+@RequiredArgsConstructor
 public class DefaultServiceLcmService implements ServiceLcmService {
 
-    private static final Logger logger = LoggerFactory.getLogger(DefaultServiceLcmService.class);
-
-    @Autowired
-    private EntityManagerFactory entityManagerFactory;
+    private final EntityManagerFactory entityManagerFactory;
+    private final SOService soService;
 
     public Session getSession() {
         return entityManagerFactory.unwrap(SessionFactory.class).getCurrentSession();}
 
-    private SOService soService;
-
-    public DefaultServiceLcmService() {
-        this(create(SOService.class));
-    }
-
-    public DefaultServiceLcmService(SOService soService) {
-        this.soService = soService;
-    }
-
     @Override
     public ServiceOperation instantiateService(HttpServletRequest request) {
         try {
-            logger.info("so instantiate is starting");
+            log.info("so instantiate is starting");
             RequestBody requestBody = extractBody(request);
             Response<ServiceOperation> response = soService.instantiateService(requestBody).execute();
-            logger.info("so instantiate has finished");
+            log.info("so instantiate has finished");
             if (response.isSuccessful()) {
                 return response.body();
             } else {
-                logger.error(String.format("Can not instantiate service[code=%s, message=%s]", response.code(),
+                log.error(String.format("Can not instantiate service[code=%s, message=%s]", response.code(),
                         response.message()));
                 throw new SOException("SO instantiate service failed!");
             }
@@ -98,7 +88,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             if (response.isSuccessful()) {
                 return response.body();
             } else {
-                logger.error(String.format("Can not query operation process[code=%s, message=%s]", response.code(),
+                log.error(String.format("Can not query operation process[code=%s, message=%s]", response.code(),
                         response.message()));
                 throw new SOException("SO query operation process failed!");
             }
@@ -110,14 +100,14 @@ public class DefaultServiceLcmService implements ServiceLcmService {
     @Override
     public DeleteOperationRsp terminateService(String serviceId, HttpServletRequest request) {
         try {
-            logger.info("so terminate is starting");
+            log.info("so terminate is starting");
             RequestBody requestBody = extractBody(request);
             Response<DeleteOperationRsp> response = soService.terminateService(serviceId, requestBody).execute();
-            logger.info("so terminate has finished");
+            log.info("so terminate has finished");
             if (response.isSuccessful()) {
                 return response.body();
             } else {
-                logger.error(String.format("Can not terminate service[code=%s, message=%s]", response.code(),
+                log.error(String.format("Can not terminate service[code=%s, message=%s]", response.code(),
                         response.message()));
                 throw new SOException("SO terminate service failed!");
             }
@@ -129,15 +119,15 @@ public class DefaultServiceLcmService implements ServiceLcmService {
     @Override
     public SaveOrUpdateOperationRsp scaleService(String serviceId, HttpServletRequest request) {
         try {
-            logger.info("so scale is finished");
+            log.info("so scale is finished");
             RequestBody requestBody = extractBody(request);
             Response<SaveOrUpdateOperationRsp> response = soService.scaleService(serviceId, requestBody).execute();
-            logger.info("so scale has finished");
+            log.info("so scale has finished");
             if (response.isSuccessful()) {
-                logger.info("scaleService response content is :" + response.body().toString());
+                log.info("scaleService response content is :" + response.body().toString());
                 return response.body();
             } else {
-                logger.error(String.format("Can not scaleService service[code=%s, message=%s]", response.code(),
+                log.error(String.format("Can not scaleService service[code=%s, message=%s]", response.code(),
                         response.message()));
                 throw new SOException("SO terminate service failed!");
             }
@@ -149,14 +139,14 @@ public class DefaultServiceLcmService implements ServiceLcmService {
     @Override
     public SaveOrUpdateOperationRsp updateService(String serviceId, HttpServletRequest request) {
         try {
-            logger.info("so update is starting");
+            log.info("so update is starting");
             RequestBody requestBody = extractBody(request);
             Response<SaveOrUpdateOperationRsp> response = soService.updateService(serviceId, requestBody).execute();
-            logger.info("so update has finished");
+            log.info("so update has finished");
             if (response.isSuccessful()) {
                 return response.body();
             } else {
-                logger.error(String.format("Can not updateService service[code=%s, message=%s]", response.code(),
+                log.error(String.format("Can not updateService service[code=%s, message=%s]", response.code(),
                         response.message()));
                 throw new SOException("SO terminate service failed!");
             }
@@ -170,12 +160,12 @@ public class DefaultServiceLcmService implements ServiceLcmService {
         Session session = getSession();
         try  {
             if (null == serviceBean) {
-                logger.error("DefaultServiceLcmService saveOrUpdateServiceBean serviceBean is null!");
+                log.error("DefaultServiceLcmService saveOrUpdateServiceBean serviceBean is null!");
             }
             session.saveOrUpdate(serviceBean);
             session.flush();
         } catch (Exception e) {
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService saveOrUpdateServiceBean. Details:"
                             + e.getMessage());
         }
@@ -192,7 +182,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             q.executeUpdate();
             session.flush();
         } catch (Exception e) {
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService updateServiceInstanceStatusById.Detail."
                             + e.getMessage());
         }
@@ -213,7 +203,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
                 serviceBean = list.get(0);
             }
         } catch (Exception e) {
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService getServiceBeanByServiceInStanceId.Detail."
                             + e.getMessage());
             serviceBean = new ServiceBean();;
@@ -235,7 +225,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             session.flush();
         } catch (Exception e) {
             list = new ArrayList<>();
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService updateServiceInstanceStatusByIdDetail."
                             + e.getMessage());
         }
@@ -248,15 +238,15 @@ public class DefaultServiceLcmService implements ServiceLcmService {
         Session session = getSession();
         try  {
             if (null == serviceOperation) {
-                logger.error("DefaultServiceLcmService saveOrUpdateServiceBean serviceOperation is null!");
+                log.error("DefaultServiceLcmService saveOrUpdateServiceBean serviceOperation is null!");
             }
             session.saveOrUpdate(serviceOperation);
             session.flush();
         } catch (Exception e) {
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService saveOrUpdateServiceInstanceOperation. Details:"
                             + Throwables.getStackTraceAsString(e));
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService saveOrUpdateServiceInstanceOperation. Details:"
                             + e.getMessage());
         }
@@ -285,7 +275,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             session.flush();
 
         } catch (Exception e) {
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService updateServiceInstanceOperation.Detail."
                             + e.getMessage());
         }
@@ -312,7 +302,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             session.flush();
 
         } catch (Exception e) {
-            logger.error("exception occurred while performing DefaultServiceLcmService getServiceInstanceOperationById."
+            log.error("exception occurred while performing DefaultServiceLcmService getServiceInstanceOperationById."
                     + e.getMessage());
         }
         return serviceOperation;
@@ -333,7 +323,7 @@ public class DefaultServiceLcmService implements ServiceLcmService {
             session.flush();
         } catch (Exception e) {
             list = new ArrayList<>();
-            logger.error(
+            log.error(
                     "exception occurred while performing DefaultServiceLcmService updateServiceInstanceStatusByIdDetail."
                             + e.getMessage());
         }
index 34103f9..0f6571b 100644 (file)
@@ -34,223 +34,76 @@ import retrofit2.http.Query;
 
 public interface AAISliceService {
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=service-profile")
     Call<JSONObject> listService(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType);
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
+
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=service-profile")
        Call<JSONObject> listServiceByStatus(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Query("orchestration-status") String orchestrationStatus);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}")
        Call<JSONObject> listServiceById(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String businessId);
 
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=nsi")
        Call<JSONObject> listServiceNSI(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=nsi")
        Call<JSONObject> listServiceNSIByStatus(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Query("orchestration-status") String orchestrationStatus);
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
+
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=nssi")
        Call<JSONObject> listServiceNSSI(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType);
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
+
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=nssi")
        Call<JSONObject> listServiceNSSIByStatus(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Query("orchestration-status") String orchestrationStatus);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=nssi")
        Call<JSONObject> listServiceNSSIByEnv(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Query("environment-context") String environmentContext);
 
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v19/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/service-profiles")
        Call<JSONObject> getServiceProfiles(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/allotted-resources")
        Call<JSONObject> queryAllottedResources(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}")
        Call<JSONObject> querySerAndSubInsByNSI(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}")
        Call<JSONObject> queryNSIByNSSI(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}")
        Call<JSONObject> queryOrderByService(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}")
        Call<JSONObject> queryOrderByOrderId(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType,@Path("service-instance-id") String serviceInstanceId);
 
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-sdc/v13/models/model/{model-invariant-id}/model-vers/model-ver/{model-version-id}")
        Call<AAIServiceNST> queryServiceNST(@Path("model-invariant-id") String modelInvariantIid,
                        @Path("model-version-id") String modelVersionId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v13/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances?service-role=communication-service")
        Call<JSONObject> listOrders(@Path("global-customer-id") String globalCustomerId,@Path("service-type") String serviceType);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-network/v21/logical-links")
        Call<ConnectionLinkList> getConnectionLinks();
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-network/v21/network-routes/network-route/{route-id}")
        Call<EndPointInfoList> getEndpointByLinkName(@Path("route-id") String linkName);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-network/v21/network-routes/network-route/{route-id}")
        Call<EndPointInfoList> getEndpointByLinkName2(@Path("route-id") String linkName2);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v21/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/{service-instance-id}/allotted-resources/allotted-resource/{allotted-resource-id}")
        Call<ConnectionLink> getAllottedResource(@Path("service-instance-id") String serviceInstancesId,@Path("allotted-resource-id") String allottedResourceId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-business/v21/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/{service-instance-id}")
        Call<ConnectionLink> getServiceInstance(@Path("service-instance-id") String serviceInstancesId);
 
-       @Headers({
-               "X-TransactionId: 9999",
-               "X-FromAppId: MSO",
-               "Authorization: Basic QUFJOkFBSQ==",
-               "Accept: application/json"
-       })
        @GET("/api/aai-business/v21/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/{service-instance-id}")
        Call<NetworkInfo> getServiceNetworkInstance(@Path("service-instance-id") String serviceInstancesId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: MSO",
-        "Authorization: Basic QUFJOkFBSQ==",
-        "Accept: application/json"
-       })
        @GET("/api/aai-network/v21/network-policies/network-policy/{network-policy-id}")
        Call<NetworkPolicy> getNetworkPolicy(@Path("network-policy-id")String relationshipValue);
 
-       @Headers({
-               "X-TransactionId: 9999",
-               "X-FromAppId: MSO",
-               "Authorization: Basic QUFJOkFBSQ==",
-               "Accept: application/json"
-       })
        @GET("/api/aai-business/v21/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/{service-instance-id}/slice-profiles")
        Call<SliceProfileList> getSliceProfiles(@Path("service-instance-id") String serviceInstancesId);
 
index 91e4b2d..8b1dacb 100644 (file)
@@ -28,7 +28,6 @@ import retrofit2.Call;
 import retrofit2.http.Body;
 import retrofit2.http.GET;
 import retrofit2.http.HTTP;
-import retrofit2.http.Headers;
 import retrofit2.http.POST;
 import retrofit2.http.PUT;
 import retrofit2.http.Path;
@@ -36,90 +35,37 @@ import retrofit2.http.Query;
 
 public interface SOSliceService {
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
        @GET("/api/so-serviceInstances/v3/{serviceId}/operations/{operationId}")
        Call<SOOperation> queryOperationProgress(@Path("serviceId") String serviceId,
                        @Path("operationId") String operationId);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
        @POST("/api/so-serviceInstances/v3/{serviceInstanceId}/activate")
        Call<ActivateService> activeService(@Path("serviceInstanceId") String serviceInstanceId, @Body RequestBody body);
 
-       @Headers({ "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==", "Accept: application/json" })
        @POST("/api/so-serviceInstances/v3/{serviceInstanceId}/deactivate")
        Call<ActivateService> deactiveService(@Path("serviceInstanceId") String serviceInstanceId, @Body RequestBody body);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
-
        @HTTP(method = "DELETE",path = "/api/so-serviceInstances/v3/{serviceInstanceId}",hasBody = true)
        Call<ActivateService> terminateService(@Path("serviceInstanceId") String serviceInstanceId, @Body RequestBody body);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
        @GET("/api/so-orchestrationTasks/v4")
        Call<JSONArray> listTask();
-       
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
+
        @GET("/api/so-orchestrationTasks/v4")
        Call<JSONArray> listTaskByStage(@Query("status") String status );
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
        @GET("/api/so-orchestrationTasks/v4/{taskId}")
        Call<SOTask> getTaskById(@Path("taskId") String taskId);
 
-       @Headers({ "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==", "Accept: application/json" })
        @GET("/api/so-orchestrationTasks/v4/{taskId}")
        Call<SOTask> getTaskByIdD(@Path("taskId") String taskId);
-       
-       @Headers({ "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==", "Accept: application/json" })
+
        @PUT("/api/so-orchestrationTasks/v4/{taskId}")
        Call<ResponseBody> updateService(@Path("taskId") String taskId, @Body RequestBody body);
 
-       @Headers({
-        "X-TransactionId: 9999",
-        "X-FromAppId: onap-cli",
-        "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-        "Accept: application/json"
-       })
        @POST("/api/so-orchestrationTasks/v4/{taskId}/commit")
        Call<ResponseBody> commitTask(@Path("taskId") String taskId);
 
-
-       @Headers({
-               "X-TransactionId: 9999",
-               "X-FromAppId: onap-cli",
-               "Authorization: Basic SW5mcmFQb3J0YWxDbGllbnQ6cGFzc3dvcmQxJA==",
-               "Accept: application/json"
-       })
        @POST("/api/so-serviceInstances/v3")
        Call<CreateResponse> submitOrders(@Body RequestBody body);
 }
index 7236ac3..cd97f3b 100644 (file)
@@ -52,4 +52,17 @@ endpoints.shutdown.sensitive=false
 server.ssl.protocol=TLS
 server.ssl.key-store=classpath:keystore/uuiServer.jks
 server.ssl.key-store-password=Aa123456
-server.ssl.key-store-type=JKS
\ No newline at end of file
+server.ssl.key-store-type=JKS
+
+intents.scheduledTask.enabled=false
+
+uui-server.client.aai.baseUrl=http://aai.onap
+uui-server.client.aai.username=AAI
+uui-server.client.aai.password=AAI
+uui-server.client.so.baseUrl=http://so.onap:8080
+uui-server.client.so.username=InfraPortalClient
+uui-server.client.so.password=password1
+uui-server.slicing.service-invariant-uuid=defaultServiceInvariantUuid
+uui-server.slicing.service-uuid=defaultServiceUuid
+uui-server.slicing.global-subscriber-id=defaultGlobalSubscriberId
+uui-server.slicing.service-type=defaultServiceType
diff --git a/server/src/test/java/org/onap/usecaseui/server/service/csmf/impl/SlicingServiceImplIntegrationTest.java b/server/src/test/java/org/onap/usecaseui/server/service/csmf/impl/SlicingServiceImplIntegrationTest.java
new file mode 100644 (file)
index 0000000..b6869c7
--- /dev/null
@@ -0,0 +1,170 @@
+/**
+ * Copyright 2025 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.
+ */
+
+package org.onap.usecaseui.server.service.csmf.impl;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
+import static com.github.tomakehurst.wiremock.client.WireMock.get;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.stubFor;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.onap.usecaseui.server.bean.csmf.OrderInfo;
+import org.onap.usecaseui.server.bean.csmf.OrderList;
+import org.onap.usecaseui.server.bean.csmf.ServiceCreateResult;
+import org.onap.usecaseui.server.bean.csmf.SlicingOrder;
+import org.onap.usecaseui.server.bean.csmf.SlicingOrderDetail;
+import org.onap.usecaseui.server.bean.nsmf.common.ServiceResult;
+import org.onap.usecaseui.server.config.AAIClientConfig;
+import org.onap.usecaseui.server.config.SOClientConfig;
+import org.onap.usecaseui.server.constant.csmf.CsmfParamConstant;
+import org.onap.usecaseui.server.constant.nsmf.NsmfParamConstant;
+import org.onap.usecaseui.server.service.csmf.SlicingService;
+import org.onap.usecaseui.server.service.csmf.config.SlicingProperties;
+import org.onap.usecaseui.server.service.lcm.ServiceLcmService;
+import org.onap.usecaseui.server.service.lcm.domain.aai.bean.AAICustomer;
+import org.onap.usecaseui.server.service.lcm.impl.DefaultServiceLcmService;
+import org.onap.usecaseui.server.service.slicingdomain.aai.AAISliceService;
+import org.onap.usecaseui.server.service.slicingdomain.so.SOSliceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.HttpHeaders;
+import org.wiremock.spring.EnableWireMock;
+
+import lombok.SneakyThrows;
+
+@EnableWireMock
+@EnableConfigurationProperties
+@SpringBootTest(
+    webEnvironment = WebEnvironment.RANDOM_PORT,
+    classes = {
+        AAIClientConfig.class,
+        SOClientConfig.class,
+        SlicingServiceImpl.class,
+        SlicingProperties.class,
+        DefaultServiceLcmService.class,
+    },
+    properties = {
+        "spring.main.web-application-type=none", // only temporary
+        "uui-server.client.aai.baseUrl=${wiremock.server.baseUrl}",
+        "uui-server.client.aai.username=AAI",
+        "uui-server.client.aai.password=AAI",
+        "uui-server.client.so.baseUrl=${wiremock.server.baseUrl}",
+        "uui-server.client.so.username=InfraPortalClient",
+        "uui-server.client.so.password=password1",
+        "uui-server.slicing.service-invariant-uuid=someServiceInvariantUuid",
+        "uui-server.slicing.service-uuid=someServiceUuid",
+        "uui-server.slicing.global-subscriber-id=someGlobalSubscriberId",
+        "uui-server.slicing.service-type=someServiceType",
+    })
+public class SlicingServiceImplIntegrationTest {
+
+    @MockBean ServiceLcmService serviceLcmService;
+    @Autowired AAISliceService aaiSliceService;
+    @Autowired SOSliceService soSliceService;
+    @Autowired SlicingProperties slicingProperties;
+
+    SlicingService slicingService;
+
+    @Value("${uui-server.client.so.username}")
+    String soUsername;
+
+    @Value("${uui-server.client.so.password}")
+    String soPassword;
+
+    @Value("${uui-server.client.aai.username}")
+    String aaiUsername;
+
+    @Value("${uui-server.client.aai.password}")
+    String aaiPassword;
+
+    @BeforeEach
+    void setup() {
+      slicingService = new SlicingServiceImpl(serviceLcmService,aaiSliceService,soSliceService, slicingProperties);
+    }
+
+    @Test
+    @SneakyThrows
+    void thatSORequestsAreCorrect() {
+        byte[] requestBytes = Files.readAllBytes(Paths.get("src/test/resources/__files/requests/submitOrdersRequest.json"));
+        String expectedRequestBody = new String(requestBytes, StandardCharsets.UTF_8);
+        stubFor(
+          post("/api/so-serviceInstances/v3")
+            .withBasicAuth(soUsername, soPassword)
+            .withHeader(HttpHeaders.ACCEPT, equalTo("application/json"))
+            .withHeader("X-TransactionId", equalTo("9999"))
+            .withHeader("X-FromAppId", equalTo("onap-cli"))
+            .withRequestBody(equalToJson(expectedRequestBody))
+            .willReturn(
+                aResponse().withBodyFile("submitOrdersResponse.json")
+            ));
+
+        SlicingOrder slicingOrder = new SlicingOrder();
+        SlicingOrderDetail detail = new SlicingOrderDetail();
+        detail.setLatency(10);
+        detail.setMaxNumberofUEs(10);
+        slicingOrder.setSlicing_order_info(detail);
+        ServiceResult serviceResult = slicingService.createSlicingService(slicingOrder);
+        ServiceCreateResult result = (ServiceCreateResult) serviceResult.getResult_body();
+        assertEquals("someServiceId", result.getService_id());
+        assertEquals("someOperationId", result.getOperation_id());
+    }
+
+    @Test
+    void thatSlicingOrdersCanBeListed() {
+        stubFor(
+            get(String.format("/api/aai-business/v13/customers/customer/%s/service-subscriptions/service-subscription/%s/service-instances?service-role=communication-service", "5GCustomer", "5G"))
+            .withBasicAuth(aaiUsername, aaiPassword)
+            .withHeader(HttpHeaders.ACCEPT, equalTo("application/json"))
+            .withHeader("X-TransactionId", equalTo("7777"))
+            .withHeader("X-FromAppId", equalTo("uui"))
+            .willReturn(
+                aResponse().withBodyFile("serviceInstancesResponse.json")
+            ));
+
+        ServiceResult result = slicingService.querySlicingOrderList(CsmfParamConstant.ALL, "1","10");
+
+        assertNotNull(result);
+        OrderList orderList = (OrderList) result.getResult_body();
+        assertEquals(2, orderList.getRecord_number());
+        OrderInfo orderInfo1 = orderList.getSlicing_order_list().get(0);
+        assertEquals("97740f7b-e205-48e9-819b-2ad997d78286", orderInfo1.getOrder_id());
+        assertEquals("1", orderInfo1.getOrder_index());
+        assertEquals("5G-smth", orderInfo1.getOrder_name());
+        assertEquals("Assigned", orderInfo1.getOrder_status());
+        assertEquals("General_Revenue-Bearing", orderInfo1.getService_snssai());
+        OrderInfo orderInfo2 = orderList.getSlicing_order_list().get(1);
+        assertEquals("97732f7b-e205-48e9-819b-2ad997d78286", orderInfo2.getOrder_id());
+        assertEquals("2", orderInfo2.getOrder_index());
+        assertEquals("5G-smth-else", orderInfo2.getOrder_name());
+        assertEquals("Assigned", orderInfo2.getOrder_status());
+        assertEquals("General_Revenue-Bearing", orderInfo2.getService_snssai());
+    }
+}
index 42258a3..0ed87f1 100644 (file)
@@ -44,6 +44,7 @@ import org.onap.usecaseui.server.bean.csmf.SlicingOrder;
 import org.onap.usecaseui.server.bean.csmf.SlicingOrderDetail;
 import org.onap.usecaseui.server.constant.nsmf.NsmfParamConstant;
 import org.onap.usecaseui.server.controller.IntentController;
+import org.onap.usecaseui.server.service.csmf.config.SlicingProperties;
 import org.onap.usecaseui.server.service.lcm.ServiceLcmService;
 import org.onap.usecaseui.server.service.lcm.impl.DefaultServiceLcmService;
 import org.onap.usecaseui.server.service.slicingdomain.aai.AAISliceService;
@@ -58,13 +59,15 @@ public class SlicingServiceImplTest {
     SOSliceService soSliceService;
     AAISliceService aaiSliceService;
     ServiceLcmService serviceLcmService;
+    SlicingProperties slicingProperties;
 
     @Before
     public void before() throws Exception {
         aaiSliceService = mock(AAISliceService.class);
         soSliceService = mock(SOSliceService.class);
         serviceLcmService = mock(DefaultServiceLcmService.class);
-        slicingService = new SlicingServiceImpl(aaiSliceService, soSliceService);
+        slicingProperties = mock(SlicingProperties.class);
+        slicingService = new SlicingServiceImpl(serviceLcmService, aaiSliceService, soSliceService, slicingProperties);
         MemberModifier.field(SlicingServiceImpl.class, "serviceLcmService").set(slicingService , serviceLcmService);
     }
 
index a1908a5..4050ac0 100644 (file)
@@ -45,19 +45,19 @@ import org.wiremock.spring.EnableWireMock;
     },
     properties = {
         "spring.main.web-application-type=none", // only temporary
-        "client.aai.baseUrl=${wiremock.server.baseUrl}",
-        "client.aai.username=AAI",
-        "client.aai.password=AAI"
+        "uui-server.client.aai.baseUrl=${wiremock.server.baseUrl}",
+        "uui-server.client.aai.username=AAI",
+        "uui-server.client.aai.password=AAI"
     })
 public class DefaultCustomerServiceIntegrationTest {
 
     @Autowired
     CustomerService customerService;
 
-    @Value("${client.aai.username}")
+    @Value("${uui-server.client.aai.username}")
     String username;
 
-    @Value("${client.aai.password}")
+    @Value("${uui-server.client.aai.password}")
     String password;
 
     @Test
index 1be495a..e04d7e3 100644 (file)
@@ -28,6 +28,7 @@ import org.onap.usecaseui.server.service.lcm.domain.so.bean.SaveOrUpdateOperatio
 import org.onap.usecaseui.server.service.lcm.domain.so.bean.ServiceOperation;
 import org.onap.usecaseui.server.service.lcm.domain.so.exceptions.SOException;
 
+import jakarta.persistence.EntityManagerFactory;
 import jakarta.servlet.ReadListener;
 import jakarta.servlet.ServletInputStream;
 import jakarta.servlet.http.HttpServletRequest;
@@ -41,18 +42,20 @@ import static org.onap.usecaseui.server.util.CallStub.failedCall;
 import static org.onap.usecaseui.server.util.CallStub.successfulCall;
 
 public class DefaultServiceLcmServiceTest {
-       
+
        private static final long serialVersionUID = 1L;
-       
+
+    private final EntityManagerFactory entityManagerFactory = mock(EntityManagerFactory.class);
+
         ServiceLcmService service = null;
-        
+
        @Before
        public void before() throws Exception {
                SOService soService = mock(SOService.class);
-               service = new DefaultServiceLcmService(soService);
+               service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
        }
-       
+
     @Test
     public void itCanInstantiateService() throws IOException {
         SOService soService = mock(SOService.class);
@@ -65,7 +68,7 @@ public class DefaultServiceLcmServiceTest {
 
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         Assert.assertSame(operation, service.instantiateService(request));
     }
@@ -104,7 +107,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.instantiateService(Mockito.any())).thenReturn(failedCall("SO is not available!"));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.instantiateService(request);
     }
@@ -115,7 +118,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.instantiateService(Mockito.any())).thenReturn(emptyBodyCall());
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.instantiateService(request);
     }
@@ -129,7 +132,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.terminateService(eq(serviceId), Mockito.any())).thenReturn(successfulCall(rsp));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         Assert.assertSame(rsp, service.terminateService(serviceId, request));
     }
@@ -141,7 +144,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.terminateService(eq(serviceId), Mockito.any())).thenReturn(failedCall("SO is not available!"));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.terminateService(serviceId, request);
     }
@@ -153,7 +156,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.terminateService(eq(serviceId), Mockito.any())).thenReturn(emptyBodyCall());
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.terminateService(serviceId, request);
     }
@@ -166,7 +169,7 @@ public class DefaultServiceLcmServiceTest {
         OperationProgressInformation progress = new OperationProgressInformation();
         when(soService.queryOperationProgress(serviceId, operationId)).thenReturn(successfulCall(progress));
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         Assert.assertSame(progress, service.queryOperationProgress(serviceId, operationId));
     }
@@ -178,7 +181,7 @@ public class DefaultServiceLcmServiceTest {
         String operationId = "1";
         when(soService.queryOperationProgress(serviceId, operationId)).thenReturn(failedCall("SO is not available!"));
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.queryOperationProgress(serviceId, operationId);
     }
@@ -190,11 +193,11 @@ public class DefaultServiceLcmServiceTest {
         String operationId = "1";
         when(soService.queryOperationProgress(serviceId, operationId)).thenReturn(emptyBodyCall());
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.queryOperationProgress(serviceId, operationId);
     }
-    
+
     @Test(expected = SOException.class)
     public void scaleServiceWillThrowExceptionWhenSOIsNotAvailable() throws IOException {
         SOService soService = mock(SOService.class);
@@ -202,7 +205,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.scaleService(eq(serviceId), Mockito.any())).thenReturn(failedCall("SO is not available!"));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.scaleService(serviceId, request);
     }
@@ -214,11 +217,11 @@ public class DefaultServiceLcmServiceTest {
         when(soService.scaleService(eq(serviceId), Mockito.any())).thenReturn(emptyBodyCall());
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.scaleService(serviceId, request);
     }
-    
+
     @Test
     public void itCanScaleService() throws IOException {
         SOService soService = mock(SOService.class);
@@ -228,11 +231,11 @@ public class DefaultServiceLcmServiceTest {
         when(soService.scaleService(eq(serviceId), Mockito.any())).thenReturn(successfulCall(rsp));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         Assert.assertSame(rsp, service.scaleService(serviceId, request));
     }
-    
+
     @Test(expected = SOException.class)
     public void updateServiceWillThrowExceptionWhenSOIsNotAvailable() throws IOException {
         SOService soService = mock(SOService.class);
@@ -240,7 +243,7 @@ public class DefaultServiceLcmServiceTest {
         when(soService.updateService(eq(serviceId), Mockito.any())).thenReturn(failedCall("SO is not available!"));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.updateService(serviceId, request);
     }
@@ -248,26 +251,28 @@ public class DefaultServiceLcmServiceTest {
     @Test(expected = SOException.class)
     public void updateServiceWillThrowExceptionWhenSOResponseError() throws IOException {
         SOService soService = mock(SOService.class);
+
         String serviceId = "1";
         when(soService.updateService(eq(serviceId), Mockito.any())).thenReturn(emptyBodyCall());
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         service.updateService(serviceId, request);
     }
-    
+
     @Test
     public void itCanUpdateService() throws IOException {
         SOService soService = mock(SOService.class);
+        EntityManagerFactory entityManagerFactory = mock(EntityManagerFactory.class);
         String serviceId = "1";
         SaveOrUpdateOperationRsp rsp = new SaveOrUpdateOperationRsp();
         rsp.setOperationId("1");
         when(soService.updateService(eq(serviceId), Mockito.any())).thenReturn(successfulCall(rsp));
         HttpServletRequest request = mockRequest();
 
-        ServiceLcmService service = new DefaultServiceLcmService(soService);
+        ServiceLcmService service = new DefaultServiceLcmService(entityManagerFactory, soService);
 
         Assert.assertSame(rsp, service.updateService(serviceId, request));
     }
-}
\ No newline at end of file
+}
diff --git a/server/src/test/resources/__files/requests/submitOrdersRequest.json b/server/src/test/resources/__files/requests/submitOrdersRequest.json
new file mode 100644 (file)
index 0000000..4610f54
--- /dev/null
@@ -0,0 +1,16 @@
+{
+  "service": {
+    "description": "",
+    "serviceInvariantUuid": "someServiceInvariantUuid",
+    "serviceUuid": "someServiceUuid",
+    "globalSubscriberId": "someGlobalSubscriberId",
+    "serviceType": "someServiceType",
+    "parameters": {
+      "requestInputs": {
+        "latency": 10,
+        "maxNumberofUEs": 10,
+        "useInterval": "20"
+      }
+    }
+  }
+}
diff --git a/server/src/test/resources/__files/serviceInstancesResponse.json b/server/src/test/resources/__files/serviceInstancesResponse.json
new file mode 100644 (file)
index 0000000..d3b14bb
--- /dev/null
@@ -0,0 +1,60 @@
+{
+  "service-instance": [
+    {
+      "service-instance-id": "97740f7b-e205-48e9-819b-2ad997d78286",
+      "service-instance-name": "5G-smth",
+      "service-type": "5G",
+      "environment-context": "General_Revenue-Bearing",
+      "workload-context": "Production",
+      "model-invariant-id": "f367053b-55ca-4074-9322-c102aed93f4f",
+      "model-version-id": "e70da80f-4df7-4be7-89c5-2ae4fdfd0f48",
+      "resource-version": "1699950946612",
+      "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/97740f7b-e205-48e9-819b-2ad997d78286/service-data/service-topology/",
+      "orchestration-status": "Assigned",
+      "input-parameters": "[]",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "owning-entity",
+            "relationship-label": "org.onap.relationships.inventory.BelongsTo",
+            "related-link": "/aai/v30/business/owning-entities/owning-entity/59d660dc-4aeb-4058-9bb9-c2bd2a0bcb72",
+            "relationship-data": [
+              {
+                "relationship-key": "owning-entity.owning-entity-id",
+                "relationship-value": "59d660dc-4aeb-4058-9bb9-c2bd2a0bcb72"
+              }
+            ]
+          }
+        ]
+      }
+    },
+    {
+      "service-instance-id": "97732f7b-e205-48e9-819b-2ad997d78286",
+      "service-instance-name": "5G-smth-else",
+      "service-type": "5G",
+      "environment-context": "General_Revenue-Bearing",
+      "workload-context": "Production",
+      "model-invariant-id": "f367053b-55ca-4074-9322-c102aed93f4f",
+      "model-version-id": "e70da80f-4df7-4be7-89c5-2ae4fdfd0f48",
+      "resource-version": "1699950946613",
+      "selflink": "restconf/config/GENERIC-RESOURCE-API:services/service/97732f7b-e205-48e9-819b-2ad997d78286/service-data/service-topology/",
+      "orchestration-status": "Assigned",
+      "input-parameters": "[]",
+      "relationship-list": {
+        "relationship": [
+          {
+            "related-to": "owning-entity",
+            "relationship-label": "org.onap.relationships.inventory.BelongsTo",
+            "related-link": "/aai/v30/business/owning-entities/owning-entity/59d660dc-4aeb-4058-9bb9-c2bd2a0bcb72",
+            "relationship-data": [
+              {
+                "relationship-key": "owning-entity.owning-entity-id",
+                "relationship-value": "59d660dc-4aeb-4058-9bb9-c2bd2a0bcb72"
+              }
+            ]
+          }
+        ]
+      }
+    }
+  ]
+}
diff --git a/server/src/test/resources/__files/submitOrdersResponse.json b/server/src/test/resources/__files/submitOrdersResponse.json
new file mode 100644 (file)
index 0000000..6ec838f
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "service": {
+    "serviceId": "someServiceId",
+    "operationId": "someOperationId"
+  }
+}