2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 Nordix Foundation.
4 * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.clamp.controlloop.runtime.instantiation;
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.mockito.Mockito.mock;
30 import static org.mockito.Mockito.when;
32 import java.io.IOException;
33 import java.util.ArrayList;
34 import org.junit.jupiter.api.AfterAll;
35 import org.junit.jupiter.api.AfterEach;
36 import org.junit.jupiter.api.BeforeAll;
37 import org.junit.jupiter.api.BeforeEach;
38 import org.junit.jupiter.api.Test;
39 import org.mockito.Mockito;
40 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
41 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
42 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
43 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
44 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
45 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ClElementStatisticsProvider;
46 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ControlLoopProvider;
47 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantProvider;
48 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ParticipantStatisticsProvider;
49 import org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider.ServiceTemplateProvider;
50 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
51 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
52 import org.onap.policy.clamp.controlloop.runtime.commissioning.CommissioningProvider;
53 import org.onap.policy.clamp.controlloop.runtime.main.parameters.ClRuntimeParameterGroup;
54 import org.onap.policy.clamp.controlloop.runtime.monitoring.MonitoringProvider;
55 import org.onap.policy.clamp.controlloop.runtime.supervision.SupervisionHandler;
56 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopStateChangePublisher;
57 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ControlLoopUpdatePublisher;
58 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantDeregisterAckPublisher;
59 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantRegisterAckPublisher;
60 import org.onap.policy.clamp.controlloop.runtime.supervision.comm.ParticipantUpdatePublisher;
61 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
62 import org.onap.policy.models.base.PfModelException;
63 import org.onap.policy.models.provider.PolicyModelsProvider;
64 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
65 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
68 * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
71 class ControlLoopInstantiationProviderTest {
72 private static final String ID_NAME = "PMSH_Instance1";
73 private static final String ID_VERSION = "1.2.3";
74 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
75 private static final String CL_INSTANTIATION_UPDATE_JSON =
76 "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
77 private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
78 "src/test/resources/rest/controlloops/PassiveCommand.json";
79 private static final String CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON =
80 "src/test/resources/rest/controlloops/ControlLoopElementsNotFound.json";
81 private static final String CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON =
82 "src/test/resources/rest/controlloops/ControlLoopsNotFound.json";
83 private static final String TOSCA_TEMPLATE_YAML =
84 "src/test/resources/rest/servicetemplates/pmsh_multiple_cl_tosca.yaml";
85 private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
86 private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
87 private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
88 private static final String CONTROLLOOP_ELEMENT_NAME_NOT_FOUND =
89 "\"ControlLoops\" INVALID, item has status INVALID\n"
90 + " \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
91 + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n"
92 + " \"entry org.onap.domain.pmsh.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
93 + " \"entry org.onap.domain.pmsh.DCAEMicroservice\" INVALID, Not FOUND\n";
95 private static final String CONTROLLOOP_DEFINITION_NOT_FOUND = "\"ControlLoops\" INVALID, item has status INVALID\n"
96 + " \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
97 + " item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
98 + " Commissioned control loop definition not FOUND\n"
99 + " \"entry org.onap.domain.PMSHControlLoopDefinition\" INVALID, item has status INVALID\n"
100 + " item \"ControlLoop\" value \"org.onap.domain.PMSHControlLoopDefinition\" INVALID,"
101 + " Commissioned control loop definition not FOUND\n";
103 private static ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
105 private static SupervisionHandler supervisionHandler;
106 private static CommissioningProvider commissioningProvider;
107 private static ControlLoopProvider clProvider;
108 private static PolicyModelsProvider modelsProvider;
111 public static void setUpBeforeClass() throws Exception {
112 serviceTemplate = InstantiationUtils.getToscaServiceTemplate(TOSCA_TEMPLATE_YAML);
116 * setup Db Provider Parameters.
118 * @throws PfModelException if an error occurs
121 public static void setupDbProviderParameters() throws PfModelException {
122 ClRuntimeParameterGroup controlLoopParameters = CommonTestData.geParameterGroup("instantproviderdb");
124 modelsProvider = CommonTestData.getPolicyModelsProvider(controlLoopParameters.getDatabaseProviderParameters());
125 clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters());
126 var participantProvider = Mockito.mock(ParticipantProvider.class);
128 var participantStatisticsProvider = Mockito.mock(ParticipantStatisticsProvider.class);
129 var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class);
130 commissioningProvider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider), clProvider, null,
131 participantProvider);
132 var monitoringProvider =
133 new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider);
134 var controlLoopUpdatePublisher = Mockito.mock(ControlLoopUpdatePublisher.class);
135 var controlLoopStateChangePublisher = Mockito.mock(ControlLoopStateChangePublisher.class);
136 var participantRegisterAckPublisher = Mockito.mock(ParticipantRegisterAckPublisher.class);
137 var participantDeregisterAckPublisher = Mockito.mock(ParticipantDeregisterAckPublisher.class);
138 var participantUpdatePublisher = Mockito.mock(ParticipantUpdatePublisher.class);
139 var serviceTemplateProvider = Mockito.mock(ServiceTemplateProvider.class);
141 supervisionHandler = new SupervisionHandler(clProvider, participantProvider, monitoringProvider,
142 serviceTemplateProvider, controlLoopUpdatePublisher, controlLoopStateChangePublisher,
143 participantRegisterAckPublisher, participantDeregisterAckPublisher, participantUpdatePublisher);
147 public void populateDb() throws Exception {
152 public static void closeDbProvider() throws PfModelException {
154 modelsProvider.close();
158 public void cleanDatabase() throws Exception {
159 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
163 void testIntanceResponses() throws PfModelException {
164 var participantProvider = Mockito.mock(ParticipantProvider.class);
165 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
166 supervisionHandler, participantProvider);
167 var instancePropertyList = instantiationProvider.createInstanceProperties(serviceTemplate);
168 assertNull(instancePropertyList.getErrorDetails());
169 var id = new ToscaConceptIdentifier(ID_NAME, ID_VERSION);
170 assertEquals(id, instancePropertyList.getAffectedInstanceProperties().get(0));
171 var instanceOrderState = instantiationProvider.getInstantiationOrderState(ID_NAME, ID_VERSION);
172 assertEquals(ControlLoopOrderedState.UNINITIALISED, instanceOrderState.getOrderedState());
173 assertEquals(ID_NAME, instanceOrderState.getControlLoopIdentifierList().get(0).getName());
175 assertNotNull(clProvider.getControlLoop(id));
176 var instanceResponse = instantiationProvider.deleteInstanceProperties(ID_NAME, ID_VERSION);
177 assertEquals(ID_NAME, instanceResponse.getAffectedControlLoops().get(0).getName());
178 assertNull(clProvider.getControlLoop(id));
182 void testInstantiationCrud() throws Exception {
183 var participantProvider = Mockito.mock(ParticipantProvider.class);
184 var participants = CommonTestData.createParticipants();
185 when(participantProvider.getParticipants()).thenReturn(participants);
187 ControlLoops controlLoopsCreate =
188 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
189 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
190 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
191 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
192 supervisionHandler, participantProvider);
193 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
194 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
196 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
197 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
198 assertThat(controlLoopsCreate).isEqualTo(controlLoopsDb);
200 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
201 ControlLoops controlLoopsGet =
202 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
203 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
204 assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
207 ControlLoops controlLoopsUpdate =
208 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
209 assertThat(controlLoopsUpdate).isNotEqualTo(controlLoopsDb);
211 instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
212 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
214 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
215 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
216 assertThat(controlLoopsUpdate).isEqualTo(controlLoopsDb);
218 InstantiationCommand instantiationCommand =
219 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
220 instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
221 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
223 for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
224 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
225 toscaConceptIdentifier.getVersion());
226 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
227 assertThat(instantiationCommand.getOrderedState())
228 .isEqualTo(controlLoopsGet.getControlLoopList().get(0).getOrderedState());
231 // in order to delete a controlLoop the state must be UNINITIALISED
232 controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
233 instantiationProvider.updateControlLoops(controlLoopsCreate);
235 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
236 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
239 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
240 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
243 private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
245 ControlLoops controlLoopsDb = new ControlLoops();
246 controlLoopsDb.setControlLoopList(new ArrayList<>());
247 var participantProvider = Mockito.mock(ParticipantProvider.class);
249 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
250 supervisionHandler, participantProvider);
252 for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
253 ControlLoops controlLoopsFromDb =
254 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
255 controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
257 return controlLoopsDb;
261 void testInstantiationDelete() throws Exception {
263 ControlLoops controlLoops =
264 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
265 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
267 ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
268 var participantProvider = Mockito.mock(ParticipantProvider.class);
270 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
271 supervisionHandler, participantProvider);
274 () -> instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion()))
275 .hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
277 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
280 for (ControlLoopState state : ControlLoopState.values()) {
281 if (!ControlLoopState.UNINITIALISED.equals(state)) {
282 assertThatDeleteThrownBy(controlLoops, state);
286 controlLoop0.setState(ControlLoopState.UNINITIALISED);
287 instantiationProvider.updateControlLoops(controlLoops);
289 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
290 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
293 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
294 ControlLoops controlLoopsGet =
295 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
296 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
300 private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
301 ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
302 controlLoop.setState(state);
303 var participantProvider = Mockito.mock(ParticipantProvider.class);
305 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
306 supervisionHandler, participantProvider);
308 instantiationProvider.updateControlLoops(controlLoops);
310 () -> instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion()))
311 .hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
315 void testCreateControlLoops_NoDuplicates() throws Exception {
317 ControlLoops controlLoopsCreate =
318 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
320 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
321 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
323 var participantProvider = Mockito.mock(ParticipantProvider.class);
324 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
325 supervisionHandler, participantProvider);
327 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
328 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
330 assertThatThrownBy(() -> instantiationProvider.createControlLoops(controlLoopsCreate)).hasMessageMatching(
331 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
333 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
334 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
339 void testCreateControlLoops_CommissionedClElementNotFound() throws Exception {
341 ControlLoops controlLoops = InstantiationUtils
342 .getControlLoopsFromResource(CL_INSTANTIATION_DEFINITION_NAME_NOT_FOUND_JSON, "ClElementNotFound");
344 var participantProvider = Mockito.mock(ParticipantProvider.class);
345 var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
346 participantProvider);
348 // to validate control Loop, it needs to define ToscaServiceTemplate
349 // InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, commissioningProvider);
351 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
353 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
354 .hasMessageMatching(CONTROLLOOP_ELEMENT_NAME_NOT_FOUND);
358 void testCreateControlLoops_CommissionedClNotFound() throws Exception {
359 ControlLoops controlLoops = InstantiationUtils
360 .getControlLoopsFromResource(CL_INSTANTIATION_CONTROLLOOP_DEFINITION_NOT_FOUND_JSON, "ClNotFound");
362 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
364 var participantProvider = Mockito.mock(ParticipantProvider.class);
365 var provider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider, supervisionHandler,
366 participantProvider);
367 assertThatThrownBy(() -> provider.createControlLoops(controlLoops))
368 .hasMessageMatching(CONTROLLOOP_DEFINITION_NOT_FOUND);
372 void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
373 var participantProvider = Mockito.mock(ParticipantProvider.class);
374 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
375 supervisionHandler, participantProvider);
376 assertThatThrownBy(() -> instantiationProvider.issueControlLoopCommand(new InstantiationCommand()))
377 .hasMessageMatching(ORDERED_STATE_INVALID);
381 void testInstantiationVersions() throws Exception {
382 // create controlLoops V1
383 ControlLoops controlLoopsV1 =
384 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
385 assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
387 var participantProvider = Mockito.mock(ParticipantProvider.class);
388 var instantiationProvider = new ControlLoopInstantiationProvider(clProvider, commissioningProvider,
389 supervisionHandler, participantProvider);
391 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
394 // create controlLoops V2
395 ControlLoops controlLoopsV2 =
396 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
397 assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
398 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
401 // GET controlLoops V2
402 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
403 ControlLoops controlLoopsGet =
404 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
405 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
406 assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
409 // DELETE controlLoops V1
410 for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
411 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
414 // GET controlLoops V1 is not available
415 for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
416 ControlLoops controlLoopsGet =
417 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
418 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
421 // GET controlLoops V2 is still available
422 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
423 ControlLoops controlLoopsGet =
424 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
425 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
426 assertThat(controlLoop).isEqualTo(controlLoopsGet.getControlLoopList().get(0));
429 // DELETE controlLoops V2
430 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
431 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
434 // GET controlLoops V2 is not available
435 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
436 ControlLoops controlLoopsGet =
437 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
438 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
442 private synchronized void deleteEntryInDB(String name, String version) throws Exception {
443 if (!modelsProvider.getServiceTemplateList(null, null).isEmpty()) {
444 modelsProvider.deleteServiceTemplate(name, version);
448 private synchronized void createEntryInDB() throws Exception {
450 deleteEntryInDB(serviceTemplate.getName(), serviceTemplate.getVersion());
451 modelsProvider.createServiceTemplate(serviceTemplate);
452 } catch (Exception e) {