1 package org.onap.vid.controller;
4 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Network;
5 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.ServiceInstance;
6 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Vlan;
7 import org.onap.vid.aai.model.AaiGetNetworkCollectionDetails.Vnf;
8 import org.onap.vid.aai.util.ServiceInstanceStandardQuery;
9 import org.onap.vid.asdc.AsdcCatalogException;
10 import org.onap.vid.exceptions.GenericUncheckedException;
11 import org.onap.vid.model.ServiceModel;
12 import org.onap.vid.model.VidNotions;
13 import org.onap.vid.properties.Features;
14 import org.onap.vid.services.VidService;
15 import org.onap.vid.utils.Multival;
16 import org.springframework.beans.factory.annotation.Autowired;
17 import org.springframework.web.bind.annotation.RequestMapping;
18 import org.springframework.web.bind.annotation.RequestMethod;
19 import org.springframework.web.bind.annotation.RequestParam;
20 import org.springframework.web.bind.annotation.RestController;
21 import org.togglz.core.manager.FeatureManager;
23 import javax.servlet.http.HttpServletRequest;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.UUID;
28 import static java.util.stream.Collectors.toList;
32 @RequestMapping(AaiServiceInstanceStandardQueryController.AAI_STANDARD_QUERY)
33 public class AaiServiceInstanceStandardQueryController extends VidRestrictedBaseController {
35 public static final String AAI_STANDARD_QUERY = "aai/standardQuery";
37 private final ServiceInstanceStandardQuery serviceInstanceStandardQuery;
38 private final FeatureManager featureManager;
39 private final VidService sdcService;
42 public AaiServiceInstanceStandardQueryController(FeatureManager featureManager, ServiceInstanceStandardQuery serviceInstanceStandardQuery, VidService sdcService) {
43 this.featureManager = featureManager;
44 this.serviceInstanceStandardQuery = serviceInstanceStandardQuery;
45 this.sdcService = sdcService;
48 @RequestMapping(value = "vlansByNetworks", method = RequestMethod.GET)
49 public VlansByNetworksHierarchy getNetworksToVlansByServiceInstance(HttpServletRequest request,
50 @RequestParam("sdcModelUuid") UUID sdcModelUuid,
51 @RequestParam("globalCustomerId") String globalCustomerId,
52 @RequestParam("serviceType") String serviceType,
53 @RequestParam("serviceInstanceId") String serviceInstanceId
54 ) throws AsdcCatalogException {
55 if (!featureManager.isActive(Features.FLAG_PRESENT_PROVIDER_NETWORKS_ASSOCIATIONS)) {
56 return new VlansByNetworksHierarchy();
59 if (!isModelOf5g(sdcModelUuid)) {
60 return new VlansByNetworksHierarchy();
63 final ServiceInstance serviceInstance =
64 serviceInstanceStandardQuery.fetchServiceInstance(globalCustomerId, serviceType, serviceInstanceId);
66 Multival<ServiceInstance, Multival<Vnf, Multival<Network, Vlan>>> l3NetworksWithVlansForVnfForService = fetchVnfsForService(serviceInstance);
67 Multival<ServiceInstance, Multival<Network, Vlan>> l3NetworksWithVlansForService = fetchNetworksForService(serviceInstance);
69 // translate to response's format
70 return new VlansByNetworksHierarchy(
71 l3NetworksWithVlansForService.getValues().stream().map(this::translateNetworksFormat
74 l3NetworksWithVlansForVnfForService.getValues().stream().map(vnfWithNetworks ->
75 new VnfVlansByNetworks(vnfWithNetworks.getKey().getVnfId(),
76 vnfWithNetworks.getValues().stream().map(this::translateNetworksFormat
83 private Multival<ServiceInstance, Multival<Vnf, Multival<Network, Vlan>>> fetchVnfsForService(ServiceInstance serviceInstance) {
84 final Multival<ServiceInstance, Vnf> vnfsForService =
85 serviceInstanceStandardQuery.fetchRelatedVnfs(serviceInstance);
87 final Multival<ServiceInstance, Multival<Vnf, Network>> vnfsWithL3NetworksForService =
88 vnfsForService.mapEachVal(vnf -> serviceInstanceStandardQuery.fetchRelatedL3Networks("vnf", vnf));
90 return vnfsWithL3NetworksForService.mapEachVal(vnfMulti->
91 vnfMulti.mapEachVal(serviceInstanceStandardQuery::fetchRelatedVlanTags)
96 private Multival<ServiceInstance, Multival<Network, Vlan>> fetchNetworksForService(ServiceInstance serviceInstance) {
97 final Multival<ServiceInstance, Network> l3NetworksForService =
98 serviceInstanceStandardQuery.fetchRelatedL3Networks("service", serviceInstance);
100 return l3NetworksForService.mapEachVal(serviceInstanceStandardQuery::fetchRelatedVlanTags);
103 private NetworksToVlans translateNetworksFormat(Multival<Network, Vlan> networkWithVlan) {
104 return new NetworksToVlans(
105 networkWithVlan.getKey().getNetworkId(),
106 networkWithVlan.getKey().getNetworkName(),
107 networkWithVlan.getKey().getNetworkType(),
108 networkWithVlan.getKey().getOrchestrationStatus(),
109 networkWithVlan.getValues().stream().map(
110 vlan -> new NetworksToVlans.Vlan(vlan.getVlanIdInner())
115 protected boolean isModelOf5g(UUID sdcModelUuid) throws AsdcCatalogException {
116 final ServiceModel serviceModel = sdcService.getService(sdcModelUuid.toString());
117 if (serviceModel == null) {
118 throw new GenericUncheckedException("Internal error while fetching Service Model: " + sdcModelUuid);
120 VidNotions.ModelCategory serviceModelCategory = serviceModel.getService().getVidNotions().getModelCategory();
121 return serviceModelCategory.equals(VidNotions.ModelCategory.IS_5G_PROVIDER_NETWORK_MODEL) ||
122 serviceModelCategory.equals(VidNotions.ModelCategory.IS_5G_FABRIC_CONFIGURATION_MODEL);
125 protected static class VlansByNetworksHierarchy {
126 public final Collection<NetworksToVlans> serviceNetworks;
127 public final Collection<VnfVlansByNetworks> vnfNetworks;
129 public VlansByNetworksHierarchy() {
130 this(Collections.emptySet(), Collections.emptySet());
133 public VlansByNetworksHierarchy(Collection<NetworksToVlans> serviceNetworks, Collection<VnfVlansByNetworks> vnfNetworks) {
134 this.serviceNetworks = serviceNetworks;
135 this.vnfNetworks = vnfNetworks;
139 protected static class VnfVlansByNetworks {
140 public final String vnfId;
141 public final Collection<NetworksToVlans> networks;
143 public VnfVlansByNetworks(String vnfId, Collection<NetworksToVlans> networks) {
145 this.networks = networks;
149 protected static class NetworksToVlans {
150 public final String networkId;
151 public final String name;
152 public final String nodeType;
153 public final String nodeStatus;
154 public final Collection<Vlan> vlans;
156 private NetworksToVlans(String networkId, String name, String nodeType, String nodeStatus, Collection<Vlan> vlans) {
157 this.networkId = networkId;
159 this.nodeType = nodeType;
160 this.nodeStatus = nodeStatus;
164 private static class Vlan {
165 public final String vlanIdInner;
167 private Vlan(String vlanIdInner) {
168 this.vlanIdInner = vlanIdInner;