Merge "Remove unused DefaultNetconfOperation marker"
authorEd Warnicke <eaw@cisco.com>
Wed, 12 Feb 2014 15:29:27 +0000 (15:29 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 12 Feb 2014 15:29:27 +0000 (15:29 +0000)
opendaylight/commons/opendaylight/pom.xml
opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/impl/SchemaAwareDataStoreAdapter.java
opendaylight/usermanager/api/src/main/java/org/opendaylight/controller/usermanager/AuthenticatedUser.java
opendaylight/usermanager/api/src/test/java/org/opendaylight/controller/usermanager/AuthenticatedUserTest.java
opendaylight/web/troubleshoot/src/main/java/org/opendaylight/controller/troubleshoot/web/Troubleshoot.java
opendaylight/web/troubleshoot/src/main/resources/js/page.js

index fb548d4..93845a3 100644 (file)
         <artifactId>clustering.stub</artifactId>
         <version>${clustering.stub.version}</version>
       </dependency>
-      <dependency>
-        <groupId>org.opendaylight.controller</groupId>
-        <artifactId>configuration</artifactId>
-        <version>${controller.version}</version>
-      </dependency>
       <dependency>
         <groupId>org.opendaylight.controller</groupId>
         <artifactId>configuration.implementation</artifactId>
               <artifactId>netty-timer-config</artifactId>
               <version>${config.version}</version>
           </dependency>
-
           <dependency>
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>configuration</artifactId>
index d997af5..a7dcf80 100644 (file)
@@ -23,8 +23,10 @@ import org.opendaylight.yangtools.yang.binding.Notification
 import org.slf4j.LoggerFactory\r
 import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder\rimport com.google.common.collect.Multimaps\r
 import org.opendaylight.yangtools.concepts.util.ListenerRegistry\r
-import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener\r
-\r
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService.NotificationInterestListener\rimport java.util.Set
+import com.google.common.collect.ImmutableSet
+import java.util.concurrent.Future
+
 class NotificationBrokerImpl implements NotificationProviderService, AutoCloseable {\r
     \r
     val ListenerRegistry<NotificationInterestListener> interestListeners = ListenerRegistry.create;\r
@@ -100,7 +102,15 @@ class NotificationBrokerImpl implements NotificationProviderService, AutoCloseab
             listenerToNotify = listenerToNotify + listeners.get(type as Class<? extends Notification>)\r
         }\r
         val tasks = listenerToNotify.map[new NotifyTask(it, notification)].toSet;\r
-        executor.invokeAll(tasks);\r
+        submitAll(executor,tasks);\r
+    }\r
+    \r
+    def submitAll(ExecutorService service, Set<NotifyTask> tasks) {
+        val ret = ImmutableSet.<Future<Object>>builder();\r
+        for(task : tasks) {\r
+            ret.add(service.submit(task));\r
+        }\r
+        return ret.build();
     }\r
 \r
     override <T extends Notification> registerNotificationListener(Class<T> notificationType,\r
index 3e6a825..b32d906 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.controller.sal.dom.broker.impl;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Map.Entry;
@@ -18,8 +20,8 @@ import org.opendaylight.controller.md.sal.common.api.data.DataReader;
 import org.opendaylight.controller.md.sal.common.impl.AbstractDataModification;
 import org.opendaylight.controller.md.sal.common.impl.util.AbstractLockableDelegator;
 import org.opendaylight.controller.sal.core.api.data.DataStore;
+import org.opendaylight.controller.sal.dom.broker.util.YangDataOperations;
 import org.opendaylight.controller.sal.dom.broker.util.YangSchemaUtils;
-import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
@@ -28,14 +30,13 @@ import org.opendaylight.yangtools.yang.data.api.Node;
 import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.controller.sal.dom.broker.util.YangDataOperations;
+import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
-
-import static com.google.common.base.Preconditions.*;
+import com.google.common.collect.ImmutableSet;
 
 public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataStore> implements //
         DataStore, //
@@ -46,7 +47,7 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
 
     private SchemaContext schema = null;
     private boolean validationEnabled = false;
-    private DataReader<InstanceIdentifier, CompositeNode> reader = new MergeFirstLevelReader();
+    private final DataReader<InstanceIdentifier, CompositeNode> reader = new MergeFirstLevelReader();
 
     @Override
     public boolean containsConfigurationPath(InstanceIdentifier path) {
@@ -164,7 +165,6 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
 
     private NormalizedDataModification prepareMergedTransaction(
             DataModification<InstanceIdentifier, CompositeNode> original) {
-        // NOOP for now
         NormalizedDataModification normalized = new NormalizedDataModification(original);
         for (Entry<InstanceIdentifier, CompositeNode> entry : original.getUpdatedConfigurationData().entrySet()) {
             normalized.putConfigurationData(entry.getKey(), entry.getValue());
@@ -173,14 +173,40 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
             normalized.putOperationalData(entry.getKey(), entry.getValue());
         }
         for (InstanceIdentifier entry : original.getRemovedConfigurationData()) {
-            normalized.removeConfigurationData(entry);
+            normalized.deepRemoveConfigurationData(entry);
         }
         for (InstanceIdentifier entry : original.getRemovedOperationalData()) {
-            normalized.removeOperationalData(entry);
+            normalized.deepRemoveOperationalData(entry);
         }
         return normalized;
     }
 
+    private Iterable<InstanceIdentifier> getConfigurationSubpaths(InstanceIdentifier entry) {
+        // FIXME: This should be replaced by index
+        Iterable<InstanceIdentifier> paths = getStoredConfigurationPaths();
+
+        return getChildrenPaths(entry, paths);
+
+    }
+
+    public Iterable<InstanceIdentifier> getOperationalSubpaths(InstanceIdentifier entry) {
+        // FIXME: This should be indexed
+        Iterable<InstanceIdentifier> paths = getStoredOperationalPaths();
+
+        return getChildrenPaths(entry, paths);
+    }
+
+    private static final Iterable<InstanceIdentifier> getChildrenPaths(InstanceIdentifier entry,
+            Iterable<InstanceIdentifier> paths) {
+        ImmutableSet.Builder<InstanceIdentifier> children = ImmutableSet.builder();
+        for (InstanceIdentifier potential : paths) {
+            if (entry.contains(potential)) {
+                children.add(entry);
+            }
+        }
+        return children.build();
+    }
+
     private final Comparator<Entry<InstanceIdentifier, CompositeNode>> preparationComparator = new Comparator<Entry<InstanceIdentifier, CompositeNode>>() {
         @Override
         public int compare(Entry<InstanceIdentifier, CompositeNode> o1, Entry<InstanceIdentifier, CompositeNode> o2) {
@@ -282,7 +308,7 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
 
     private class NormalizedDataModification extends AbstractDataModification<InstanceIdentifier, CompositeNode> {
 
-        private Object identifier;
+        private final Object identifier;
         private TransactionStatus status;
 
         public NormalizedDataModification(DataModification<InstanceIdentifier, CompositeNode> original) {
@@ -291,6 +317,29 @@ public class SchemaAwareDataStoreAdapter extends AbstractLockableDelegator<DataS
             status = TransactionStatus.NEW;
         }
 
+        /**
+         *
+         * Ensures all subpaths are removed - this currently does slow lookup in
+         * all keys.
+         *
+         * @param entry
+         */
+        public void deepRemoveOperationalData(InstanceIdentifier entry) {
+            Iterable<InstanceIdentifier> paths = getOperationalSubpaths(entry);
+            removeOperationalData(entry);
+            for (InstanceIdentifier potential : paths) {
+                removeOperationalData(potential);
+            }
+        }
+
+        public void deepRemoveConfigurationData(InstanceIdentifier entry) {
+            Iterable<InstanceIdentifier> paths = getConfigurationSubpaths(entry);
+            removeConfigurationData(entry);
+            for (InstanceIdentifier potential : paths) {
+                removeConfigurationData(potential);
+            }
+        }
+
         @Override
         public Object getIdentifier() {
             return this.identifier;
index 94200e6..809ca13 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.controller.usermanager;
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
@@ -47,7 +48,7 @@ public class AuthenticatedUser implements Serializable {
     }
 
     public List<String> getUserRoles() {
-        return userRoles;
+        return userRoles == null ? Collections.<String> emptyList() : new ArrayList<String>(userRoles);
     }
 
     public void addUserRole(String string) {
index b8a1a98..d32799e 100644 (file)
@@ -8,15 +8,15 @@
 
 package org.opendaylight.controller.usermanager;
 
+import java.util.Arrays;
+import java.util.List;
+
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.opendaylight.controller.sal.authorization.UserLevel;
 import org.springframework.security.core.GrantedAuthority;
 
-import java.util.Arrays;
-import java.util.List;
-
 public class AuthenticatedUserTest {
 
         static String[] roleArray;
@@ -33,7 +33,7 @@ public class AuthenticatedUserTest {
                 user = new AuthenticatedUser("auser");
 
                 Assert.assertFalse(user.getAccessDate().isEmpty());
-                Assert.assertNull(user.getUserRoles());
+        Assert.assertNotNull(user.getUserRoles());
         }
 
         @Test
index 36b5043..04fbf84 100644 (file)
@@ -41,6 +41,7 @@ import org.opendaylight.controller.sal.match.Match;
 import org.opendaylight.controller.sal.match.MatchType;
 import org.opendaylight.controller.sal.reader.FlowOnNode;
 import org.opendaylight.controller.sal.reader.NodeConnectorStatistics;
+import org.opendaylight.controller.sal.reader.NodeDescription;
 import org.opendaylight.controller.sal.utils.EtherTypes;
 import org.opendaylight.controller.sal.utils.GlobalConstants;
 import org.opendaylight.controller.sal.utils.HexEncode;
@@ -101,6 +102,30 @@ public class Troubleshoot implements IDaylightWeb {
         return userLevel.ordinal() <= AUTH_LEVEL.ordinal();
     }
 
+    @RequestMapping(value = "/nodeInfo", method = RequestMethod.GET)
+    @ResponseBody
+    public NodeDescription getNodeInfo(HttpServletRequest request, @RequestParam(required = false) String container,
+            @RequestParam(required = true) String nodeId) {
+        List<Map<String, String>> lines = new ArrayList<Map<String, String>>();
+        String containerName = (container == null) ? GlobalConstants.DEFAULT.toString() : container;
+
+        // Derive the privilege this user has on the current container
+        String userName = request.getUserPrincipal().getName();
+        Privilege privilege = DaylightWebUtil.getContainerPrivilege(userName, containerName, this);
+
+        if (privilege != Privilege.NONE) {
+            IStatisticsManager statisticsManager = (IStatisticsManager) ServiceHelper
+                    .getInstance(IStatisticsManager.class, containerName, this);
+            if(statisticsManager != null){
+                Node node = Node.fromString(nodeId);
+                NodeDescription nodeDesc = statisticsManager.getNodeDescription(node);
+                return nodeDesc;
+            }
+        }
+
+        return new NodeDescription();
+    }
+
     @RequestMapping(value = "/existingNodes", method = RequestMethod.GET)
     @ResponseBody
     public TroubleshootingJsonBean getExistingNodes(HttpServletRequest request, @RequestParam(required = false) String container) {
index 4bc4c76..09c4666 100644 (file)
@@ -1,8 +1,8 @@
-/* 
- * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved. 
- * 
- * This program and the accompanying materials are made available under the 
- * terms of the Eclipse Public License v1.0 which accompanies this distribution, 
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  *
  */
@@ -63,13 +63,13 @@ $(one.f.menu.right.bottom).each(function(index, value) {
 /**Troubleshoot modules*/
 one.f.troubleshooting = {
     rootUrl: "/controller/web/troubleshoot",
-    rightBottomDashlet: { 
+    rightBottomDashlet: {
         get: function() {
             var $rightBottomDashlet = $("#right-bottom").find(".dashlet");
             return $rightBottomDashlet;
         },
         setDashletHeader: function(label) {
-            $("#right-bottom li a")[0].innerHTML = label; 
+            $("#right-bottom li a")[0].innerHTML = label;
         }
     },
     createTable: function(columnNames, body) {
@@ -92,8 +92,11 @@ one.f.troubleshooting.existingNodes = {
             portsDataGrid: "one_f_troubleshooting_existingNodes_id_portsDataGrid",
             flowsDataGrid: "one_f_troubleshooting_existingNodes_id_flowsDataGrid",
             refreshFlowsButton:"one_f_troubleshooting_existingNodes_id_refreshFlowsButton",
-            refreshPortsButton:"one_f_troubleshooting_existingNodes_id_refreshPortsButton"
-
+            refreshPortsButton:"one_f_troubleshooting_existingNodes_id_refreshPortsButton",
+            modal : {
+                nodeInfo : "one_f_troubleshooting_existingNodes_id_modal_nodeInfo",
+                cancelButton : "one_f_troubleshooting_existingNodes_id_modal_cancelButton",
+            }
         },
         load: {
             main: function($dashlet) {
@@ -171,7 +174,7 @@ one.f.troubleshooting.existingNodes = {
                         $("#" + one.f.troubleshooting.existingNodes.id.portsDataGrid).datagrid({dataSource: dataSource});
                     });
                 } catch(e) {}
-            } 
+            }
         },
         ajax : function(url, callback) {
             $.getJSON(url, function(data) {
@@ -204,7 +207,9 @@ one.f.troubleshooting.existingNodes = {
                     data: data.nodeData,
                     formatter: function(items) {
                         $.each(items, function(index, item) {
-                            item["statistics"] = "<a href=\"javascript:one.f.troubleshooting.existingNodes.load.flows('" + item["nodeId"] + "');\">Flows</a>" + 
+                            item.nodeName = "<a href=\"javascript:one.f.troubleshooting.existingNodes.data.nodeInfo('"
+                                + item.nodeId + "');\">" + item.nodeName + "</a>"
+                            item["statistics"] = "<a href=\"javascript:one.f.troubleshooting.existingNodes.load.flows('" + item["nodeId"] + "');\">Flows</a>" +
                             " <a href=\"javascript:one.f.troubleshooting.existingNodes.load.ports('" + item["nodeId"] + "');\">Ports</a>";
                         });
                     },
@@ -461,6 +466,46 @@ one.f.troubleshooting.existingNodes = {
                     result.push(tr);
                 });
                 return result;
+            },
+            nodeInfo : function(nodeId){
+                $.getJSON(one.main.constants.address.prefix + "/troubleshoot/nodeInfo?nodeId=" + nodeId, function(content) {
+                    var h3 = 'Node Information'
+
+                    var headers = [ 'Description','Specification'];
+
+                    var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
+                    var $table = one.lib.dashlet.table.table(attributes);
+                    var $thead = one.lib.dashlet.table.header(headers);
+                    $table.append($thead);
+
+                    var footer = [];
+
+                    var cancelButton = one.lib.dashlet.button.single("Cancel",
+                            one.f.troubleshooting.existingNodes.id.modal.nodeInfo, "", "");
+                    var $cancelButton = one.lib.dashlet.button.button(cancelButton);
+                    footer.push($cancelButton);
+
+                    var body = []
+                    $.each(content, function(key, value) {
+                        var tr = {};
+                        var entry = [];
+
+                        entry.push(key);
+                        entry.push(value);
+
+                        tr.entry = entry;
+                        body.push(tr);
+                    });
+                    var $tbody = one.lib.dashlet.table.body(body);
+                    $table.append($tbody);
+
+                    var $modal = one.lib.modal.spawn(one.f.troubleshooting.existingNodes.id.modal.nodeInfo, h3, $table , footer);
+                    $modal.modal();
+
+                    $('#'+one.f.troubleshooting.existingNodes.id.modal.nodeInfo, $modal).click(function() {
+                        $modal.modal('hide');
+                    });
+                });
             }
         }
 };
@@ -488,7 +533,7 @@ one.f.troubleshooting.uptime = {
                 $("#" + one.f.troubleshooting.uptime.id.datagrid).datagrid({dataSource: dataSource});
             });
     },
-    
+
     ajax : {
         main : function(url, requestData, callback) {
             $.getJSON(url, requestData, function(data) {
@@ -496,7 +541,7 @@ one.f.troubleshooting.uptime = {
             });
         }
     },
-    
+
     data: {
         uptimeDataGrid: function(data) {
             var source = new StaticDataSource({
@@ -548,7 +593,7 @@ one.f.troubleshooting.statistics = {
         var $p = $(document.createElement('p'));
         $p.text('Please select a Flow or Ports statistics');
         $p.addClass('text-center').addClass('text-info');
-        
+
         $dashlet.append($none)
             .append($p);
     }