+++ /dev/null
-/*
- * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.netvirt.openstack.netvirt.translator.iaware.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.netvirt.openstack.netvirt.translator.iaware.INeutronNetworkAware;
-import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork;
-import org.opendaylight.netvirt.openstack.netvirt.translator.NeutronNetwork_Segment;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeGre;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVxlan;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.neutron.networks.network.Segments;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.common.collect.ImmutableBiMap;
-
-public class NeutronNetworkChangeListener implements ClusteredDataChangeListener, AutoCloseable {
- private static final Logger LOG = LoggerFactory.getLogger(NeutronNetworkChangeListener.class);
-
- private static final ImmutableBiMap<Class<? extends NetworkTypeBase>,String> NETWORK_MAP
- = new ImmutableBiMap.Builder<Class<? extends NetworkTypeBase>,String>()
- .put(NetworkTypeFlat.class,"flat")
- .put(NetworkTypeGre.class,"gre")
- .put(NetworkTypeVlan.class,"vlan")
- .put(NetworkTypeVxlan.class,"vxlan")
- .build();
-
- static private String getNetworkTypeString(Class<? extends NetworkTypeBase> type) {
- String ret = NETWORK_MAP.get(type);
- if (ret == null) {
- ret = "flat";
- }
- return ret;
- }
-
- private ListenerRegistration<DataChangeListener> registration;
- private DataBroker db;
-
- public NeutronNetworkChangeListener(DataBroker db){
- this.db = db;
- InstanceIdentifier<Network> path = InstanceIdentifier
- .create(Neutron.class)
- .child(Networks.class)
- .child(Network.class);
- LOG.debug("Register listener for Neutron Network model data changes");
- registration =
- this.db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, path, this, DataChangeScope.ONE);
-
- }
-
- @Override
- public void onDataChanged(
- AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
- LOG.trace("Data changes : {}",changes);
-
- Object[] subscribers = NeutronIAwareUtil.getInstances(INeutronNetworkAware.class, this);
- createNetwork(changes, subscribers);
- updateNetwork(changes, subscribers);
- deleteNetwork(changes, subscribers);
- }
-
- private void createNetwork(
- AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
- Object[] subscribers) {
- for (Entry<InstanceIdentifier<?>, DataObject> newNetwork : changes.getCreatedData().entrySet()) {
- if(newNetwork.getValue() instanceof Network){
- NeutronNetwork network = fromMd((Network)newNetwork.getValue());
- for(Object entry: subscribers){
- INeutronNetworkAware subscriber = (INeutronNetworkAware)entry;
- subscriber.neutronNetworkCreated(network);
- }
- }
- }
- }
-
- private void updateNetwork(
- AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
- Object[] subscribers) {
- for (Entry<InstanceIdentifier<?>, DataObject> updateNetwork : changes.getUpdatedData().entrySet()) {
- if(updateNetwork.getValue() instanceof Network){
- NeutronNetwork network = fromMd((Network)updateNetwork.getValue());
- for(Object entry: subscribers){
- INeutronNetworkAware subscriber = (INeutronNetworkAware)entry;
- subscriber.neutronNetworkUpdated(network);
- }
- }
- }
- }
-
- private void deleteNetwork(
- AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes,
- Object[] subscribers) {
- for (InstanceIdentifier<?> deletedNetworkPath : changes.getRemovedPaths()) {
- if(deletedNetworkPath.getTargetType().equals(Network.class)){
- NeutronNetwork network = fromMd((Network)changes.getOriginalData().get(deletedNetworkPath));
- for(Object entry: subscribers){
- INeutronNetworkAware subscriber = (INeutronNetworkAware)entry;
- subscriber.neutronNetworkDeleted(network);
- }
- }
- }
- }
-
- /*
- * This method is borrowed from NeutronNetworkInterface.java class of Neutron Northbound class.
- * We will be utilizing similar code from other classes from the same package of neutron project.
- */
- private NeutronNetwork fromMd(Network network) {
- NeutronNetwork result = new NeutronNetwork();
- result.setAdminStateUp(network.isAdminStateUp());
- result.setNetworkName(network.getName());
- result.setShared(network.isShared());
- result.setStatus(network.getStatus());
-
- // todo remove '-' chars as tenant id doesn't use them
- if (network.getTenantId() != null) {
- result.setTenantID(network.getTenantId().getValue());
- }
- result.setID(network.getUuid().getValue());
-
- NetworkL3Extension l3Extension = network.getAugmentation(NetworkL3Extension.class);
- result.setRouterExternal(l3Extension.isExternal());
-
- NetworkProviderExtension providerExtension = network.getAugmentation(NetworkProviderExtension.class);
- result.setProviderPhysicalNetwork(providerExtension.getPhysicalNetwork());
- result.setProviderSegmentationID(providerExtension.getSegmentationId());
- result.setProviderNetworkType(getNetworkTypeString(providerExtension.getNetworkType()));
- List<NeutronNetwork_Segment> segments = new ArrayList<>();
- if (providerExtension.getSegments() != null) {
- for (Segments segment: providerExtension.getSegments()) {
- NeutronNetwork_Segment neutronSegment = new NeutronNetwork_Segment();
- neutronSegment.setProviderPhysicalNetwork(segment.getPhysicalNetwork());
- neutronSegment.setProviderSegmentationID(segment.getSegmentationId());
- neutronSegment.setProviderNetworkType(getNetworkTypeString(segment.getNetworkType()));
- segments.add(neutronSegment);
- }
- }
- result.setSegments(segments);
- return result;
- }
-
- @Override
- public void close() throws Exception {
- registration.close();
- }
-}