Fix for VID-928: NullPointerException during deploy service instance with empty cds...
[vid.git] / vid-app-common / src / main / java / org / onap / vid / job / command / MsoRequestBuilder.kt
1 package org.onap.vid.job.command
2
3 import com.google.common.collect.ImmutableList
4 import org.apache.commons.lang3.ObjectUtils.defaultIfNull
5 import org.apache.commons.lang3.StringUtils
6 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate
7 import org.onap.vid.aai.AaiClientInterface
8 import org.onap.vid.aai.ExceptionWithRequestInfo
9 import org.onap.vid.aai.model.ResourceType
10 import org.onap.vid.changeManagement.RequestDetailsWrapper
11 import org.onap.vid.model.serviceInstantiation.*
12 import org.onap.vid.mso.model.*
13 import org.onap.vid.mso.model.BaseResourceInstantiationRequestDetails.*
14 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails.UserParamNameAndValue
15 import org.onap.vid.mso.rest.SubscriberInfo
16 import org.onap.vid.properties.Features
17 import org.onap.vid.services.AsyncInstantiationBusinessLogic
18 import org.onap.vid.services.CloudOwnerService
19 import org.onap.vid.services.UserParamsContainer
20 import org.springframework.beans.factory.annotation.Autowired
21 import org.springframework.stereotype.Service
22 import org.togglz.core.manager.FeatureManager
23 import java.util.*
24 import java.util.Collections.emptyList
25 import java.util.stream.Collectors
26
27 @Service
28 class MsoRequestBuilder
29 @Autowired constructor(private val asyncInstantiationBL: AsyncInstantiationBusinessLogic,
30                        private val cloudOwnerService: CloudOwnerService,
31                        private val aaiClient: AaiClientInterface,
32                        private val featureManager: FeatureManager) {
33
34     companion object {
35         private val LOGGER = EELFLoggerDelegate.getLogger(MsoRequestBuilder::class.java)
36         private const val VID_SOURCE = "VID"
37         private const val DISABLED_HOMING_VALUE = "none"
38     }
39
40     fun generateALaCarteServiceInstantiationRequest(payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String, userId: String): RequestDetailsWrapper<ServiceInstantiationRequestDetails> {
41         val userParams = generateUserParamList()
42
43         val requestParameters = ServiceInstantiationRequestDetails.RequestParameters(payload.subscriptionServiceType, true, userParams, payload.testApi)
44
45         val requestDetails = generateServiceInstantiationRequestDetails(payload, requestParameters, optimisticUniqueServiceInstanceName, userId)
46
47         return RequestDetailsWrapper(requestDetails)
48     }
49
50     fun generateServiceDeletionRequest(payload: ServiceInstantiation, userId: String): RequestDetailsWrapper<ServiceDeletionRequestDetails> {
51
52         val requestParameters = ServiceDeletionRequestDetails.RequestParameters(payload.isALaCarte, payload.testApi)
53
54         val requestInfo = ServiceDeletionRequestDetails.RequestInfo(
55                 VID_SOURCE,
56                 userId)
57
58         val requestDetails = ServiceDeletionRequestDetails(payload.modelInfo, requestInfo, requestParameters)
59
60         return RequestDetailsWrapper(requestDetails)
61     }
62
63     fun generateMacroServiceInstantiationRequest(jobId: UUID?, payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String, userId: String): RequestDetailsWrapper<ServiceInstantiationRequestDetails> {
64         val serviceInstanceName = generateServiceName(jobId, payload, optimisticUniqueServiceInstanceName)
65
66         val serviceInstantiationServiceList = generateMacroServiceInstantiationRequestParams(payload, serviceInstanceName, jobId)
67
68         val requestParameters = ServiceInstantiationRequestDetails.RequestParameters(payload.subscriptionServiceType, false, serviceInstantiationServiceList)
69
70         val requestDetails = generateServiceInstantiationRequestDetails(payload, requestParameters, serviceInstanceName, userId)
71
72         return RequestDetailsWrapper(requestDetails)
73     }
74
75     fun generateNetworkInstantiationRequest(networkDetails: Network, serviceModelInfo: ModelInfo, serviceInstanceId: String, userId: String, testApi: String?): RequestDetailsWrapper<NetworkInstantiationRequestDetails> {
76         val requestInfo = generateRequestInfo(networkDetails.instanceName, ResourceType.L3_NETWORK, networkDetails.isRollbackOnFailure, networkDetails.productFamilyId, userId)
77         val cloudConfiguration = generateCloudConfiguration(networkDetails.lcpCloudRegionId, networkDetails.tenantId)
78         val platform = Platform(networkDetails.platformName)
79         val lineOfBusiness = LineOfBusiness.of(networkDetails.lineOfBusiness)
80         val requestParameters = BaseResourceInstantiationRequestDetails.RequestParameters(generateUserParamList(), testApi)
81         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo))
82         return RequestDetailsWrapper(NetworkInstantiationRequestDetails(networkDetails.modelInfo, cloudConfiguration, requestInfo, platform, lineOfBusiness, relatedInstanceList, requestParameters))
83     }
84
85     fun generateVnfInstantiationRequest(vnfDetails: Vnf, serviceModelInfo: ModelInfo, serviceInstanceId: String, userId: String, testApi: String?): RequestDetailsWrapper<VnfInstantiationRequestDetails> {
86         val requestInfo = generateRequestInfo(vnfDetails.instanceName, ResourceType.GENERIC_VNF, vnfDetails.isRollbackOnFailure, vnfDetails.productFamilyId, userId)
87         val cloudConfiguration = generateCloudConfiguration(vnfDetails.lcpCloudRegionId, vnfDetails.tenantId)
88         val platform = Platform(vnfDetails.platformName)
89         val lineOfBusiness = LineOfBusiness.of(vnfDetails.lineOfBusiness)
90         val requestParameters = BaseResourceInstantiationRequestDetails.RequestParameters(generateUserParamList(), testApi)
91         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo))
92         return RequestDetailsWrapper(VnfInstantiationRequestDetails(vnfDetails.modelInfo, cloudConfiguration, requestInfo, platform, lineOfBusiness, relatedInstanceList, requestParameters))
93     }
94
95     fun generateDeleteVnfRequest(vnfDetails: Vnf, userId: String): RequestDetailsWrapper<VnfInstantiationRequestDetails> {
96         val requestInfo = generateRequestInfo(null, null, null, null, userId)
97         val cloudConfiguration = generateCloudConfiguration(vnfDetails.lcpCloudRegionId, vnfDetails.tenantId)
98         return RequestDetailsWrapper(VnfInstantiationRequestDetails(vnfDetails.modelInfo, cloudConfiguration, requestInfo, null, null, null, null))
99     }
100
101     protected fun generateVfModuleRequestWithRequestParams(
102             vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
103             serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String, vgInstanceId: String?, userId: String,
104             requestParameters: (userParams: List<UserParamTypes>) -> RequestParametersVfModuleOrVolumeGroup
105     ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
106         val requestInfo = generateRequestInfo(vfModuleDetails.instanceName, ResourceType.VF_MODULE, vfModuleDetails.isRollbackOnFailure, null, userId)
107
108         //cloud configuration
109         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
110
111         val userParams = UserParamsContainer(extractActualInstanceParams(vfModuleDetails.instanceParams), vfModuleDetails.supplementaryParams)
112
113         //related instance list
114         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
115         if (StringUtils.isNotEmpty(vgInstanceId)) {
116             val volumeGroupModel = ModelInfo()
117             volumeGroupModel.modelType = "volumeGroup"
118             relatedInstanceList.add(RelatedInstance(volumeGroupModel, vgInstanceId, vfModuleDetails.volumeGroupInstanceName))
119         }
120
121         return RequestDetailsWrapper(VfModuleOrVolumeGroupRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, relatedInstanceList, requestParameters(userParams.toALaCarte())))
122     }
123
124     fun generateVfModuleInstantiationRequest(
125             vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
126             serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String,
127             vgInstanceId: String?, userId: String, testApi: String?
128     ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
129         val requestParameters = { userParams: List<UserParamTypes> ->
130             RequestParametersVfModuleOrVolumeGroupInstantiation(userParams, vfModuleDetails.isUsePreload, testApi)
131         }
132
133         return generateVfModuleRequestWithRequestParams(vfModuleDetails, serviceModelInfo, serviceInstanceId,
134                 vnfModelInfo, vnfInstanceId, vgInstanceId, userId, requestParameters)
135     }
136
137     fun generateVfModuleReplaceRequest(
138             vfModuleDetails: VfModule, serviceModelInfo: ModelInfo,
139             serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String,
140             vgInstanceId: String?, userId: String, testApi: String?
141     ): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
142         val requestParameters = { userParams: List<UserParamTypes> ->
143             RequestParametersVfModuleUpgrade(userParams, vfModuleDetails.isUsePreload, testApi,
144                     vfModuleDetails.isRetainAssignments, nullSafeNegate(vfModuleDetails.isRetainVolumeGroups))
145         }
146
147         return generateVfModuleRequestWithRequestParams(vfModuleDetails, serviceModelInfo, serviceInstanceId,
148                 vnfModelInfo, vnfInstanceId, vgInstanceId, userId, requestParameters)
149     }
150
151     private fun nullSafeNegate(booleanValue: Boolean?): Boolean? = booleanValue?.not()
152
153     fun generateVolumeGroupInstantiationRequest(vfModuleDetails: VfModule, serviceModelInfo: ModelInfo, serviceInstanceId: String, vnfModelInfo: ModelInfo, vnfInstanceId: String, userId: String, testApi: String?): RequestDetailsWrapper<VolumeGroupRequestDetails> {
154         val requestInfo = generateRequestInfo(vfModuleDetails.volumeGroupInstanceName, ResourceType.VOLUME_GROUP, vfModuleDetails.isRollbackOnFailure, null, userId)
155         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
156         val userParams = UserParamsContainer(extractActualInstanceParams(vfModuleDetails.instanceParams), vfModuleDetails.supplementaryParams)
157         val requestParameters = RequestParametersVfModuleOrVolumeGroupInstantiation(userParams.toALaCarte(), vfModuleDetails.isUsePreload, testApi)
158         val relatedInstances = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo, vnfInstanceId to vnfModelInfo))
159
160         vfModuleDetails.modelInfo.modelType = "volumeGroup"
161         return RequestDetailsWrapper(VolumeGroupRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, relatedInstances, requestParameters))
162     }
163
164     fun generateInstanceGroupInstantiationRequest(instanceGroupDetails: InstanceGroup, serviceModelInfo: ModelInfo, serviceInstanceId: String, userId: String, testApi: String?): RequestDetailsWrapper<InstanceGroupInstantiationRequestDetails> {
165         val requestInfo = generateRequestInfo(instanceGroupDetails.instanceName, ResourceType.INSTANCE_GROUP, instanceGroupDetails.isRollbackOnFailure, null, userId)
166         val requestParameters = BaseResourceInstantiationRequestDetails.RequestParameters(generateUserParamList(), testApi)
167         val relatedInstanceList = generateRelatedInstances(mapOf(serviceInstanceId to serviceModelInfo))
168         return RequestDetailsWrapper(InstanceGroupInstantiationRequestDetails(instanceGroupDetails.modelInfo, requestInfo, relatedInstanceList, requestParameters))
169     }
170
171     fun generateInstanceGroupMemberRequest(instanceGroupMemberId: String, userId: String): RequestDetailsWrapper<AddOrRemoveInstanceGroupMemberRequestDetails> {
172         val requestInfo = generateRequestInfo(null, null, null, null, userId)
173         val modelInfo = ModelInfo()
174         modelInfo.modelType = "vnf"
175         val relatedInstanceList = generateRelatedInstances(mapOf(instanceGroupMemberId to modelInfo))
176         return RequestDetailsWrapper(AddOrRemoveInstanceGroupMemberRequestDetails(requestInfo, relatedInstanceList))
177     }
178
179     fun generateDeleteNetworkRequest(networkDetails: Network, userId: String): RequestDetailsWrapper<NetworkInstantiationRequestDetails> {
180         val requestInfo = generateRequestInfo(null, null, null, null, userId)
181         val cloudConfiguration = generateCloudConfiguration(networkDetails.lcpCloudRegionId, networkDetails.tenantId)
182         return RequestDetailsWrapper(NetworkInstantiationRequestDetails(networkDetails.modelInfo, cloudConfiguration, requestInfo, null, null, null, null))
183     }
184
185     fun generateDeleteVfModuleRequest(vfModuleDetails: VfModule, userId: String): RequestDetailsWrapper<VfModuleOrVolumeGroupRequestDetails> {
186         val requestInfo = generateRequestInfo(null, null, null, null, userId)
187         val cloudConfiguration = generateCloudConfiguration(vfModuleDetails.lcpCloudRegionId, vfModuleDetails.tenantId)
188         return RequestDetailsWrapper(VfModuleOrVolumeGroupRequestDetails(vfModuleDetails.modelInfo, cloudConfiguration, requestInfo, null, null))
189     }
190
191     private fun generateServiceName(jobId: UUID?, payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String): String? {
192         var serviceInstanceName: String
193         if (StringUtils.isEmpty(optimisticUniqueServiceInstanceName)) {
194             serviceInstanceName = payload.modelInfo.modelName
195         } else {
196             serviceInstanceName = optimisticUniqueServiceInstanceName
197         }
198         return peekServiceName(jobId, payload, serviceInstanceName)
199     }
200
201     private fun peekServiceName(jobId: UUID?, payload: ServiceInstantiation, optimisticUniqueServiceInstanceName: String): String {
202         val serviceInstanceName: String
203         // unique name already exist in service info. If it's free in AAI we use it
204         if (isNameFreeInAai(optimisticUniqueServiceInstanceName, ResourceType.SERVICE_INSTANCE)) {
205             serviceInstanceName = optimisticUniqueServiceInstanceName
206         } else {
207             serviceInstanceName = asyncInstantiationBL.getUniqueName(optimisticUniqueServiceInstanceName, ResourceType.SERVICE_INSTANCE)
208         }//otherwise we used the original service instance name (from payload) to get a new unique name from DB and AAI
209
210         //update serviceInfo with new name if needed
211         try {
212             asyncInstantiationBL.updateServiceInfo(jobId) { x -> x.serviceInstanceName = serviceInstanceName }
213         } catch (e: Exception) {
214             LOGGER.error("Failed updating service name {} in serviceInfo", serviceInstanceName, e)
215         }
216
217         return serviceInstanceName
218     }
219
220     @Throws(ExceptionWithRequestInfo::class)
221     private fun isNameFreeInAai(name: String, resourceType: ResourceType): Boolean {
222         return !aaiClient.isNodeTypeExistsByName(name, resourceType)
223     }
224
225     private fun generateServiceInstantiationServicesList(payload: ServiceInstantiation, serviceInstanceName: String?, vnfList: List<ServiceInstantiationRequestDetails.ServiceInstantiationVnf>, pnfList: List<ServiceInstantiationRequestDetails.ServiceInstantiationPnf>): List<ServiceInstantiationRequestDetails.ServiceInstantiationService> {
226         val serviceInstantiationServiceList = LinkedList<ServiceInstantiationRequestDetails.ServiceInstantiationService>()
227         val unFilteredInstanceParams = defaultIfNull<List<MutableMap<String, String>>>(payload.instanceParams, emptyList())
228         val filteredInstanceParams = removeUnNeededParams(unFilteredInstanceParams)
229         val serviceInstantiationService = ServiceInstantiationRequestDetails.ServiceInstantiationService(
230                 payload.modelInfo,
231                 serviceInstanceName,
232                 filteredInstanceParams,
233                 vnfList,
234                 pnfList
235         )
236         serviceInstantiationServiceList.add(serviceInstantiationService)
237         return serviceInstantiationServiceList
238     }
239
240     private fun removeUnNeededParams(instanceParams: List<MutableMap<String, String>>?): List<MutableMap<String, String>> {
241         val keysToRemove = mutableListOf<String>()
242         if (instanceParams.isNullOrEmpty()) {
243             return emptyList()
244         }
245
246         for (key in instanceParams[0].keys) {
247             for (paramToIgnore in AsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE)
248                 if (key.equals(paramToIgnore, ignoreCase = true)) {
249                     keysToRemove.add(key)
250                 }
251         }
252
253         val result: MutableMap<String, String> = mutableMapOf();
254         instanceParams[0].entries.stream()
255                 .filter { entry -> !keysToRemove.contains(entry.key) }
256                 .forEach { t -> result.put(t.key, t.value) }
257
258         return if (result.isEmpty()) emptyList() else listOf(result)
259     }
260
261     private fun createServiceInstantiationVnfList(jobId: UUID?, payload: ServiceInstantiation): List<ServiceInstantiationRequestDetails.ServiceInstantiationVnf> {
262         val cloudConfiguration = generateCloudConfiguration(payload.lcpCloudRegionId, payload.tenantId)
263         val isBulk = asyncInstantiationBL.isPartOfBulk(jobId)
264
265         val vnfs = payload.vnfs
266         val vnfList = mutableListOf<ServiceInstantiationRequestDetails.ServiceInstantiationVnf>()
267         for (vnf in vnfs.values) {
268             val vfModules = vnf.vfModules
269             val convertedUnFilteredVfModules = convertVfModuleMapToList(vfModules)
270             val filteredVfModules = filterInstanceParamsFromVfModuleAndUniqueNames(convertedUnFilteredVfModules, isBulk)
271             val serviceInstantiationVnf = ServiceInstantiationRequestDetails.ServiceInstantiationVnf(
272                     vnf.modelInfo,
273                     cloudConfiguration,
274                     vnf.platformName,
275                     vnf.lineOfBusiness,
276                     payload.productFamilyId,
277                     buildVnfInstanceParams(vnf.instanceParams, filteredVfModules),
278                     filteredVfModules,
279                     getUniqueNameIfNeeded(vnf.instanceName, ResourceType.GENERIC_VNF, isBulk)
280             )
281             vnfList.add(serviceInstantiationVnf)
282         }
283
284         return vnfList;
285     }
286
287     private fun createServiceInstantiationPnfList(jobId: UUID?, payload: ServiceInstantiation): List<ServiceInstantiationRequestDetails.ServiceInstantiationPnf> {
288         val isBulk = asyncInstantiationBL.isPartOfBulk(jobId)
289
290         val pnfs = payload.pnfs
291         val pnfList = mutableListOf<ServiceInstantiationRequestDetails.ServiceInstantiationPnf>()
292         for (pnf in pnfs.values) {
293             val serviceInstantiationPnf = ServiceInstantiationRequestDetails.ServiceInstantiationPnf(
294                     pnf.modelInfo,
295                     pnf.platformName,
296                     pnf.lineOfBusiness,
297                     payload.productFamilyId,
298                     buildPnfInstanceParams(pnf.instanceParams),
299                     getUniqueNameIfNeeded(pnf.instanceName, ResourceType.PNF, isBulk)
300             )
301             pnfList.add(serviceInstantiationPnf)
302         }
303
304         return pnfList;
305     }
306
307     private fun convertVfModuleMapToList(vfModules: Map<String, Map<String, VfModule>>): List<VfModuleMacro> {
308         return vfModules.values.stream().flatMap { vfModule ->
309             vfModule.values.stream().map { item ->
310                 val userParams = UserParamsContainer(extractActualInstanceParams(item.instanceParams), item.supplementaryParams)
311
312                 VfModuleMacro(
313                         item.modelInfo,
314                         item.instanceName,
315                         item.volumeGroupInstanceName,
316                         userParams.toMacroPost1806())
317             }
318         }.collect(Collectors.toList<VfModuleMacro>())
319     }
320
321     //Make sure we always get a one Map from InstanceParams
322     private fun extractActualInstanceParams(originalInstanceParams: List<MutableMap<String, String>>?): MutableMap<String, String> {
323         return if (originalInstanceParams.isNullOrEmpty() || originalInstanceParams[0].isNullOrEmpty()) {
324             mutableMapOf()
325         } else originalInstanceParams[0]
326     }
327
328     private fun filterInstanceParamsFromVfModuleAndUniqueNames(unFilteredVfModules: List<VfModuleMacro>, isBulk: Boolean): List<VfModuleMacro> {
329         return unFilteredVfModules.stream().map { vfModule ->
330             VfModuleMacro(
331                     vfModule.modelInfo,
332                     getUniqueNameIfNeeded(vfModule.instanceName, ResourceType.VF_MODULE, isBulk),
333                     getUniqueNameIfNeeded(vfModule.volumeGroupInstanceName, ResourceType.VOLUME_GROUP, isBulk),
334                     removeUnNeededParams(vfModule.instanceParams))
335         }
336                 .collect(Collectors.toList<VfModuleMacro>())
337     }
338
339     fun buildVnfInstanceParams(currentVnfInstanceParams: List<MutableMap<String, String>>, vfModules: List<VfModuleMacro>): List<Map<String, String>> {
340         val filteredVnfInstanceParams = removeUnNeededParams(currentVnfInstanceParams)
341
342         val vnfInstanceParams = extractActualInstanceParams(filteredVnfInstanceParams)
343         vfModules.stream()
344                 .map { x -> extractActualInstanceParams(x.instanceParams) }
345                 .forEach { vnfInstanceParams.putAll(it) }
346         return if (vnfInstanceParams.isEmpty()) emptyList() else ImmutableList.of(vnfInstanceParams)
347     }
348
349     fun buildPnfInstanceParams(currentPnfInstanceParams: List<MutableMap<String, String>>): List<Map<String, String>> {
350         val filteredPnfInstanceParams = removeUnNeededParams(currentPnfInstanceParams)
351
352         val pnfInstanceParams = extractActualInstanceParams(filteredPnfInstanceParams)
353         return if (pnfInstanceParams.isEmpty()) emptyList() else ImmutableList.of(pnfInstanceParams)
354     }
355
356     private fun generateServiceInstantiationRequestDetails(payload: ServiceInstantiation, requestParameters: ServiceInstantiationRequestDetails.RequestParameters, serviceInstanceName: String?, userId: String): ServiceInstantiationRequestDetails {
357         val requestInfo = ServiceInstantiationRequestDetails.RequestInfo(serviceInstanceName,
358                 payload.productFamilyId,
359                 VID_SOURCE,
360                 payload.isRollbackOnFailure,
361                 userId)
362         val owningEntity = ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity(payload.owningEntityId, payload.owningEntityName)
363         val subscriberInfo = generateSubscriberInfo(payload)
364         val project = if (payload.projectName != null) ServiceInstantiationRequestDetails.Project(payload.projectName) else null
365         return ServiceInstantiationRequestDetails(payload.modelInfo, owningEntity, subscriberInfo, project, requestInfo, requestParameters)
366     }
367
368     private fun generateSubscriberInfo(payload: ServiceInstantiation): SubscriberInfo {
369         val subscriberInfo = SubscriberInfo()
370         subscriberInfo.globalSubscriberId = payload.globalSubscriberId
371         return subscriberInfo
372     }
373
374     private fun generateCloudConfiguration(lcpCloudRegionId: String?, tenantId: String?): CloudConfiguration? {
375
376         if (lcpCloudRegionId.isNullOrEmpty()) return null
377
378         val cloudConfiguration = CloudConfiguration(lcpCloudRegionId, tenantId)
379         cloudOwnerService.enrichCloudConfigurationWithCloudOwner(cloudConfiguration, lcpCloudRegionId)
380
381         return cloudConfiguration
382     }
383
384     private fun generateRelatedInstances(relatedInstances: Map<String, ModelInfo>): MutableList<RelatedInstance> {
385         return relatedInstances.entries.stream()
386                 .map { RelatedInstance(it.value, it.key) }
387                 .collect(Collectors.toList())
388     }
389
390     private fun generateRequestInfo(instanceName: String?, resourceType: ResourceType?, rollbackOnFailure: Boolean?, productFamilyId: String?, userId: String): BaseResourceInstantiationRequestDetails.RequestInfo {
391         return BaseResourceInstantiationRequestDetails.RequestInfo(
392                 if (resourceType == null) null else getUniqueNameIfNeeded(instanceName, resourceType, false),
393                 productFamilyId,
394                 VID_SOURCE,
395                 rollbackOnFailure,
396                 userId)
397
398     }
399
400     private fun getUniqueNameIfNeeded(name: String?, resourceType: ResourceType, isBulk: Boolean): String? {
401         return if (StringUtils.isNotEmpty(name)) {
402             if (isBulk) asyncInstantiationBL.getUniqueName(name, resourceType) else name
403         } else {
404             null
405         }
406     }
407
408     private fun generateUserParamList(): List<UserParamNameAndValue> {
409         return emptyList()
410     }
411
412     fun generateMacroServicePre1806InstantiationRequest(payload: ServiceInstantiation, userId: String): RequestDetailsWrapper<ServiceInstantiationRequestDetails> {
413         val requestInfo = ServiceInstantiationRequestDetails.RequestInfo(payload.instanceName, payload.productFamilyId, VID_SOURCE, payload.isRollbackOnFailure, userId)
414         val userParams = UserParamsContainer(generateSingleMapFromInstanceParams(payload.instanceParams), emptyList())
415         val requestParameters = ServiceInstantiationRequestDetails.RequestParameters(payload.subscriptionServiceType, false, userParams.toMacroPre1806())
416         val subscriberInfo = generateSubscriberInfoPre1806(payload)
417         val project = if (payload.projectName != null) ServiceInstantiationRequestDetails.Project(payload.projectName) else null
418         val owningEntity = ServiceInstantiationRequestDetails.ServiceInstantiationOwningEntity(payload.owningEntityId, payload.owningEntityName)
419         val cloudConfiguration = generateCloudConfiguration(payload.lcpCloudRegionId, payload.tenantId)
420         val relatedInstanceList = generateRelatedInstanceListForVrfEntry(payload.vrfs)
421
422         return RequestDetailsWrapper(ServiceInstantiationPre1806RequestDetails(
423                 payload.modelInfo,
424                 owningEntity,
425                 subscriberInfo,
426                 project,
427                 requestInfo,
428                 requestParameters,
429                 cloudConfiguration,
430                 relatedInstanceList))
431     }
432
433     private fun generateSingleMapFromInstanceParams(instanceParams: List<Map<String, String>>): Map<String, String> {
434         return if (instanceParams.isNullOrEmpty()) emptyMap() else instanceParams[0]
435     }
436
437     private fun generateSubscriberInfoPre1806(payload: ServiceInstantiation): SubscriberInfo {
438         val subscriberInfo = SubscriberInfo()
439         subscriberInfo.globalSubscriberId = payload.globalSubscriberId
440         subscriberInfo.subscriberName = payload.subscriberName
441         return subscriberInfo
442     }
443
444     private fun generateRelatedInstanceListForVrfEntry(vrfEntries: MutableMap<String, VrfEntry>): List<RelatedInstance> {
445         //fe send map of vrfs, with maps of networks and vpns, but actually we expect to only one vpn and one network
446         return if (vrfEntries.isEmpty() || vrfEntries.values.first().vpns.isEmpty() || vrfEntries.values.first().networks.isEmpty()) emptyList()
447         else {
448             val vpn = vrfEntries.values.first().vpns.values.first()
449             val network = vrfEntries.values.first().networks.values.first()
450             listOf(vpn, network).map { RelatedInstance(it.modelInfo, it.instanceId, it.instanceName) }
451         }
452     }
453
454     private fun generateMacroServiceInstantiationRequestParams(payload: ServiceInstantiation, serviceInstanceName: String?, jobId: UUID?): List<UserParamTypes> {
455         val userParams = generateServiceInstantiationServicesList(
456                 payload,
457                 serviceInstanceName,
458                 createServiceInstantiationVnfList(jobId, payload),
459                 createServiceInstantiationPnfList(jobId, payload)
460         )
461
462         return userParams.plus(homingSolution())
463     }
464
465     private fun homingSolution(): List<UserParamTypes> {
466         return if (featureManager.isActive(Features.FLAG_DISABLE_HOMING)) {
467             listOf(ServiceInstantiationRequestDetails.HomingSolution(DISABLED_HOMING_VALUE))
468         } else {
469             listOf()
470         }
471     }
472 }