2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2019-2020 Nordix Foundation.
7 * Modifications Copyright (C) 2021-2022 Bell Canada. All rights reserved.
8 * ================================================================================
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.pap.main.rest.e2e;
25 import io.micrometer.core.instrument.MeterRegistry;
27 import java.io.FileInputStream;
28 import java.io.FileNotFoundException;
29 import java.io.IOException;
30 import java.util.List;
32 import java.util.Optional;
33 import org.junit.After;
34 import org.onap.policy.common.parameters.ValidationResult;
35 import org.onap.policy.common.utils.coder.Coder;
36 import org.onap.policy.common.utils.coder.CoderException;
37 import org.onap.policy.common.utils.coder.StandardCoder;
38 import org.onap.policy.common.utils.resources.PrometheusUtils;
39 import org.onap.policy.common.utils.resources.ResourceUtils;
40 import org.onap.policy.models.base.PfConceptKey;
41 import org.onap.policy.models.base.PfModelException;
42 import org.onap.policy.models.pdp.concepts.PdpGroup;
43 import org.onap.policy.models.pdp.concepts.PdpGroups;
44 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
45 import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
46 import org.onap.policy.models.pdp.concepts.PdpStatistics;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
48 import org.onap.policy.models.tosca.simple.concepts.JpaToscaServiceTemplate;
49 import org.onap.policy.pap.main.PolicyPapRuntimeException;
50 import org.onap.policy.pap.main.repository.ToscaServiceTemplateRepository;
51 import org.onap.policy.pap.main.rest.CommonPapRestServer;
52 import org.onap.policy.pap.main.service.PdpGroupService;
53 import org.onap.policy.pap.main.service.PdpStatisticsService;
54 import org.onap.policy.pap.main.service.PolicyStatusService;
55 import org.onap.policy.pap.main.service.ToscaServiceTemplateService;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58 import org.springframework.beans.factory.annotation.Autowired;
59 import org.yaml.snakeyaml.Yaml;
61 public abstract class End2EndBase extends CommonPapRestServer {
62 private static final Logger logger = LoggerFactory.getLogger(End2EndBase.class);
64 private static final Coder coder = new StandardCoder();
65 private static final Yaml yaml = new Yaml();
68 * Context - should be initialized by setUp() method.
70 protected End2EndContext context = null;
73 public PdpGroupService pdpGroupService;
76 public PdpStatisticsService pdpStatisticsService;
79 private ToscaServiceTemplateRepository serviceTemplateRepository;
82 public PolicyStatusService policyStatusService;
85 public ToscaServiceTemplateService toscaService;
88 public MeterRegistry meterRegistry;
90 public String deploymentsCounterName = "pap_" + PrometheusUtils.POLICY_DEPLOYMENTS_METRIC;
91 public String[] deploymentSuccessTag = {PrometheusUtils.OPERATION_METRIC_LABEL, PrometheusUtils.DEPLOY_OPERATION,
92 PrometheusUtils.STATUS_METRIC_LABEL, State.SUCCESS.name()};
93 public String[] unDeploymentSuccessTag = {PrometheusUtils.OPERATION_METRIC_LABEL,
94 PrometheusUtils.UNDEPLOY_OPERATION, PrometheusUtils.STATUS_METRIC_LABEL, State.SUCCESS.name()};
101 public void tearDown() {
102 if (context != null) {
105 } catch (final Exception e) {
106 logger.warn("failed to stop end-to-end context", e);
110 meterRegistry.clear();
115 * Adds Tosca Policy Types to the DB.
117 * @param yamlFile name of the YAML file specifying the data to be loaded
118 * @throws PfModelException if a DAO error occurs
120 public void addToscaPolicyTypes(final String yamlFile) throws PfModelException {
121 final ToscaServiceTemplate serviceTemplate = loadYamlFile(yamlFile, ToscaServiceTemplate.class);
122 JpaToscaServiceTemplate jpaToscaServiceTemplate = mergeWithExistingTemplate(serviceTemplate);
123 serviceTemplateRepository.save(jpaToscaServiceTemplate);
127 * Adds Tosca Policies to the DB.
129 * @param yamlFile name of the YAML file specifying the data to be loaded
130 * @throws PfModelException if a DAO error occurs
132 public void addToscaPolicies(final String yamlFile) throws PfModelException {
133 final ToscaServiceTemplate serviceTemplate = loadYamlFile(yamlFile, ToscaServiceTemplate.class);
134 JpaToscaServiceTemplate jpaToscaServiceTemplate = mergeWithExistingTemplate(serviceTemplate);
135 serviceTemplateRepository.save(jpaToscaServiceTemplate);
138 private JpaToscaServiceTemplate mergeWithExistingTemplate(ToscaServiceTemplate serviceTemplate) {
139 JpaToscaServiceTemplate jpaToscaServiceTemplate = new JpaToscaServiceTemplate(serviceTemplate);
140 Optional<JpaToscaServiceTemplate> dbServiceTemplateOpt = serviceTemplateRepository
141 .findById(new PfConceptKey(JpaToscaServiceTemplate.DEFAULT_NAME, JpaToscaServiceTemplate.DEFAULT_VERSION));
142 if (!dbServiceTemplateOpt.isEmpty()) {
143 JpaToscaServiceTemplate dbServiceTemplate = dbServiceTemplateOpt.get();
144 if (dbServiceTemplate.getPolicyTypes() != null) {
145 jpaToscaServiceTemplate.setPolicyTypes(dbServiceTemplate.getPolicyTypes());
147 if (dbServiceTemplate.getDataTypes() != null) {
148 jpaToscaServiceTemplate.setDataTypes(dbServiceTemplate.getDataTypes());
150 if (dbServiceTemplate.getTopologyTemplate() != null) {
151 jpaToscaServiceTemplate.setTopologyTemplate(dbServiceTemplate.getTopologyTemplate());
155 return jpaToscaServiceTemplate;
159 * Adds PDP groups to the DB.
161 * @param jsonFile name of the JSON file specifying the data to be loaded
162 * @throws PfModelException if a DAO error occurs
164 public void addGroups(final String jsonFile) throws PfModelException {
165 final PdpGroups groups = loadJsonFile(jsonFile, PdpGroups.class);
167 final ValidationResult result = groups.validatePapRest();
168 if (!result.isValid()) {
169 throw new PolicyPapRuntimeException("cannot init DB groups from " + jsonFile + ":\n" + result.getResult());
172 pdpGroupService.createPdpGroups(groups.getGroups());
176 * Fetch PDP groups from the DB.
178 * @param name name of the pdpGroup
179 * @throws PfModelException if a DAO error occurs
181 public List<PdpGroup> fetchGroups(final String name) throws PfModelException {
182 return pdpGroupService.getPdpGroups(name);
186 * Fetch PDP statistics from the DB.
188 * @param instanceId name of the pdpStatistics
189 * @param groupName name of the pdpGroup
190 * @param subGroupName name of the pdpSubGroup
191 * @throws PfModelException if a DAO error occurs
193 public Map<String, Map<String, List<PdpStatistics>>> fetchPdpStatistics(final String instanceId,
194 final String groupName, final String subGroupName) throws PfModelException {
195 return pdpStatisticsService.fetchDatabaseStatistics(groupName, subGroupName, instanceId, 100, null, null);
199 * Adds PdpPolicyStatus records to the DB.
201 * @param jsonFile name of the JSON file specifying the data to be loaded
202 * @throws PfModelException if a DAO error occurs
204 public void addPdpPolicyStatus(final String jsonFile) throws PfModelException {
205 final PolicyStatusRecords data = loadJsonFile(jsonFile, PolicyStatusRecords.class);
206 policyStatusService.cudPolicyStatus(data.records, null, null);
210 * Loads an object from a YAML file.
212 * @param fileName name of the file from which to load
213 * @param clazz the class of the object to be loaded
214 * @return the object that was loaded from the file
216 protected static <T> T loadYamlFile(final String fileName, final Class<T> clazz) {
217 final File propFile = new File(ResourceUtils.getFilePath4Resource("e2e/" + fileName));
219 try (FileInputStream input = new FileInputStream(propFile)) {
220 final Object yamlObject = yaml.load(input);
221 final String json = coder.encode(yamlObject);
222 final T result = coder.decode(json, clazz);
224 if (result == null) {
225 throw new PolicyPapRuntimeException("cannot decode " + clazz.getSimpleName() + " from " + fileName);
230 } catch (final FileNotFoundException e) {
231 throw new PolicyPapRuntimeException("cannot find " + fileName, e);
233 } catch (IOException | CoderException e) {
234 throw new PolicyPapRuntimeException("cannot decode " + fileName, e);
239 * Loads an object from a JSON file.
241 * @param fileName name of the file from which to load
242 * @param clazz the class of the object to be loaded
243 * @return the object that was loaded from the file
245 protected static <T> T loadJsonFile(final String fileName, final Class<T> clazz) {
246 final String fileName2 = (fileName.startsWith("src/") ? fileName : "e2e/" + fileName);
247 final File propFile = new File(ResourceUtils.getFilePath4Resource(fileName2));
249 final T result = coder.decode(propFile, clazz);
251 if (result == null) {
252 throw new PolicyPapRuntimeException("cannot decode " + clazz.getSimpleName() + " from " + fileName);
257 } catch (final CoderException e) {
258 throw new RuntimeException(e);
262 public class PolicyStatusRecords {
263 private List<PdpPolicyStatus> records;