Improved CLI. Still need to edit submitted code
diff --git a/cli/cli/c_actions.py b/cli/cli/c_actions.py
index e445315..d90acae 100755
--- a/cli/cli/c_actions.py
+++ b/cli/cli/c_actions.py
@@ -1546,6 +1546,12 @@
result = []
if (onos == 1) and (url == 'links'):
for entry in entries:
+ src = entry.get('src')
+ dst = entry.get('dst')
+ for tempEntry in entries:
+ if cmp(src, tempEntry.get('dst')) == 0:
+ if cmp(dst, tempEntry.get('src')) == 0:
+ entries.remove(tempEntry)
result.append({
'src-switch' : entry['src']['dpid'],
'src-port' : entry['src']['portNumber'],
diff --git a/cli/cli/desc/version200/switch.py b/cli/cli/desc/version200/switch.py
index 6a814f3..c8f65ed 100755
--- a/cli/cli/desc/version200/switch.py
+++ b/cli/cli/desc/version200/switch.py
@@ -951,11 +951,10 @@
'switch' : {
'field-orderings' : {
'default' : [ 'Idx', '@', 'switch-alias', 'connected-since',
- 'ip-address', 'type'],
+ 'ip-address', 'type', 'controller'],
'details' : [ 'Idx','@', 'switch-alias', 'connected-since',
- 'ip-address', 'type'],
- 'brief' : [ 'Idx', '@', 'switch-alias', 'connected-since',
- 'ip-address', ],
+ 'ip-address', 'type', 'controller'],
+ 'brief' : [ 'Idx', '@', 'switch-alias', 'controller'],
},
'fields' : {
'@' : {
@@ -978,13 +977,14 @@
'formatter' : fmtcnv.decode_switch_actions,
},
'ip-address' : {
- 'verbose-name' : 'IP Address',
+ 'verbose-name' : 'Connected At',
},
'socket-address' : {
},
'buffers' : {
},
'controller' : {
+ 'verbose-name' : 'Controller',
},
'tables' : {
},
diff --git a/cli/cli/rest_to_model.py b/cli/cli/rest_to_model.py
index 4c37c87..34506ce 100755
--- a/cli/cli/rest_to_model.py
+++ b/cli/cli/rest_to_model.py
@@ -410,7 +410,23 @@
# this synthetic obj_type's name is 'switches' in an attempt
# to disabigutate it from 'class Switch'
+ #TODO: Need figure out a better way to get url (Through sdncon framework)
+ url = "http://%s/rest/v1/mastership" % sdnsh.controller
+ try:
+ result2 = sdnsh.store.rest_simple_request(url)
+ check_rest_result(result2)
+ mastership_data = json.loads(result2)
+ except Exception, e:
+ if sdnsh.description: # description debugging
+ print "get_model_from_url: failed request %s: '%s'" % (url, e)
+ entries = []
for entry in entries:
+ dpid = entry.get('dpid')
+ if(dpid in mastership_data.keys()):
+ #As there is only one master for switch
+ controller = mastership_data[dpid][0].get('controllerId')
+ else:
+ controller = None
if switch_match and switch_match != entry['dpid']:
continue
if switch_prefix and not entry['dpid'].startswith(switch_prefix):
@@ -418,9 +434,11 @@
if onos == 1:
result.append({
'dpid' : entry['dpid'],
+ 'switch-alias' : entry['stringAttributes']['name'],
'connected-since' : entry['stringAttributes']['ConnectedSince'],
- 'ip-address' : 0,
- 'type' : entry['stringAttributes']['type']
+ 'ip-address' : entry['stringAttributes']['remoteAddress'],
+ 'type' : entry['stringAttributes']['type'],
+ 'controller' : controller
})
else:
attrs = entry['attributes']
@@ -476,8 +494,7 @@
sw['tcp-port'] = ''
sw['connected-since'] = ''
result.append(sw)
- else:
- known_dpids[dpid].update(sw)
+ [dpid].update(sw)
elif obj_type == 'interfaces':
# These are called interfaces because the primary
diff --git a/cli/sdncon/rest/views.py b/cli/sdncon/rest/views.py
index 260933e..7a45dbb 100755
--- a/cli/sdncon/rest/views.py
+++ b/cli/sdncon/rest/views.py
@@ -702,6 +702,15 @@
return get_sdnplatform_response(url)
@safe_rest_view
+def do_mastership(request):
+ url = controller_url("onos", "registry", "switches" ,"json")
+ #url = "http://127.0.0.1:8080/wm/onos/registry/switches/json"
+ if request.META['QUERY_STRING']:
+ url += '?' + request.META['QUERY_STRING']
+ return get_sdnplatform_response(url)
+#'''
+
+@safe_rest_view
def do_links(request):
if onos == 0:
url = controller_url("topology", "links", "json")
diff --git a/cli/sdncon/urls.py b/cli/sdncon/urls.py
index 2abf2bd..b06bd39 100755
--- a/cli/sdncon/urls.py
+++ b/cli/sdncon/urls.py
@@ -38,7 +38,6 @@
(r'ui/show_link', 'sdncon.ui.views.show_link'),
(r'ui/show_tunnel', 'sdncon.ui.views.show_tunnel'),
(r'ui/build_topology', 'sdncon.ui.views.build_topology'),
-
# Uncomment the next line to enable the admin:
(r'^admin/', include(admin.site.urls)),
(r'accounts/login/$', 'django.contrib.auth.views.login'),
@@ -70,6 +69,7 @@
(r'^rest/v1/device', 'sdncon.rest.views.do_device'),
(r'^rest/v1/switches', 'sdncon.rest.views.do_switches'),
(r'^rest/v1/links', 'sdncon.rest.views.do_links'),
+ (r'^rest/v1/mastership', 'sdncon.rest.views.do_mastership'),
(r'^rest/v1/vns/device-interface', 'sdncon.rest.views.do_vns_device_interface'),
(r'^rest/v1/vns/interface', 'sdncon.rest.views.do_vns_interface'),
(r'^rest/v1/vns/realtimestats/flow/(?P<vnsName>[A-Za-z0-9_:.|\-]+)/?$', 'sdncon.rest.views.do_vns_realtimestats_flow', {'category': 'vns'}),
diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
index 72ec404..7fa7560 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
@@ -18,6 +18,7 @@
package net.floodlightcontroller.core;
import java.io.IOException;
+import java.net.SocketAddress;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@@ -113,6 +114,12 @@
* @return whether the switch is still disconnected
*/
public boolean isConnected();
+
+ /**
+ * retun the channelSocket ip address with port number
+ * @return channelSocketAddress
+ */
+ public SocketAddress getChannelSocketAddress();
/**
* Sets whether the switch is connected.
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
index 30b8059..d92719c 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImplBase.java
@@ -18,6 +18,7 @@
**/
import java.io.IOException;
+import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -323,6 +324,10 @@
public void setChannel(Channel channel) {
this.channel = channel;
}
+ @Override
+ public SocketAddress getChannelSocketAddress(){
+ return channel.getRemoteAddress();
+ }
@Override
public void write(OFMessage m, FloodlightContext bc) throws IOException {
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
index c53ab76..b591044 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyPublisher.java
@@ -377,6 +377,12 @@
sw.getConnectedSince().toString());
switchData.createStringAttribute(TopologyElement.ELEMENT_ADMIN_STATUS,
AdminStatus.ACTIVE.toString());
+ //setting name from config file.
+ switchData.createStringAttribute("name",
+ ret.getSwitchConfig().getName());
+ //set the switch socketAddress and port
+ switchData.createStringAttribute("remoteAddress",
+ sw.getChannelSocketAddress().toString().substring(1));
if (ret.getConfigState() == NetworkConfigState.ACCEPT_ADD) {
Map<String, String> attr = ret.getSwitchConfig().getPublishAttributes();
for (Entry<String, String> e : attr.entrySet()) {
@@ -389,6 +395,7 @@
ConfigState.NOT_CONFIGURED.toString());
}
switchData.freeze();
+ System.out.println("getOnosInstanceId().toString():\n\n\n\n\n"+getOnosInstanceId());
// The Port events
List<PortData> portDataEntries = new ArrayList<PortData>();
for (OFPortDesc port : sw.getPorts()) {