Committed by
Gerrit Code Review
Fixed to not to create gateway group if it is already exists
Also changed some names shorter. Change-Id: Iaa8aa5ac378fc168e79c9e238090ca817af42261
Showing
11 changed files
with
131 additions
and
104 deletions
| ... | @@ -331,7 +331,7 @@ public class OpenstackIcmpHandler { | ... | @@ -331,7 +331,7 @@ public class OpenstackIcmpHandler { |
| 331 | private Map<DeviceId, PortNumber> getExternalInfo() { | 331 | private Map<DeviceId, PortNumber> getExternalInfo() { |
| 332 | Map<DeviceId, PortNumber> externalInfoMap = Maps.newHashMap(); | 332 | Map<DeviceId, PortNumber> externalInfoMap = Maps.newHashMap(); |
| 333 | gatewayService.getGatewayDeviceIds().forEach(deviceId -> | 333 | gatewayService.getGatewayDeviceIds().forEach(deviceId -> |
| 334 | - externalInfoMap.putIfAbsent(deviceId, gatewayService.getGatewayExternalPort(deviceId))); | 334 | + externalInfoMap.putIfAbsent(deviceId, gatewayService.getUplinkPort(deviceId))); |
| 335 | return externalInfoMap; | 335 | return externalInfoMap; |
| 336 | } | 336 | } |
| 337 | } | 337 | } | ... | ... |
| ... | @@ -147,11 +147,11 @@ public class OpenstackPnatHandler implements Runnable { | ... | @@ -147,11 +147,11 @@ public class OpenstackPnatHandler implements Runnable { |
| 147 | 147 | ||
| 148 | ScalableGatewayService gatewayService = getService(ScalableGatewayService.class); | 148 | ScalableGatewayService gatewayService = getService(ScalableGatewayService.class); |
| 149 | GatewayNode gatewayNode = gatewayService.getGatewayNode(deviceId); | 149 | GatewayNode gatewayNode = gatewayService.getGatewayNode(deviceId); |
| 150 | - if (gatewayNode.getGatewayExternalInterfaceName() == null) { | 150 | + if (gatewayNode.getUplinkIntf() == null) { |
| 151 | log.error(EXTERNAL_PORT_NULL, deviceId.toString()); | 151 | log.error(EXTERNAL_PORT_NULL, deviceId.toString()); |
| 152 | return; | 152 | return; |
| 153 | } | 153 | } |
| 154 | - treatment.setOutput(gatewayService.getGatewayExternalPort(deviceId)); | 154 | + treatment.setOutput(gatewayService.getUplinkPort(deviceId)); |
| 155 | 155 | ||
| 156 | ethernet.resetChecksum(); | 156 | ethernet.resetChecksum(); |
| 157 | 157 | ... | ... |
| ... | @@ -468,7 +468,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { | ... | @@ -468,7 +468,7 @@ public class OpenstackRoutingManager implements OpenstackRoutingService { |
| 468 | DeviceId deviceId = pkt.receivedFrom().deviceId(); | 468 | DeviceId deviceId = pkt.receivedFrom().deviceId(); |
| 469 | Port port = null; | 469 | Port port = null; |
| 470 | port = deviceService.getPort(deviceId, | 470 | port = deviceService.getPort(deviceId, |
| 471 | - gatewayService.getGatewayExternalPort(deviceId)); | 471 | + gatewayService.getUplinkPort(deviceId)); |
| 472 | if (port != null) { | 472 | if (port != null) { |
| 473 | OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(), | 473 | OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(), |
| 474 | Ip4Address.valueOf(iPacket.getSourceAddress())); | 474 | Ip4Address.valueOf(iPacket.getSourceAddress())); | ... | ... |
| ... | @@ -188,7 +188,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -188,7 +188,7 @@ public class OpenstackRoutingRulePopulator { |
| 188 | 188 | ||
| 189 | tBuilder.setIpSrc(externalIp); | 189 | tBuilder.setIpSrc(externalIp); |
| 190 | gatewayService.getGatewayNodes().forEach(node -> { | 190 | gatewayService.getGatewayNodes().forEach(node -> { |
| 191 | - tBuilder.setOutput(gatewayService.getGatewayExternalPort(node.getGatewayDeviceId())); | 191 | + tBuilder.setOutput(gatewayService.getUplinkPort(node.getGatewayDeviceId())); |
| 192 | ForwardingObjective fo = DefaultForwardingObjective.builder() | 192 | ForwardingObjective fo = DefaultForwardingObjective.builder() |
| 193 | .withSelector(sBuilder.build()) | 193 | .withSelector(sBuilder.build()) |
| 194 | .withTreatment(tBuilder.build()) | 194 | .withTreatment(tBuilder.build()) |
| ... | @@ -380,7 +380,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -380,7 +380,7 @@ public class OpenstackRoutingRulePopulator { |
| 380 | StreamSupport.stream(deviceService.getDevices().spliterator(), false) | 380 | StreamSupport.stream(deviceService.getDevices().spliterator(), false) |
| 381 | .filter(d -> isTypeOf(d.id(), OpenstackNodeService.NodeType.COMPUTE)) | 381 | .filter(d -> isTypeOf(d.id(), OpenstackNodeService.NodeType.COMPUTE)) |
| 382 | .forEach(d -> populateRuleToGatewayBySgw(d.id(), | 382 | .forEach(d -> populateRuleToGatewayBySgw(d.id(), |
| 383 | - gatewayService.getGroupIdForGatewayLoadBalance(d.id()), vni)); | 383 | + gatewayService.getGatewayGroupId(d.id()), vni)); |
| 384 | } | 384 | } |
| 385 | 385 | ||
| 386 | private void populateRuleToGatewayBySgw(DeviceId deviceId, GroupId groupId, long vni) { | 386 | private void populateRuleToGatewayBySgw(DeviceId deviceId, GroupId groupId, long vni) { |
| ... | @@ -548,7 +548,7 @@ public class OpenstackRoutingRulePopulator { | ... | @@ -548,7 +548,7 @@ public class OpenstackRoutingRulePopulator { |
| 548 | } | 548 | } |
| 549 | 549 | ||
| 550 | private PortNumber getExternalPortNum(DeviceId deviceId) { | 550 | private PortNumber getExternalPortNum(DeviceId deviceId) { |
| 551 | - return checkNotNull(gatewayService.getGatewayExternalPort(deviceId), PORTNOTNULL); | 551 | + return checkNotNull(gatewayService.getUplinkPort(deviceId), PORTNOTNULL); |
| 552 | } | 552 | } |
| 553 | 553 | ||
| 554 | /** | 554 | /** | ... | ... |
| ... | @@ -28,13 +28,12 @@ import static com.google.common.base.Preconditions.checkNotNull; | ... | @@ -28,13 +28,12 @@ import static com.google.common.base.Preconditions.checkNotNull; |
| 28 | */ | 28 | */ |
| 29 | public final class GatewayNode { | 29 | public final class GatewayNode { |
| 30 | private final DeviceId gatewayDeviceId; | 30 | private final DeviceId gatewayDeviceId; |
| 31 | - private final String gatewayExternalInterfaceName; | 31 | + private final String uplinkIntf; |
| 32 | private final Ip4Address dataIpAddress; | 32 | private final Ip4Address dataIpAddress; |
| 33 | 33 | ||
| 34 | - private GatewayNode(DeviceId gatewayDeviceId, String gatewayExternalInterfaceName, | 34 | + private GatewayNode(DeviceId gatewayDeviceId, String uplinkIntf, Ip4Address dataIpAddress) { |
| 35 | - Ip4Address dataIpAddress) { | ||
| 36 | this.gatewayDeviceId = gatewayDeviceId; | 35 | this.gatewayDeviceId = gatewayDeviceId; |
| 37 | - this.gatewayExternalInterfaceName = gatewayExternalInterfaceName; | 36 | + this.uplinkIntf = uplinkIntf; |
| 38 | this.dataIpAddress = dataIpAddress; | 37 | this.dataIpAddress = dataIpAddress; |
| 39 | } | 38 | } |
| 40 | 39 | ||
| ... | @@ -52,8 +51,8 @@ public final class GatewayNode { | ... | @@ -52,8 +51,8 @@ public final class GatewayNode { |
| 52 | * | 51 | * |
| 53 | * @return The gateway`s interface name | 52 | * @return The gateway`s interface name |
| 54 | */ | 53 | */ |
| 55 | - public String getGatewayExternalInterfaceName() { | 54 | + public String getUplinkIntf() { |
| 56 | - return gatewayExternalInterfaceName; | 55 | + return uplinkIntf; |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | /** | 58 | /** |
| ... | @@ -74,8 +73,7 @@ public final class GatewayNode { | ... | @@ -74,8 +73,7 @@ public final class GatewayNode { |
| 74 | if (obj instanceof GatewayNode) { | 73 | if (obj instanceof GatewayNode) { |
| 75 | GatewayNode that = (GatewayNode) obj; | 74 | GatewayNode that = (GatewayNode) obj; |
| 76 | if (Objects.equals(gatewayDeviceId, that.gatewayDeviceId) && | 75 | if (Objects.equals(gatewayDeviceId, that.gatewayDeviceId) && |
| 77 | - Objects.equals(gatewayExternalInterfaceName, | 76 | + Objects.equals(uplinkIntf, that.uplinkIntf) && |
| 78 | - that.gatewayExternalInterfaceName) && | ||
| 79 | Objects.equals(dataIpAddress, that.dataIpAddress)) { | 77 | Objects.equals(dataIpAddress, that.dataIpAddress)) { |
| 80 | return true; | 78 | return true; |
| 81 | } | 79 | } |
| ... | @@ -85,17 +83,15 @@ public final class GatewayNode { | ... | @@ -85,17 +83,15 @@ public final class GatewayNode { |
| 85 | 83 | ||
| 86 | @Override | 84 | @Override |
| 87 | public int hashCode() { | 85 | public int hashCode() { |
| 88 | - return Objects.hash(gatewayDeviceId, | 86 | + return Objects.hash(gatewayDeviceId, uplinkIntf, dataIpAddress); |
| 89 | - gatewayExternalInterfaceName, | ||
| 90 | - dataIpAddress); | ||
| 91 | } | 87 | } |
| 92 | 88 | ||
| 93 | @Override | 89 | @Override |
| 94 | public String toString() { | 90 | public String toString() { |
| 95 | return MoreObjects.toStringHelper(getClass()) | 91 | return MoreObjects.toStringHelper(getClass()) |
| 96 | - .add("deviceId", gatewayDeviceId) | 92 | + .add("gatewayDeviceId", gatewayDeviceId) |
| 97 | - .add("externalPort", gatewayExternalInterfaceName) | 93 | + .add("uplinkInterface", uplinkIntf) |
| 98 | - .add("dataIp", dataIpAddress) | 94 | + .add("dataIpAddress", dataIpAddress) |
| 99 | .toString(); | 95 | .toString(); |
| 100 | } | 96 | } |
| 101 | 97 | ||
| ... | @@ -114,7 +110,7 @@ public final class GatewayNode { | ... | @@ -114,7 +110,7 @@ public final class GatewayNode { |
| 114 | public static final class Builder { | 110 | public static final class Builder { |
| 115 | 111 | ||
| 116 | private DeviceId gatewayDeviceId; | 112 | private DeviceId gatewayDeviceId; |
| 117 | - private String gatewayExternalInterfaceName; | 113 | + private String uplinkIntf; |
| 118 | private Ip4Address dataIpAddress; | 114 | private Ip4Address dataIpAddress; |
| 119 | 115 | ||
| 120 | /** | 116 | /** |
| ... | @@ -129,13 +125,13 @@ public final class GatewayNode { | ... | @@ -129,13 +125,13 @@ public final class GatewayNode { |
| 129 | } | 125 | } |
| 130 | 126 | ||
| 131 | /** | 127 | /** |
| 132 | - * Sets the gateway`s interface name. | 128 | + * Sets the gateway`s uplink interface name. |
| 133 | * | 129 | * |
| 134 | * @param name The gateway`s interface name | 130 | * @param name The gateway`s interface name |
| 135 | * @return Builder object | 131 | * @return Builder object |
| 136 | */ | 132 | */ |
| 137 | - public Builder gatewayExternalInterfaceName(String name) { | 133 | + public Builder uplinkIntf(String name) { |
| 138 | - this.gatewayExternalInterfaceName = name; | 134 | + this.uplinkIntf = name; |
| 139 | return this; | 135 | return this; |
| 140 | } | 136 | } |
| 141 | 137 | ||
| ... | @@ -156,8 +152,8 @@ public final class GatewayNode { | ... | @@ -156,8 +152,8 @@ public final class GatewayNode { |
| 156 | * @return GatewayNode object | 152 | * @return GatewayNode object |
| 157 | */ | 153 | */ |
| 158 | public GatewayNode build() { | 154 | public GatewayNode build() { |
| 159 | - return new GatewayNode(checkNotNull(gatewayDeviceId), checkNotNull(gatewayExternalInterfaceName), | 155 | + return new GatewayNode(checkNotNull(gatewayDeviceId), checkNotNull(uplinkIntf), |
| 160 | - checkNotNull(dataIpAddress)); | 156 | + checkNotNull(dataIpAddress)); |
| 161 | } | 157 | } |
| 162 | } | 158 | } |
| 163 | } | 159 | } | ... | ... |
| ... | @@ -41,7 +41,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { | ... | @@ -41,7 +41,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { |
| 41 | public static final String NODES = "nodes"; | 41 | public static final String NODES = "nodes"; |
| 42 | public static final String BRIDGE_ID = "bridgeId"; | 42 | public static final String BRIDGE_ID = "bridgeId"; |
| 43 | public static final String DATAPLANE_IP = "dataPlaneIp"; | 43 | public static final String DATAPLANE_IP = "dataPlaneIp"; |
| 44 | - public static final String EXTERNAL_INTERFACE_NAME = "gatewayExternalInterfaceName"; | 44 | + public static final String UPLINK_INTERFACE_NAME = "uplinkInterface"; |
| 45 | 45 | ||
| 46 | /** | 46 | /** |
| 47 | * Returns the set of nodes read from network config. | 47 | * Returns the set of nodes read from network config. |
| ... | @@ -61,7 +61,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { | ... | @@ -61,7 +61,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { |
| 61 | try { | 61 | try { |
| 62 | nodes.add(new GatewayNode.Builder() | 62 | nodes.add(new GatewayNode.Builder() |
| 63 | .gatewayDeviceId(DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText())) | 63 | .gatewayDeviceId(DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText())) |
| 64 | - .gatewayExternalInterfaceName(jsonNode.path(EXTERNAL_INTERFACE_NAME).asText()) | 64 | + .uplinkIntf(jsonNode.path(UPLINK_INTERFACE_NAME).asText()) |
| 65 | .dataIpAddress(Ip4Address.valueOf(jsonNode.path(DATAPLANE_IP).asText())).build()); | 65 | .dataIpAddress(Ip4Address.valueOf(jsonNode.path(DATAPLANE_IP).asText())).build()); |
| 66 | } catch (IllegalArgumentException | NullPointerException e) { | 66 | } catch (IllegalArgumentException | NullPointerException e) { |
| 67 | log.error("Failed to read {}", e.toString()); | 67 | log.error("Failed to read {}", e.toString()); |
| ... | @@ -86,7 +86,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { | ... | @@ -86,7 +86,7 @@ public class GatewayNodeConfig extends Config<ApplicationId> { |
| 86 | ObjectNode objectNode = (ObjectNode) jsonNode; | 86 | ObjectNode objectNode = (ObjectNode) jsonNode; |
| 87 | return isString(objectNode, BRIDGE_ID, MANDATORY) | 87 | return isString(objectNode, BRIDGE_ID, MANDATORY) |
| 88 | && isIpAddress(objectNode, DATAPLANE_IP, MANDATORY) | 88 | && isIpAddress(objectNode, DATAPLANE_IP, MANDATORY) |
| 89 | - && isString(objectNode, EXTERNAL_INTERFACE_NAME, MANDATORY); | 89 | + && isString(objectNode, UPLINK_INTERFACE_NAME, MANDATORY); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | } | 92 | } | ... | ... |
| ... | @@ -35,20 +35,21 @@ public interface ScalableGatewayService { | ... | @@ -35,20 +35,21 @@ public interface ScalableGatewayService { |
| 35 | GatewayNode getGatewayNode(DeviceId deviceId); | 35 | GatewayNode getGatewayNode(DeviceId deviceId); |
| 36 | 36 | ||
| 37 | /** | 37 | /** |
| 38 | - * Returns the gateway`s port number with the given device identifier. | 38 | + * Returns the uplink port number of the gateway with the supplied device ID. |
| 39 | * | 39 | * |
| 40 | - * @param deviceId The gateway node deviceId | 40 | + * @param deviceId the gateway node device id |
| 41 | - * @return The external interface port number | 41 | + * @return the external interface port number |
| 42 | */ | 42 | */ |
| 43 | - PortNumber getGatewayExternalPort(DeviceId deviceId); | 43 | + PortNumber getUplinkPort(DeviceId deviceId); |
| 44 | 44 | ||
| 45 | /** | 45 | /** |
| 46 | * Returns group id for gateway load balance. | 46 | * Returns group id for gateway load balance. |
| 47 | + * If the group does not exist in the supplied source device, creates one. | ||
| 47 | * | 48 | * |
| 48 | * @param srcDeviceId source device id | 49 | * @param srcDeviceId source device id |
| 49 | * @return The group id | 50 | * @return The group id |
| 50 | */ | 51 | */ |
| 51 | - GroupId getGroupIdForGatewayLoadBalance(DeviceId srcDeviceId); | 52 | + GroupId getGatewayGroupId(DeviceId srcDeviceId); |
| 52 | 53 | ||
| 53 | /** | 54 | /** |
| 54 | * Returns the list of gateway node information with the given device identifier. | 55 | * Returns the list of gateway node information with the given device identifier. | ... | ... |
| ... | @@ -56,7 +56,7 @@ public class ScalableGatewayAddCommand extends AbstractShellCommand { | ... | @@ -56,7 +56,7 @@ public class ScalableGatewayAddCommand extends AbstractShellCommand { |
| 56 | GatewayNode gatewayNode = GatewayNode.builder() | 56 | GatewayNode gatewayNode = GatewayNode.builder() |
| 57 | .gatewayDeviceId(DeviceId.deviceId(deviceId)) | 57 | .gatewayDeviceId(DeviceId.deviceId(deviceId)) |
| 58 | .dataIpAddress(Ip4Address.valueOf(ipAddress)) | 58 | .dataIpAddress(Ip4Address.valueOf(ipAddress)) |
| 59 | - .gatewayExternalInterfaceName(interfaceName) | 59 | + .uplinkIntf(interfaceName) |
| 60 | .build(); | 60 | .build(); |
| 61 | if (service.addGatewayNode(gatewayNode)) { | 61 | if (service.addGatewayNode(gatewayNode)) { |
| 62 | print(SUCCESS); | 62 | print(SUCCESS); | ... | ... |
| ... | @@ -35,6 +35,6 @@ public class ScalableGatewayListCommand extends AbstractShellCommand { | ... | @@ -35,6 +35,6 @@ public class ScalableGatewayListCommand extends AbstractShellCommand { |
| 35 | service.getGatewayNodes().forEach(node -> print(FORMAT, | 35 | service.getGatewayNodes().forEach(node -> print(FORMAT, |
| 36 | node.getGatewayDeviceId().toString(), | 36 | node.getGatewayDeviceId().toString(), |
| 37 | node.getDataIpAddress().toString(), | 37 | node.getDataIpAddress().toString(), |
| 38 | - node.getGatewayExternalInterfaceName().toString())); | 38 | + node.getUplinkIntf().toString())); |
| 39 | } | 39 | } |
| 40 | } | 40 | } | ... | ... |
| ... | @@ -16,6 +16,7 @@ | ... | @@ -16,6 +16,7 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.scalablegateway.impl; | 17 | package org.onosproject.scalablegateway.impl; |
| 18 | 18 | ||
| 19 | +import com.google.common.collect.ImmutableList; | ||
| 19 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
| 20 | import org.apache.felix.scr.annotations.Activate; | 21 | import org.apache.felix.scr.annotations.Activate; |
| 21 | import org.apache.felix.scr.annotations.Component; | 22 | import org.apache.felix.scr.annotations.Component; |
| ... | @@ -25,6 +26,7 @@ import org.apache.felix.scr.annotations.Reference; | ... | @@ -25,6 +26,7 @@ import org.apache.felix.scr.annotations.Reference; |
| 25 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 26 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 26 | import org.apache.felix.scr.annotations.Service; | 27 | import org.apache.felix.scr.annotations.Service; |
| 27 | import org.onlab.util.KryoNamespace; | 28 | import org.onlab.util.KryoNamespace; |
| 29 | +import org.onlab.util.Tools; | ||
| 28 | import org.onosproject.core.ApplicationId; | 30 | import org.onosproject.core.ApplicationId; |
| 29 | import org.onosproject.core.CoreService; | 31 | import org.onosproject.core.CoreService; |
| 30 | 32 | ||
| ... | @@ -43,13 +45,14 @@ import org.onosproject.net.device.DeviceListener; | ... | @@ -43,13 +45,14 @@ import org.onosproject.net.device.DeviceListener; |
| 43 | import org.onosproject.net.device.DeviceService; | 45 | import org.onosproject.net.device.DeviceService; |
| 44 | import org.onosproject.net.driver.DriverService; | 46 | import org.onosproject.net.driver.DriverService; |
| 45 | import org.onosproject.net.group.Group; | 47 | import org.onosproject.net.group.Group; |
| 46 | -import org.onosproject.net.group.GroupDescription; | 48 | +import org.onosproject.net.group.GroupKey; |
| 47 | import org.onosproject.net.group.GroupService; | 49 | import org.onosproject.net.group.GroupService; |
| 48 | import org.onosproject.scalablegateway.api.GatewayNode; | 50 | import org.onosproject.scalablegateway.api.GatewayNode; |
| 49 | import org.onosproject.scalablegateway.api.GatewayNodeConfig; | 51 | import org.onosproject.scalablegateway.api.GatewayNodeConfig; |
| 50 | import org.onosproject.scalablegateway.api.ScalableGatewayService; | 52 | import org.onosproject.scalablegateway.api.ScalableGatewayService; |
| 51 | 53 | ||
| 52 | import java.util.List; | 54 | import java.util.List; |
| 55 | +import java.util.Objects; | ||
| 53 | import java.util.Optional; | 56 | import java.util.Optional; |
| 54 | 57 | ||
| 55 | import org.onosproject.store.serializers.KryoNamespaces; | 58 | import org.onosproject.store.serializers.KryoNamespaces; |
| ... | @@ -60,7 +63,7 @@ import org.onosproject.store.service.Versioned; | ... | @@ -60,7 +63,7 @@ import org.onosproject.store.service.Versioned; |
| 60 | import org.slf4j.Logger; | 63 | import org.slf4j.Logger; |
| 61 | import org.slf4j.LoggerFactory; | 64 | import org.slf4j.LoggerFactory; |
| 62 | 65 | ||
| 63 | -import static com.google.common.base.Preconditions.checkNotNull; | 66 | +import static org.onosproject.net.AnnotationKeys.PORT_NAME; |
| 64 | 67 | ||
| 65 | /** | 68 | /** |
| 66 | * Manages gateway node for gateway scalability. | 69 | * Manages gateway node for gateway scalability. |
| ... | @@ -74,11 +77,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -74,11 +77,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 74 | private ApplicationId appId; | 77 | private ApplicationId appId; |
| 75 | private static final String APP_ID = "org.onosproject.scalablegateway"; | 78 | private static final String APP_ID = "org.onosproject.scalablegateway"; |
| 76 | private static final String APP_NAME = "scalablegateway"; | 79 | private static final String APP_NAME = "scalablegateway"; |
| 77 | - private static final String GATEWAYNODE_CAN_NOT_BE_NULL = "The gateway node can not be null"; | ||
| 78 | - private static final String PORT_CAN_NOT_BE_NULL = "The port can not be null"; | ||
| 79 | - private static final String FAIL_ADD_GATEWAY = "Adding process is failed as existing deivce id"; | ||
| 80 | - private static final String FAIL_REMOVE_GATEWAY = "Removing process is failed as unknown deivce id"; | ||
| 81 | - private static final String PORT_NAME = "portName"; | ||
| 82 | private static final String GATEWAYNODE_MAP_NAME = "gatewaynode-map"; | 80 | private static final String GATEWAYNODE_MAP_NAME = "gatewaynode-map"; |
| 83 | 81 | ||
| 84 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 82 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| ... | @@ -106,7 +104,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -106,7 +104,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 106 | private SelectGroupHandler selectGroupHandler; | 104 | private SelectGroupHandler selectGroupHandler; |
| 107 | 105 | ||
| 108 | private final NetworkConfigListener configListener = new InternalConfigListener(); | 106 | private final NetworkConfigListener configListener = new InternalConfigListener(); |
| 109 | - private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); | 107 | + private final InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); |
| 110 | 108 | ||
| 111 | private final ConfigFactory configFactory = | 109 | private final ConfigFactory configFactory = |
| 112 | new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, GatewayNodeConfig.class, APP_NAME) { | 110 | new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, GatewayNodeConfig.class, APP_NAME) { |
| ... | @@ -115,10 +113,10 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -115,10 +113,10 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 115 | return new GatewayNodeConfig(); | 113 | return new GatewayNodeConfig(); |
| 116 | } | 114 | } |
| 117 | }; | 115 | }; |
| 118 | - private ConsistentMap<DeviceId, GatewayNode> gatewayNodeMap; // Map<GatewayNode`s Id, GatewayNode object> | 116 | + |
| 117 | + private ConsistentMap<DeviceId, GatewayNode> gatewayNodeMap; // Map<GatewayNode Id, GatewayNode object> | ||
| 119 | private static final KryoNamespace.Builder GATEWAYNODE_SERIALIZER = KryoNamespace.newBuilder() | 118 | private static final KryoNamespace.Builder GATEWAYNODE_SERIALIZER = KryoNamespace.newBuilder() |
| 120 | .register(KryoNamespaces.API) | 119 | .register(KryoNamespaces.API) |
| 121 | - .register(DeviceId.class) | ||
| 122 | .register(GatewayNode.class); | 120 | .register(GatewayNode.class); |
| 123 | 121 | ||
| 124 | @Activate | 122 | @Activate |
| ... | @@ -141,8 +139,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -141,8 +139,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 141 | 139 | ||
| 142 | @Deactivate | 140 | @Deactivate |
| 143 | protected void deactivate() { | 141 | protected void deactivate() { |
| 144 | - gatewayNodeMap.clear(); | ||
| 145 | - | ||
| 146 | deviceService.removeListener(internalDeviceListener); | 142 | deviceService.removeListener(internalDeviceListener); |
| 147 | configService.removeListener(configListener); | 143 | configService.removeListener(configListener); |
| 148 | 144 | ||
| ... | @@ -151,32 +147,44 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -151,32 +147,44 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 151 | 147 | ||
| 152 | @Override | 148 | @Override |
| 153 | public GatewayNode getGatewayNode(DeviceId deviceId) { | 149 | public GatewayNode getGatewayNode(DeviceId deviceId) { |
| 154 | - return checkNotNull(gatewayNodeMap.get(deviceId).value(), GATEWAYNODE_CAN_NOT_BE_NULL); | 150 | + GatewayNode gatewayNode = gatewayNodeMap.get(deviceId).value(); |
| 151 | + if (gatewayNode == null) { | ||
| 152 | + log.warn("Gateway with device ID {} does not exist"); | ||
| 153 | + return null; | ||
| 154 | + } | ||
| 155 | + return gatewayNode; | ||
| 155 | } | 156 | } |
| 156 | 157 | ||
| 157 | @Override | 158 | @Override |
| 158 | - public PortNumber getGatewayExternalPort(DeviceId deviceId) { | 159 | + public PortNumber getUplinkPort(DeviceId deviceId) { |
| 159 | - GatewayNode gatewayNode = checkNotNull(gatewayNodeMap.get(deviceId).value(), GATEWAYNODE_CAN_NOT_BE_NULL); | 160 | + GatewayNode gatewayNode = gatewayNodeMap.get(deviceId).value(); |
| 160 | - String externalInterfaceName = gatewayNode.getGatewayExternalInterfaceName(); | 161 | + if (gatewayNode == null) { |
| 161 | - Optional<Port> port = deviceService.getPorts(deviceId) | 162 | + log.warn("Gateway with device ID {} does not exist"); |
| 162 | - .stream() | 163 | + return null; |
| 163 | - .filter(p -> p.annotations().value(PORT_NAME).equals(externalInterfaceName)) | 164 | + } |
| 164 | - .findFirst(); | ||
| 165 | 165 | ||
| 166 | + Optional<Port> port = deviceService.getPorts(deviceId).stream() | ||
| 167 | + .filter(p -> Objects.equals( | ||
| 168 | + p.annotations().value(PORT_NAME), | ||
| 169 | + gatewayNode.getUplinkIntf())) | ||
| 170 | + .findFirst(); | ||
| 166 | if (!port.isPresent()) { | 171 | if (!port.isPresent()) { |
| 167 | - log.error("Cannot find port {} in gateway device {}", externalInterfaceName, deviceId); | 172 | + log.warn("Cannot find uplink interface from gateway {}", deviceId); |
| 168 | return null; | 173 | return null; |
| 169 | } | 174 | } |
| 170 | - | ||
| 171 | return port.get().number(); | 175 | return port.get().number(); |
| 172 | } | 176 | } |
| 173 | 177 | ||
| 174 | @Override | 178 | @Override |
| 175 | - public GroupId getGroupIdForGatewayLoadBalance(DeviceId srcDeviceId) { | 179 | + public synchronized GroupId getGatewayGroupId(DeviceId srcDeviceId) { |
| 176 | - GroupDescription description = selectGroupHandler.createSelectGroupInVxlan(srcDeviceId, getGatewayNodes()); | 180 | + GroupKey groupKey = selectGroupHandler.getGroupKey(srcDeviceId); |
| 177 | - groupService.addGroup(description); | 181 | + Group group = groupService.getGroup(srcDeviceId, groupKey); |
| 178 | - Group group = groupService.getGroup(description.deviceId(), description.appCookie()); | 182 | + if (group == null) { |
| 179 | - return group != null ? group.id() : null; | 183 | + log.info("Created gateway group for {}", srcDeviceId); |
| 184 | + return selectGroupHandler.createGatewayGroup(srcDeviceId, getGatewayNodes()); | ||
| 185 | + } else { | ||
| 186 | + return group.id(); | ||
| 187 | + } | ||
| 180 | } | 188 | } |
| 181 | 189 | ||
| 182 | @Override | 190 | @Override |
| ... | @@ -185,9 +193,8 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -185,9 +193,8 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 185 | gatewayNodeMap.values() | 193 | gatewayNodeMap.values() |
| 186 | .stream() | 194 | .stream() |
| 187 | .map(Versioned::value) | 195 | .map(Versioned::value) |
| 188 | - .forEach(gatewayNode -> gatewayNodeList.add(gatewayNode)); | 196 | + .forEach(gatewayNodeList::add); |
| 189 | return gatewayNodeList; | 197 | return gatewayNodeList; |
| 190 | - | ||
| 191 | } | 198 | } |
| 192 | 199 | ||
| 193 | @Override | 200 | @Override |
| ... | @@ -198,7 +205,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -198,7 +205,6 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 198 | .map(Versioned::value) | 205 | .map(Versioned::value) |
| 199 | .forEach(gatewayNode -> deviceIdList.add(gatewayNode.getGatewayDeviceId())); | 206 | .forEach(gatewayNode -> deviceIdList.add(gatewayNode.getGatewayDeviceId())); |
| 200 | return deviceIdList; | 207 | return deviceIdList; |
| 201 | - | ||
| 202 | } | 208 | } |
| 203 | 209 | ||
| 204 | @Override | 210 | @Override |
| ... | @@ -206,7 +212,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -206,7 +212,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 206 | Versioned<GatewayNode> existingNode = gatewayNodeMap.putIfAbsent( | 212 | Versioned<GatewayNode> existingNode = gatewayNodeMap.putIfAbsent( |
| 207 | gatewayNode.getGatewayDeviceId(), gatewayNode); | 213 | gatewayNode.getGatewayDeviceId(), gatewayNode); |
| 208 | if (existingNode == null) { | 214 | if (existingNode == null) { |
| 209 | - updateGatewayLoadBalance(gatewayNode, true); | 215 | + updateGatewayGroup(gatewayNode, true); |
| 210 | log.info("Added {} to gateway pool", gatewayNode); | 216 | log.info("Added {} to gateway pool", gatewayNode); |
| 211 | return true; | 217 | return true; |
| 212 | } else { | 218 | } else { |
| ... | @@ -218,16 +224,22 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -218,16 +224,22 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 218 | public boolean deleteGatewayNode(GatewayNode gatewayNode) { | 224 | public boolean deleteGatewayNode(GatewayNode gatewayNode) { |
| 219 | boolean result = gatewayNodeMap.remove(gatewayNode.getGatewayDeviceId(), gatewayNode); | 225 | boolean result = gatewayNodeMap.remove(gatewayNode.getGatewayDeviceId(), gatewayNode); |
| 220 | if (result) { | 226 | if (result) { |
| 221 | - updateGatewayLoadBalance(gatewayNode, false); | 227 | + updateGatewayGroup(gatewayNode, false); |
| 228 | + log.info("Deleted gateway with device ID {}", gatewayNode.getGatewayDeviceId()); | ||
| 222 | } | 229 | } |
| 223 | return result; | 230 | return result; |
| 224 | } | 231 | } |
| 225 | 232 | ||
| 226 | - private void updateGatewayLoadBalance(GatewayNode gatewayNode, boolean nodeInsertion) { | 233 | + private void updateGatewayGroup(GatewayNode gatewayNode, boolean isInsert) { |
| 227 | - deviceService.getAvailableDevices().forEach(device -> | 234 | + Tools.stream(deviceService.getAvailableDevices()).forEach(device -> { |
| 228 | - groupService.getGroups(device.id(), appId).forEach(group -> | 235 | + Tools.stream(groupService.getGroups(device.id(), appId)).forEach(group -> { |
| 229 | - selectGroupHandler.updateBucketToSelectGroupInVxlan(device.id(), group.appCookie(), | 236 | + selectGroupHandler.updateGatewayGroupBuckets( |
| 230 | - Lists.newArrayList(gatewayNode), nodeInsertion))); | 237 | + device.id(), |
| 238 | + ImmutableList.of(gatewayNode), | ||
| 239 | + isInsert); | ||
| 240 | + log.trace("Updated gateway group on {}", device.id()); | ||
| 241 | + }); | ||
| 242 | + }); | ||
| 231 | } | 243 | } |
| 232 | 244 | ||
| 233 | private class InternalConfigListener implements NetworkConfigListener { | 245 | private class InternalConfigListener implements NetworkConfigListener { |
| ... | @@ -257,7 +269,9 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -257,7 +269,9 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 257 | public void event(DeviceEvent deviceEvent) { | 269 | public void event(DeviceEvent deviceEvent) { |
| 258 | if (deviceEvent.type() == DeviceEvent.Type.DEVICE_SUSPENDED || | 270 | if (deviceEvent.type() == DeviceEvent.Type.DEVICE_SUSPENDED || |
| 259 | deviceEvent.type() == DeviceEvent.Type.DEVICE_REMOVED) { | 271 | deviceEvent.type() == DeviceEvent.Type.DEVICE_REMOVED) { |
| 260 | - deleteGatewayNode(getGatewayNode(deviceEvent.subject().id())); | 272 | + DeviceId deviceId = deviceEvent.subject().id(); |
| 273 | + deleteGatewayNode(getGatewayNode(deviceId)); | ||
| 274 | + log.warn("Gateway with device ID {} is disconnected", deviceId); | ||
| 261 | } | 275 | } |
| 262 | } | 276 | } |
| 263 | } | 277 | } |
| ... | @@ -269,8 +283,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -269,8 +283,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 269 | return; | 283 | return; |
| 270 | } | 284 | } |
| 271 | 285 | ||
| 272 | - config.gatewayNodes().forEach(gatewayNode -> addGatewayNode(gatewayNode)); | 286 | + config.gatewayNodes().forEach(this::addGatewayNode); |
| 273 | - | ||
| 274 | log.info("ScalableGateway configured"); | 287 | log.info("ScalableGateway configured"); |
| 275 | } | 288 | } |
| 276 | } | 289 | } | ... | ... |
| ... | @@ -19,6 +19,8 @@ package org.onosproject.scalablegateway.impl; | ... | @@ -19,6 +19,8 @@ package org.onosproject.scalablegateway.impl; |
| 19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
| 20 | import org.onlab.packet.Ip4Address; | 20 | import org.onlab.packet.Ip4Address; |
| 21 | import org.onosproject.core.ApplicationId; | 21 | import org.onosproject.core.ApplicationId; |
| 22 | +import org.onosproject.core.DefaultGroupId; | ||
| 23 | +import org.onosproject.core.GroupId; | ||
| 22 | import org.onosproject.net.DeviceId; | 24 | import org.onosproject.net.DeviceId; |
| 23 | import org.onosproject.net.Port; | 25 | import org.onosproject.net.Port; |
| 24 | import org.onosproject.net.PortNumber; | 26 | import org.onosproject.net.PortNumber; |
| ... | @@ -36,7 +38,6 @@ import org.onosproject.net.flow.instructions.ExtensionTreatment; | ... | @@ -36,7 +38,6 @@ import org.onosproject.net.flow.instructions.ExtensionTreatment; |
| 36 | import org.onosproject.net.flow.instructions.ExtensionTreatmentType; | 38 | import org.onosproject.net.flow.instructions.ExtensionTreatmentType; |
| 37 | import org.onosproject.net.group.DefaultGroupDescription; | 39 | import org.onosproject.net.group.DefaultGroupDescription; |
| 38 | import org.onosproject.net.group.DefaultGroupKey; | 40 | import org.onosproject.net.group.DefaultGroupKey; |
| 39 | -import org.onosproject.net.group.Group; | ||
| 40 | import org.onosproject.net.group.GroupBucket; | 41 | import org.onosproject.net.group.GroupBucket; |
| 41 | import org.onosproject.net.group.GroupBuckets; | 42 | import org.onosproject.net.group.GroupBuckets; |
| 42 | import org.onosproject.net.group.GroupDescription; | 43 | import org.onosproject.net.group.GroupDescription; |
| ... | @@ -48,6 +49,7 @@ import org.slf4j.LoggerFactory; | ... | @@ -48,6 +49,7 @@ import org.slf4j.LoggerFactory; |
| 48 | 49 | ||
| 49 | import java.util.List; | 50 | import java.util.List; |
| 50 | 51 | ||
| 52 | +import static org.onosproject.net.AnnotationKeys.PORT_NAME; | ||
| 51 | import static org.onosproject.net.group.DefaultGroupBucket.createSelectGroupBucket; | 53 | import static org.onosproject.net.group.DefaultGroupBucket.createSelectGroupBucket; |
| 52 | 54 | ||
| 53 | /** | 55 | /** |
| ... | @@ -59,7 +61,6 @@ public class SelectGroupHandler { | ... | @@ -59,7 +61,6 @@ public class SelectGroupHandler { |
| 59 | 61 | ||
| 60 | private static final String TUNNEL_DESTINATION = "tunnelDst"; | 62 | private static final String TUNNEL_DESTINATION = "tunnelDst"; |
| 61 | private static final String PORTNAME_PREFIX_TUNNEL = "vxlan"; | 63 | private static final String PORTNAME_PREFIX_TUNNEL = "vxlan"; |
| 62 | - private static final String PORTNAME = "portName"; | ||
| 63 | 64 | ||
| 64 | private final GroupService groupService; | 65 | private final GroupService groupService; |
| 65 | private final DeviceService deviceService; | 66 | private final DeviceService deviceService; |
| ... | @@ -89,45 +90,61 @@ public class SelectGroupHandler { | ... | @@ -89,45 +90,61 @@ public class SelectGroupHandler { |
| 89 | * @param nodeList gateway node list for bucket action | 90 | * @param nodeList gateway node list for bucket action |
| 90 | * @return created select type group description | 91 | * @return created select type group description |
| 91 | */ | 92 | */ |
| 92 | - public GroupDescription createSelectGroupInVxlan(DeviceId srcDeviceId, List<GatewayNode> nodeList) { | 93 | + public GroupId createGatewayGroup(DeviceId srcDeviceId, List<GatewayNode> nodeList) { |
| 93 | List<GroupBucket> bucketList = generateBucketsForSelectGroup(srcDeviceId, nodeList); | 94 | List<GroupBucket> bucketList = generateBucketsForSelectGroup(srcDeviceId, nodeList); |
| 94 | - GroupKey key = generateGroupKey(srcDeviceId, nodeList); | 95 | + GroupId groupId = getGroupId(srcDeviceId); |
| 95 | - return new DefaultGroupDescription(srcDeviceId, GroupDescription.Type.SELECT, | 96 | + GroupDescription groupDescription = new DefaultGroupDescription( |
| 96 | - new GroupBuckets(bucketList), key, null, appId); | 97 | + srcDeviceId, |
| 98 | + GroupDescription.Type.SELECT, | ||
| 99 | + new GroupBuckets(bucketList), | ||
| 100 | + getGroupKey(srcDeviceId), | ||
| 101 | + groupId.id(), | ||
| 102 | + appId); | ||
| 103 | + | ||
| 104 | + groupService.addGroup(groupDescription); | ||
| 105 | + return groupId; | ||
| 97 | } | 106 | } |
| 98 | 107 | ||
| 99 | - private GroupKey generateGroupKey(DeviceId srcDeviceId, List<GatewayNode> nodeList) { | 108 | + /** |
| 100 | - String cookie = srcDeviceId.toString(); | 109 | + * Returns unique group key with supplied source device ID as a hash. |
| 101 | - for (GatewayNode node : nodeList) { | 110 | + * |
| 102 | - cookie = cookie.concat(node.getGatewayDeviceId().toString()); | 111 | + * @param srcDeviceId source device id |
| 103 | - } | 112 | + * @return group key |
| 104 | - return new DefaultGroupKey(cookie.getBytes()); | 113 | + */ |
| 114 | + public GroupKey getGroupKey(DeviceId srcDeviceId) { | ||
| 115 | + return new DefaultGroupKey(srcDeviceId.toString().getBytes()); | ||
| 116 | + } | ||
| 105 | 117 | ||
| 118 | + private GroupId getGroupId(DeviceId srcDeviceId) { | ||
| 119 | + return new DefaultGroupId(srcDeviceId.toString().hashCode()); | ||
| 106 | } | 120 | } |
| 107 | 121 | ||
| 108 | /** | 122 | /** |
| 109 | * Updates groupBuckets in select type group. | 123 | * Updates groupBuckets in select type group. |
| 110 | * | 124 | * |
| 111 | - * @param deviceId target device id for group description | 125 | + * @param deviceId target device id to update the group |
| 112 | - * @param oldAppCookie group key for target group | ||
| 113 | * @param nodeList updated gateway node list for bucket action | 126 | * @param nodeList updated gateway node list for bucket action |
| 114 | - * @param nodeInsertion update type(add or remove) | 127 | + * @param isInsert update type(add or remove) |
| 115 | * @return result of process | 128 | * @return result of process |
| 116 | */ | 129 | */ |
| 117 | - public boolean updateBucketToSelectGroupInVxlan(DeviceId deviceId, GroupKey oldAppCookie, | 130 | + public void updateGatewayGroupBuckets(DeviceId deviceId, |
| 118 | - List<GatewayNode> nodeList, boolean nodeInsertion) { | 131 | + List<GatewayNode> nodeList, |
| 132 | + boolean isInsert) { | ||
| 119 | List<GroupBucket> bucketList = generateBucketsForSelectGroup(deviceId, nodeList); | 133 | List<GroupBucket> bucketList = generateBucketsForSelectGroup(deviceId, nodeList); |
| 120 | - | 134 | + GroupKey groupKey = getGroupKey(deviceId); |
| 121 | - GroupKey newAppCookie = generateGroupKey(deviceId, nodeList); | 135 | + if (isInsert) { |
| 122 | - if (nodeInsertion) { | 136 | + groupService.addBucketsToGroup( |
| 123 | - groupService.addBucketsToGroup(deviceId, oldAppCookie, | 137 | + deviceId, |
| 124 | - new GroupBuckets(bucketList), newAppCookie, appId); | 138 | + groupKey, |
| 139 | + new GroupBuckets(bucketList), | ||
| 140 | + groupKey, appId); | ||
| 125 | } else { | 141 | } else { |
| 126 | - groupService.removeBucketsFromGroup(deviceId, oldAppCookie, | 142 | + groupService.removeBucketsFromGroup( |
| 127 | - new GroupBuckets(bucketList), newAppCookie, appId); | 143 | + deviceId, |
| 144 | + groupKey, | ||
| 145 | + new GroupBuckets(bucketList), | ||
| 146 | + groupKey, appId); | ||
| 128 | } | 147 | } |
| 129 | - Group group = groupService.getGroup(deviceId, newAppCookie); | ||
| 130 | - return group != null ? true : false; | ||
| 131 | } | 148 | } |
| 132 | 149 | ||
| 133 | private List<GroupBucket> generateBucketsForSelectGroup(DeviceId deviceId, List<GatewayNode> nodeList) { | 150 | private List<GroupBucket> generateBucketsForSelectGroup(DeviceId deviceId, List<GatewayNode> nodeList) { |
| ... | @@ -175,7 +192,7 @@ public class SelectGroupHandler { | ... | @@ -175,7 +192,7 @@ public class SelectGroupHandler { |
| 175 | */ | 192 | */ |
| 176 | private PortNumber getTunnelPort(DeviceId deviceId) { | 193 | private PortNumber getTunnelPort(DeviceId deviceId) { |
| 177 | Port port = deviceService.getPorts(deviceId).stream() | 194 | Port port = deviceService.getPorts(deviceId).stream() |
| 178 | - .filter(p -> p.annotations().value(PORTNAME).equals(PORTNAME_PREFIX_TUNNEL)) | 195 | + .filter(p -> p.annotations().value(PORT_NAME).equals(PORTNAME_PREFIX_TUNNEL)) |
| 179 | .findAny().orElse(null); | 196 | .findAny().orElse(null); |
| 180 | 197 | ||
| 181 | if (port == null) { | 198 | if (port == null) { | ... | ... |
-
Please register or login to post a comment