use of org.onosproject.k8snode.api.K8sNode in project onos by opennetworkinglab.
the class K8sServiceHandler method setGroupBuckets.
private void setGroupBuckets(Service service, boolean install) {
Map<ServicePort, Set<String>> spEpasMap = getSportEpAddressMap(service);
Map<ServicePort, List<GroupBucket>> spGrpBkts = Maps.newConcurrentMap();
Map<String, String> nodeIpGatewayIpMap = nodeIpGatewayIpMap(k8sNodeService, k8sNetworkService);
for (K8sNode node : k8sNodeService.completeNodes()) {
spEpasMap.forEach((sp, epas) -> {
List<GroupBucket> bkts = Lists.newArrayList();
for (String ip : epas) {
GroupBucket bkt = buildBuckets(node.intgBridge(), nodeIpGatewayIpMap.getOrDefault(ip, ip), sp);
if (bkt == null) {
continue;
}
if (install) {
bkts.add(bkt);
} else {
bkts.remove(bkt);
}
}
spGrpBkts.put(sp, bkts);
});
String serviceIp = service.getSpec().getClusterIP();
spGrpBkts.forEach((sp, bkts) -> {
String svcStr = servicePortStr(serviceIp, sp.getPort(), sp.getProtocol());
int groupId = svcStr.hashCode();
if (bkts.size() > 0) {
k8sGroupRuleService.setBuckets(appId, node.intgBridge(), groupId, bkts);
}
});
spEpasMap.forEach((sp, epas) -> epas.forEach(epa -> {
String podIp = nodeIpGatewayIpMap.getOrDefault(epa, epa);
int targetPort;
if (sp.getTargetPort().getIntVal() == null) {
Pod pod = podByIp(k8sPodService, podIp);
targetPort = portNumberByName(pod, sp.getTargetPort().getStrVal());
} else {
targetPort = sp.getTargetPort().getIntVal();
}
if (targetPort != 0) {
setUnshiftDomainRules(node.intgBridge(), POD_TABLE, PRIORITY_NAT_RULE, serviceIp, sp.getPort(), sp.getProtocol(), podIp, targetPort, install);
}
}));
}
}
use of org.onosproject.k8snode.api.K8sNode in project onos by opennetworkinglab.
the class K8sSwitchingArpHandler method processArpReply.
private void processArpReply(PacketContext context, Ethernet ethPacket) {
ARP arpPacket = (ARP) ethPacket.getPayload();
IpAddress srcIp = IpAddress.valueOf(INET, arpPacket.getSenderProtocolAddress());
MacAddress srcMac = MacAddress.valueOf(arpPacket.getSenderHardwareAddress());
IpAddress dstIp = IpAddress.valueOf(INET, arpPacket.getTargetProtocolAddress());
if (dstIp.equals(IpAddress.valueOf(NODE_FAKE_IP_STR))) {
// mutable MAP scenario is not considered for now
if (!extHostMacStore.containsKey(srcIp)) {
extHostMacStore.put(srcIp, srcMac);
}
K8sNode k8sNode = k8sNodeService.nodes().stream().filter(n -> n.nodeIp().equals(srcIp)).findAny().orElse(null);
if (k8sNode == null) {
return;
} else {
if (k8sNode.nodeInfo().nodeMac() != null) {
return;
}
}
// we update node MAC address which will be referred in node port scenario
K8sNodeInfo nodeInfo = new K8sNodeInfo(k8sNode.nodeIp(), srcMac);
K8sNode updatedNode = k8sNode.updateNodeInfo(nodeInfo);
k8sNodeService.updateNode(updatedNode);
}
}
use of org.onosproject.k8snode.api.K8sNode in project onos by opennetworkinglab.
the class K8sSwitchingHandler method setForwardingRulesForTunnel.
/**
* Configures the flow rules which are used for L2 packet switching.
* Note that these rules will be inserted in switching table (table 80).
*
* @param port kubernetes port object
* @param install install flag, add the rule if true, remove it otherwise
*/
private void setForwardingRulesForTunnel(K8sPort port, boolean install) {
// switching rules for the instPorts in the same node
TrafficSelector selector = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchIPDst(port.ipAddress().toIpPrefix()).build();
TrafficTreatment treatment = DefaultTrafficTreatment.builder().setEthDst(port.macAddress()).setOutput(port.portNumber()).build();
k8sFlowRuleService.setRule(appId, port.deviceId(), selector, treatment, PRIORITY_SWITCHING_RULE, FORWARDING_TABLE, install);
// switching rules for the node in the remote node
K8sNode localNode = k8sNodeService.node(port.deviceId());
if (localNode == null) {
final String error = String.format("Cannot find kubernetes node for %s", port.deviceId());
throw new IllegalStateException(error);
}
k8sNodeService.completeNodes().stream().filter(remoteNode -> !remoteNode.intgBridge().equals(localNode.intgBridge())).forEach(remoteNode -> {
TrafficTreatment treatmentToTunnel = DefaultTrafficTreatment.builder().setOutput(remoteNode.intgToTunPortNum()).build();
k8sFlowRuleService.setRule(appId, remoteNode.intgBridge(), selector, treatmentToTunnel, PRIORITY_SWITCHING_RULE, FORWARDING_TABLE, install);
PortNumber portNum = tunnelPortNumByNetId(port.networkId(), k8sNetworkService, remoteNode);
TrafficTreatment treatmentToRemote = DefaultTrafficTreatment.builder().extension(buildExtension(deviceService, remoteNode.tunBridge(), localNode.dataIp().getIp4Address()), remoteNode.tunBridge()).setTunnelId(getVni(port)).setOutput(portNum).build();
k8sFlowRuleService.setRule(appId, remoteNode.tunBridge(), selector, treatmentToRemote, PRIORITY_DEFAULT_RULE, TUN_ENTRY_TABLE, install);
});
}
use of org.onosproject.k8snode.api.K8sNode in project onos by opennetworkinglab.
the class K8sNodeCheckCommand method doExecute.
@Override
protected void doExecute() {
K8sNodeService nodeService = get(K8sNodeService.class);
DeviceService deviceService = get(DeviceService.class);
K8sNode node = nodeService.node(hostname);
if (node == null) {
print("Cannot find %s from registered nodes", hostname);
return;
}
print("[Integration Bridge Status]");
Device intgBridge = deviceService.getDevice(node.intgBridge());
if (intgBridge != null) {
print("%s %s=%s available=%s %s", deviceService.isAvailable(intgBridge.id()) ? MSG_OK : MSG_ERROR, node.intgBridgeName(), intgBridge.id(), deviceService.isAvailable(intgBridge.id()), intgBridge.annotations());
printPortState(deviceService, node.intgBridge(), node.intgBridgePortName());
printPortState(deviceService, node.intgBridge(), node.intgToExtPatchPortName());
printPortState(deviceService, node.intgBridge(), node.intgToLocalPatchPortName());
} else {
print("%s %s=%s is not available", MSG_ERROR, node.intgBridgeName(), node.intgBridge());
}
print("");
print("[External Bridge Status]");
Device extBridge = deviceService.getDevice(node.extBridge());
if (extBridge != null) {
print("%s %s=%s available=%s %s", deviceService.isAvailable(extBridge.id()) ? MSG_OK : MSG_ERROR, node.extBridgeName(), extBridge.id(), deviceService.isAvailable(extBridge.id()), extBridge.annotations());
printPortState(deviceService, node.extBridge(), node.extToIntgPatchPortName());
} else {
print("%s %s=%s is not available", MSG_ERROR, node.extBridgeName(), node.extBridge());
}
print("");
print("[Local Bridge Status]");
Device localBridge = deviceService.getDevice(node.localBridge());
if (localBridge != null) {
print("%s %s=%s available=%s %s", deviceService.isAvailable(localBridge.id()) ? MSG_OK : MSG_ERROR, node.localBridgeName(), localBridge.id(), deviceService.isAvailable(localBridge.id()), localBridge.annotations());
printPortState(deviceService, node.localBridge(), node.localToIntgPatchPortName());
}
print("");
print("[Tunnel Bridge Status]");
Device tunBridge = deviceService.getDevice(node.tunBridge());
if (tunBridge != null) {
print("%s %s=%s available=%s %s", deviceService.isAvailable(tunBridge.id()) ? MSG_OK : MSG_ERROR, node.tunBridgeName(), tunBridge.id(), deviceService.isAvailable(tunBridge.id()), tunBridge.annotations());
printPortState(deviceService, node.tunBridge(), node.tunToIntgPatchPortName());
if (node.dataIp() != null) {
printPortState(deviceService, node.tunBridge(), node.vxlanPortName());
printPortState(deviceService, node.tunBridge(), node.grePortName());
printPortState(deviceService, node.tunBridge(), node.genevePortName());
}
}
}
use of org.onosproject.k8snode.api.K8sNode in project onos by opennetworkinglab.
the class K8sNodeWebResource method createNodes.
/**
* Creates a set of kubernetes nodes' config from the JSON input stream.
*
* @param input kubernetes nodes JSON input stream
* @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
* is malformed
* @onos.rsModel K8sNode
*/
@POST
@Path("node")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createNodes(InputStream input) {
log.trace(String.format(MESSAGE_NODE, CREATE));
readNodeConfiguration(input).forEach(node -> {
K8sNode existing = nodeAdminService.node(node.hostname());
if (existing == null) {
nodeAdminService.createNode(node);
}
});
UriBuilder locationBuilder = uriInfo.getBaseUriBuilder().path(NODES).path(NODE_ID);
return created(locationBuilder.build()).build();
}
Aggregations