Merge "Step version for release"
[portal/nonrtric-controlpanel.git] / webapp-backend / src / test / java / org / oransc / portal / nonrtric / controlpanel / config / PolicyControllerMockConfiguration.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2019 Nordix Foundation
6  * Modifications Copyright (C) 2020 Nordix Foundation
7  * %%
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ========================LICENSE_END===================================
20  */
21 package org.oransc.portal.nonrtric.controlpanel.config;
22
23 import com.google.gson.GsonBuilder;
24
25 import java.io.BufferedReader;
26 import java.io.InputStream;
27 import java.io.InputStreamReader;
28 import java.lang.invoke.MethodHandles;
29 import java.util.ArrayList;
30 import java.util.Collection;
31 import java.util.HashMap;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Optional;
35 import java.util.Vector;
36 import java.util.stream.Collectors;
37
38 import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo;
39 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo;
40 import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances;
41 import org.oransc.portal.nonrtric.controlpanel.model.PolicyType;
42 import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes;
43 import org.oransc.portal.nonrtric.controlpanel.policyagentapi.PolicyAgentApi;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.springframework.boot.test.context.TestConfiguration;
47 import org.springframework.context.annotation.Bean;
48 import org.springframework.http.HttpStatus;
49 import org.springframework.http.ResponseEntity;
50 import org.springframework.web.client.RestClientException;
51
52 /**
53  * Creates a mock implementation of the policy controller client API.
54  */
55 @TestConfiguration
56 public class PolicyControllerMockConfiguration {
57
58     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
59
60     private static com.google.gson.Gson gson = new GsonBuilder() //
61         .serializeNulls() //
62         .create(); //
63
64     @Bean
65     public PolicyAgentApi policyAgentApi() {
66         MockPolicyAgentApi apiClient = new MockPolicyAgentApi();
67         return apiClient;
68     }
69
70     class MockPolicyAgentApi implements PolicyAgentApi {
71         private final Database database = new Database();
72
73         @Override
74         public ResponseEntity<Object> getPolicyInstance(String id) {
75             return new ResponseEntity<>(database.getInstance(id), HttpStatus.OK);
76         }
77
78         @Override
79         public ResponseEntity<String> putPolicy(String policyTypeIdString, String policyInstanceId, Object json,
80             String ric) {
81             database.putInstance(policyTypeIdString, policyInstanceId, json, ric);
82             return new ResponseEntity<>(HttpStatus.OK);
83         }
84
85         @Override
86         public ResponseEntity<String> deletePolicy(String policyInstanceId) {
87             database.deleteInstance(policyInstanceId);
88             return new ResponseEntity<>(HttpStatus.OK);
89         }
90
91         @Override
92         public ResponseEntity<String> getAllPolicyTypes() {
93             PolicyTypes result = new PolicyTypes();
94             result.addAll(database.getTypes());
95             return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
96         }
97
98         @Override
99         public ResponseEntity<String> getPolicyInstancesForType(String type) {
100             PolicyInstances result = new PolicyInstances();
101             List<PolicyInfo> inst = database.getInstances(Optional.of(type));
102             result.addAll(inst);
103             return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
104         }
105
106         @Override
107         public ResponseEntity<String> getRicsSupportingType(String typeName) {
108             Vector<String> res = new Vector<>();
109             res.add("ric_1");
110             res.add("ric_2");
111             res.add("ric_3");
112             return new ResponseEntity<>(gson.toJson(res), HttpStatus.OK);
113         }
114     }
115
116     class Database {
117
118         Database() {
119             PolicyType policyType = new PolicyType("", "{}");
120             types.put("", policyType);
121
122             String schema = getStringFromFile("demo-policy-schema-1.json");
123             policyType = new PolicyType("type2", schema);
124             types.put("type2", policyType);
125
126             schema = getStringFromFile("demo-policy-schema-2.json");
127             policyType = new PolicyType("type3", schema);
128             types.put("type3", policyType);
129
130             schema = getStringFromFile("demo-policy-schema-3.json");
131             policyType = new PolicyType("type4", schema);
132             types.put("type4", policyType);
133
134             putInstance("", "123", "{\"data\":\"data\"}", "ric_1");
135         }
136
137         private String getStringFromFile(String path) {
138             try {
139                 InputStream inputStream =
140                     MethodHandles.lookup().lookupClass().getClassLoader().getResourceAsStream(path);
141                 return new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n"));
142             } catch (Exception e) {
143                 logger.error("Cannot read file :" + path, e);
144                 return "";
145             }
146         }
147
148         String normalize(String str) {
149             return str.replace('\n', ' ');
150         }
151
152         private String getTimeStampUTC() {
153             return java.time.Instant.now().toString();
154         }
155
156         void putInstance(String typeId, String instanceId, Object instanceData, String ric) {
157             PolicyInfo i = ImmutablePolicyInfo.builder().json(instanceData).lastModified(getTimeStampUTC())
158                 .id(instanceId).ric(ric).service("service").type(typeId).build();
159             instances.put(instanceId, i);
160         }
161
162         public void deleteInstance(String instanceId) {
163             instances.remove(instanceId);
164         }
165
166         Object getInstance(String id) throws RestClientException {
167             PolicyInfo i = instances.get(id);
168             if (i == null) {
169                 throw new RestClientException("Type not found: " + id);
170             }
171             return i.json();
172         }
173
174         public Collection<PolicyType> getTypes() {
175             return types.values();
176         }
177
178         public List<PolicyInfo> getInstances(Optional<String> typeId) {
179             ArrayList<PolicyInfo> result = new ArrayList<>();
180             for (PolicyInfo i : instances.values()) {
181                 if (typeId.isPresent()) {
182                     if (i.type().equals(typeId.get())) {
183                         result.add(i);
184                     }
185
186                 } else {
187                     result.add(i);
188                 }
189             }
190             return result;
191         }
192
193         private Map<String, PolicyType> types = new HashMap<>();
194         private Map<String, PolicyInfo> instances = new HashMap<>();
195
196     }
197
198 }