7b81b1beb7f3dcf2669a92ff796bac85a8931ab4
[dcaegen2/services.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * BBS-RELOCATION-CPE-AUTHENTICATION-HANDLER
4  * ================================================================================
5  * Copyright (C) 2019 NOKIA 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.bbs.event.processor.config;
22
23 import static org.junit.jupiter.api.Assertions.assertAll;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
25 import static org.junit.jupiter.api.Assertions.assertFalse;
26 import static org.junit.jupiter.api.Assertions.assertTrue;
27
28 import java.util.Collections;
29 import java.util.HashMap;
30 import java.util.Map;
31
32 import org.junit.FixMethodOrder;
33 import org.junit.jupiter.api.DisplayName;
34 import org.junit.jupiter.api.Test;
35 import org.junit.runners.MethodSorters;
36 import org.onap.bbs.event.processor.model.GeneratedAppConfigObject;
37 import org.onap.bbs.event.processor.model.ImmutableDmaapInfo;
38 import org.onap.bbs.event.processor.model.ImmutableGeneratedAppConfigObject;
39 import org.onap.bbs.event.processor.model.ImmutableStreamsObject;
40 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapConsumerConfiguration;
41 import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapPublisherConfiguration;
42 import org.springframework.beans.factory.annotation.Autowired;
43 import org.springframework.boot.context.properties.EnableConfigurationProperties;
44 import org.springframework.boot.test.context.SpringBootTest;
45 import org.springframework.test.context.TestPropertySource;
46
47 @SpringBootTest(classes = {
48         AaiClientProperties.class,
49         DmaapReRegistrationConsumerProperties.class,
50         DmaapCpeAuthenticationConsumerProperties.class,
51         DmaapProducerProperties.class,
52         SecurityProperties.class,
53         GenericProperties.class})
54 @EnableConfigurationProperties
55 @TestPropertySource(properties = {
56         "configs.aai.client.aaiHost=test localhost",
57         "configs.aai.client.aaiPort=1234",
58         "configs.aai.client.aaiProtocol=https",
59         "configs.aai.client.aaiUserName=AAI",
60         "configs.aai.client.aaiUserPassword=AAI",
61         "configs.aai.client.aaiIgnoreSslCertificateErrors=true",
62         "configs.aai.client.aaiHeaders.X-FromAppId=bbs",
63         "configs.aai.client.aaiHeaders.X-TransactionId=9999",
64         "configs.aai.client.aaiHeaders.Accept=application/json",
65         "configs.aai.client.aaiHeaders.Real-Time=true",
66         "configs.aai.client.aaiHeaders.Content-Type=application/merge-patch+json",
67         "configs.dmaap.consumer.re-registration.dmaapHostName=test localhost",
68         "configs.dmaap.consumer.re-registration.dmaapPortNumber=1234",
69         "configs.dmaap.consumer.re-registration.dmaapTopicName=/events/unauthenticated.PNF_REREGISTRATION",
70         "configs.dmaap.consumer.re-registration.dmaapProtocol=http",
71         "configs.dmaap.consumer.re-registration.dmaapContentType=application/json",
72         "configs.dmaap.consumer.re-registration.consumerId=c12",
73         "configs.dmaap.consumer.re-registration.consumerGroup=OpenDcae-c12",
74         "configs.dmaap.consumer.re-registration.timeoutMs=-1",
75         "configs.dmaap.consumer.re-registration.messageLimit=1",
76         "configs.dmaap.consumer.cpe-authentication.dmaapHostName=test localhost",
77         "configs.dmaap.consumer.cpe-authentication.dmaapPortNumber=1234",
78         "configs.dmaap.consumer.cpe-authentication.dmaapTopicName=/events/unauthenticated.CPE_AUTHENTICATION",
79         "configs.dmaap.consumer.cpe-authentication.dmaapProtocol=http",
80         "configs.dmaap.consumer.cpe-authentication.dmaapContentType=application/json",
81         "configs.dmaap.consumer.cpe-authentication.consumerId=c12",
82         "configs.dmaap.consumer.cpe-authentication.consumerGroup=OpenDcae-c12",
83         "configs.dmaap.consumer.cpe-authentication.timeoutMs=-1",
84         "configs.dmaap.consumer.cpe-authentication.messageLimit=1",
85         "configs.dmaap.producer.dmaapHostName=test localhost",
86         "configs.dmaap.producer.dmaapPortNumber=1234",
87         "configs.dmaap.producer.dmaapTopicName=/events/unauthenticated.DCAE_CL_OUTPUT",
88         "configs.dmaap.producer.dmaapProtocol=http",
89         "configs.dmaap.producer.dmaapContentType=application/json",
90         "configs.security.trustStorePath=test trust store path",
91         "configs.security.trustStorePasswordPath=test trust store password path",
92         "configs.security.keyStorePath=test key store path",
93         "configs.security.keyStorePasswordPath=test key store password path",
94         "configs.security.enableDmaapCertAuth=true",
95         "configs.security.enableAaiCertAuth=true",
96         "configs.application.pipelinesPollingIntervalSec=30",
97         "configs.application.pipelinesTimeoutSec=15",
98         "configs.application.policyVersion=1.0.0",
99         "configs.application.clTargetType=VM",
100         "configs.application.clEventStatus=ONSET",
101         "configs.application.clVersion=1.0.2",
102         "configs.application.clTarget=vserver.vserver-name",
103         "configs.application.clOriginator=DCAE-bbs-event-processor",
104         "configs.application.re-registration.policyScope=reRegPolicyScope",
105         "configs.application.re-registration.clControlName=reRegControlName",
106         "configs.application.cpe-authentication.policyScope=cpeAuthPolicyScope",
107         "configs.application.cpe-authentication.clControlName=cpeAuthControlName"})
108 @DisplayName("Application Configuration Unit-Tests")
109 // Ordering tests because we need a first configuration population from @TestPropertySource
110 // and then update of the config parameters based on a new Consul-retrieved Configuration object
111 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
112 class ApplicationConfigurationTest {
113
114     private ApplicationConfiguration configuration;
115
116     @Autowired
117     public ApplicationConfigurationTest(AaiClientProperties aaiClientProperties,
118                                         DmaapReRegistrationConsumerProperties dmaapReRegistrationConsumerProperties,
119                                         DmaapCpeAuthenticationConsumerProperties
120                                                     dmaapCpeAuthenticationConsumerProperties,
121                                         DmaapProducerProperties dmaapProducerProperties,
122                                         SecurityProperties securityProperties,
123                                         GenericProperties genericProperties) {
124         this.configuration = new ApplicationConfiguration(aaiClientProperties,
125                 dmaapReRegistrationConsumerProperties,
126                 dmaapCpeAuthenticationConsumerProperties,
127                 dmaapProducerProperties,
128                 securityProperties,
129                 genericProperties);
130     }
131
132     @Test
133     void testA_configurationObjectSuccessfullyPopulated() {
134
135         AaiClientConfiguration aaiClientConfiguration = configuration.getAaiClientConfiguration();
136         assertAll("AAI Client Configuration Properties",
137             () -> assertEquals("test localhost", aaiClientConfiguration.aaiHost()),
138             () -> assertEquals(Integer.valueOf(1234), aaiClientConfiguration.aaiPort()),
139             () -> assertEquals("https", aaiClientConfiguration.aaiProtocol()),
140             () -> assertEquals("AAI", aaiClientConfiguration.aaiUserName()),
141             () -> assertEquals("AAI", aaiClientConfiguration.aaiUserPassword()),
142             () -> assertTrue(aaiClientConfiguration.aaiIgnoreSslCertificateErrors()),
143             () -> assertEquals("bbs", aaiClientConfiguration.aaiHeaders().get("X-FromAppId")),
144             () -> assertEquals("9999", aaiClientConfiguration.aaiHeaders().get("X-TransactionId")),
145             () -> assertEquals("application/json", aaiClientConfiguration.aaiHeaders().get("Accept")),
146             () -> assertEquals("true", aaiClientConfiguration.aaiHeaders().get("Real-Time")),
147             () -> assertEquals("application/merge-patch+json",
148                         aaiClientConfiguration.aaiHeaders().get("Content-Type"))
149         );
150
151         DmaapConsumerConfiguration dmaapConsumerReRegistrationConfig =
152                 configuration.getDmaapReRegistrationConsumerConfiguration();
153         assertAll("DMaaP Consumer Re-Registration Configuration Properties",
154             () -> assertEquals("test localhost", dmaapConsumerReRegistrationConfig.dmaapHostName()),
155             () -> assertEquals(Integer.valueOf(1234), dmaapConsumerReRegistrationConfig.dmaapPortNumber()),
156             () -> assertEquals("/events/unauthenticated.PNF_REREGISTRATION",
157                     dmaapConsumerReRegistrationConfig.dmaapTopicName()),
158             () -> assertEquals("http", dmaapConsumerReRegistrationConfig.dmaapProtocol()),
159             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserName()),
160             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserPassword()),
161             () -> assertEquals("application/json", dmaapConsumerReRegistrationConfig.dmaapContentType()),
162             () -> assertEquals("c12", dmaapConsumerReRegistrationConfig.consumerId()),
163             () -> assertEquals("OpenDcae-c12", dmaapConsumerReRegistrationConfig.consumerGroup()),
164             () -> assertEquals(Integer.valueOf(-1), dmaapConsumerReRegistrationConfig.timeoutMs()),
165             () -> assertEquals(Integer.valueOf(1), dmaapConsumerReRegistrationConfig.messageLimit())
166         );
167
168         DmaapConsumerConfiguration dmaapConsumerCpeAuthenticationConfig =
169                 configuration.getDmaapCpeAuthenticationConsumerConfiguration();
170         assertAll("DMaaP Consumer CPE Authentication Configuration Properties",
171             () -> assertEquals("test localhost", dmaapConsumerCpeAuthenticationConfig.dmaapHostName()),
172             () -> assertEquals(Integer.valueOf(1234), dmaapConsumerCpeAuthenticationConfig.dmaapPortNumber()),
173             () -> assertEquals("/events/unauthenticated.CPE_AUTHENTICATION",
174                     dmaapConsumerCpeAuthenticationConfig.dmaapTopicName()),
175             () -> assertEquals("http", dmaapConsumerCpeAuthenticationConfig.dmaapProtocol()),
176             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserName()),
177             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserPassword()),
178             () -> assertEquals("application/json", dmaapConsumerCpeAuthenticationConfig.dmaapContentType()),
179             () -> assertEquals("c12", dmaapConsumerCpeAuthenticationConfig.consumerId()),
180             () -> assertEquals("OpenDcae-c12", dmaapConsumerCpeAuthenticationConfig.consumerGroup()),
181             () -> assertEquals(Integer.valueOf(-1), dmaapConsumerCpeAuthenticationConfig.timeoutMs()),
182             () -> assertEquals(Integer.valueOf(1), dmaapConsumerCpeAuthenticationConfig.messageLimit())
183         );
184
185         DmaapPublisherConfiguration dmaapPublisherConfiguration = configuration.getDmaapPublisherConfiguration();
186         assertAll("DMaaP Publisher Configuration Properties",
187             () -> assertEquals("test localhost", dmaapPublisherConfiguration.dmaapHostName()),
188             () -> assertEquals(Integer.valueOf(1234), dmaapPublisherConfiguration.dmaapPortNumber()),
189             () -> assertEquals("/events/unauthenticated.DCAE_CL_OUTPUT",
190                     dmaapPublisherConfiguration.dmaapTopicName()),
191             () -> assertEquals("http", dmaapPublisherConfiguration.dmaapProtocol()),
192             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserName()),
193             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserPassword()),
194             () -> assertEquals("application/json", dmaapPublisherConfiguration.dmaapContentType())
195         );
196
197         assertAll("Generic Application Properties",
198             () -> assertEquals(30, configuration.getPipelinesPollingIntervalInSeconds()),
199             () -> assertEquals(15, configuration.getPipelinesTimeoutInSeconds()),
200             () -> assertEquals("1.0.0", configuration.getPolicyVersion()),
201             () -> assertEquals("VM", configuration.getCloseLoopTargetType()),
202             () -> assertEquals("ONSET", configuration.getCloseLoopEventStatus()),
203             () -> assertEquals("1.0.2", configuration.getCloseLoopVersion()),
204             () -> assertEquals("vserver.vserver-name", configuration.getCloseLoopTarget()),
205             () -> assertEquals("DCAE-bbs-event-processor", configuration.getCloseLoopOriginator()),
206             () -> assertEquals("reRegPolicyScope", configuration.getReRegistrationCloseLoopPolicyScope()),
207             () -> assertEquals("cpeAuthPolicyScope", configuration.getCpeAuthenticationCloseLoopPolicyScope()),
208             () -> assertEquals("reRegControlName", configuration.getReRegistrationCloseLoopControlName()),
209             () -> assertEquals("cpeAuthControlName", configuration.getCpeAuthenticationCloseLoopControlName())
210         );
211     }
212
213     @Test
214     void testB_passingNewConfiguration_UpdateSucceeds() {
215         Map<String, GeneratedAppConfigObject.StreamsObject> subscribes = new HashMap<>();
216
217         GeneratedAppConfigObject.DmaapInfo dmaapInfo1 = ImmutableDmaapInfo.builder()
218                 .clientId("1500462518108")
219                 .clientRole("com.dcae.member")
220                 .location("mtc00")
221                 .topicUrl("https://we-are-message-router1.us:3901/events/unauthenticated.PNF_UPDATE")
222                 .build();
223         GeneratedAppConfigObject.StreamsObject streamsObject1 = ImmutableStreamsObject.builder()
224                 .type("message_router")
225                 .aafUsername("some-user")
226                 .aafPassword("some-password")
227                 .dmaapInfo(dmaapInfo1)
228                 .build();
229         GeneratedAppConfigObject.DmaapInfo dmaapInfo2 = ImmutableDmaapInfo.builder()
230                 .clientId("1500462518108")
231                 .clientRole("com.dcae.member")
232                 .location("mtc00")
233                 .topicUrl("https://we-are-message-router2.us:3902/events/unauthenticated.CPE_AUTHENTICATION")
234                 .build();
235         GeneratedAppConfigObject.StreamsObject streamsObject2 = ImmutableStreamsObject.builder()
236                 .type("message_router")
237                 .aafUsername("some-user")
238                 .aafPassword("some-password")
239                 .dmaapInfo(dmaapInfo2)
240                 .build();
241
242         subscribes.put("config_key_1", streamsObject1);
243         subscribes.put("config_key_2", streamsObject2);
244
245         // Create Publishes Objects
246         GeneratedAppConfigObject.DmaapInfo dmaapInfo3 = ImmutableDmaapInfo.builder()
247                 .clientId("1500462518108")
248                 .clientRole("com.dcae.member")
249                 .location("mtc00")
250                 .topicUrl("https://we-are-message-router3.us:3903/events/unauthenticated.DCAE_CL_OUTPUT")
251                 .build();
252         GeneratedAppConfigObject.StreamsObject streamsObject3 = ImmutableStreamsObject.builder()
253                 .type("message_router")
254                 .aafUsername("some-user")
255                 .aafPassword("some-password")
256                 .dmaapInfo(dmaapInfo3)
257                 .build();
258
259         // Final config object
260         GeneratedAppConfigObject updatedConfiguration = ImmutableGeneratedAppConfigObject.builder()
261                 .dmaapProtocol("https")
262                 .dmaapContentType("application/json")
263                 .dmaapConsumerConsumerId("c13")
264                 .dmaapConsumerConsumerGroup("OpenDcae-c13")
265                 .dmaapMessageLimit(10)
266                 .dmaapTimeoutMs(5)
267                 .aaiHost("aai.onap.svc.cluster.local")
268                 .aaiPort(8443)
269                 .aaiProtocol("http")
270                 .aaiUsername("AAI-update")
271                 .aaiPassword("AAI-update")
272                 .aaiIgnoreSslCertificateErrors(false)
273                 .pipelinesPollingIntervalSec(20)
274                 .pipelinesTimeoutSec(20)
275                 .cbsPollingIntervalSec(180)
276                 .policyVersion("2.0.0")
277                 .closeLoopTargetType("VM2")
278                 .closeLoopEventStatus("ONSET-update")
279                 .closeLoopVersion("2.0.2")
280                 .closeLoopTarget("Target-update")
281                 .closeLoopOriginator("Originator-update")
282                 .reRegistrationPolicyScope("policyScope-update")
283                 .reRegistrationClControlName("controlName-update")
284                 .cpeAuthPolicyScope("policyScope-update")
285                 .cpeAuthClControlName("controlName-update")
286                 .reRegConfigKey("config_key_1")
287                 .cpeAuthConfigKey("config_key_2")
288                 .closeLoopConfigKey("config_key_3")
289                 .streamSubscribesMap(subscribes)
290                 .streamPublishesMap(Collections.singletonMap("config_key_3", streamsObject3))
291                 .build();
292
293         // Update the configuration
294         configuration.updateCurrentConfiguration(updatedConfiguration);
295
296         AaiClientConfiguration aaiClientConfiguration = configuration.getAaiClientConfiguration();
297         assertAll("AAI Client Configuration Properties",
298             () -> assertEquals("aai.onap.svc.cluster.local", aaiClientConfiguration.aaiHost()),
299             () -> assertEquals(Integer.valueOf(8443), aaiClientConfiguration.aaiPort()),
300             () -> assertEquals("http", aaiClientConfiguration.aaiProtocol()),
301             () -> assertEquals("AAI-update", aaiClientConfiguration.aaiUserName()),
302             () -> assertEquals("AAI-update", aaiClientConfiguration.aaiUserPassword()),
303             () -> assertFalse(aaiClientConfiguration.aaiIgnoreSslCertificateErrors()),
304             () -> assertEquals("bbs", aaiClientConfiguration.aaiHeaders().get("X-FromAppId")),
305             () -> assertEquals("9999", aaiClientConfiguration.aaiHeaders().get("X-TransactionId")),
306             () -> assertEquals("application/json", aaiClientConfiguration.aaiHeaders().get("Accept")),
307             () -> assertEquals("true", aaiClientConfiguration.aaiHeaders().get("Real-Time")),
308             () -> assertEquals("application/merge-patch+json",
309                         aaiClientConfiguration.aaiHeaders().get("Content-Type"))
310         );
311
312         DmaapConsumerConfiguration dmaapConsumerReRegistrationConfig =
313                 configuration.getDmaapReRegistrationConsumerConfiguration();
314         assertAll("DMaaP Consumer Re-Registration Configuration Properties",
315             () -> assertEquals("we-are-message-router1.us", dmaapConsumerReRegistrationConfig.dmaapHostName()),
316             () -> assertEquals(Integer.valueOf(3901), dmaapConsumerReRegistrationConfig.dmaapPortNumber()),
317             () -> assertEquals("/events/unauthenticated.PNF_UPDATE",
318                     dmaapConsumerReRegistrationConfig.dmaapTopicName()),
319             () -> assertEquals("https", dmaapConsumerReRegistrationConfig.dmaapProtocol()),
320             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserName()),
321             () -> assertEquals("", dmaapConsumerReRegistrationConfig.dmaapUserPassword()),
322             () -> assertEquals("application/json", dmaapConsumerReRegistrationConfig.dmaapContentType()),
323             () -> assertEquals("c13", dmaapConsumerReRegistrationConfig.consumerId()),
324             () -> assertEquals("OpenDcae-c13", dmaapConsumerReRegistrationConfig.consumerGroup()),
325             () -> assertEquals(Integer.valueOf(5), dmaapConsumerReRegistrationConfig.timeoutMs()),
326             () -> assertEquals(Integer.valueOf(10), dmaapConsumerReRegistrationConfig.messageLimit())
327         );
328
329         DmaapConsumerConfiguration dmaapConsumerCpeAuthenticationConfig =
330                 configuration.getDmaapCpeAuthenticationConsumerConfiguration();
331         assertAll("DMaaP Consumer CPE Authentication Configuration Properties",
332             () -> assertEquals("we-are-message-router2.us", dmaapConsumerCpeAuthenticationConfig.dmaapHostName()),
333             () -> assertEquals(Integer.valueOf(3902), dmaapConsumerCpeAuthenticationConfig.dmaapPortNumber()),
334             () -> assertEquals("/events/unauthenticated.CPE_AUTHENTICATION",
335                     dmaapConsumerCpeAuthenticationConfig.dmaapTopicName()),
336             () -> assertEquals("https", dmaapConsumerCpeAuthenticationConfig.dmaapProtocol()),
337             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserName()),
338             () -> assertEquals("", dmaapConsumerCpeAuthenticationConfig.dmaapUserPassword()),
339             () -> assertEquals("application/json", dmaapConsumerCpeAuthenticationConfig.dmaapContentType()),
340             () -> assertEquals("c13", dmaapConsumerCpeAuthenticationConfig.consumerId()),
341             () -> assertEquals("OpenDcae-c13", dmaapConsumerCpeAuthenticationConfig.consumerGroup()),
342             () -> assertEquals(Integer.valueOf(5), dmaapConsumerCpeAuthenticationConfig.timeoutMs()),
343             () -> assertEquals(Integer.valueOf(10), dmaapConsumerCpeAuthenticationConfig.messageLimit())
344         );
345
346         DmaapPublisherConfiguration dmaapPublisherConfiguration = configuration.getDmaapPublisherConfiguration();
347         assertAll("DMaaP Publisher Configuration Properties",
348             () -> assertEquals("we-are-message-router3.us", dmaapPublisherConfiguration.dmaapHostName()),
349             () -> assertEquals(Integer.valueOf(3903), dmaapPublisherConfiguration.dmaapPortNumber()),
350             () -> assertEquals("/events/unauthenticated.DCAE_CL_OUTPUT",
351                     dmaapPublisherConfiguration.dmaapTopicName()),
352             () -> assertEquals("https", dmaapPublisherConfiguration.dmaapProtocol()),
353             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserName()),
354             () -> assertEquals("", dmaapPublisherConfiguration.dmaapUserPassword()),
355             () -> assertEquals("application/json", dmaapPublisherConfiguration.dmaapContentType())
356         );
357
358         assertAll("Generic Application Properties",
359             () -> assertEquals(20, configuration.getPipelinesPollingIntervalInSeconds()),
360             () -> assertEquals(20, configuration.getPipelinesTimeoutInSeconds()),
361             () -> assertEquals(180, configuration.getCbsPollingInterval()),
362             () -> assertEquals("2.0.0", configuration.getPolicyVersion()),
363             () -> assertEquals("VM2", configuration.getCloseLoopTargetType()),
364             () -> assertEquals("ONSET-update", configuration.getCloseLoopEventStatus()),
365             () -> assertEquals("2.0.2", configuration.getCloseLoopVersion()),
366             () -> assertEquals("Target-update", configuration.getCloseLoopTarget()),
367             () -> assertEquals("Originator-update", configuration.getCloseLoopOriginator()),
368             () -> assertEquals("policyScope-update", configuration.getReRegistrationCloseLoopPolicyScope()),
369             () -> assertEquals("policyScope-update", configuration.getCpeAuthenticationCloseLoopPolicyScope()),
370             () -> assertEquals("controlName-update", configuration.getReRegistrationCloseLoopControlName()),
371             () -> assertEquals("controlName-update", configuration.getCpeAuthenticationCloseLoopControlName())
372         );
373     }
374 }