Committed by
Gerrit Code Review
Improved node bootstrap and debugging
Change-Id: I37d8a5236c9dc798a524891c8918380a6f85a6b5
Showing
3 changed files
with
72 additions
and
33 deletions
| ... | @@ -21,6 +21,9 @@ import org.apache.karaf.shell.commands.Command; | ... | @@ -21,6 +21,9 @@ import org.apache.karaf.shell.commands.Command; |
| 21 | import org.onosproject.cli.AbstractShellCommand; | 21 | import org.onosproject.cli.AbstractShellCommand; |
| 22 | import org.onosproject.cordvtn.api.CordVtnNode; | 22 | import org.onosproject.cordvtn.api.CordVtnNode; |
| 23 | import org.onosproject.cordvtn.impl.CordVtnNodeManager; | 23 | import org.onosproject.cordvtn.impl.CordVtnNodeManager; |
| 24 | +import org.onosproject.net.Device; | ||
| 25 | +import org.onosproject.net.device.DeviceService; | ||
| 26 | +import org.onosproject.net.driver.DriverService; | ||
| 24 | 27 | ||
| 25 | /** | 28 | /** |
| 26 | * Checks detailed node init state. | 29 | * Checks detailed node init state. |
| ... | @@ -36,6 +39,8 @@ public class CordVtnNodeCheckCommand extends AbstractShellCommand { | ... | @@ -36,6 +39,8 @@ public class CordVtnNodeCheckCommand extends AbstractShellCommand { |
| 36 | @Override | 39 | @Override |
| 37 | protected void execute() { | 40 | protected void execute() { |
| 38 | CordVtnNodeManager nodeManager = AbstractShellCommand.get(CordVtnNodeManager.class); | 41 | CordVtnNodeManager nodeManager = AbstractShellCommand.get(CordVtnNodeManager.class); |
| 42 | + DeviceService deviceService = AbstractShellCommand.get(DeviceService.class); | ||
| 43 | + | ||
| 39 | CordVtnNode node = nodeManager.getNodes() | 44 | CordVtnNode node = nodeManager.getNodes() |
| 40 | .stream() | 45 | .stream() |
| 41 | .filter(n -> n.hostname().equals(hostname)) | 46 | .filter(n -> n.hostname().equals(hostname)) |
| ... | @@ -48,5 +53,22 @@ public class CordVtnNodeCheckCommand extends AbstractShellCommand { | ... | @@ -48,5 +53,22 @@ public class CordVtnNodeCheckCommand extends AbstractShellCommand { |
| 48 | } | 53 | } |
| 49 | 54 | ||
| 50 | print(nodeManager.checkNodeInitState(node)); | 55 | print(nodeManager.checkNodeInitState(node)); |
| 56 | + | ||
| 57 | + print("%n[DEBUG]"); | ||
| 58 | + Device device = deviceService.getDevice(node.intBrId()); | ||
| 59 | + String driver = get(DriverService.class).getDriver(device.id()).name(); | ||
| 60 | + print("%s available=%s driver=%s %s", | ||
| 61 | + device.id(), | ||
| 62 | + deviceService.isAvailable(device.id()), | ||
| 63 | + driver, | ||
| 64 | + device.annotations()); | ||
| 65 | + | ||
| 66 | + deviceService.getPorts(node.intBrId()).forEach(port -> { | ||
| 67 | + Object portIsEnabled = port.isEnabled() ? "enabled" : "disabled"; | ||
| 68 | + print("port=%s state=%s %s", | ||
| 69 | + port.number(), | ||
| 70 | + portIsEnabled, | ||
| 71 | + port.annotations()); | ||
| 72 | + }); | ||
| 51 | } | 73 | } |
| 52 | } | 74 | } | ... | ... |
| ... | @@ -178,7 +178,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro | ... | @@ -178,7 +178,7 @@ public class CordVtn extends AbstractProvider implements CordVtnService, HostPro |
| 178 | 178 | ||
| 179 | @Activate | 179 | @Activate |
| 180 | protected void activate() { | 180 | protected void activate() { |
| 181 | - appId = coreService.registerApplication("org.onosproject.cordvtn"); | 181 | + appId = coreService.registerApplication(CordVtnService.CORDVTN_APP_ID); |
| 182 | ruleInstaller = new CordVtnRuleInstaller(appId, flowRuleService, | 182 | ruleInstaller = new CordVtnRuleInstaller(appId, flowRuleService, |
| 183 | deviceService, | 183 | deviceService, |
| 184 | groupService, | 184 | groupService, | ... | ... |
| ... | @@ -86,6 +86,7 @@ import java.util.stream.Collectors; | ... | @@ -86,6 +86,7 @@ import java.util.stream.Collectors; |
| 86 | import static com.google.common.base.Preconditions.checkNotNull; | 86 | import static com.google.common.base.Preconditions.checkNotNull; |
| 87 | import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; | 87 | import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; |
| 88 | import static org.onlab.util.Tools.groupedThreads; | 88 | import static org.onlab.util.Tools.groupedThreads; |
| 89 | +import static org.onosproject.cordvtn.impl.RemoteIpCommandUtil.*; | ||
| 89 | import static org.onosproject.net.Device.Type.SWITCH; | 90 | import static org.onosproject.net.Device.Type.SWITCH; |
| 90 | import static org.onosproject.net.behaviour.TunnelDescription.Type.VXLAN; | 91 | import static org.onosproject.net.behaviour.TunnelDescription.Type.VXLAN; |
| 91 | import static org.slf4j.LoggerFactory.getLogger; | 92 | import static org.slf4j.LoggerFactory.getLogger; |
| ... | @@ -222,7 +223,7 @@ public class CordVtnNodeManager { | ... | @@ -222,7 +223,7 @@ public class CordVtnNodeManager { |
| 222 | } | 223 | } |
| 223 | 224 | ||
| 224 | @Activate | 225 | @Activate |
| 225 | - protected void active() { | 226 | + protected void activate() { |
| 226 | appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID); | 227 | appId = coreService.getAppId(CordVtnService.CORDVTN_APP_ID); |
| 227 | localNodeId = clusterService.getLocalNode().id(); | 228 | localNodeId = clusterService.getLocalNode().id(); |
| 228 | leadershipService.runForLeadership(appId.name()); | 229 | leadershipService.runForLeadership(appId.name()); |
| ... | @@ -242,18 +243,20 @@ public class CordVtnNodeManager { | ... | @@ -242,18 +243,20 @@ public class CordVtnNodeManager { |
| 242 | nodeStore.addListener(nodeStoreListener); | 243 | nodeStore.addListener(nodeStoreListener); |
| 243 | deviceService.addListener(deviceListener); | 244 | deviceService.addListener(deviceListener); |
| 244 | configService.addListener(configListener); | 245 | configService.addListener(configListener); |
| 246 | + | ||
| 247 | + log.info("Started"); | ||
| 245 | } | 248 | } |
| 246 | 249 | ||
| 247 | @Deactivate | 250 | @Deactivate |
| 248 | protected void deactivate() { | 251 | protected void deactivate() { |
| 249 | configService.removeListener(configListener); | 252 | configService.removeListener(configListener); |
| 250 | deviceService.removeListener(deviceListener); | 253 | deviceService.removeListener(deviceListener); |
| 251 | - | ||
| 252 | nodeStore.removeListener(nodeStoreListener); | 254 | nodeStore.removeListener(nodeStoreListener); |
| 253 | - nodeStore.clear(); | ||
| 254 | 255 | ||
| 255 | leadershipService.withdraw(appId.name()); | 256 | leadershipService.withdraw(appId.name()); |
| 256 | eventExecutor.shutdown(); | 257 | eventExecutor.shutdown(); |
| 258 | + | ||
| 259 | + log.info("Stopped"); | ||
| 257 | } | 260 | } |
| 258 | 261 | ||
| 259 | /** | 262 | /** |
| ... | @@ -344,29 +347,31 @@ public class CordVtnNodeManager { | ... | @@ -344,29 +347,31 @@ public class CordVtnNodeManager { |
| 344 | return null; | 347 | return null; |
| 345 | } | 348 | } |
| 346 | 349 | ||
| 347 | - Session session = RemoteIpCommandUtil.connect(node.sshInfo()); | 350 | + Session session = connect(node.sshInfo()); |
| 348 | if (session == null) { | 351 | if (session == null) { |
| 349 | log.debug("Failed to SSH to {}", node.hostname()); | 352 | log.debug("Failed to SSH to {}", node.hostname()); |
| 350 | return null; | 353 | return null; |
| 351 | } | 354 | } |
| 352 | 355 | ||
| 353 | - Set<IpAddress> intBrIps = RemoteIpCommandUtil.getCurrentIps(session, DEFAULT_BRIDGE); | 356 | + Set<IpAddress> intBrIps = getCurrentIps(session, DEFAULT_BRIDGE); |
| 354 | String result = String.format( | 357 | String result = String.format( |
| 355 | - "br-int created and connected : %s (%s)%n" + | 358 | + "Current state : %s%n" + |
| 356 | - "VXLAN interface created : %s%n" + | 359 | + "br-int created and connected to ONOS : %s (%s)%n" + |
| 357 | - "Data plane interface added : %s (%s)%n" + | 360 | + "VXLAN interface added to br-int : %s%n" + |
| 358 | - "IP flushed from %s : %s%n" + | 361 | + "Data plane interface is added to br-int and enabled : %s (%s)%n" + |
| 362 | + "IP flushed from data plane interface : %s (%s)%n" + | ||
| 359 | "Data plane IP added to br-int : %s (%s)%n" + | 363 | "Data plane IP added to br-int : %s (%s)%n" + |
| 360 | "Local management IP added to br-int : %s (%s)", | 364 | "Local management IP added to br-int : %s (%s)", |
| 365 | + node.state(), | ||
| 361 | isBrIntCreated(node) ? OK : NO, node.intBrId(), | 366 | isBrIntCreated(node) ? OK : NO, node.intBrId(), |
| 362 | isTunnelIntfCreated(node) ? OK : NO, | 367 | isTunnelIntfCreated(node) ? OK : NO, |
| 363 | isDataPlaneIntfAdded(node) ? OK : NO, node.dpIntf(), | 368 | isDataPlaneIntfAdded(node) ? OK : NO, node.dpIntf(), |
| 364 | - node.dpIntf(), | 369 | + isInterfaceUp(session, node.dpIntf()) && |
| 365 | - RemoteIpCommandUtil.getCurrentIps(session, node.dpIntf()).isEmpty() ? OK : NO, | 370 | + getCurrentIps(session, node.dpIntf()).isEmpty() ? OK : NO, node.dpIntf(), |
| 366 | intBrIps.contains(node.dpIp().ip()) ? OK : NO, node.dpIp().cidr(), | 371 | intBrIps.contains(node.dpIp().ip()) ? OK : NO, node.dpIp().cidr(), |
| 367 | intBrIps.contains(node.localMgmtIp().ip()) ? OK : NO, node.localMgmtIp().cidr()); | 372 | intBrIps.contains(node.localMgmtIp().ip()) ? OK : NO, node.localMgmtIp().cidr()); |
| 368 | 373 | ||
| 369 | - RemoteIpCommandUtil.disconnect(session); | 374 | + disconnect(session); |
| 370 | 375 | ||
| 371 | return result; | 376 | return result; |
| 372 | } | 377 | } |
| ... | @@ -630,6 +635,18 @@ public class CordVtnNodeManager { | ... | @@ -630,6 +635,18 @@ public class CordVtnNodeManager { |
| 630 | return; | 635 | return; |
| 631 | } | 636 | } |
| 632 | 637 | ||
| 638 | + Session session = connect(node.sshInfo()); | ||
| 639 | + if (session == null) { | ||
| 640 | + log.debug("Failed to SSH to {}", node.hostname()); | ||
| 641 | + return; | ||
| 642 | + } | ||
| 643 | + | ||
| 644 | + if (!isInterfaceUp(session, node.dpIntf())) { | ||
| 645 | + log.warn("Interface {} is not available", node.dpIntf()); | ||
| 646 | + return; | ||
| 647 | + } | ||
| 648 | + disconnect(session); | ||
| 649 | + | ||
| 633 | try { | 650 | try { |
| 634 | Device device = deviceService.getDevice(node.ovsdbId()); | 651 | Device device = deviceService.getDevice(node.ovsdbId()); |
| 635 | if (device.is(BridgeConfig.class)) { | 652 | if (device.is(BridgeConfig.class)) { |
| ... | @@ -650,24 +667,24 @@ public class CordVtnNodeManager { | ... | @@ -650,24 +667,24 @@ public class CordVtnNodeManager { |
| 650 | * @param node cordvtn node | 667 | * @param node cordvtn node |
| 651 | */ | 668 | */ |
| 652 | private void setIpAddress(CordVtnNode node) { | 669 | private void setIpAddress(CordVtnNode node) { |
| 653 | - Session session = RemoteIpCommandUtil.connect(node.sshInfo()); | 670 | + Session session = connect(node.sshInfo()); |
| 654 | if (session == null) { | 671 | if (session == null) { |
| 655 | log.debug("Failed to SSH to {}", node.hostname()); | 672 | log.debug("Failed to SSH to {}", node.hostname()); |
| 656 | return; | 673 | return; |
| 657 | } | 674 | } |
| 658 | 675 | ||
| 659 | - RemoteIpCommandUtil.getCurrentIps(session, DEFAULT_BRIDGE).stream() | 676 | + getCurrentIps(session, DEFAULT_BRIDGE).stream() |
| 660 | .filter(ip -> !ip.equals(node.localMgmtIp().ip())) | 677 | .filter(ip -> !ip.equals(node.localMgmtIp().ip())) |
| 661 | .filter(ip -> !ip.equals(node.dpIp().ip())) | 678 | .filter(ip -> !ip.equals(node.dpIp().ip())) |
| 662 | - .forEach(ip -> RemoteIpCommandUtil.deleteIp(session, ip, DEFAULT_BRIDGE)); | 679 | + .forEach(ip -> deleteIp(session, ip, DEFAULT_BRIDGE)); |
| 663 | 680 | ||
| 664 | - boolean result = RemoteIpCommandUtil.flushIp(session, node.dpIntf()) && | 681 | + boolean result = flushIp(session, node.dpIntf()) && |
| 665 | - RemoteIpCommandUtil.setInterfaceUp(session, node.dpIntf()) && | 682 | + setInterfaceUp(session, node.dpIntf()) && |
| 666 | - RemoteIpCommandUtil.addIp(session, node.dpIp(), DEFAULT_BRIDGE) && | 683 | + addIp(session, node.dpIp(), DEFAULT_BRIDGE) && |
| 667 | - RemoteIpCommandUtil.addIp(session, node.localMgmtIp(), DEFAULT_BRIDGE) && | 684 | + addIp(session, node.localMgmtIp(), DEFAULT_BRIDGE) && |
| 668 | - RemoteIpCommandUtil.setInterfaceUp(session, DEFAULT_BRIDGE); | 685 | + setInterfaceUp(session, DEFAULT_BRIDGE); |
| 669 | 686 | ||
| 670 | - RemoteIpCommandUtil.disconnect(session); | 687 | + disconnect(session); |
| 671 | 688 | ||
| 672 | if (result) { | 689 | if (result) { |
| 673 | setNodeState(node, NodeState.COMPLETE); | 690 | setNodeState(node, NodeState.COMPLETE); |
| ... | @@ -720,20 +737,20 @@ public class CordVtnNodeManager { | ... | @@ -720,20 +737,20 @@ public class CordVtnNodeManager { |
| 720 | * @return true if the IP is set, false otherwise | 737 | * @return true if the IP is set, false otherwise |
| 721 | */ | 738 | */ |
| 722 | private boolean isIpAddressSet(CordVtnNode node) { | 739 | private boolean isIpAddressSet(CordVtnNode node) { |
| 723 | - Session session = RemoteIpCommandUtil.connect(node.sshInfo()); | 740 | + Session session = connect(node.sshInfo()); |
| 724 | if (session == null) { | 741 | if (session == null) { |
| 725 | log.debug("Failed to SSH to {}", node.hostname()); | 742 | log.debug("Failed to SSH to {}", node.hostname()); |
| 726 | return false; | 743 | return false; |
| 727 | } | 744 | } |
| 728 | 745 | ||
| 729 | - Set<IpAddress> intBrIps = RemoteIpCommandUtil.getCurrentIps(session, DEFAULT_BRIDGE); | 746 | + Set<IpAddress> intBrIps = getCurrentIps(session, DEFAULT_BRIDGE); |
| 730 | - boolean result = RemoteIpCommandUtil.getCurrentIps(session, node.dpIntf()).isEmpty() && | 747 | + boolean result = getCurrentIps(session, node.dpIntf()).isEmpty() && |
| 731 | - RemoteIpCommandUtil.isInterfaceUp(session, node.dpIntf()) && | 748 | + isInterfaceUp(session, node.dpIntf()) && |
| 732 | intBrIps.contains(node.dpIp().ip()) && | 749 | intBrIps.contains(node.dpIp().ip()) && |
| 733 | intBrIps.contains(node.localMgmtIp().ip()) && | 750 | intBrIps.contains(node.localMgmtIp().ip()) && |
| 734 | - RemoteIpCommandUtil.isInterfaceUp(session, DEFAULT_BRIDGE); | 751 | + isInterfaceUp(session, DEFAULT_BRIDGE); |
| 735 | 752 | ||
| 736 | - RemoteIpCommandUtil.disconnect(session); | 753 | + disconnect(session); |
| 737 | return result; | 754 | return result; |
| 738 | } | 755 | } |
| 739 | 756 | ||
| ... | @@ -951,13 +968,13 @@ public class CordVtnNodeManager { | ... | @@ -951,13 +968,13 @@ public class CordVtnNodeManager { |
| 951 | oldNode = event.oldValue().value(); | 968 | oldNode = event.oldValue().value(); |
| 952 | newNode = event.newValue().value(); | 969 | newNode = event.newValue().value(); |
| 953 | 970 | ||
| 971 | + log.info("Reloaded {}", newNode.hostname()); | ||
| 954 | if (!newNode.equals(oldNode)) { | 972 | if (!newNode.equals(oldNode)) { |
| 955 | - log.info("{} has been updated", newNode.hostname()); | ||
| 956 | log.debug("New node: {}", newNode); | 973 | log.debug("New node: {}", newNode); |
| 957 | } | 974 | } |
| 958 | - // perform init procedure based on current state on any updates, | 975 | + // performs init procedure even if the node is not changed |
| 959 | - // insert, or even if the node is the same for robustness since | 976 | + // for robustness since it's no harm to run init procedure |
| 960 | - // it's no harm to run the init procedure multiple times | 977 | + // multiple times |
| 961 | eventExecutor.execute(() -> initNode(newNode)); | 978 | eventExecutor.execute(() -> initNode(newNode)); |
| 962 | break; | 979 | break; |
| 963 | case INSERT: | 980 | case INSERT: |
| ... | @@ -967,7 +984,7 @@ public class CordVtnNodeManager { | ... | @@ -967,7 +984,7 @@ public class CordVtnNodeManager { |
| 967 | break; | 984 | break; |
| 968 | case REMOVE: | 985 | case REMOVE: |
| 969 | oldNode = event.oldValue().value(); | 986 | oldNode = event.oldValue().value(); |
| 970 | - log.info("{} is removed", oldNode.hostname()); | 987 | + log.info("Removed {}", oldNode.hostname()); |
| 971 | break; | 988 | break; |
| 972 | default: | 989 | default: |
| 973 | break; | 990 | break; | ... | ... |
-
Please register or login to post a comment