Merge "Refactor, fix code formatting and add unittests"
[dcaegen2/platform.git] / mod2 / catalog-service / src / main / java / org / onap / dcaegen2 / platform / mod / web / service / specification / SpecificationServiceImpl.java
1 /*
2  * ============LICENSE_START=======================================================
3  *  org.onap.dcae
4  *  ================================================================================
5  *  Copyright (c) 2020 AT&T Intellectual Property. All rights reserved.
6  *  ================================================================================
7  *  Licensed under the Apache License, Version 2.0 (the "License");
8  *  you may not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  *
11  *       http://www.apache.org/licenses/LICENSE-2.0
12  *
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS,
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  *  ============LICENSE_END=========================================================
19  */
20
21 package org.onap.dcaegen2.platform.mod.web.service.specification;
22
23 import org.onap.dcaegen2.platform.mod.model.microserviceinstance.MsInstance;
24 import org.onap.dcaegen2.platform.mod.model.microserviceinstance.MsInstanceStatus;
25 import org.onap.dcaegen2.platform.mod.model.restapi.SpecificationRequest;
26 import org.onap.dcaegen2.platform.mod.model.specification.Specification;
27 import org.onap.dcaegen2.platform.mod.model.specification.SpecificationStatus;
28 import org.onap.dcaegen2.platform.mod.web.service.microserviceinstance.MsInstanceService;
29 import lombok.Setter;
30 import org.springframework.beans.factory.annotation.Autowired;
31 import org.springframework.stereotype.Service;
32 import org.springframework.transaction.annotation.Transactional;
33
34 import java.util.Date;
35 import java.util.HashMap;
36 import java.util.List;
37 import java.util.Map;
38
39 /**
40  * Specification Service implementation
41  */
42 @Service
43 @Setter
44 public class SpecificationServiceImpl implements SpecificationService {
45
46     @Autowired
47     private SpecificationGateway specificationGateway;
48
49     @Autowired
50     private MsInstanceService msInstanceService;
51
52     @Autowired
53     private SpecificationValidatorService specificationValidatorService;
54
55     /**
56      * Lists all Ms Instances
57      * @param id
58      * @return
59      */
60     @Override
61     public List<Specification> getAllSpecsByMsInstanceId(String id) {
62         return specificationGateway.getSpecificationByMsInstanceId(id);
63     }
64
65     /**
66      * creates a Specification
67      * @param msInstanceId
68      * @param request
69      * @return
70      */
71     @Override
72     @Transactional
73     public Specification createSpecification(String msInstanceId, SpecificationRequest request) {
74         MsInstance msInstance = msInstanceService.getMsInstanceById(msInstanceId);
75         specificationValidatorService.validateSpecForRelease(request, msInstance.getRelease());
76         Specification newSpec = createSpecification(request, msInstance);
77         makePreviousSpecInactive(msInstance);
78         Specification savedSpec = specificationGateway.save(newSpec);
79         updateMsInstance(msInstance, savedSpec);
80         return savedSpec;
81     }
82
83     private Specification createSpecification(SpecificationRequest request, MsInstance msInstance) {
84         return Specification.builder()
85                 .status(SpecificationStatus.ACTIVE)
86                 .specContent(request.getSpecContent())
87                 .policyJson(request.getPolicyJson())
88                 .type(request.getType())
89                 .metadata(getMetadata(request))
90                 .msInstanceInfo(buildMsInstanceInfo(msInstance))
91                 .build();
92     }
93
94     private void updateMsInstance(MsInstance msInstance, Specification savedSpecification) {
95         msInstance.setActiveSpec(savedSpecification);
96         msInstance.setStatus(MsInstanceStatus.IN_DEV);
97         msInstanceService.updateMsInstance(msInstance);
98     }
99
100     private void makePreviousSpecInactive(MsInstance msInstance) {
101         if (msInstance.getActiveSpec() != null) {
102             msInstance.getActiveSpec().setStatus(SpecificationStatus.INACTIVE);
103             specificationGateway.save(msInstance.getActiveSpec());
104         }
105     }
106
107     private Map<String, Object> getMetadata(SpecificationRequest request) {
108         Map<String, Object> metadata = request.getMetadata();
109         metadata.put("createdBy", request.getUser());
110         metadata.put("createdOn", new Date());
111         return metadata;
112     }
113
114     private Map<String, Object> buildMsInstanceInfo(MsInstance msInstance) {
115         Map<String, Object> msInstanceInfo = new HashMap<>();
116         msInstanceInfo.put("id", msInstance.getId());
117         msInstanceInfo.put("name", msInstance.getName());
118         msInstanceInfo.put("release", msInstance.getRelease());
119         return msInstanceInfo;
120     }
121
122     /**
123      * Updates a MsInstance reference in a Specification record
124      * @param msInstance
125      */
126     @Override
127     @Transactional
128     public void updateMsInstanceRef(MsInstance msInstance) {
129         List<Specification> specifications = getAllSpecsByMsInstanceId(msInstance.getId());
130         specifications.forEach((specification) ->{
131             specification.getMsInstanceInfo().put("name", msInstance.getName());
132             specification.getMsInstanceInfo().put("release", msInstance.getRelease());
133             specificationGateway.save(specification);
134         });
135     }
136
137
138 }