import java.util.Optional;
import org.apache.logging.log4j.util.Strings;
import org.onap.aai.domain.yang.EsrSystemInfo;
+import org.onap.aai.domain.yang.EsrSystemInfoList;
import org.onap.aai.domain.yang.EsrVnfm;
import org.onap.aai.domain.yang.EsrVnfmList;
+import org.onap.aai.domain.yang.v18.GenericVnf;
import org.onap.so.adapters.vevnfm.exception.VeVnfmException;
import org.onap.so.client.aai.AAIObjectType;
import org.onap.so.client.aai.AAIResourcesClient;
if (response.isPresent()) {
final EsrVnfmList esrVnfmList = response.get();
- logger.info("The VNFM replied with: {}", esrVnfmList);
+ logger.info("The AAI ESR replied with: {}", esrVnfmList);
final List<EsrVnfm> esrVnfm = esrVnfmList.getEsrVnfm();
final List<EsrSystemInfo> infos = new LinkedList<>();
if (response.isPresent()) {
final EsrVnfm esrVnfm = response.get();
- logger.info("The VNFM replied with: {}", esrVnfm);
- return esrVnfm.getEsrSystemInfoList().getEsrSystemInfo();
+ logger.info("The AAI ESR replied with: {}", esrVnfm);
+ final EsrSystemInfoList esrSystemInfoList = esrVnfm.getEsrSystemInfoList();
+
+ if (esrSystemInfoList != null) {
+ return esrSystemInfoList.getEsrSystemInfo();
+ }
}
return Collections.emptyList();
}
+
+ public boolean checkGenericVnfId(final String vnfId) {
+ final AAIResourcesClient resourcesClient = new AAIResourcesClient();
+ final AAIResourceUri resourceUri = AAIUriFactory.createResourceUri(AAIObjectType.GENERIC_VNF, vnfId);
+ final Optional<GenericVnf> response = resourcesClient.get(GenericVnf.class, resourceUri);
+
+ if (response.isPresent()) {
+ final GenericVnf vnf = response.get();
+ logger.info("The AAI replied with: {}", vnf);
+ return vnfId.equals(vnf.getVnfId());
+ }
+
+ return false;
+ }
}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.constant;
+
+/**
+ * Which incoming Notification with particular VNF id is supported
+ */
+public enum VnfNotificationFilterType {
+ /**
+ * None
+ */
+ NONE,
+
+ /**
+ * Only those which are valid in AAI
+ */
+ AAI_CHECKED,
+
+ /**
+ * All
+ */
+ ALL
+}
package org.onap.so.adapters.vevnfm.controller;
+import org.onap.so.adapters.vevnfm.constant.VnfNotificationFilterType;
import org.onap.so.adapters.vevnfm.service.DmaapService;
+import org.onap.so.adapters.vevnfm.service.VnfAaiChecker;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
private static final Logger logger = LoggerFactory.getLogger(NotificationController.class);
+ private final VnfNotificationFilterType vnfFilterType;
+ private final VnfAaiChecker vnfAaiChecker;
+ private final DmaapService dmaapService;
+
@Autowired
- private DmaapService dmaapService;
+ public NotificationController(
+ @Value("${notification.vnf-filter-type}") final VnfNotificationFilterType vnfFilterType,
+ final VnfAaiChecker vnfAaiChecker, final DmaapService dmaapService) {
+ this.vnfFilterType = vnfFilterType;
+ this.vnfAaiChecker = vnfAaiChecker;
+ this.dmaapService = dmaapService;
+ }
@PostMapping("${vnfm.notification}")
public ResponseEntity receiveNotification(@RequestBody final VnfLcmOperationOccurrenceNotification notification) {
logger.info("Notification received {}", notification);
- dmaapService.send(notification);
+
+ final String vnfInstanceId = notification.getVnfInstanceId();
+
+ if (vnfAaiChecker.vnfCheck(vnfFilterType, vnfInstanceId)) {
+ logger.info("The info with the VNF id '{}' is sent to DMaaP", vnfInstanceId);
+ dmaapService.send(notification);
+ } else {
+ logger.info("This VNF id '{}' is not supported", vnfInstanceId);
+ }
+
return ResponseEntity.ok().build();
}
}
package org.onap.so.adapters.vevnfm.service;
+import com.google.gson.Gson;
import com.squareup.okhttp.Credentials;
import java.util.Collections;
import org.apache.logging.log4j.util.Strings;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.LccnSubscriptionRequest;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthentication;
import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
+import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class SubscriberService {
+ private static final Gson gson = new Gson();
+
+ @Value("${vevnfmadapter.vnf-filter-json}")
+ private String vnfFilter;
+
@Value("${vevnfmadapter.endpoint}")
private String endpoint;
private LccnSubscriptionRequest createRequest() {
final LccnSubscriptionRequest request = new LccnSubscriptionRequest();
+ request.filter(getFilter());
request.callbackUri(getCallbackUri());
final SubscriptionsAuthenticationParamsBasic paramsBasic = new SubscriptionsAuthenticationParamsBasic();
final SubscriptionsAuthentication authentication = new SubscriptionsAuthentication();
return request;
}
+ private SubscriptionsFilter getFilter() {
+ return gson.fromJson(vnfFilter, SubscriptionsFilter.class);
+ }
+
private String getCallbackUri() {
return endpoint + notification;
}
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.service;
+
+import org.onap.so.adapters.vevnfm.aai.AaiConnection;
+import org.onap.so.adapters.vevnfm.constant.VnfNotificationFilterType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class VnfAaiChecker {
+
+ private final AaiConnection aaiConnection;
+
+ @Autowired
+ public VnfAaiChecker(final AaiConnection aaiConnection) {
+ this.aaiConnection = aaiConnection;
+ }
+
+ public boolean vnfCheck(final VnfNotificationFilterType filterType, final String vnfId) {
+ switch (filterType) {
+ case ALL:
+ return true;
+ case AAI_CHECKED:
+ return aaiConnection.checkGenericVnfId(vnfId);
+ case NONE:
+ return false;
+ default:
+ throw new IllegalArgumentException(
+ "The value of VnfNotificationFilterType is not supported: " + filterType);
+ }
+ }
+}
port: 9098
vevnfmadapter:
+ vnf-filter-json: '{notificationTypes:[VnfLcmOperationOccurrenceNotification],operationStates:[COMPLETED]}'
endpoint: http://so-ve-vnfm-adapter.onap:9098
mso:
subscription: /vnflcm/v1/subscriptions
notification: /lcm/v1/vnf/instances/notifications
+notification:
+ vnf-filter-type: NONE
+
dmaap:
endpoint: http://message-router.onap:30227
topic: /events/unauthenticated.DCAE_CL_OUTPUT
package org.onap.so.adapters.vevnfm.controller;
import static org.junit.Assert.assertEquals;
-import static org.springframework.test.web.client.ExpectedCount.once;
import static org.springframework.test.web.client.match.MockRestRequestMatchers.anything;
import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess;
import org.junit.Before;
final MockHttpServletRequestBuilder request = MockMvcRequestBuilders.post(notification)
.contentType(MediaType.APPLICATION_JSON).content(MINIMAL_JSON_CONTENT);
- mockRestServer.expect(once(), anything()).andRespond(withSuccess());
+ mockRestServer.expect(anything()).andRespond(withSuccess());
// when
final MvcResult mvcResult = mvc.perform(request).andReturn();
--- /dev/null
+/*-
+ * ============LICENSE_START=======================================================
+ * SO
+ * ================================================================================
+ * Copyright (C) 2020 Samsung. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.adapters.vevnfm.service;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.when;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+import org.onap.so.adapters.vevnfm.aai.AaiConnection;
+import org.onap.so.adapters.vevnfm.constant.VnfNotificationFilterType;
+
+@RunWith(MockitoJUnitRunner.class)
+public class VnfAaiCheckerTest {
+
+ private static final String VNF_ID = "t5h78w";
+
+ @Mock
+ private AaiConnection aaiConnection;
+
+ @InjectMocks
+ private VnfAaiChecker checker;
+
+ @Test
+ public void testAll() {
+ // when
+ final boolean response = checker.vnfCheck(VnfNotificationFilterType.ALL, VNF_ID);
+
+ // then
+ assertTrue(response);
+ }
+
+ @Test
+ public void testAaiCheckedPresent() {
+ // given
+ when(aaiConnection.checkGenericVnfId(eq(VNF_ID))).thenReturn(true);
+
+ // when
+ final boolean response = checker.vnfCheck(VnfNotificationFilterType.AAI_CHECKED, VNF_ID);
+
+ // then
+ assertTrue(response);
+ }
+
+ @Test
+ public void testAaiCheckedAbsent() {
+ // given
+ when(aaiConnection.checkGenericVnfId(eq(VNF_ID))).thenReturn(false);
+
+ // when
+ final boolean response = checker.vnfCheck(VnfNotificationFilterType.AAI_CHECKED, VNF_ID);
+
+ // then
+ assertFalse(response);
+ }
+
+ @Test
+ public void testNone() {
+ // when
+ final boolean response = checker.vnfCheck(VnfNotificationFilterType.NONE, VNF_ID);
+
+ // then
+ assertFalse(response);
+ }
+}
--- /dev/null
+#
+# Copyright © 2019, 2020 Samsung.
+# All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+server:
+ port: 9098
+
+vevnfmadapter:
+ vnf-filter-json: '{notificationTypes:[VnfLcmOperationOccurrenceNotification],operationStates:[COMPLETED]}'
+ endpoint: http://so-ve-vnfm-adapter.onap:9098
+
+mso:
+ key: 07a7159d3bf51a0e53be7a8f89699be7
+
+aai:
+ endpoint: https://aai.onap:30233
+ auth: 75C4483F9C05E2C33A8602635FA532397EC44AB667A2B64DED4FEE08DD932F2E3C1FEE
+
+vnfm:
+ default-endpoint: https://so-vnfm-simulator.onap:9093
+ subscription: /vnflcm/v1/subscriptions
+ notification: /lcm/v1/vnf/instances/notifications
+
+notification:
+ vnf-filter-type: ALL
+
+dmaap:
+ endpoint: http://message-router.onap:30227
+ topic: /events/unauthenticated.DCAE_CL_OUTPUT
+ closed-loop:
+ control:
+ name: ClosedLoopControlName
+ version: 1.0.2
+
+spring:
+ security:
+ usercredentials:
+ - username: admin
+ openpass: a4b3c2d1
+ password: '$2a$10$vU.mWyNTsikAxXIA5c269ewCpAbYTiyMS0m1N.kn4F2CSGEnrKN7K'
+ role: USER
+ http:
+ converters:
+ preferred-json-mapper: gson