diff --git a/src/main/java/net/floodlightcontroller/core/internal/Controller.java b/src/main/java/net/floodlightcontroller/core/internal/Controller.java index ef49cded3fc36028bfde24612ed0c2b8cabeddf0..eb8322c4e03fb9ed5d3b04a971684dbd48840788 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/Controller.java +++ b/src/main/java/net/floodlightcontroller/core/internal/Controller.java @@ -720,6 +720,23 @@ public class Controller implements IFloodlightProviderService, IStorageSourceLis } log.info("Number of worker threads set to {}", this.workerThreads); + + /** + * Tulio Ribeiro + */ + String controllerId = configParams.get("controllerId"); + if (!Strings.isNullOrEmpty(controllerId)) { + try { + this.controllerId = controllerId; + } catch (Exception e) { + log.error("Invalid controlelrId {}, {}", controllerId, e); + throw new FloodlightModuleException("Invalid controllerId of " + controllerId + " in config"); + } + } + log.info("ControllerId set to {}", this.controllerId); + + + String addresses = configParams.get("openFlowAddresses"); if (!Strings.isNullOrEmpty(addresses)) { try { diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java index 0611648a5252cd623f1ade599777b3a9151c0067..41b63c45d5eb2cf10a8c65a695321de71a7b2708 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFChannelHandler.java @@ -39,6 +39,7 @@ import org.projectfloodlight.openflow.protocol.OFHelloElem; import org.projectfloodlight.openflow.protocol.OFHelloElemVersionbitmap; import org.projectfloodlight.openflow.protocol.OFMessage; import org.projectfloodlight.openflow.protocol.OFPortStatus; +import org.projectfloodlight.openflow.protocol.OFRoleStatus; import org.projectfloodlight.openflow.protocol.OFType; import org.projectfloodlight.openflow.protocol.OFVersion; import org.projectfloodlight.openflow.protocol.ver13.OFHelloElemTypeSerializerVer13; @@ -831,7 +832,7 @@ class OFChannelHandler extends SimpleChannelInboundHandler<Iterable<OFMessage>> .build(); write(reply); } - + private void write(OFMessage m) { channel.writeAndFlush(Collections.singletonList(m)); } diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java index 47671f5cedd4b502bfc8aa69a7354943568d62c2..aa9322d6442b5baec6863399decf5025d3cd2cf2 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchHandshakeHandler.java @@ -55,6 +55,7 @@ import org.projectfloodlight.openflow.protocol.OFPortStatus; import org.projectfloodlight.openflow.protocol.OFQueueGetConfigReply; import org.projectfloodlight.openflow.protocol.OFRoleReply; import org.projectfloodlight.openflow.protocol.OFRoleRequest; +import org.projectfloodlight.openflow.protocol.OFRoleStatus; import org.projectfloodlight.openflow.protocol.OFSetConfig; import org.projectfloodlight.openflow.protocol.OFStatsReply; import org.projectfloodlight.openflow.protocol.OFStatsReplyFlags; @@ -617,6 +618,13 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener { void processOFRoleRequest(OFRoleRequest m) { unhandledMessageWritten(m); } + + /** + * Tulio Ribeiro + */ + void processOFRoleStatus(OFRoleStatus m){ + unhandledMessageReceived(m); + } void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) { unhandledMessageWritten(m); @@ -863,6 +871,9 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener { case EXPERIMENTER: processOFExperimenter((OFExperimenter) m); break; + case ROLE_STATUS: + processOFRoleStatus((OFRoleStatus) m); + break; default: illegalMessageReceived(m); break; @@ -1313,7 +1324,20 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener { @Override void enterState(){ - sendRoleRequest(roleManager.getOFControllerRole()); + //sendRoleRequest(roleManager.getOFControllerRole());//original + /** + * Tulio Ribeiro + * Retrieve role from floodlightdefault.properties configuration file + * swId;Role 00:00:00:00:00:00:00:01;ROLE_SLAVE + * If not defined there, the role will be set as MASTER + */ + OFControllerRole role = OFControllerRole.ROLE_MASTER; + if(OFSwitchManager.switchInitialRole != null) + if(OFSwitchManager.switchInitialRole.containsKey(mainConnection.getDatapathId())){ + role = OFSwitchManager.switchInitialRole.get(mainConnection.getDatapathId()); + log.info("Defining switch role from config file: {}", role); + } + sendRoleRequest(role); } } @@ -1413,6 +1437,35 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener { void processOFRoleRequest(OFRoleRequest m) { sendRoleRequest(m); } + + @Override + void processOFRoleStatus(OFRoleStatus m) { + /** + * Tulio Ribeiro + * + * Controller roles. + * enum ofp_controller_role { + * OFPCR_ROLE_NOCHANGE = 0, Don’t change current role. + * OFPCR_ROLE_EQUAL = 1, Default role, full access. + * OFPCR_ROLE_MASTER = 2, Full access, at most one master. + * OFPCR_ROLE_SLAVE = 3, Read-only access. + * }; + */ + //log.info("Processing roleStatus from MasterState..."); + long role = m.getRole(); + if(role==3){ + sendRoleRequest(OFControllerRole.ROLE_SLAVE); + /*OFSwitchManager.switchInitialRole.remove(mainConnection.getDatapathId()); + OFSwitchManager.switchInitialRole.put(mainConnection.getDatapathId(), + OFControllerRole.ROLE_SLAVE);*/ + } + else if (role==2) + sendRoleRequest(OFControllerRole.ROLE_MASTER); + else if (role==1) + sendRoleRequest(OFControllerRole.ROLE_EQUAL); + else + sendRoleRequest(OFControllerRole.ROLE_NOCHANGE); + } @Override void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) { @@ -1530,6 +1583,30 @@ public class OFSwitchHandshakeHandler implements IOFConnectionListener { void processOFRoleRequest(OFRoleRequest m) { sendRoleRequest(m); } + + @Override + void processOFRoleStatus(OFRoleStatus m) { + /** + * Tulio Ribeiro + * + * Controller roles. + * enum ofp_controller_role { + * OFPCR_ROLE_NOCHANGE = 0, Don’t change current role. + * OFPCR_ROLE_EQUAL = 1, Default role, full access. + * OFPCR_ROLE_MASTER = 2, Full access, at most one master. + * OFPCR_ROLE_SLAVE = 3, Read-only access. + * }; + */ + long role = m.getRole(); + if(role==3) + sendRoleRequest(OFControllerRole.ROLE_SLAVE); + else if (role==2) + sendRoleRequest(OFControllerRole.ROLE_MASTER); + else if (role==1) + sendRoleRequest(OFControllerRole.ROLE_EQUAL); + else + sendRoleRequest(OFControllerRole.ROLE_NOCHANGE); + } @Override void processOFNiciraControllerRoleRequest(OFNiciraControllerRoleRequest m) { diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java index 9b22851539d7f2e344514bcc9583a7ea23544145..789fe686876da4a06992be22073e9b2d373608b6 100644 --- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java +++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchManager.java @@ -92,7 +92,8 @@ import io.netty.util.concurrent.GlobalEventExecutor; * @author gregor, capveg, sovietaced * */ -public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListener, IHAListener, IFloodlightModule, IOFSwitchService, IStoreListener<DatapathId> { +public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListener, +IHAListener, IFloodlightModule, IOFSwitchService, IStoreListener<DatapathId> { private static final Logger log = LoggerFactory.getLogger(OFSwitchManager.class); private volatile OFControllerRole role; @@ -117,6 +118,8 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen private ConcurrentHashMap<DatapathId, OFSwitchHandshakeHandler> switchHandlers; private ConcurrentHashMap<DatapathId, IOFSwitchBackend> switches; private ConcurrentHashMap<DatapathId, IOFSwitch> syncedSwitches; + + protected static Map<DatapathId, OFControllerRole> switchInitialRole; private ISwitchDriverRegistry driverRegistry; @@ -631,7 +634,8 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen @Override public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { - Collection<Class<? extends IFloodlightService>> l = new ArrayList<Class<? extends IFloodlightService>>(); + Collection<Class<? extends IFloodlightService>> l = + new ArrayList<Class<? extends IFloodlightService>>(); l.add(IFloodlightProviderService.class); l.add(IDebugEventService.class); @@ -728,6 +732,12 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen log.info("Clear switch flow tables on each transition to master: TRUE"); OFSwitchManager.clearTablesOnEachTransitionToMaster = true; } + + + //Define initial role per switch + String switchesInitialState = configParams.get("switchesInitialState"); + switchInitialRole = jsonToSwitchInitialRoleMap(switchesInitialState); + log.debug("SwitchInitialRole: {}", switchInitialRole.entrySet()); /* * Get default max table for forward to controller flows. @@ -1169,4 +1179,63 @@ public class OFSwitchManager implements IOFSwitchManager, INewOFConnectionListen addUpdateToQueue(update); }*/ } + + + /** + * Tulio Ribeiro + * @param String json + * @return Map<DatapathId, OFControllerRole> + */ + private static Map<DatapathId, OFControllerRole> jsonToSwitchInitialRoleMap(String json) { + MappingJsonFactory f = new MappingJsonFactory(); + JsonParser jp; + Map<DatapathId, OFControllerRole> retValue = new HashMap<DatapathId, OFControllerRole>(); + + if (json == null || json.isEmpty()) { + return retValue; + } + + try { + try { + jp = f.createParser(json); + } catch (JsonParseException e) { + throw new IOException(e); + } + + jp.nextToken(); + if (jp.getCurrentToken() != JsonToken.START_OBJECT) { + throw new IOException("Expected START_OBJECT"); + } + + while (jp.nextToken() != JsonToken.END_OBJECT) { + if (jp.getCurrentToken() != JsonToken.FIELD_NAME) { + throw new IOException("Expected FIELD_NAME"); + } + + String n = jp.getCurrentName(); + jp.nextToken(); + if (jp.getText().equals("")) { + continue; + } + + DatapathId dpid; + OFControllerRole ofcr=OFControllerRole.ROLE_NOCHANGE; + + try { + n = n.trim(); + dpid = DatapathId.of(n); + ofcr = OFControllerRole.valueOf(jp.getText()); + retValue.put(dpid, ofcr); + + } catch (NumberFormatException e) { + log.error("Invalid DPID format: {}, or OFControllerRole: {}", n, ofcr); + } + } + } catch (IOException e) { + log.error("Problem: {}", e); + } + return retValue; + } + + } diff --git a/src/main/java/net/floodlightcontroller/simpleft/FT.java b/src/main/java/net/floodlightcontroller/simpleft/FT.java new file mode 100644 index 0000000000000000000000000000000000000000..f725ecf3cf493bd0784cdd8c59f78a1af9af7ba0 --- /dev/null +++ b/src/main/java/net/floodlightcontroller/simpleft/FT.java @@ -0,0 +1,299 @@ +/** + * Tulio Alberton Ribeiro + * + * LaSIGE - Large-Scale Informatics Systems Laboratory + * + * 03/2016 + * + * Without warrant + * + * 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 + */ + +package net.floodlightcontroller.simpleft; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; + +import net.floodlightcontroller.core.FloodlightContext; +import net.floodlightcontroller.core.IOFMessageListener; +import net.floodlightcontroller.core.IOFSwitch; +import net.floodlightcontroller.core.IOFSwitchListener; +import net.floodlightcontroller.core.PortChangeType; +import net.floodlightcontroller.core.internal.FloodlightProvider; +import net.floodlightcontroller.core.internal.IOFSwitchService; +import net.floodlightcontroller.core.module.FloodlightModuleContext; +import net.floodlightcontroller.core.module.FloodlightModuleException; +import net.floodlightcontroller.core.module.IFloodlightModule; +import net.floodlightcontroller.core.module.IFloodlightService; +import net.floodlightcontroller.storage.IStorageSourceService; +import net.floodlightcontroller.threadpool.IThreadPoolService; + +import org.projectfloodlight.openflow.protocol.OFControllerRole; +import org.projectfloodlight.openflow.protocol.OFMessage; +import org.projectfloodlight.openflow.protocol.OFPortDesc; +import org.projectfloodlight.openflow.protocol.OFRoleReply; +import org.projectfloodlight.openflow.protocol.OFType; +import org.projectfloodlight.openflow.types.DatapathId; +import org.sdnplatform.sync.IStoreClient; +import org.sdnplatform.sync.IStoreListener; +import org.sdnplatform.sync.ISyncService; +import org.sdnplatform.sync.ISyncService.Scope; +import org.sdnplatform.sync.error.SyncException; +import org.sdnplatform.sync.internal.rpc.IRPCListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class FT implements +IOFMessageListener, +IFloodlightModule, +IStoreListener<String>, +IOFSwitchListener, +IRPCListener +{ + + private ISyncService syncService; + private IStoreClient<String, String> storeFT; + + protected static Logger logger = LoggerFactory.getLogger(FT.class); + + protected static IOFSwitchService switchService; + private static UtilDurable utilDurable; + + private String controllerId; + + @Override + public String getName() { + // TODO Auto-generated method stub + return FT.class.getSimpleName(); + } + + @Override + public boolean isCallbackOrderingPrereq(OFType type, String name) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isCallbackOrderingPostreq(OFType type, String name) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Collection<Class<? extends IFloodlightService>> getModuleServices() { + // TODO Auto-generated method stub + return null; + + } + + @Override + public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() { + // TODO Auto-generated method stub + return null; + + } + + @Override + public Collection<Class<? extends IFloodlightService>> getModuleDependencies() { + // TODO Auto-generated method stub + Collection<Class<? extends IFloodlightService>> l = + new ArrayList<Class<? extends IFloodlightService>>(); + l.add(IStorageSourceService.class); + l.add(ISyncService.class); + l.add(IOFSwitchService.class); + return l; + } + + @Override + public void init(FloodlightModuleContext context) + throws FloodlightModuleException { + // TODO Auto-generated method stub + + this.syncService = context.getServiceImpl(ISyncService.class); + switchService = context.getServiceImpl(IOFSwitchService.class); + utilDurable = new UtilDurable(); + + Map<String, String> configParams = context.getConfigParams(FloodlightProvider.class); + controllerId = configParams.get("controllerId"); + } + + @Override + public void startUp(FloodlightModuleContext context) + throws FloodlightModuleException { + + switchService.addOFSwitchListener(this); + syncService.addRPCListener(this); + + try { + this.syncService.registerStore("FT_Switches", Scope.GLOBAL); + this.storeFT = this.syncService + .getStoreClient("FT_Switches", + String.class, + String.class); + this.storeFT.addStoreListener(this); + } catch (SyncException e) { + throw new FloodlightModuleException("Error while setting up sync service", e); + } + + } + + @Override + public net.floodlightcontroller.core.IListener.Command receive( + IOFSwitch sw, OFMessage msg, FloodlightContext cntx) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void keysModified(Iterator<String> keys, + org.sdnplatform.sync.IStoreListener.UpdateType type) { + // TODO Auto-generated method stub + while(keys.hasNext()){ + String k = keys.next(); + try { + /*logger.debug("keysModified: Key:{}, Value:{}, Type: {}", + new Object[] { + k, + storeClient.get(k).getValue().toString(), + type.name()} + );*/ + if(type.name().equals("REMOTE")){ + String swIds = storeFT.get(k).getValue(); + logger.debug("REMOTE: NodeId:{}, Switches:{}", k, swIds); + } + } catch (SyncException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + } + + @Override + public void switchAdded(DatapathId switchId) { + // TODO Auto-generated method stub + } + + @Override + public void switchRemoved(DatapathId switchId) { + // TODO Auto-generated method stub + try { + this.storeFT.put(controllerId, getActiveSwitches()); + } catch (SyncException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public void switchActivated(DatapathId switchId) { + // TODO Auto-generated method stub + String switches = getActiveSwitches(); + if(switches==null)return; + try { + this.storeFT.put(controllerId, switches); + } catch (SyncException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + @Override + public void switchPortChanged(DatapathId switchId, OFPortDesc port, + PortChangeType type) { + // TODO Auto-generated method stub + + } + + @Override + public void switchChanged(DatapathId switchId) { + // TODO Auto-generated method stub + String switches = getActiveSwitches(); + if(switches==null)return; + try { + this.storeFT.put(controllerId, switches); + } catch (SyncException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + public String getActiveSwitches(){ + if(switchService == null)return null; + String activeSwitches = ""; + Iterator<DatapathId> itDpid = switchService.getAllSwitchDpids().iterator(); + while (itDpid.hasNext()) { + DatapathId dpid = itDpid.next(); + try{ + if(switchService.getActiveSwitch(dpid).isActive()){ + activeSwitches += dpid; + if(itDpid.hasNext()) + activeSwitches += ","; + } + } + catch(NullPointerException npe){ + return null; + } + } + return activeSwitches; + } + + public void setSwitchRole(OFControllerRole role, String swId){ + + IOFSwitch sw = switchService.getActiveSwitch(DatapathId.of(swId)); + OFRoleReply reply=null; + UtilDurable utilDurable = new UtilDurable(); + reply = utilDurable.setSwitchRole(sw, role); + + if(reply!=null){ + logger.info("DEFINED {} as {}, reply.getRole:{}!", + new Object[]{ + sw.getId(), + role, + reply.getRole()}); + } + else + logger.info("Reply NULL!"); + } + + @Override + public void disconnectedNode(Short nodeId) { + // TODO Auto-generated method stub + String swIds=null; + try { + swIds = storeFT.get(""+nodeId).getValue(); + logger.debug("Switches managed by nodeId:{}, Switches:{}", nodeId, swIds); + } catch (SyncException e) { + e.printStackTrace(); + } + + if(!swIds.equals("")){ + String swId[] = swIds.split(","); + for (int i = 0; i < swId.length; i++) { + setSwitchRole(OFControllerRole.ROLE_MASTER, swId[i]); + } + } + } + + @Override + public void connectedNode(Short nodeId) { + // TODO Auto-generated method stub + String activeSwicthes = getActiveSwitches(); + logger.debug("NodeID: {} connected, my switches: {}", nodeId, activeSwicthes); + try { + storeFT.put(controllerId, activeSwicthes); + } catch (SyncException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java b/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java new file mode 100644 index 0000000000000000000000000000000000000000..bdd5a9f27ca150f1bcaeaeec2523f44534a64c2e --- /dev/null +++ b/src/main/java/net/floodlightcontroller/simpleft/UtilDurable.java @@ -0,0 +1,37 @@ +package net.floodlightcontroller.simpleft; + +import java.util.concurrent.TimeUnit; + +import net.floodlightcontroller.core.IOFSwitch; + +import org.projectfloodlight.openflow.protocol.OFControllerRole; +import org.projectfloodlight.openflow.protocol.OFRoleReply; +import org.projectfloodlight.openflow.types.U64; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.util.concurrent.ListenableFuture; + +public class UtilDurable { + private static Logger logger; + + public UtilDurable(){ + logger = LoggerFactory.getLogger(UtilDurable.class); + } + + public OFRoleReply setSwitchRole(IOFSwitch sw, OFControllerRole role) { + try { + ListenableFuture<OFRoleReply> future = sw.writeRequest(sw.getOFFactory().buildRoleRequest() + .setGenerationId(U64.ZERO) + .setRole(role) + .build()); + return future.get(10, TimeUnit.SECONDS); + + } catch (Exception e) { + logger.error("Failure setting switch {} role to {}.", sw.toString(), role.toString()); + logger.error(e.getMessage()); + } + return null; + } + +} diff --git a/src/main/java/org/sdnplatform/sync/ISyncService.java b/src/main/java/org/sdnplatform/sync/ISyncService.java index 48feead4a3c378e61147292203db3ccaa6435900..6598952829ec4c9751c80a1c9995a1bde844ac35 100644 --- a/src/main/java/org/sdnplatform/sync/ISyncService.java +++ b/src/main/java/org/sdnplatform/sync/ISyncService.java @@ -1,13 +1,13 @@ package org.sdnplatform.sync; +import net.floodlightcontroller.core.module.IFloodlightService; + import org.sdnplatform.sync.error.SyncException; import org.sdnplatform.sync.error.UnknownStoreException; +import org.sdnplatform.sync.internal.rpc.IRPCListener; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.core.type.TypeReference; - - -import net.floodlightcontroller.core.module.IFloodlightService; +import com.fasterxml.jackson.databind.JsonNode; /** * The sync service provides a high-performance in-memory database for @@ -133,4 +133,18 @@ public interface ISyncService extends IFloodlightService { IInconsistencyResolver<Versioned<V>> resolver) throws UnknownStoreException; + + + + + /** + * Listener to RPC connections, used in simple Fault tolerance module, + * or other modules that need cluster monitor nodes (connect and disconnect). + * The listener is dispatched at connected or disconnected events. + * The listener inform the node id of connected or disconnected nodes on cluster. + * @param listener + */ + public void addRPCListener(IRPCListener listener); + public void removeRPCListener(IRPCListener listener); + } diff --git a/src/main/java/org/sdnplatform/sync/internal/SyncManager.java b/src/main/java/org/sdnplatform/sync/internal/SyncManager.java index 540fa42b1c1155ee49869caf8403c937e4d83052..92e57e09990bdf52f54d718cf80aed2988d5335f 100644 --- a/src/main/java/org/sdnplatform/sync/internal/SyncManager.java +++ b/src/main/java/org/sdnplatform/sync/internal/SyncManager.java @@ -18,13 +18,19 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.core.type.TypeReference; +import net.floodlightcontroller.core.module.FloodlightModuleContext; +import net.floodlightcontroller.core.module.FloodlightModuleException; +import net.floodlightcontroller.core.module.IFloodlightService; +import net.floodlightcontroller.core.util.SingletonTask; +import net.floodlightcontroller.debugcounter.IDebugCounter; +import net.floodlightcontroller.debugcounter.IDebugCounterService; +import net.floodlightcontroller.storage.IStorageSourceService; +import net.floodlightcontroller.threadpool.IThreadPoolService; import org.sdnplatform.sync.IClosableIterator; import org.sdnplatform.sync.ISyncService; -import org.sdnplatform.sync.Versioned; import org.sdnplatform.sync.IVersion.Occurred; +import org.sdnplatform.sync.Versioned; import org.sdnplatform.sync.error.PersistException; import org.sdnplatform.sync.error.SyncException; import org.sdnplatform.sync.error.SyncRuntimeException; @@ -38,6 +44,7 @@ import org.sdnplatform.sync.internal.config.Node; import org.sdnplatform.sync.internal.config.PropertyCCProvider; import org.sdnplatform.sync.internal.config.StorageCCProvider; import org.sdnplatform.sync.internal.config.SyncStoreCCProvider; +import org.sdnplatform.sync.internal.rpc.IRPCListener; import org.sdnplatform.sync.internal.rpc.RPCService; import org.sdnplatform.sync.internal.rpc.TProtocolUtil; import org.sdnplatform.sync.internal.store.IStorageEngine; @@ -46,22 +53,16 @@ import org.sdnplatform.sync.internal.store.MappingStoreListener; import org.sdnplatform.sync.internal.store.SynchronizingStorageEngine; import org.sdnplatform.sync.internal.util.ByteArray; import org.sdnplatform.sync.internal.version.VectorClock; -import org.sdnplatform.sync.thrift.SyncMessage; import org.sdnplatform.sync.thrift.KeyedValues; import org.sdnplatform.sync.thrift.KeyedVersions; +import org.sdnplatform.sync.thrift.SyncMessage; import org.sdnplatform.sync.thrift.SyncOfferMessage; import org.sdnplatform.sync.thrift.SyncValueMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.floodlightcontroller.core.module.FloodlightModuleContext; -import net.floodlightcontroller.core.module.FloodlightModuleException; -import net.floodlightcontroller.core.module.IFloodlightService; -import net.floodlightcontroller.core.util.SingletonTask; -import net.floodlightcontroller.debugcounter.IDebugCounter; -import net.floodlightcontroller.debugcounter.IDebugCounterService; -import net.floodlightcontroller.storage.IStorageSourceService; -import net.floodlightcontroller.threadpool.IThreadPoolService; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; /** @@ -71,6 +72,7 @@ import net.floodlightcontroller.threadpool.IThreadPoolService; * @see ISyncService */ public class SyncManager extends AbstractSyncManager { + protected static final Logger logger = LoggerFactory.getLogger(SyncManager.class.getName()); @@ -812,4 +814,29 @@ public class SyncManager extends AbstractSyncManager { return bsm; } } + + + /** + * Add a listener to RPC connections on cluster. + * The listener is dispatched at connect or disconnect events. + * Can be used to monitor connections or disconnections on cluster configs. + */ + @Override + public void addRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + rpcService.addRPCListener(listener); + + } + /** + * Remove the listener to RPC connections on cluster. + * The listener is dispatched at connect or disconnect events. + * Can be used to monitor connections or disconnections on cluster configs. + */ + @Override + public void removeRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + rpcService.removeRPCListener(listener); + } + + } diff --git a/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java b/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java index c78218c206be2ca0a7a54ac0971e828c407806c2..113f3a33a47a4210d27db001fdf90c58e523467d 100644 --- a/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java +++ b/src/main/java/org/sdnplatform/sync/internal/config/PropertyCCProvider.java @@ -21,7 +21,7 @@ public class PropertyCCProvider implements IClusterConfigProvider { @Override public ClusterConfig getConfig() throws SyncException { - if (!config.containsKey("nodes") || !config.containsKey("thisNode")) + if (!config.containsKey("nodes") || !config.containsKey("thisNodeId")) throw new SyncException("Configuration properties nodes or " + "thisNode not set"); @@ -34,10 +34,10 @@ public class PropertyCCProvider implements IClusterConfigProvider { Short thisNodeId; try { - thisNodeId = Short.parseShort(config.get("thisNode")); + thisNodeId = Short.parseShort(config.get("thisNodeId")); } catch (NumberFormatException e) { throw new SyncException("Failed to parse thisNode " + - "node ID: " + config.get("thisNode"), e); + "node ID: " + config.get("thisNodeId"), e); } try { ObjectMapper mapper = new ObjectMapper(); @@ -49,6 +49,7 @@ public class PropertyCCProvider implements IClusterConfigProvider { keyStorePath, keyStorePassword); } catch (Exception e) { + e.printStackTrace(); throw new SyncException("Could not update " + "configuration", e); } diff --git a/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java b/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java index 23b8e7bc24b93d37d565081c5da17252be97a95f..fbe81c5b81ecd970a60ca6817f36417b9205d5b7 100644 --- a/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java +++ b/src/main/java/org/sdnplatform/sync/internal/remote/RemoteSyncManager.java @@ -3,6 +3,7 @@ package org.sdnplatform.sync.internal.remote; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.Collection; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; @@ -28,6 +29,8 @@ import org.sdnplatform.sync.error.SyncRuntimeException; import org.sdnplatform.sync.error.UnknownStoreException; import org.sdnplatform.sync.internal.AbstractSyncManager; import org.sdnplatform.sync.internal.config.AuthScheme; +import org.sdnplatform.sync.internal.config.ClusterConfig; +import org.sdnplatform.sync.internal.rpc.IRPCListener; import org.sdnplatform.sync.internal.rpc.RPCService; import org.sdnplatform.sync.internal.rpc.TProtocolUtil; import org.sdnplatform.sync.internal.store.IStore; @@ -370,4 +373,17 @@ public class RemoteSyncManager extends AbstractSyncManager { throw new RemoteStoreException("Error while waiting for reply", e); } } + + + @Override + public void addRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + + } + + @Override + public void removeRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + + } } diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java b/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java index 9d0f2b447908b3b413a2e837a5a4a71dddd38448..9c0077a9dd3ba8767617f03fed074c2a0bc47511 100644 --- a/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java +++ b/src/main/java/org/sdnplatform/sync/internal/rpc/AbstractRPCChannelHandler.java @@ -335,6 +335,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda throw new AuthException("No authentication data in " + "handshake message"); } + if (cr.isSetResponse()) { authenticateResponse(currentChallenge, cr.getResponse()); currentChallenge = null; @@ -348,8 +349,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda header.setTransactionId(getTransactionId()); m.setHeader(header); SyncMessage bsm = new SyncMessage(MessageType.HELLO); - bsm.setHello(m); - + bsm.setHello(m); AuthChallengeResponse reply = new AuthChallengeResponse(); reply.setResponse(generateResponse(cr.getChallenge())); m.setAuthChallengeResponse(reply); @@ -622,7 +622,7 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda } private String generateResponse(String challenge) throws AuthException { - byte[] secretBytes = getSharedSecret(); + byte[] secretBytes = getSharedSecret(); if (secretBytes == null) return null; SecretKeySpec signingKey = @@ -631,9 +631,9 @@ public abstract class AbstractRPCChannelHandler extends ChannelInboundHandlerAda try { mac = Mac.getInstance("HmacSHA1"); } catch (NoSuchAlgorithmException e) { - throw new AuthException("Could not initialize HmacSHA1 algorithm", - e); + throw new AuthException("Could not initialize HmacSHA1 algorithm", e); } + try { mac.init(signingKey); byte[] output = diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java b/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java new file mode 100644 index 0000000000000000000000000000000000000000..a124e341f2f09c6fb9c4697d6bc743f5f003cc80 --- /dev/null +++ b/src/main/java/org/sdnplatform/sync/internal/rpc/IRPCListener.java @@ -0,0 +1,32 @@ +/** + * Tulio Alberton Ribeiro + * + * LaSIGE - Large-Scale Informatics Systems Laboratory + * + * 03/2016 + * + * Without warrant + * + * 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 + */ + +package org.sdnplatform.sync.internal.rpc; + +public interface IRPCListener { + + /** + * Inform to listeners when a node is disconnected. + * @param nodeId + */ + public void disconnectedNode(Short nodeId); + + /** + * Inform to listeners when a node is connected. + * @param nodeId + */ + public void connectedNode(Short nodeId); +} diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java index a1c4fd7af7e73f9f97f5d165866adff4cca9fd10..aca15d1f6bf6e15d9f4effd0fe90f310924b28f1 100644 --- a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java +++ b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCChannelHandler.java @@ -556,14 +556,14 @@ public class RPCChannelHandler extends AbstractRPCChannelHandler { @Override protected byte[] getSharedSecret() throws AuthException { - String path = syncManager.getClusterConfig().getKeyStorePath(); - String pass = syncManager.getClusterConfig().getKeyStorePassword(); - try { - return CryptoUtil.getSharedSecret(path, pass); - } catch (Exception e) { - throw new AuthException("Could not read challenge/response " + - "shared secret from key store " + path, e); - } + String path = syncManager.getClusterConfig().getKeyStorePath(); + String pass = syncManager.getClusterConfig().getKeyStorePassword(); + try { + return CryptoUtil.getSharedSecret(path, pass); + } catch (Exception e) { + throw new AuthException("Could not read challenge/response " + + "shared secret from key store " + path, e); + } } @Override diff --git a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java index 962e355437fd946335f5f56c7a2c95977ca75670..824d1717f14869d8f9014d73eb71b49b240f35f7 100644 --- a/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java +++ b/src/main/java/org/sdnplatform/sync/internal/rpc/RPCService.java @@ -1,12 +1,30 @@ package org.sdnplatform.sync.internal.rpc; +import io.netty.bootstrap.Bootstrap; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.util.Timer; +import io.netty.util.concurrent.GlobalEventExecutor; + import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.EnumSet; import java.util.HashMap; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.LinkedTransferQueue; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; @@ -14,30 +32,15 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import java.util.concurrent.LinkedTransferQueue; import net.floodlightcontroller.core.util.SingletonTask; import net.floodlightcontroller.debugcounter.IDebugCounterService; -import io.netty.bootstrap.Bootstrap; -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelOption; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.group.ChannelGroup; -import io.netty.channel.group.DefaultChannelGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.Timer; -import io.netty.util.concurrent.GlobalEventExecutor; import org.sdnplatform.sync.internal.SyncManager; import org.sdnplatform.sync.internal.config.Node; import org.sdnplatform.sync.internal.util.Pair; -import org.sdnplatform.sync.thrift.SyncMessage; import org.sdnplatform.sync.thrift.MessageType; +import org.sdnplatform.sync.thrift.SyncMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +48,7 @@ import org.slf4j.LoggerFactory; * A lightweight RPC mechanism built on netty. * @author readams */ -public class RPCService { +public class RPCService{ protected static final Logger logger = LoggerFactory.getLogger(RPCService.class); @@ -54,6 +57,11 @@ public class RPCService { */ protected SyncManager syncManager; + /** + *Tulio Ribeiro + */ + protected Set<IRPCListener> rpcListeners; + /** * Debug counter service */ @@ -172,6 +180,7 @@ public class RPCService { this.syncManager = syncManager; this.debugCounter = debugCounter; this.timer = timer; + this.rpcListeners = new CopyOnWriteArraySet<IRPCListener>(); messageWindows = new ConcurrentHashMap<Short, MessageWindow>(); } @@ -299,6 +308,16 @@ public class RPCService { nc.nuke(); } connections.remove(nodeId); + + /** + * Tulio Ribeiro + * Inform all registered modules about disconnected node + */ + if (rpcListeners != null) { + for (IRPCListener listener : rpcListeners) { + listener.disconnectedNode(nodeId); + } + } } } @@ -502,6 +521,16 @@ public class RPCService { } c.nodeChannel = channel; c.state = NodeConnectionState.CONNECTED; + + /** + * Tulio Ribeiro + * Inform all registered modules about connected node + */ + if (rpcListeners != null) { + for (IRPCListener listener : rpcListeners) { + listener.connectedNode(nodeId); + } + } } } @@ -674,4 +703,16 @@ public class RPCService { } } } + + + //@Override + public void addRPCListener(IRPCListener listener) { + this.rpcListeners.add(listener); + } + + //@Override + public void removeRPCListener(IRPCListener listener) { + this.rpcListeners.remove(listener); + } + } \ No newline at end of file diff --git a/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java b/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java index 73998477a51eb01658af19fe9f65935559e8db76..3cbece71242d654e85e0f6ad21b33ffd201b8e21 100644 --- a/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java +++ b/src/main/java/org/sdnplatform/sync/internal/util/CryptoUtil.java @@ -1,8 +1,11 @@ package org.sdnplatform.sync.internal.util; import java.io.File; +import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.security.Key; import java.security.KeyStore; +import java.security.KeyStore.Entry; import java.security.SecureRandom; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; @@ -12,9 +15,7 @@ import org.sdnplatform.sync.ISyncService; public class CryptoUtil { private static SecureRandom secureRandom = new SecureRandom(); - public static final String CHALLENGE_RESPONSE_SECRET = - ISyncService.class.getPackage().getName() + - ".ChallengeResponseSecret"; + public static final String CHALLENGE_RESPONSE_SECRET = "AliasChallengeResponse"; public static byte[] secureRandom(int bytes) { byte[] r = new byte[bytes]; @@ -43,16 +44,12 @@ public class CryptoUtil { String keyStorePassword) throws Exception { if (keyStorePath == null) return null; - char[] password = keyStorePassword.toCharArray(); - KeyStore.ProtectionParameter protParam = - new KeyStore.PasswordProtection(password); - - KeyStore ks = readKeyStore(keyStorePath, password); - - KeyStore.SecretKeyEntry entry = (KeyStore.SecretKeyEntry) - ks.getEntry(CHALLENGE_RESPONSE_SECRET, protParam); - SecretKey secretKey = entry.getSecretKey(); - return secretKey.getEncoded(); + + KeyStore keyStore = KeyStore.getInstance("JCEKS"); + keyStore.load(new FileInputStream(keyStorePath), keyStorePassword.toCharArray()); + Key key = keyStore.getKey(CHALLENGE_RESPONSE_SECRET, keyStorePassword.toCharArray()); + + return key.getEncoded(); } public static void writeSharedSecret(String keyStorePath, diff --git a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule index b7dfe953e276c4fea382bdb2bd1ff63851d52f74..4aa8eb12eb21ecfd0cc84558d493e12930aec27c 100644 --- a/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule +++ b/src/main/resources/META-INF/services/net.floodlightcontroller.core.module.IFloodlightModule @@ -16,6 +16,7 @@ net.floodlightcontroller.threadpool.ThreadPool net.floodlightcontroller.core.internal.ShutdownServiceImpl org.sdnplatform.sync.internal.SyncManager org.sdnplatform.sync.internal.SyncTorture +net.floodlightcontroller.simpleft.FT net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher net.floodlightcontroller.testmodule.TestModule net.floodlightcontroller.topology.TopologyManager diff --git a/src/main/resources/floodlightNodeBackup.properties b/src/main/resources/floodlightNodeBackup.properties new file mode 100644 index 0000000000000000000000000000000000000000..fe982dec77c928dbacb225e237ec91e23ab31b6b --- /dev/null +++ b/src/main/resources/floodlightNodeBackup.properties @@ -0,0 +1,48 @@ +floodlight.modules=\ +net.floodlightcontroller.storage.memory.MemoryStorageSource,\ +net.floodlightcontroller.core.internal.FloodlightProvider,\ +net.floodlightcontroller.threadpool.ThreadPool,\ +net.floodlightcontroller.debugcounter.DebugCounterServiceImpl,\ +net.floodlightcontroller.perfmon.PktInProcessingTime,\ +net.floodlightcontroller.debugevent.DebugEventService,\ +net.floodlightcontroller.staticflowentry.StaticFlowEntryPusher,\ +net.floodlightcontroller.topology.TopologyManager,\ +net.floodlightcontroller.forwarding.Forwarding,\ +net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,\ +net.floodlightcontroller.ui.web.StaticWebRoutable,\ +net.floodlightcontroller.loadbalancer.LoadBalancer,\ +net.floodlightcontroller.firewall.Firewall,\ +net.floodlightcontroller.simpleft.FT,\ +net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\ +net.floodlightcontroller.accesscontrollist.ACL,\ +net.floodlightcontroller.statistics.StatisticsCollector +org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE +org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/key2.jceks +org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight2/ +org.sdnplatform.sync.internal.SyncManager.keyStorePassword=PassWord +org.sdnplatform.sync.internal.SyncManager.port=6643 +org.sdnplatform.sync.internal.SyncManager.thisNodeId=2 +org.sdnplatform.sync.internal.SyncManager.persistenceEnabled=FALSE +org.sdnplatform.sync.internal.SyncManager.nodes=[\ +{"nodeId": 1, "domainId": 1, "hostname": "192.168.1.100", "port": 6642},\ +{"nodeId": 2, "domainId": 1, "hostname": "192.168.1.100", "port": 6643}\ +] +net.floodlightcontroller.forwarding.Forwarding.match=vlan, mac, ip, transport +net.floodlightcontroller.forwarding.Forwarding.flood-arp=NO +net.floodlightcontroller.core.internal.FloodlightProvider.openFlowPort=7753 +net.floodlightcontroller.core.internal.FloodlightProvider.role=ACTIVE +net.floodlightcontroller.core.internal.FloodlightProvider.workerThreads=8 +net.floodlightcontroller.core.internal.FloodlightProvider.controllerId=2 +net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-history-size=10 +net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-update-threshold=0.5 +net.floodlightcontroller.core.internal.OFSwitchManager.defaultMaxTablesToReceiveTableMissFlow=1 +net.floodlightcontroller.core.internal.OFSwitchManager.maxTablesToReceiveTableMissFlowPerDpid={"00:00:00:00:00:00:00:01":"1","2":"1"} +net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=NO +net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=NO +net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to/file.jceks +net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=Password +net.floodlightcontroller.core.internal.OFSwitchManager.useSsl=NO +net.floodlightcontroller.core.internal.OFSwitchManager.supportedOpenFlowVersions=1.0, 1.1, 1.2, 1.3, 1.4 +net.floodlightcontroller.core.internal.OFSwitchManager.switchesInitialState={"00:00:00:00:00:00:00:01":"ROLE_SLAVE","00:00:00:00:00:00:00:02":"ROLE_SLAVE", "00:00:00:00:00:00:00:03":"ROLE_SLAVE", "00:00:00:00:00:00:00:04":"ROLE_SLAVE","00:00:00:00:00:00:00:05":"ROLE_SLAVE"} +net.floodlightcontroller.statistics.StatisticsCollector.enable=FALSE +net.floodlightcontroller.statistics.StatisticsCollector.collectionIntervalPortStatsSeconds=10 \ No newline at end of file diff --git a/src/main/resources/floodlightdefault.properties b/src/main/resources/floodlightdefault.properties index 89bf32381355331dd93a011d0e59d2a2581d4d5d..451528d3eaa8668af31baa46c594591080d763a7 100644 --- a/src/main/resources/floodlightdefault.properties +++ b/src/main/resources/floodlightdefault.properties @@ -14,29 +14,40 @@ net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager,\ net.floodlightcontroller.ui.web.StaticWebRoutable,\ net.floodlightcontroller.loadbalancer.LoadBalancer,\ net.floodlightcontroller.firewall.Firewall,\ +net.floodlightcontroller.simpleft.FT,\ net.floodlightcontroller.devicemanager.internal.DeviceManagerImpl,\ net.floodlightcontroller.accesscontrollist.ACL,\ net.floodlightcontroller.statistics.StatisticsCollector org.sdnplatform.sync.internal.SyncManager.authScheme=CHALLENGE_RESPONSE -org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/auth_credentials.jceks +org.sdnplatform.sync.internal.SyncManager.keyStorePath=/etc/floodlight/key2.jceks org.sdnplatform.sync.internal.SyncManager.dbPath=/var/lib/floodlight/ +org.sdnplatform.sync.internal.SyncManager.keyStorePassword=PassWord org.sdnplatform.sync.internal.SyncManager.port=6642 +org.sdnplatform.sync.internal.SyncManager.thisNodeId=1 +org.sdnplatform.sync.internal.SyncManager.persistenceEnabled=FALSE +org.sdnplatform.sync.internal.SyncManager.nodes=[\ +{"nodeId": 1, "domainId": 1, "hostname": "192.168.1.100", "port": 6642},\ +{"nodeId": 2, "domainId": 1, "hostname": "192.168.1.100", "port": 6643}\ +] net.floodlightcontroller.forwarding.Forwarding.match=vlan, mac, ip, transport net.floodlightcontroller.forwarding.Forwarding.flood-arp=NO net.floodlightcontroller.core.internal.FloodlightProvider.openFlowPort=6653 net.floodlightcontroller.core.internal.FloodlightProvider.role=ACTIVE +net.floodlightcontroller.core.internal.FloodlightProvider.workerThreads=8 +net.floodlightcontroller.core.internal.FloodlightProvider.controllerId=1 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-history-size=10 net.floodlightcontroller.linkdiscovery.internal.LinkDiscoveryManager.latency-update-threshold=0.5 net.floodlightcontroller.core.internal.OFSwitchManager.defaultMaxTablesToReceiveTableMissFlow=1 net.floodlightcontroller.core.internal.OFSwitchManager.maxTablesToReceiveTableMissFlowPerDpid={"00:00:00:00:00:00:00:01":"1","2":"1"} -net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=YES -net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=YES -net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to/your/keystore-file.jks -net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=your-keystore-password +net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnInitialHandshakeAsMaster=NO +net.floodlightcontroller.core.internal.OFSwitchManager.clearTablesOnEachTransitionToMaster=NO +net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePath=/path/to.jecks +net.floodlightcontroller.core.internal.OFSwitchManager.keyStorePassword=PassFL net.floodlightcontroller.core.internal.OFSwitchManager.useSsl=NO net.floodlightcontroller.core.internal.OFSwitchManager.supportedOpenFlowVersions=1.0, 1.1, 1.2, 1.3, 1.4 -net.floodlightcontroller.restserver.RestApiServer.keyStorePath=/path/to/your/keystore-file.jks -net.floodlightcontroller.restserver.RestApiServer.keyStorePassword=your-keystore-password +net.floodlightcontroller.core.internal.OFSwitchManager.switchesInitialState={"00:00:00:00:00:00:00:01":"ROLE_MASTER","00:00:00:00:00:00:00:02":"ROLE_MASTER", "00:00:00:00:00:00:00:03":"ROLE_MASTER", "00:00:00:00:00:00:00:04":"ROLE_MASTER","00:00:00:00:00:00:00:05":"ROLE_MASTER"} +net.floodlightcontroller.restserver.RestApiServer.keyStorePath=/path/to.jceks +net.floodlightcontroller.restserver.RestApiServer.keyStorePassword=Password net.floodlightcontroller.restserver.RestApiServer.httpsNeedClientAuthentication=NO net.floodlightcontroller.restserver.RestApiServer.useHttps=NO net.floodlightcontroller.restserver.RestApiServer.useHttp=YES diff --git a/src/main/resources/logback-test.xml b/src/main/resources/logback-test.xml index 8fa1e8f86065f20fa51ea0b42336af21b4e15cdc..932abba8d8a168ae18f677f43a6eef994d8ee17d 100644 --- a/src/main/resources/logback-test.xml +++ b/src/main/resources/logback-test.xml @@ -10,15 +10,25 @@ <appender-ref ref="STDOUT" /> <appender-ref ref="EV_WARN_ERR" /> </root> - <logger name="org" level="WARN"/> + <logger name="org" level="INFO"/> <logger name="io" level="INFO"></logger> <!-- Netty logging --> <logger name="LogService" level="DEBUG"></logger> <!-- Restlet access logging --> <logger name="net.floodlightcontroller" level="INFO"/> <logger name="org.sdnplatform" level="INFO"></logger> + <logger name="org.sdnplatform.sync.internal.SyncManager" level="INFO"></logger> + <logger name="org.sdnplatform.sync.internal.config.StorageCCProvider" level="INFO"></logger> + <logger name="org.sdnplatform.sync.internal.config.PropertyCCProvider" level="INFO"></logger> + <logger name="org.sdnplatform.sync.internal.rpc.RPCService" level="INFO"></logger> <logger name="net.floodlightcontroller.devicemanager" level="INFO"></logger> <logger name="net.floodlightcontroller.linkdiscovery" level="INFO"></logger> <logger name="net.floodlightcontroller.forwarding" level="INFO"></logger> + <logger name="net.floodlightcontroller.simpleft.FT" level="INFO"></logger> <logger name="net.floodlightcontroller.core" level="INFO"></logger> <logger name="net.floodlightcontroller.topology" level="INFO" ></logger> <logger name="org.projectfloodlight.openflow" level="INFO" ></logger> + <logger name="net.floodlightcontroller.core.internal.OFSwitchManager" level="INFO"></logger> + <logger name="net.floodlightcontroller.core.internal.OFSwitchHandshakeHandler" level="INFO"></logger> + <logger name="net.floodlightcontroller.core.internal.OFChannelHandler" level="INFO"></logger> + <logger name="net.floodlightcontroller.core.internal.OFSwitchManager" level="INFO"></logger> + </configuration> diff --git a/src/test/java/org/sdnplatform/sync/client/ClientTest.java b/src/test/java/org/sdnplatform/sync/client/ClientTest.java index bd64765778508d395db61f1f3e230ece844120a8..0ba68ebe6f6eb407277be5dca77def354c5cc2a5 100644 --- a/src/test/java/org/sdnplatform/sync/client/ClientTest.java +++ b/src/test/java/org/sdnplatform/sync/client/ClientTest.java @@ -47,8 +47,7 @@ public class ClientTest { @Before public void setUp() throws Exception { - keyStoreFile = new File(keyStoreFolder.getRoot(), - "keystore.jceks"); + keyStoreFile = new File(keyStoreFolder.getRoot(), "keystore.jceks"); CryptoUtil.writeSharedSecret(keyStoreFile.getAbsolutePath(), keyStorePassword, CryptoUtil.secureRandom(16)); @@ -68,7 +67,7 @@ public class ClientTest { fmc.addService(IDebugEventService.class, new MockDebugEventService()); fmc.addConfigParam(syncManager, "nodes", nodeString); - fmc.addConfigParam(syncManager, "thisNode", ""+1); + fmc.addConfigParam(syncManager, "thisNodeId", ""+1); fmc.addConfigParam(syncManager, "persistenceEnabled", "false"); fmc.addConfigParam(syncManager, "authScheme", "CHALLENGE_RESPONSE"); fmc.addConfigParam(syncManager, "keyStorePath", diff --git a/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java b/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java index 0bd1764f7290728602cf430c2d15fbe9733687f6..72e3a5bf73f0bd838c378b4c8fd8a400d7109c23 100644 --- a/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java +++ b/src/test/java/org/sdnplatform/sync/internal/BootstrapTest.java @@ -51,8 +51,7 @@ public class BootstrapTest { int curPort = 6699; - String keyStorePath = new File(dbFolder.getRoot(), - "keystore.jceks").getAbsolutePath(); + String keyStorePath = new File(dbFolder.getRoot(), "keystore.jceks").getAbsolutePath(); String keyStorePassword = "bootstrapping is fun!"; CryptoUtil.writeSharedSecret(keyStorePath, keyStorePassword, diff --git a/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java b/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java index 5bb874c269cf8e7b540180e661896d0797f4be9f..418fbfdf321957808e3e732da5973cfa6d4067c5 100644 --- a/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java +++ b/src/test/java/org/sdnplatform/sync/internal/SyncManagerTest.java @@ -78,7 +78,7 @@ public class SyncManagerTest { fmc.addConfigParam(syncManager, "configProviders", PropertyCCProvider.class.getName()); fmc.addConfigParam(syncManager, "nodes", nodeString); - fmc.addConfigParam(syncManager, "thisNode", ""+thisNode.getNodeId()); + fmc.addConfigParam(syncManager, "thisNodeId", ""+thisNode.getNodeId()); fmc.addConfigParam(syncManager, "persistenceEnabled", "false"); fmc.addConfigParam(syncManager, "authScheme", "CHALLENGE_RESPONSE"); fmc.addConfigParam(syncManager, "keyStorePath", diff --git a/src/test/java/org/sdnplatform/sync/test/MockSyncService.java b/src/test/java/org/sdnplatform/sync/test/MockSyncService.java index e4f1c63261b897bc55875d5db0c8bdfb4a51c5e9..325892b772fe75dfb8c2aa3aa4bbedfd20430070 100644 --- a/src/test/java/org/sdnplatform/sync/test/MockSyncService.java +++ b/src/test/java/org/sdnplatform/sync/test/MockSyncService.java @@ -7,6 +7,8 @@ import org.sdnplatform.sync.ISyncService; import org.sdnplatform.sync.error.SyncException; import org.sdnplatform.sync.error.UnknownStoreException; import org.sdnplatform.sync.internal.AbstractSyncManager; +import org.sdnplatform.sync.internal.config.ClusterConfig; +import org.sdnplatform.sync.internal.rpc.IRPCListener; import org.sdnplatform.sync.internal.store.IStorageEngine; import org.sdnplatform.sync.internal.store.IStore; import org.sdnplatform.sync.internal.store.InMemoryStorageEngine; @@ -119,4 +121,22 @@ public class MockSyncService extends AbstractSyncManager { public void reset() { localStores = new HashMap<String, ListenerStorageEngine>(); } + + + /** + * Tulio Ribeiro + */ + @Override + public void addRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + + } + /** + * Tulio Ribeiro + */ + @Override + public void removeRPCListener(IRPCListener listener) { + // TODO Auto-generated method stub + + } }