Committed by
Gerrit Code Review
[ONOS-4482] Implement dynamic add or remove a gateway node
- Implements command line interface for dynamic management - Implements dynamic gateway node management - Add CLIs Change-Id: I27bb945968a262d2813d317fc79e75ee768b2825
Showing
8 changed files
with
291 additions
and
6 deletions
| ... | @@ -53,5 +53,15 @@ | ... | @@ -53,5 +53,15 @@ |
| 53 | <artifactId>onos-core-serializers</artifactId> | 53 | <artifactId>onos-core-serializers</artifactId> |
| 54 | <version>${project.version}</version> | 54 | <version>${project.version}</version> |
| 55 | </dependency> | 55 | </dependency> |
| 56 | + <dependency> | ||
| 57 | + <groupId>org.apache.karaf.shell</groupId> | ||
| 58 | + <artifactId>org.apache.karaf.shell.console</artifactId> | ||
| 59 | + <version>3.0.5</version> | ||
| 60 | + </dependency> | ||
| 61 | + <dependency> | ||
| 62 | + <groupId>org.onosproject</groupId> | ||
| 63 | + <artifactId>onos-cli</artifactId> | ||
| 64 | + <version>1.7.0-SNAPSHOT</version> | ||
| 65 | + </dependency> | ||
| 56 | </dependencies> | 66 | </dependencies> |
| 57 | </project> | 67 | </project> | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.scalablegateway.cli; | ||
| 18 | + | ||
| 19 | +import com.google.common.collect.Lists; | ||
| 20 | +import org.apache.karaf.shell.commands.Argument; | ||
| 21 | +import org.apache.karaf.shell.commands.Command; | ||
| 22 | +import org.onlab.packet.Ip4Address; | ||
| 23 | +import org.onosproject.cli.AbstractShellCommand; | ||
| 24 | +import org.onosproject.net.DeviceId; | ||
| 25 | +import org.onosproject.scalablegateway.api.GatewayNode; | ||
| 26 | +import org.onosproject.scalablegateway.api.ScalableGatewayService; | ||
| 27 | + | ||
| 28 | +import java.util.Collections; | ||
| 29 | +import java.util.List; | ||
| 30 | + | ||
| 31 | +/** | ||
| 32 | + * Adds gateway node information for scalablegateway node managements. | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | +@Command(scope = "onos", name = "gateway-add", | ||
| 36 | + description = "Adds gateway node information for scalablegateway node managements") | ||
| 37 | +public class ScalableGatewayAddCommand extends AbstractShellCommand { | ||
| 38 | + | ||
| 39 | + private static final String SUCCESS = "Process of adding gateway node is succeed"; | ||
| 40 | + private static final String FAIL = "Process of adding gateway node is failed"; | ||
| 41 | + | ||
| 42 | + @Argument(index = 0, name = "DeviceId", description = "GatewayNode device id", | ||
| 43 | + required = true, multiValued = false) | ||
| 44 | + String deviceId = null; | ||
| 45 | + | ||
| 46 | + @Argument(index = 1, name = "dataPlaneIp", | ||
| 47 | + description = "GatewayNode datePlane interface ip address", | ||
| 48 | + required = true, multiValued = false) | ||
| 49 | + String ipAddress = null; | ||
| 50 | + | ||
| 51 | + @Argument(index = 2, name = "extInterfaceNames", | ||
| 52 | + description = "GatewayNode Interface name to outgoing external network", | ||
| 53 | + required = true, multiValued = true) | ||
| 54 | + String interfaceName = null; | ||
| 55 | + | ||
| 56 | + @Override | ||
| 57 | + protected void execute() { | ||
| 58 | + ScalableGatewayService service = get(ScalableGatewayService.class); | ||
| 59 | + | ||
| 60 | + GatewayNode gatewayNode = GatewayNode.builder() | ||
| 61 | + .gatewayDeviceId(DeviceId.deviceId(deviceId)) | ||
| 62 | + .dataIpAddress(Ip4Address.valueOf(ipAddress)) | ||
| 63 | + .gatewayExternalInterfaceNames(splitNameList(interfaceName)) | ||
| 64 | + .build(); | ||
| 65 | + if (service.addGatewayNode(gatewayNode)) { | ||
| 66 | + print(SUCCESS); | ||
| 67 | + } else { | ||
| 68 | + print(FAIL); | ||
| 69 | + } | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + private List<String> splitNameList(String interfaceName) { | ||
| 73 | + List<String> list = Lists.newArrayList(); | ||
| 74 | + return Collections.addAll(list, interfaceName.split(",")) ? list : null; | ||
| 75 | + } | ||
| 76 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.scalablegateway.cli; | ||
| 18 | + | ||
| 19 | +import org.apache.karaf.shell.commands.Argument; | ||
| 20 | +import org.apache.karaf.shell.commands.Command; | ||
| 21 | +import org.onosproject.cli.AbstractShellCommand; | ||
| 22 | +import org.onosproject.net.DeviceId; | ||
| 23 | +import org.onosproject.scalablegateway.api.GatewayNode; | ||
| 24 | +import org.onosproject.scalablegateway.api.ScalableGatewayService; | ||
| 25 | + | ||
| 26 | +/** | ||
| 27 | + * Deletes gateway node information for scalablegateway node managements. | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +@Command(scope = "onos", name = "gateway-delete", | ||
| 31 | + description = "Deletes gateway node information for scalablegateway node managements") | ||
| 32 | +public class ScalableGatewayDeleteCommand extends AbstractShellCommand { | ||
| 33 | + | ||
| 34 | + private static final String SUCCESS = "Process of deleting gateway node is succeed."; | ||
| 35 | + private static final String FAIL = "Process of deleting gateway node is failed."; | ||
| 36 | + private static final String UNKNOWN = "Unknown device id is given."; | ||
| 37 | + | ||
| 38 | + @Argument(index = 0, name = "DeviceId", description = "GatewayNode device id", | ||
| 39 | + required = true, multiValued = false) | ||
| 40 | + String deviceId = null; | ||
| 41 | + | ||
| 42 | + @Override | ||
| 43 | + protected void execute() { | ||
| 44 | + ScalableGatewayService service = get(ScalableGatewayService.class); | ||
| 45 | + | ||
| 46 | + GatewayNode gatewayNode = service.getGatewayNode(DeviceId.deviceId(deviceId)); | ||
| 47 | + if (gatewayNode == null) { | ||
| 48 | + print(UNKNOWN); | ||
| 49 | + return; | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + if (service.deleteGatewayNode(gatewayNode)) { | ||
| 53 | + print(SUCCESS); | ||
| 54 | + } else { | ||
| 55 | + print(FAIL); | ||
| 56 | + } | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +package org.onosproject.scalablegateway.cli; | ||
| 18 | + | ||
| 19 | +import org.apache.karaf.shell.commands.Command; | ||
| 20 | +import org.onosproject.cli.AbstractShellCommand; | ||
| 21 | +import org.onosproject.scalablegateway.api.ScalableGatewayService; | ||
| 22 | + | ||
| 23 | +/** | ||
| 24 | + * Lists all gateway node information of scalablegateway. | ||
| 25 | + */ | ||
| 26 | + | ||
| 27 | +@Command(scope = "onos", name = "gateways", | ||
| 28 | + description = "Lists gateway node information") | ||
| 29 | +public class ScalableGatewayListCommand extends AbstractShellCommand { | ||
| 30 | + | ||
| 31 | + private static final String FORMAT = "GatewayNode Id[%s]: DataPlane Ip[%s], External Interface names[%s]"; | ||
| 32 | + @Override | ||
| 33 | + protected void execute() { | ||
| 34 | + ScalableGatewayService service = get(ScalableGatewayService.class); | ||
| 35 | + service.getGatewayNodes().forEach(node -> print(FORMAT, | ||
| 36 | + node.getGatewayDeviceId().toString(), | ||
| 37 | + node.getDataIpAddress().toString(), | ||
| 38 | + node.getGatewayExternalInterfaceNames().toString())); | ||
| 39 | + } | ||
| 40 | +} |
| 1 | +/* | ||
| 2 | + * Copyright 2016-present Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/** | ||
| 18 | + * Command line interface for Scaleable Gateway management. | ||
| 19 | + */ | ||
| 20 | +package org.onosproject.scalablegateway.cli; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -17,7 +17,6 @@ | ... | @@ -17,7 +17,6 @@ |
| 17 | package org.onosproject.scalablegateway.impl; | 17 | package org.onosproject.scalablegateway.impl; |
| 18 | 18 | ||
| 19 | import com.google.common.collect.Lists; | 19 | import com.google.common.collect.Lists; |
| 20 | -import com.google.common.collect.Maps; | ||
| 21 | import org.apache.felix.scr.annotations.Activate; | 20 | import org.apache.felix.scr.annotations.Activate; |
| 22 | import org.apache.felix.scr.annotations.Component; | 21 | import org.apache.felix.scr.annotations.Component; |
| 23 | import org.apache.felix.scr.annotations.Deactivate; | 22 | import org.apache.felix.scr.annotations.Deactivate; |
| ... | @@ -25,6 +24,7 @@ import org.apache.felix.scr.annotations.Deactivate; | ... | @@ -25,6 +24,7 @@ import org.apache.felix.scr.annotations.Deactivate; |
| 25 | import org.apache.felix.scr.annotations.Reference; | 24 | import org.apache.felix.scr.annotations.Reference; |
| 26 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 25 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
| 27 | import org.apache.felix.scr.annotations.Service; | 26 | import org.apache.felix.scr.annotations.Service; |
| 27 | +import org.onlab.util.KryoNamespace; | ||
| 28 | import org.onosproject.core.ApplicationId; | 28 | import org.onosproject.core.ApplicationId; |
| 29 | import org.onosproject.core.CoreService; | 29 | import org.onosproject.core.CoreService; |
| 30 | 30 | ||
| ... | @@ -38,6 +38,8 @@ import org.onosproject.net.config.NetworkConfigListener; | ... | @@ -38,6 +38,8 @@ import org.onosproject.net.config.NetworkConfigListener; |
| 38 | import org.onosproject.net.config.NetworkConfigRegistry; | 38 | import org.onosproject.net.config.NetworkConfigRegistry; |
| 39 | import org.onosproject.net.config.NetworkConfigService; | 39 | import org.onosproject.net.config.NetworkConfigService; |
| 40 | import org.onosproject.net.config.basics.SubjectFactories; | 40 | import org.onosproject.net.config.basics.SubjectFactories; |
| 41 | +import org.onosproject.net.device.DeviceEvent; | ||
| 42 | +import org.onosproject.net.device.DeviceListener; | ||
| 41 | import org.onosproject.net.device.DeviceService; | 43 | import org.onosproject.net.device.DeviceService; |
| 42 | import org.onosproject.net.driver.DriverService; | 44 | import org.onosproject.net.driver.DriverService; |
| 43 | import org.onosproject.net.group.Group; | 45 | import org.onosproject.net.group.Group; |
| ... | @@ -48,8 +50,12 @@ import org.onosproject.scalablegateway.api.GatewayNodeConfig; | ... | @@ -48,8 +50,12 @@ import org.onosproject.scalablegateway.api.GatewayNodeConfig; |
| 48 | import org.onosproject.scalablegateway.api.ScalableGatewayService; | 50 | import org.onosproject.scalablegateway.api.ScalableGatewayService; |
| 49 | 51 | ||
| 50 | import java.util.List; | 52 | import java.util.List; |
| 51 | -import java.util.Map; | ||
| 52 | 53 | ||
| 54 | +import org.onosproject.store.serializers.KryoNamespaces; | ||
| 55 | +import org.onosproject.store.service.ConsistentMap; | ||
| 56 | +import org.onosproject.store.service.Serializer; | ||
| 57 | +import org.onosproject.store.service.StorageService; | ||
| 58 | +import org.onosproject.store.service.Versioned; | ||
| 53 | import org.slf4j.Logger; | 59 | import org.slf4j.Logger; |
| 54 | import org.slf4j.LoggerFactory; | 60 | import org.slf4j.LoggerFactory; |
| 55 | 61 | ||
| ... | @@ -72,6 +78,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -72,6 +78,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 72 | private static final String FAIL_ADD_GATEWAY = "Adding process is failed as existing deivce id"; | 78 | private static final String FAIL_ADD_GATEWAY = "Adding process is failed as existing deivce id"; |
| 73 | private static final String FAIL_REMOVE_GATEWAY = "Removing process is failed as unknown deivce id"; | 79 | private static final String FAIL_REMOVE_GATEWAY = "Removing process is failed as unknown deivce id"; |
| 74 | private static final String PORT_NAME = "portName"; | 80 | private static final String PORT_NAME = "portName"; |
| 81 | + private static final String GATEWAYNODE_MAP_NAME = "gatewaynode-map"; | ||
| 75 | 82 | ||
| 76 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 83 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 77 | protected CoreService coreService; | 84 | protected CoreService coreService; |
| ... | @@ -91,10 +98,14 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -91,10 +98,14 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 91 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 98 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
| 92 | protected GroupService groupService; | 99 | protected GroupService groupService; |
| 93 | 100 | ||
| 101 | + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | ||
| 102 | + protected StorageService storageService; | ||
| 103 | + | ||
| 94 | private GatewayNodeConfig config; | 104 | private GatewayNodeConfig config; |
| 95 | private SelectGroupHandler selectGroupHandler; | 105 | private SelectGroupHandler selectGroupHandler; |
| 96 | 106 | ||
| 97 | private final NetworkConfigListener configListener = new InternalConfigListener(); | 107 | private final NetworkConfigListener configListener = new InternalConfigListener(); |
| 108 | + private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); | ||
| 98 | 109 | ||
| 99 | private final ConfigFactory configFactory = | 110 | private final ConfigFactory configFactory = |
| 100 | new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, GatewayNodeConfig.class, APP_NAME) { | 111 | new ConfigFactory(SubjectFactories.APP_SUBJECT_FACTORY, GatewayNodeConfig.class, APP_NAME) { |
| ... | @@ -103,17 +114,28 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -103,17 +114,28 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 103 | return new GatewayNodeConfig(); | 114 | return new GatewayNodeConfig(); |
| 104 | } | 115 | } |
| 105 | }; | 116 | }; |
| 106 | - private Map<DeviceId, GatewayNode> gatewayNodeMap = Maps.newHashMap(); // Map<GatewayNode`s Id, GatewayNode object> | 117 | + private ConsistentMap<DeviceId, GatewayNode> gatewayNodeMap; // Map<GatewayNode`s Id, GatewayNode object> |
| 118 | + private static final KryoNamespace.Builder GATEWAYNODE_SERIALIZER = KryoNamespace.newBuilder() | ||
| 119 | + .register(KryoNamespaces.API) | ||
| 120 | + .register(DeviceId.class) | ||
| 121 | + .register(GatewayNode.class); | ||
| 107 | 122 | ||
| 108 | @Activate | 123 | @Activate |
| 109 | protected void activate() { | 124 | protected void activate() { |
| 110 | appId = coreService.registerApplication(APP_ID); | 125 | appId = coreService.registerApplication(APP_ID); |
| 111 | configRegistry.registerConfigFactory(configFactory); | 126 | configRegistry.registerConfigFactory(configFactory); |
| 112 | configService.addListener(configListener); | 127 | configService.addListener(configListener); |
| 128 | + deviceService.addListener(internalDeviceListener); | ||
| 113 | 129 | ||
| 114 | selectGroupHandler = new SelectGroupHandler(groupService, deviceService, driverService, appId); | 130 | selectGroupHandler = new SelectGroupHandler(groupService, deviceService, driverService, appId); |
| 115 | readConfiguration(); | 131 | readConfiguration(); |
| 116 | 132 | ||
| 133 | + gatewayNodeMap = storageService.<DeviceId, GatewayNode>consistentMapBuilder() | ||
| 134 | + .withSerializer(Serializer.using(GATEWAYNODE_SERIALIZER.build())) | ||
| 135 | + .withName(GATEWAYNODE_MAP_NAME) | ||
| 136 | + .withApplicationId(appId) | ||
| 137 | + .build(); | ||
| 138 | + | ||
| 117 | log.info("started"); | 139 | log.info("started"); |
| 118 | } | 140 | } |
| 119 | 141 | ||
| ... | @@ -121,6 +143,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -121,6 +143,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 121 | protected void deactivate() { | 143 | protected void deactivate() { |
| 122 | gatewayNodeMap.clear(); | 144 | gatewayNodeMap.clear(); |
| 123 | 145 | ||
| 146 | + deviceService.removeListener(internalDeviceListener); | ||
| 124 | configService.removeListener(configListener); | 147 | configService.removeListener(configListener); |
| 125 | 148 | ||
| 126 | log.info("stopped"); | 149 | log.info("stopped"); |
| ... | @@ -128,12 +151,12 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -128,12 +151,12 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 128 | 151 | ||
| 129 | @Override | 152 | @Override |
| 130 | public GatewayNode getGatewayNode(DeviceId deviceId) { | 153 | public GatewayNode getGatewayNode(DeviceId deviceId) { |
| 131 | - return checkNotNull(gatewayNodeMap.get(deviceId), GATEWAYNODE_CAN_NOT_BE_NULL); | 154 | + return checkNotNull(gatewayNodeMap.get(deviceId).value(), GATEWAYNODE_CAN_NOT_BE_NULL); |
| 132 | } | 155 | } |
| 133 | 156 | ||
| 134 | @Override | 157 | @Override |
| 135 | public List<PortNumber> getGatewayExternalPorts(DeviceId deviceId) { | 158 | public List<PortNumber> getGatewayExternalPorts(DeviceId deviceId) { |
| 136 | - GatewayNode gatewayNode = checkNotNull(gatewayNodeMap.get(deviceId), GATEWAYNODE_CAN_NOT_BE_NULL); | 159 | + GatewayNode gatewayNode = checkNotNull(gatewayNodeMap.get(deviceId).value(), GATEWAYNODE_CAN_NOT_BE_NULL); |
| 137 | List<PortNumber> portNumbers = Lists.newArrayList(); | 160 | List<PortNumber> portNumbers = Lists.newArrayList(); |
| 138 | gatewayNode.getGatewayExternalInterfaceNames() | 161 | gatewayNode.getGatewayExternalInterfaceNames() |
| 139 | .stream() | 162 | .stream() |
| ... | @@ -164,6 +187,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -164,6 +187,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 164 | List<GatewayNode> gatewayNodeList = Lists.newArrayList(); | 187 | List<GatewayNode> gatewayNodeList = Lists.newArrayList(); |
| 165 | gatewayNodeMap.values() | 188 | gatewayNodeMap.values() |
| 166 | .stream() | 189 | .stream() |
| 190 | + .map(Versioned::value) | ||
| 167 | .forEach(gatewayNode -> gatewayNodeList.add(gatewayNode)); | 191 | .forEach(gatewayNode -> gatewayNodeList.add(gatewayNode)); |
| 168 | return gatewayNodeList; | 192 | return gatewayNodeList; |
| 169 | 193 | ||
| ... | @@ -174,6 +198,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -174,6 +198,7 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 174 | List<DeviceId> deviceIdList = Lists.newArrayList(); | 198 | List<DeviceId> deviceIdList = Lists.newArrayList(); |
| 175 | gatewayNodeMap.values() | 199 | gatewayNodeMap.values() |
| 176 | .stream() | 200 | .stream() |
| 201 | + .map(Versioned::value) | ||
| 177 | .forEach(gatewayNode -> deviceIdList.add(gatewayNode.getGatewayDeviceId())); | 202 | .forEach(gatewayNode -> deviceIdList.add(gatewayNode.getGatewayDeviceId())); |
| 178 | return deviceIdList; | 203 | return deviceIdList; |
| 179 | 204 | ||
| ... | @@ -182,12 +207,24 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -182,12 +207,24 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 182 | @Override | 207 | @Override |
| 183 | public boolean addGatewayNode(GatewayNode gatewayNode) { | 208 | public boolean addGatewayNode(GatewayNode gatewayNode) { |
| 184 | gatewayNodeMap.putIfAbsent(gatewayNode.getGatewayDeviceId(), gatewayNode); | 209 | gatewayNodeMap.putIfAbsent(gatewayNode.getGatewayDeviceId(), gatewayNode); |
| 210 | + updateGatewayLoadBalance(gatewayNode, true); | ||
| 185 | return true; | 211 | return true; |
| 186 | } | 212 | } |
| 187 | 213 | ||
| 188 | @Override | 214 | @Override |
| 189 | public boolean deleteGatewayNode(GatewayNode gatewayNode) { | 215 | public boolean deleteGatewayNode(GatewayNode gatewayNode) { |
| 190 | - return gatewayNodeMap.remove(gatewayNode.getGatewayDeviceId(), gatewayNode); | 216 | + boolean result = gatewayNodeMap.remove(gatewayNode.getGatewayDeviceId(), gatewayNode); |
| 217 | + if (result) { | ||
| 218 | + updateGatewayLoadBalance(gatewayNode, false); | ||
| 219 | + } | ||
| 220 | + return result; | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + private void updateGatewayLoadBalance(GatewayNode gatewayNode, boolean nodeInsertion) { | ||
| 224 | + deviceService.getAvailableDevices().forEach(device -> | ||
| 225 | + groupService.getGroups(device.id(), appId).forEach(group -> | ||
| 226 | + selectGroupHandler.updateBucketToSelectGroupInVxlan(device.id(), group.appCookie(), | ||
| 227 | + Lists.newArrayList(gatewayNode), nodeInsertion))); | ||
| 191 | } | 228 | } |
| 192 | 229 | ||
| 193 | private class InternalConfigListener implements NetworkConfigListener { | 230 | private class InternalConfigListener implements NetworkConfigListener { |
| ... | @@ -211,6 +248,17 @@ public class ScalableGatewayManager implements ScalableGatewayService { | ... | @@ -211,6 +248,17 @@ public class ScalableGatewayManager implements ScalableGatewayService { |
| 211 | } | 248 | } |
| 212 | } | 249 | } |
| 213 | 250 | ||
| 251 | + private class InternalDeviceListener implements DeviceListener { | ||
| 252 | + | ||
| 253 | + @Override | ||
| 254 | + public void event(DeviceEvent deviceEvent) { | ||
| 255 | + if (deviceEvent.type() == DeviceEvent.Type.DEVICE_SUSPENDED || | ||
| 256 | + deviceEvent.type() == DeviceEvent.Type.DEVICE_REMOVED) { | ||
| 257 | + deleteGatewayNode(getGatewayNode(deviceEvent.subject().id())); | ||
| 258 | + } | ||
| 259 | + } | ||
| 260 | + } | ||
| 261 | + | ||
| 214 | private void readConfiguration() { | 262 | private void readConfiguration() { |
| 215 | config = configService.getConfig(appId, GatewayNodeConfig.class); | 263 | config = configService.getConfig(appId, GatewayNodeConfig.class); |
| 216 | if (config == null) { | 264 | if (config == null) { | ... | ... |
| 1 | +<!-- | ||
| 2 | + ~ Copyright 2016-present Open Networking Laboratory | ||
| 3 | + ~ | ||
| 4 | + ~ Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + ~ you may not use this file except in compliance with the License. | ||
| 6 | + ~ You may obtain a copy of the License at | ||
| 7 | + ~ | ||
| 8 | + ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + ~ | ||
| 10 | + ~ Unless required by applicable law or agreed to in writing, software | ||
| 11 | + ~ distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + ~ See the License for the specific language governing permissions and | ||
| 14 | + ~ limitations under the License. | ||
| 15 | + --> | ||
| 16 | +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> | ||
| 17 | + | ||
| 18 | + <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> | ||
| 19 | + <command> | ||
| 20 | + <action class="org.onosproject.scalablegateway.cli.ScalableGatewayListCommand"/> | ||
| 21 | + </command> | ||
| 22 | + <command> | ||
| 23 | + <action class="org.onosproject.scalablegateway.cli.ScalableGatewayAddCommand"/> | ||
| 24 | + </command> | ||
| 25 | + <command> | ||
| 26 | + <action class="org.onosproject.scalablegateway.cli.ScalableGatewayDeleteCommand"/> | ||
| 27 | + </command> | ||
| 28 | + </command-bundle> | ||
| 29 | +</blueprint> |
-
Please register or login to post a comment