Support to assign IP address via DHCP to Bare Metal server
Change-Id: Ie385c0d261dd54d93c910939805c6bcc2b41bebc
(cherry picked from commit 9275f9c8434d79cde8ca1f01f3d601dbc345e554)
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
index 922d1b5..19551ea 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandler.java
@@ -45,8 +45,6 @@
import org.onosproject.net.packet.PacketProcessor;
import org.onosproject.net.packet.PacketService;
import org.onosproject.openstacknetworking.api.Constants;
-import org.onosproject.openstacknetworking.api.InstancePort;
-import org.onosproject.openstacknetworking.api.InstancePortService;
import org.onosproject.openstacknetworking.api.OpenstackFlowRuleService;
import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
import org.onosproject.openstacknode.api.OpenstackNode;
@@ -136,9 +134,6 @@
protected PacketService packetService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
- protected InstancePortService instancePortService;
-
- @Reference(cardinality = ReferenceCardinality.MANDATORY)
protected OpenstackNetworkService osNetworkService;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
@@ -242,18 +237,30 @@
}
MacAddress clientMac = MacAddress.valueOf(dhcpPacket.getClientHardwareAddress());
- InstancePort reqInstPort = instancePortService.instancePort(clientMac);
- if (reqInstPort == null) {
- log.trace("Failed to find host(MAC:{})", clientMac);
+
+ Port port = osNetworkService.ports().stream()
+ .filter(p -> MacAddress.valueOf(p.getMacAddress()).equals(clientMac))
+ .findAny().orElse(null);
+
+ if (port == null) {
+ log.warn("Failed to retrieve openstack port information for MAC {}", clientMac);
return;
}
+
+ IP fixedIp = port.getFixedIps().stream().findFirst().orElse(null);
+
+ if (fixedIp == null) {
+ log.warn("There is no IP addresses are assigned with the port {}", port.getId());
+ return;
+ }
+
Ethernet ethPacket = context.inPacket().parsed();
switch (inPacketType) {
case DHCPDISCOVER:
- processDhcpDiscover(context, clientMac, reqInstPort, ethPacket);
+ processDhcpDiscover(context, clientMac, port, ethPacket);
break;
case DHCPREQUEST:
- processDhcpRequest(context, clientMac, reqInstPort, ethPacket);
+ processDhcpRequest(context, clientMac, port, ethPacket);
break;
case DHCPRELEASE:
log.trace("DHCP RELEASE received from {}", clientMac);
@@ -265,23 +272,25 @@
}
private void processDhcpDiscover(PacketContext context, MacAddress clientMac,
- InstancePort instPort, Ethernet ethPacket) {
+ Port port, Ethernet ethPacket) {
log.trace("DHCP DISCOVER received from {}", clientMac);
Ethernet discoverReply = buildReply(ethPacket,
(byte) DHCPOFFER.getValue(),
- instPort);
+ port);
sendReply(context, discoverReply);
- log.trace("DHCP OFFER({}) is sent for {}", instPort.ipAddress(), clientMac);
+ log.trace("DHCP OFFER({}) is sent for {}",
+ port.getFixedIps().stream().findFirst(), clientMac);
}
private void processDhcpRequest(PacketContext context, MacAddress clientMac,
- InstancePort instPort, Ethernet ethPacket) {
+ Port port, Ethernet ethPacket) {
log.trace("DHCP REQUEST received from {}", clientMac);
Ethernet requestReply = buildReply(ethPacket,
(byte) DHCPACK.getValue(),
- instPort);
+ port);
sendReply(context, requestReply);
- log.trace("DHCP ACK({}) is sent for {}", instPort.ipAddress(), clientMac);
+ log.trace("DHCP ACK({}) is sent for {}",
+ port.getFixedIps().stream().findFirst(), clientMac);
}
private DHCP.MsgType getPacketType(DHCP dhcpPacket) {
@@ -299,16 +308,14 @@
}
private Ethernet buildReply(Ethernet ethRequest, byte packetType,
- InstancePort reqInstPort) {
- log.trace("Build for DHCP reply msg for instance port {}", reqInstPort.toString());
- Port osPort = osNetworkService.port(reqInstPort.portId());
- if (osPort == null) {
- log.error("Failed to retrieve openstack port information for instance port {}",
- reqInstPort.toString());
- return null;
- }
+ Port port) {
+ log.trace("Build for DHCP reply msg for openstack port {}", port.toString());
+
// pick one IP address to make a reply
- IP fixedIp = osPort.getFixedIps().stream().findFirst().get();
+ // since we check the validity of fixed IP address at parent method,
+ // so no need to double check the fixed IP existence here
+ IP fixedIp = port.getFixedIps().stream().findFirst().get();
+
Subnet osSubnet = osNetworkService.subnet(fixedIp.getSubnetId());
Ethernet ethReply = new Ethernet();
@@ -321,7 +328,7 @@
ipv4Reply.setSourceAddress(
clusterService.getLocalNode().ip().getIp4Address().toString());
- ipv4Reply.setDestinationAddress(reqInstPort.ipAddress().getIp4Address().toInt());
+ ipv4Reply.setDestinationAddress(fixedIp.getIpAddress());
ipv4Reply.setTtl(PACKET_TTL);
UDP udpRequest = (UDP) ipv4Request.getPayload();
@@ -333,7 +340,7 @@
DHCP dhcpReply = buildDhcpReply(
dhcpRequest,
packetType,
- reqInstPort.ipAddress().getIp4Address(),
+ Ip4Address.valueOf(fixedIp.getIpAddress()),
osSubnet);
udpReply.setPayload(dhcpReply);
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
index 8cd0462..ba55fe7 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingDhcpHandlerTest.java
@@ -126,7 +126,6 @@
dhcpHandler.coreService = new TestCoreService();
dhcpHandler.configService = new TestConfigService();
dhcpHandler.packetService = new TestPacketService();
- dhcpHandler.instancePortService = new TestInstancePortService();
dhcpHandler.osNetworkService = new TestOpenstackNetworkService();
dhcpHandler.osNodeService = new TestOpenstackNodeService();
dhcpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
@@ -372,17 +371,6 @@
}
/**
- * Mocks the InstancePortService.
- */
- private class TestInstancePortService extends InstancePortServiceAdapter {
-
- @Override
- public InstancePort instancePort(MacAddress macAddress) {
- return new TestInstancePort();
- }
- }
-
- /**
* Mocks the OpenstackNetworkService.
*/
private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {