use of org.openkilda.server42.control.messaging.Control.CommandPacket in project open-kilda by telstra.
the class GateTest method listFlowsTest.
@Test
public void listFlowsTest() throws Exception {
Builder commandPacketResponseBuilded = CommandPacketResponse.newBuilder();
Flow flow1 = Flow.newBuilder().setFlowId("some-flow-id-01").build();
Flow flow2 = Flow.newBuilder().setFlowId("some-flow-id-02").build();
commandPacketResponseBuilded.addResponse(Any.pack(flow1));
commandPacketResponseBuilded.addResponse(Any.pack(flow2));
CommandPacketResponse commandPacketResponse = commandPacketResponseBuilded.build();
when(zeroMqClient.send(argThat(commandPacket -> commandPacket.getType() == Type.LIST_FLOWS))).thenReturn(commandPacketResponse);
String switchId = "00:00:1b:45:18:d6:71:5a";
Headers headers = Headers.builder().correlationId("some-correlation-id").build();
gate.listen(new ListFlowsRequest(headers), switchId);
ArgumentCaptor<ListFlowsResponse> argument = ArgumentCaptor.forClass(ListFlowsResponse.class);
verify(template).send(eq(toStorm), argument.capture());
ListFlowsResponse response = argument.getValue();
assertThat(response.getFlowIds()).contains(flow1.getFlowId(), flow2.getFlowId());
}
use of org.openkilda.server42.control.messaging.Control.CommandPacket in project open-kilda by telstra.
the class ControlServer method run.
/**
* We get commands from zmq socket and execute them one by one.
*/
@Override
public void run() {
log.info("started");
try (ZContext context = new ZContext()) {
Socket server = context.createSocket(ZMQ.REP);
server.bind(bindEndpoint);
while (!isInterrupted()) {
byte[] request = server.recv();
try {
CommandPacket commandPacket = CommandPacket.parseFrom(request);
Builder builder = CommandPacketResponse.newBuilder();
builder.setCommunicationId(commandPacket.getCommunicationId());
log.info("command type {}", commandPacket.getType().toString());
log.info("flow list before {}", flows.keySet().toString());
switch(commandPacket.getType()) {
case ADD_FLOW:
for (Any any : commandPacket.getCommandList()) {
AddFlow addFlow = any.unpack(AddFlow.class);
flows.put(FlowKey.fromFlow(addFlow.getFlow()), addFlow.getFlow());
statsServer.addFlow(addFlow.getFlow());
}
break;
case REMOVE_FLOW:
for (Any any : commandPacket.getCommandList()) {
RemoveFlow removeFlow = any.unpack(RemoveFlow.class);
FlowKey flowKey = FlowKey.fromFlow(removeFlow.getFlow());
flows.remove(flowKey);
statsServer.removeFlow(flowKey);
}
break;
case CLEAR_FLOWS:
if (commandPacket.getCommandCount() > 0) {
Any command = commandPacket.getCommand(0);
ClearFlowsFilter filter = command.unpack(ClearFlowsFilter.class);
List<FlowKey> keys = flows.values().stream().filter(flow -> flow.getDstMac().equals(filter.getDstMac())).map(FlowKey::fromFlow).collect(Collectors.toList());
flows.keySet().removeAll(keys);
keys.forEach(statsServer::removeFlow);
} else {
flows.clear();
statsServer.clearFlows();
}
break;
case LIST_FLOWS:
if (commandPacket.getCommandCount() > 0) {
Any command = commandPacket.getCommand(0);
ListFlowsFilter filter = command.unpack(ListFlowsFilter.class);
flows.values().stream().filter(flow -> flow.getDstMac().equals(filter.getDstMac())).forEach(flow -> builder.addResponse(Any.pack(flow)));
} else {
for (Flow flow : flows.values()) {
builder.addResponse(Any.pack(flow));
}
}
break;
case PUSH_SETTINGS:
log.warn("will be shipped with stats application");
Any command = commandPacket.getCommand(0);
PushSettings settings = command.unpack(PushSettings.class);
log.info(settings.toString());
break;
case ADD_ISL:
for (Any any : commandPacket.getCommandList()) {
AddIsl addIsl = any.unpack(AddIsl.class);
IslEndpoint endpoint = addIsl.getIsl();
isls.computeIfAbsent(endpoint.getSwitchId(), k -> new HashSet<>()).add(endpoint.getPort());
statsServer.addIsl(endpoint.getSwitchId(), endpoint.getPort());
}
break;
case REMOVE_ISL:
for (Any any : commandPacket.getCommandList()) {
RemoveIsl removeIsl = any.unpack(RemoveIsl.class);
IslEndpoint endpoint = removeIsl.getIsl();
isls.getOrDefault(endpoint.getSwitchId(), emptySet()).remove(endpoint.getPort());
statsServer.removeIsl(endpoint.getSwitchId(), endpoint.getPort());
}
break;
case CLEAR_ISLS:
if (commandPacket.getCommandCount() > 0) {
ClearIslsFilter filter = commandPacket.getCommand(0).unpack(ClearIslsFilter.class);
Set<Integer> ports = Optional.ofNullable(isls.get(filter.getSwitchId())).orElse(emptySet());
isls.remove(filter.getSwitchId());
ports.forEach(p -> statsServer.removeIsl(filter.getSwitchId(), p));
} else {
isls.clear();
statsServer.clearIsls();
}
break;
case LIST_ISLS:
if (commandPacket.getCommandCount() > 0) {
ListIslsFilter filter = commandPacket.getCommand(0).unpack(ListIslsFilter.class);
Optional.ofNullable(isls.get(filter.getSwitchId())).orElse(emptySet()).forEach(port -> builder.addResponse(Any.pack(IslEndpoint.newBuilder().setSwitchId(filter.getSwitchId()).setPort(port).build())));
} else {
isls.forEach((switchId, ports) -> ports.forEach(port -> builder.addResponse(Any.pack(IslEndpoint.newBuilder().setSwitchId(switchId).setPort(port).build()))));
}
break;
case UNRECOGNIZED:
default:
log.error("Unknown command type");
break;
}
log.info("flow list after {}", flows.keySet().toString());
server.send(builder.build().toByteArray());
} catch (InvalidProtocolBufferException e) {
log.error("marshalling error");
}
}
}
}
use of org.openkilda.server42.control.messaging.Control.CommandPacket in project open-kilda by telstra.
the class GateTest method testClearIsls.
@Test
public void testClearIsls() throws Exception {
ClearIsls clearIsls = ClearIsls.builder().switchId(new SwitchId("00:00:1b:45:18:d6:71:5a")).build();
gate.listen(clearIsls);
CommandPacket commandPacket = getCommandPacket();
assertThat(commandPacket.getType()).isEqualTo(Type.CLEAR_ISLS);
assertThat(commandPacket.getCommandList()).hasSize(1);
Any command = commandPacket.getCommand(0);
assertThat(command.is(IslRttControl.ClearIslsFilter.class)).isTrue();
IslRttControl.ClearIslsFilter unpack = command.unpack(IslRttControl.ClearIslsFilter.class);
String switchId = clearIsls.getSwitchId().toString();
assertThat(unpack.getSwitchId()).isEqualTo(switchId);
}
use of org.openkilda.server42.control.messaging.Control.CommandPacket in project open-kilda by telstra.
the class GateTest method listIslsTest.
@Test
public void listIslsTest() throws Exception {
Builder commandPacketResponseBuilded = CommandPacketResponse.newBuilder();
String switchId = "00:00:1b:45:18:d6:71:5a";
IslEndpoint port1 = IslEndpoint.newBuilder().setSwitchId(switchId).setPort(1).build();
IslEndpoint port2 = IslEndpoint.newBuilder().setSwitchId(switchId).setPort(2).build();
IslEndpoint port3 = IslEndpoint.newBuilder().setSwitchId(switchId).setPort(3).build();
IslEndpoint port4 = IslEndpoint.newBuilder().setSwitchId(switchId).setPort(4).build();
commandPacketResponseBuilded.addResponse(Any.pack(port1));
commandPacketResponseBuilded.addResponse(Any.pack(port2));
commandPacketResponseBuilded.addResponse(Any.pack(port3));
commandPacketResponseBuilded.addResponse(Any.pack(port4));
CommandPacketResponse commandPacketResponse = commandPacketResponseBuilded.build();
when(zeroMqClient.send(argThat(commandPacket -> commandPacket.getType() == Type.LIST_ISLS))).thenReturn(commandPacketResponse);
gate.listen(ListIslsRequest.builder().switchId(new SwitchId(switchId)).build());
ArgumentCaptor<ListIslsResponse> argument = ArgumentCaptor.forClass(ListIslsResponse.class);
verify(template).send(eq(toStorm), argument.capture());
ListIslsResponse response = argument.getValue();
assertThat(response.getPorts()).contains(port1.getPort(), port2.getPort(), port3.getPort(), port4.getPort());
}
use of org.openkilda.server42.control.messaging.Control.CommandPacket in project open-kilda by telstra.
the class GateTest method addFlow.
@Test
public void addFlow() throws Exception {
AddFlow addFlow = AddFlow.builder().flowId("some-flow-id").tunnelId(1001L).innerTunnelId(1002L).direction(FlowDirection.REVERSE).port(42).build();
String switchId = "00:00:1b:45:18:d6:71:5a";
gate.listen(addFlow, switchId);
CommandPacket commandPacket = getCommandPacket();
assertThat(commandPacket.getType()).isEqualTo(Type.ADD_FLOW);
assertThat(commandPacket.getCommandCount()).isEqualTo(1);
Any command = commandPacket.getCommand(0);
assertThat(command.is(FlowRttControl.AddFlow.class)).isTrue();
FlowRttControl.AddFlow unpack = command.unpack(FlowRttControl.AddFlow.class);
Flow flow = unpack.getFlow();
assertThat(flow.getFlowId()).isEqualTo(addFlow.getFlowId());
assertThat(flow.getTunnelId()).isEqualTo(addFlow.getTunnelId());
assertThat(flow.getInnerTunnelId()).isEqualTo(addFlow.getInnerTunnelId());
assertThat(flow.getDirection()).isEqualTo(FlowDirection.toBoolean(addFlow.getDirection()));
assertThat(flow.getUdpSrcPort()).isEqualTo(flowRttUdpSrcPortOffset + addFlow.getPort());
Map<Long, List<String>> vlanToSwitch = switchToVlanMapping.getVlan();
vlanToSwitch.forEach((vlan, switches) -> {
if (switches.contains(switchId)) {
assertThat(flow.getTransitTunnelId()).isEqualTo(vlan);
}
});
assertThat(flow.getDstMac()).isSubstringOf(switchId).isNotEqualTo(switchId);
}
Aggregations