1271fd114f9bd1c95c300a7f058476c6f9c0691c
[smo/teiv.git] /
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Modifications Copyright (C) 2025 OpenInfra Foundation Europe
4  *  ================================================================================
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *  SPDX-License-Identifier: Apache-2.0
18  *  ============LICENSE_END=========================================================
19  */
20 package org.oran.smo.teiv.adapters.focom_to_teiv_adapter.service;
21
22 import com.fasterxml.jackson.core.type.TypeReference;
23 import com.fasterxml.jackson.databind.ObjectMapper;
24 import com.fasterxml.jackson.databind.SerializationFeature;
25 import lombok.extern.slf4j.Slf4j;
26 import org.nephio.focom.v1alpha1.FocomProvisioningRequest;
27 import org.oran.provisioning.o2ims.v1alpha1.ProvisioningRequest;
28 import org.oran.smo.teiv.adapters.focom_to_teiv_adapter.custom_resource_json.EntityAndRelationshipModel;
29 import org.oran.smo.teiv.adapters.focom_to_teiv_adapter.custom_resource_json.EntityItem;
30 import org.oran.smo.teiv.adapters.focom_to_teiv_adapter.custom_resource_json.RelationshipItem;
31
32 import org.springframework.stereotype.Component;
33
34 import java.io.IOException;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Map;
39
40
41 import static org.oran.smo.teiv.adapters.common.utils.Constants.ENTITY_OCLOUD_NAMESPACE;
42 import static org.oran.smo.teiv.adapters.common.utils.Constants.SMO_TEIV_CLOUD_PREFIX;
43 import static org.oran.smo.teiv.adapters.common.utils.Constants.ENTITY_NODE_CLUSTER;
44 import static org.oran.smo.teiv.adapters.common.utils.Constants.REL_DEPLOYED_ON;
45 import static org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder.buildEntityTypeName;
46 import static org.oran.smo.teiv.adapters.common.utils.TeivIdBuilder.buildTeivFocomRelationshipTypeName;
47
48 @Slf4j
49 @Component
50 public class FocomToTeivModelBuilder {
51
52     private final FocomProvisioningRequestService service;
53     private final EntityAndRelationshipModelService modelService;
54
55     public FocomToTeivModelBuilder(FocomProvisioningRequestService service,
56                                    EntityAndRelationshipModelService modelService) {
57         this.service = service;
58         this.modelService = modelService;
59     }
60
61     public Map<String, Object> getFocomtoTeivJson() throws IOException {
62
63         List<EntityItem> oCloudNamespaces = new ArrayList<>();
64         List<EntityItem> nodeClusters = new ArrayList<>();
65         List<RelationshipItem> deployOnRelationships = new ArrayList<>();
66
67         int index = 1;
68
69         List<FocomProvisioningRequest> focomRequests = service.getAllFocomProvisioningRequests();
70
71         for (FocomProvisioningRequest focomProvisioningRequest : focomRequests) {
72
73             validateProvisioningRequest(focomProvisioningRequest);
74
75             EntityItem oCloudNamespace = buildOCloudNamespace(focomProvisioningRequest, index);
76             oCloudNamespaces.add(oCloudNamespace);
77
78             EntityItem nodeCluster = buildNodeCluster(focomProvisioningRequest, index);
79             nodeClusters.add(nodeCluster);
80
81             RelationshipItem rel = modelService.getTeivRelationshipDeployOn(oCloudNamespace, nodeCluster, index);
82             deployOnRelationships.add(rel);
83
84             index++;
85         }
86
87         Map<String, List<EntityItem>> entities = new HashMap<>();
88         entities.put(
89                 buildEntityTypeName(SMO_TEIV_CLOUD_PREFIX, ENTITY_OCLOUD_NAMESPACE),
90                 oCloudNamespaces
91         );
92         entities.put(
93                 buildEntityTypeName(SMO_TEIV_CLOUD_PREFIX, ENTITY_NODE_CLUSTER),
94                 nodeClusters
95         );
96
97         Map<String, List<RelationshipItem>> relationships = new HashMap<>();
98         relationships.put(
99                 buildTeivFocomRelationshipTypeName(
100                         REL_DEPLOYED_ON,
101                         ENTITY_OCLOUD_NAMESPACE.toUpperCase(),
102                         ENTITY_NODE_CLUSTER.toUpperCase()
103                 ),
104                 deployOnRelationships
105         );
106
107         EntityAndRelationshipModel entityAndRelationshipModel = new EntityAndRelationshipModel();
108         entityAndRelationshipModel.setEntities(List.of(entities));
109         entityAndRelationshipModel.setRelationships(List.of(relationships));
110
111         ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
112         Map<String, Object> json = mapper.convertValue(entityAndRelationshipModel, new TypeReference<Map<String, Object>>() {
113         });
114
115         log.info(mapper.writeValueAsString(entityAndRelationshipModel));
116         return json;
117     }
118
119     private void validateProvisioningRequest(FocomProvisioningRequest focomProvisioningRequest) {
120         if (!"Fulfilled".equals(focomProvisioningRequest.getStatus().getPhase())) {
121             throw new RuntimeException("Requested Focomprovisioning request is not in Fulfilled phase");
122         }
123     }
124
125     private EntityItem buildOCloudNamespace(FocomProvisioningRequest focomProvisioningRequest, int index) {
126         String namespace = focomProvisioningRequest.getSpec().getOCloudNamespace();
127         return modelService.getOCloudNamespaceEntity(namespace, index);
128     }
129
130     private EntityItem buildNodeCluster(FocomProvisioningRequest focomProvisioningRequest, int index) {
131         ProvisioningRequest o2imsReq = service.getO2imsProvisioningRequest(focomProvisioningRequest.getMetadata().getName());
132
133         String clusterName = focomProvisioningRequest.getSpec().getTemplateParameters()
134                 .getAdditionalProperties()
135                 .get("clusterName")
136                 .toString();
137
138         String nodeClusterId = String.valueOf(o2imsReq.getStatus()
139                 .getProvisionedResourceSet()
140                 .getOCloudNodeClusterId());
141
142         return modelService.getNodeClusterEntity(clusterName, nodeClusterId, index);
143     }
144 }
145