/*
* Copyright (c) 2015 Inocybe Technologies 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.nic.mapping.mdsal.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.sal.binding.api.BindingAwareBroker.ProviderContext;
import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
import org.opendaylight.nic.mapping.api.IntentMappingService;
import org.opendaylight.nic.utils.MdsalUtils;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.Mappings;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.MappingsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.multimap.OuterMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.multimap.OuterMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.multimap.OuterMapKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.multimap.outer.map.InnerMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nic.mapping.rev151111.multimap.outer.map.InnerMapBuilder;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.osgi.framework.ServiceRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MappingMdsalProvider implements IntentMappingService,
BindingAwareProvider,
DataChangeListener,
AutoCloseable {
protected ServiceRegistration<IntentMappingService> intentMappingServiceRegistration;
private static final Logger LOG = LoggerFactory.getLogger(MappingMdsalProvider.class);
private DataBroker dataBroker;
private MdsalUtils mdsalUtils;
//FIXME extract this constant to the Utils bundle
public static final InstanceIdentifier<Mappings> MAPPINGS_IID =
InstanceIdentifier
.builder(Mappings.class)
.build();
public MappingMdsalProvider() {
}
@Override
public void close() throws Exception {
if (intentMappingServiceRegistration != null)
intentMappingServiceRegistration.unregister();
}
@Override
public void onDataChanged(AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
// TODO Auto-generated method stub
}
@Override
public void onSessionInitiated(ProviderContext session) {
// Retrieve the data broker to create transactions
dataBroker = session.getSALService(DataBroker.class);
this.mdsalUtils = new MdsalUtils(dataBroker);
Mappings mappings = new MappingsBuilder().build();
// Initialize default config data in MD-SAL data store
initDatastore(LogicalDatastoreType.CONFIGURATION, MAPPINGS_IID, mappings);
// Initialize the Operational datastore so that we can copy data to it
// in the future.
initDatastore(LogicalDatastoreType.OPERATIONAL, MAPPINGS_IID, mappings);
}
private void initDatastore(LogicalDatastoreType store,
InstanceIdentifier<Mappings> iid,
Mappings mappings) {
mdsalUtils.put(store, iid, mappings);
LOG.info("initDatastore: mappings data populated: {}", store, iid, mappings);
}
@Override
public Collection<String> keys() {
Collection<String> keys = new ArrayList<String>();
Mappings mappings = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, MAPPINGS_IID);
if(mappings == null)
return keys;
List<OuterMap> outerMap = mappings.getOuterMap();
if (outerMap != null && !outerMap.isEmpty()) {
for (OuterMap map: outerMap) {
keys.add(map.getKey().getId());
}
}
return keys;
}
@Override
public void add(String key, Map<String, String> objs) {
OuterMapKey mapKey = new OuterMapKey(key);
InstanceIdentifier<OuterMap> outerMapIid = InstanceIdentifier
.builder(Mappings.class)
.child(OuterMap.class, mapKey)
.build();
List<InnerMap> innerMap = new ArrayList<>();
if (objs != null && objs.size() > 0){
for (String keyy : objs.keySet()) {
String valuee = objs.get(keyy);
InnerMap innerElement = new InnerMapBuilder().setInnerKey(keyy).setValue(valuee).build();
innerMap.add(innerElement);
}
}
OuterMap outerMap = new OuterMapBuilder().setId(key).setKey(mapKey).setInnerMap(innerMap).build();
mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, outerMapIid, outerMap);
}
@Override
public Map<String, String> get(String key) {
Map<String, String> subjectMappings = new HashMap<>();
InstanceIdentifier<OuterMap> outerMapIid = InstanceIdentifier
.builder(Mappings.class)
.child(OuterMap.class,
new OuterMapKey(key))
.build();
OuterMap outerMap = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, outerMapIid);
if (outerMap != null && outerMap.getInnerMap() != null && !outerMap.getInnerMap().isEmpty()) {
for (InnerMap innerMap : outerMap.getInnerMap()) {
subjectMappings.put(innerMap.getInnerKey(), innerMap.getValue());
}
}
return subjectMappings;
}
@Override
public boolean delete(String key) {
OuterMapKey mapKey = new OuterMapKey(key);
InstanceIdentifier<OuterMap> outerMapIid = InstanceIdentifier
.builder(Mappings.class)
.child(OuterMap.class, mapKey)
.build();
return mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, outerMapIid);
}
}