alshabib

Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next

package org.onlab.onos.cluster;
public class MastershipTerm {
private final NodeId master = null;
private int termNumber;
}
package org.onlab.onos.cluster;
import org.onlab.onos.net.DeviceId;
// TODO give me a better name
/**
* Service to obtain mastership term information.
*/
public interface MastershipTermService {
// TBD: manage/increment per device mastership change
// or increment on any change
/**
* Returns the term number of mastership change occurred for given device.
*
* @param deviceId the identifier of the device
* @return current master's term.
*/
MastershipTerm getMastershipTerm(DeviceId deviceId);
}
......@@ -51,7 +51,7 @@ public interface DeviceProviderService extends ProviderService<DeviceProvider> {
* mastership role on the device.
*
* @param deviceId identity of the device
* @param role mastership role being asserted
* @param role mastership role that was asserted but failed
*/
void unableToAssertRole(DeviceId deviceId, MastershipRole role);
......
package org.onlab.onos.store;
/**
* Opaque version structure.
*/
public interface Timestamp extends Comparable<Timestamp> {
}
package org.onlab.onos.store.impl;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.Objects;
import org.onlab.onos.net.ElementId;
import org.onlab.onos.store.Timestamp;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ComparisonChain;
// If it is store specific, implement serializable interfaces?
/**
* Default implementation of Timestamp.
*/
public final class OnosTimestamp implements Timestamp {
private final ElementId id;
private final int termNumber;
private final int sequenceNumber;
/**
* Default version tuple.
*
* @param id identifier of the element
* @param termNumber the mastership termNumber
* @param sequenceNumber the sequenceNumber number within the termNumber
*/
public OnosTimestamp(ElementId id, int termNumber, int sequenceNumber) {
this.id = checkNotNull(id);
this.termNumber = termNumber;
this.sequenceNumber = sequenceNumber;
}
@Override
public int compareTo(Timestamp o) {
checkArgument(o instanceof OnosTimestamp, "Must be OnosTimestamp", o);
OnosTimestamp that = (OnosTimestamp) o;
checkArgument(this.id.equals(that.id),
"Cannot compare version for different element this:%s, that:%s",
this, that);
return ComparisonChain.start()
.compare(this.termNumber, that.termNumber)
.compare(this.sequenceNumber, that.sequenceNumber)
.result();
}
@Override
public int hashCode() {
return Objects.hash(id, termNumber, sequenceNumber);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof OnosTimestamp)) {
return false;
}
OnosTimestamp that = (OnosTimestamp) obj;
return Objects.equals(this.id, that.id) &&
Objects.equals(this.termNumber, that.termNumber) &&
Objects.equals(this.sequenceNumber, that.sequenceNumber);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("id", id)
.add("termNumber", termNumber)
.add("sequenceNumber", sequenceNumber)
.toString();
}
/**
* Returns the element.
*
* @return element identifier
*/
public ElementId id() {
return id;
}
/**
* Returns the termNumber.
*
* @return termNumber
*/
public int termNumber() {
return termNumber;
}
/**
* Returns the sequenceNumber number.
*
* @return sequenceNumber
*/
public int sequenceNumber() {
return sequenceNumber;
}
}
......@@ -4,7 +4,9 @@ import com.hazelcast.config.Config;
import com.hazelcast.config.FileSystemXmlConfig;
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import de.javakaffee.kryoserializers.URISerializer;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
......@@ -26,6 +28,7 @@ import org.onlab.onos.store.serializers.DefaultPortSerializer;
import org.onlab.onos.store.serializers.DeviceIdSerializer;
import org.onlab.onos.store.serializers.IpPrefixSerializer;
import org.onlab.onos.store.serializers.NodeIdSerializer;
import org.onlab.onos.store.serializers.OnosTimestampSerializer;
import org.onlab.onos.store.serializers.PortNumberSerializer;
import org.onlab.onos.store.serializers.ProviderIdSerializer;
import org.onlab.packet.IpPrefix;
......@@ -90,6 +93,7 @@ public class StoreManager implements StoreService {
.register(DeviceId.class, new DeviceIdSerializer())
.register(PortNumber.class, new PortNumberSerializer())
.register(DefaultPort.class, new DefaultPortSerializer())
.register(OnosTimestamp.class, new OnosTimestampSerializer())
.build()
.populate(10);
}
......
......@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
// TODO move to util, etc.
/**
* Kryo Serializer for {@link DefaultPort}.
*/
......
......@@ -9,7 +9,6 @@ import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
//TODO move to util, etc.
/**
* Kryo Serializer for {@link DeviceId}.
*/
......
......@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
// TODO move to util, etc.
/**
* Kryo Serializer for {@link IpPrefix}.
*/
......
package org.onlab.onos.store.serializers;
import org.onlab.onos.net.ElementId;
import org.onlab.onos.store.impl.OnosTimestamp;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
/**
* Kryo Serializer for {@link OnosTimestamp}.
*/
public class OnosTimestampSerializer extends Serializer<OnosTimestamp> {
/**
* Default constructor.
*/
public OnosTimestampSerializer() {
// non-null, immutable
super(false, true);
}
@Override
public void write(Kryo kryo, Output output, OnosTimestamp object) {
kryo.writeClassAndObject(output, object.id());
output.writeInt(object.termNumber());
output.writeInt(object.sequenceNumber());
}
@Override
public OnosTimestamp read(Kryo kryo, Input input, Class<OnosTimestamp> type) {
ElementId id = (ElementId) kryo.readClassAndObject(input);
final int term = input.readInt();
final int sequence = input.readInt();
return new OnosTimestamp(id, term, sequence);
}
}
......@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
// TODO move to util, etc.
/**
* Serializer for {@link PortNumber}.
*/
......
......@@ -7,7 +7,6 @@ import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
//TODO move to util, etc.
/**
* Serializer for {@link ProviderId}.
*/
......
package org.onlab.onos.openflow.controller.impl;
import java.io.IOException;
import java.util.List;
import org.jboss.netty.channel.Channel;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.onos.openflow.controller.RoleState;
import org.onlab.onos.openflow.controller.driver.OpenFlowAgent;
import org.onlab.onos.openflow.controller.driver.OpenFlowSwitchDriver;
import org.onlab.onos.openflow.controller.driver.RoleHandler;
import org.onlab.onos.openflow.controller.driver.RoleRecvStatus;
import org.onlab.onos.openflow.controller.driver.RoleReplyInfo;
import org.onlab.onos.openflow.controller.driver.SwitchStateException;
import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFErrorMsg;
import org.projectfloodlight.openflow.protocol.OFFactories;
import org.projectfloodlight.openflow.protocol.OFFactory;
import org.projectfloodlight.openflow.protocol.OFFeaturesReply;
import org.projectfloodlight.openflow.protocol.OFMessage;
import org.projectfloodlight.openflow.protocol.OFPortDesc;
import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
import org.projectfloodlight.openflow.protocol.OFVersion;
import org.projectfloodlight.openflow.types.U64;
import static org.junit.Assert.assertEquals;
import static org.onlab.onos.openflow.controller.RoleState.*;
import static org.onlab.onos.openflow.controller.driver.RoleRecvStatus.*;
public class RoleManagerTest {
private static final U64 GID = U64.of(10L);
private static final long XID = 1L;
private OpenFlowSwitchDriver sw;
private RoleManager manager;
@Before
public void setUp() {
sw = new TestSwitchDriver();
manager = new RoleManager(sw);
}
@After
public void tearDown() {
manager = null;
sw = null;
}
@Test
public void deliverRoleReply() {
RoleRecvStatus status;
RoleReplyInfo asserted = new RoleReplyInfo(MASTER, GID, XID);
RoleReplyInfo unasserted = new RoleReplyInfo(SLAVE, GID, XID);
try {
//call without sendRoleReq() for requestPending = false
//first, sw.role == null
status = manager.deliverRoleReply(asserted);
assertEquals("expectation wrong", OTHER_EXPECTATION, status);
sw.setRole(MASTER);
assertEquals("expectation wrong", OTHER_EXPECTATION, status);
sw.setRole(SLAVE);
//match to pendingRole = MASTER, requestPending = true
manager.sendRoleRequest(MASTER, MATCHED_CURRENT_ROLE);
status = manager.deliverRoleReply(asserted);
assertEquals("expectation wrong", MATCHED_CURRENT_ROLE, status);
//requestPending never gets reset -- this might be a bug.
status = manager.deliverRoleReply(unasserted);
assertEquals("expectation wrong", OTHER_EXPECTATION, status);
assertEquals("pending role mismatch", MASTER, ((TestSwitchDriver) sw).failed);
} catch (IOException | SwitchStateException e) {
assertEquals("unexpected error thrown",
SwitchStateException.class, e.getClass());
}
}
private class TestSwitchDriver implements OpenFlowSwitchDriver {
RoleState failed = null;
RoleState current = null;
@Override
public void sendMsg(OFMessage msg) {
}
@Override
public void sendMsg(List<OFMessage> msgs) {
}
@Override
public void handleMessage(OFMessage fromSwitch) {
}
@Override
public void setRole(RoleState role) {
current = role;
}
@Override
public RoleState getRole() {
return current;
}
@Override
public List<OFPortDesc> getPorts() {
return null;
}
@Override
public OFFactory factory() {
// return what-ever triggers requestPending = true
return OFFactories.getFactory(OFVersion.OF_10);
}
@Override
public String getStringId() {
return "100";
}
@Override
public long getId() {
return 0;
}
@Override
public String manfacturerDescription() {
return null;
}
@Override
public String datapathDescription() {
return null;
}
@Override
public String hardwareDescription() {
return null;
}
@Override
public String softwareDescription() {
return null;
}
@Override
public String serialNumber() {
return null;
}
@Override
public void disconnectSwitch() {
}
@Override
public void returnRoleAssertFailure(RoleState role) {
failed = role;
}
@Override
public void setAgent(OpenFlowAgent agent) {
}
@Override
public void setRoleHandler(RoleHandler roleHandler) {
}
@Override
public void reassertRole() {
}
@Override
public boolean handleRoleError(OFErrorMsg error) {
return false;
}
@Override
public void handleNiciraRole(OFMessage m) throws SwitchStateException {
}
@Override
public void handleRole(OFMessage m) throws SwitchStateException {
}
@Override
public void startDriverHandshake() {
}
@Override
public boolean isDriverHandshakeComplete() {
return false;
}
@Override
public void processDriverHandshakeMessage(OFMessage m) {
}
@Override
public boolean connectSwitch() {
return false;
}
@Override
public boolean activateMasterSwitch() {
return false;
}
@Override
public boolean activateEqualSwitch() {
return false;
}
@Override
public void transitionToEqualSwitch() {
}
@Override
public void transitionToMasterSwitch() {
}
@Override
public void removeConnectedSwitch() {
}
@Override
public void setPortDescReply(OFPortDescStatsReply portDescReply) {
}
@Override
public void setFeaturesReply(OFFeaturesReply featuresReply) {
}
@Override
public void setSwitchDescription(OFDescStatsReply desc) {
}
@Override
public int getNextTransactionId() {
return (int) XID;
}
@Override
public Boolean supportNxRole() {
return true;
}
@Override
public void setOFVersion(OFVersion ofV) {
}
@Override
public void setTableFull(boolean full) {
}
@Override
public void setChannel(Channel channel) {
}
@Override
public void setConnected(boolean connected) {
}
@Override
public boolean isConnected() {
return false;
}
@Override
public void write(OFMessage msg) {
}
@Override
public void write(List<OFMessage> msgs) {
}
}
}