Adding ONOS Segment Routing CLI files to new repo
diff --git a/cli/climodelinfo.py b/cli/climodelinfo.py
new file mode 100755
index 0000000..438eda8
--- /dev/null
+++ b/cli/climodelinfo.py
@@ -0,0 +1,1833 @@
+#
+# Copyright (c) 2010,2013 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+# sdnsh - The Controller Shell
+# module: climodelinfo.py
+#
+# This module contains classes that help fill out more of the CLI's model
+# this will do a merge with the model_info_list object that is generated
+# directly from the django models
+#
+# the motivation is that commands/objects that are not based in the
+# model should be able to take advantage of functions like prettyprint
+# or completion
+#
+# also, this lets us add info to the model that is CLI-specific.
+# In that respect, it is a lot like a django html view where the
+# columns are presented in a certain order in tables, and attributes
+# are grouped together in fieldsets
+
+# field-orderings must have a 'default' entry variants for brief/verbose
+
+# LOOK!
+# - sort hints for show running
+# - justification for columns
+# - have proper class for obj_type_info ?
+
+import model_info_list # load the automatically generated model definitions from the controller
+import base64
+import struct
+import re
+import doctest
+
+onos=1
+class CliModelInfo():
+ # so the model is accessible from the formatter functions
+ singleton = None
+
+
+ django_model_dict = {}
+ complete_obj_type_info_dict = {}
+
+
+ def __init__(self):
+ CliModelInfo.singleton = self
+ self.django_model_dict = dict(model_info_list.model_info_dict)
+ self.complete_obj_type_info_dict = dict(self.django_model_dict)
+
+ # Clean up the tables for the user field
+
+ # merge from additional_model_info_dict
+
+ # LOOK! should be able to do this by implementing a recursive deep copy/update
+ for obj_type in self.additional_model_info_dict.keys():
+ # if a new obj_type, just copy it
+ if not obj_type in self.complete_obj_type_info_dict:
+ self.complete_obj_type_info_dict[obj_type] = dict(self.additional_model_info_dict[obj_type])
+ else:
+ # if an existing obj_type, then go through keys (we know it's a dict)
+ for obj_info in self.additional_model_info_dict[obj_type].keys():
+ if not obj_info in self.complete_obj_type_info_dict[obj_type]:
+ if obj_info == 'field-orderings':
+ self.complete_obj_type_info_dict[obj_type][obj_info] = dict(self.additional_model_info_dict[obj_type][obj_info])
+ else:
+ # shallow copy
+ self.complete_obj_type_info_dict[obj_type][obj_info] = self.additional_model_info_dict[obj_type][obj_info]
+ else:
+ if obj_info == "fields":
+ model_fields = self.complete_obj_type_info_dict[obj_type]['fields']
+ addl_fields = self.additional_model_info_dict[obj_type]['fields']
+
+ # both objects have fields - be intelligent
+ for f in addl_fields.keys():
+ if not f in model_fields:
+ model_fields[f] = dict(addl_fields[f])
+ else:
+ for attr in addl_fields[f].keys():
+ model_fields[f][attr] = addl_fields[f][attr]
+ #print self.complete_obj_type_info_dict
+
+ def add_type_info(self, name, type_info):
+ self.complete_obj_type_info_dict[name] = type_info
+
+ def get_complete_obj_type_info_dict(self):
+ return self.complete_obj_type_info_dict
+
+ def get_fields_to_print(self, obj_type, field_ordering='default'):
+ fields_to_print = []
+ obj_type_info = self.complete_obj_type_info_dict.get(obj_type, None)
+ if obj_type_info:
+ if 'field-orderings' in obj_type_info:
+ fields_to_print = obj_type_info['field-orderings'].get(field_ordering, [])
+ if len(fields_to_print) == 0: # either no field-orderings or couldn't find specific
+ fields_to_print = obj_type_info['fields'].keys()
+ return fields_to_print
+
+ def get_field_info(self, obj_type, field_name):
+ obj_type_info = self.complete_obj_type_info_dict.get(obj_type, None)
+ return obj_type_info['fields'].get(field_name, None)
+
+ # LOOK! Refactor - Should we merge this with model_info_list?
+ #if (onos == 1):
+ # do nothing
+ # additional_model_info_dict = {}
+ #elif (onos==2):
+ if (onos == 1):
+ additional_model_info_dict = {
+ 'switches' : {
+ # switches are now directly fetched via rest api.
+ # 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'switches',
+ 'config-obj-type' : 'switch-config',
+
+ 'fields' : {
+ 'dpid' : {
+ 'edit' : False,
+ 'max_length': 32,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'active' : {
+ 'edit' : False
+ },
+ 'core-switch' : {
+ 'edit' : False,
+ },
+ 'connected-since' : {
+ 'edit' : False
+ },
+ 'capabilities' : {
+ 'edit' : False
+ },
+ 'actions' : {
+ 'edit' : False
+ },
+ 'ip-address' : {
+ 'edit' : False
+ },
+ 'socket-address' : {
+ 'edit' : False
+ },
+ 'buffers' : {
+ 'edit' : False
+ },
+ 'controller' : {
+ 'edit' : False,
+ },
+ 'tables' : {
+ 'edit' : False
+ },
+ 'switch-alias' : {
+ 'help_text' : 'Switch alias for DPID',
+ 'edit' : False,
+ },
+ 'tunnels' : {
+ 'edit' : False,
+ },
+ 'tunnel-supported' : {
+ 'edit' : False,
+ },
+ 'tunnel-termination' : {
+ 'edit' : False,
+ },
+ 'tunnel-active' : {
+ 'edit' : False,
+ },
+ 'dp-desc' : {
+ 'edit' : False,
+ },
+ 'hw-desc' : {
+ 'edit' : False,
+ },
+ 'sw-desc' : {
+ 'edit' : False,
+ },
+ 'serial-num' : {
+ 'edit' : False,
+ },
+ }
+ },
+ 'interfaces' : {
+ # switches are now directly fetched via rest api.
+ # 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'display',
+ 'url' : 'switches',
+ 'config-obj-type' : 'switch-interface-config',
+
+ 'fields' : {
+ 'id' : {
+ 'edit' : False,
+ 'max_length': 48,
+ 'null': False,
+ 'primary_key': True,
+ 'type' : 'compound-key',
+ 'edit' : False,
+ 'help_text' : '#!dpid',
+ 'compound_key_fields': [ 'dpid' ]
+ },
+ 'dpid' : {
+ #'type' : 'ForeignKey',
+ #'rel_field_name' : 'dpid',
+ #'rel_obj_type' : 'switch',
+ },
+ 'name' : {
+ },
+ 'number' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ }
+ },
+
+
+ 'switch-config' : {
+ 'source' : 'debug-only',
+ },
+
+
+ 'tunnel-config' : {
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'tunnel-config',
+ 'config-obj-type' : 'tunnel-config',
+
+ 'fields' : {
+ 'tunnel-id' : {
+ 'edit' : False,
+ 'max_length': 32,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ },
+ },
+
+ 'policy-config' : {
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'policy-config',
+ 'config-obj-type' : 'policy-config',
+
+ 'fields' : {
+ 'policy-id' : {
+ 'edit' : False,
+ 'max_length': 32,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ },
+ },
+
+ 'switch-alias' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+ },
+
+
+ 'switch-interface-config' : {
+ 'source' : 'debug-only',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ 'broadcast' : { 'edit' : False
+ },
+ 'name' : { 'edit' : False
+ },
+ 'mode' : {
+ 'edit' : False
+ },
+ },
+ },
+
+
+ 'host-alias' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+ 'fields' : {
+ }
+ },
+
+
+ 'link' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'link-type' : {
+ 'type' : 'CharField'
+ },
+ }
+ },
+
+
+ 'port' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'switch' : {
+ },
+ 'number' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ }
+ },
+
+ 'switch-interfaces' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'Idx' : {
+ 'edit' : False,
+ 'type' : 'CharField'
+ },
+ 'id' : {
+ 'primary_key': True,
+ # format's out of the sorting business
+ # 'sort' : 'tail-integer',
+ },
+ 'switch' : {
+ },
+ 'name' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ },
+ 'hardware-address' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'stp-state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ 'receiveBytes' : {
+ },
+ 'receivePackets' : {
+ },
+ 'receiveErrors' : {
+ },
+ 'transmitBytes' : {
+ },
+ 'transmitPackets' : {
+ },
+ 'transmitErrors' : {
+ },
+ },
+ },
+
+ 'controller_switches' : {
+ 'source' : 'user-config',
+
+ 'fields' : {
+ 'dpid' : { 'primary_key' : True,
+ },
+ }
+ },
+
+ 'host-config' : {
+ 'source' : 'show',
+ 'url' : 'device',
+
+ 'fields' : {
+ 'Idx' : {
+ 'edit' : False,
+ 'type' : 'CharField'
+ },
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'max_length': 17,
+ 'null': False,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'vendor' : {
+ 'edit' : False,
+ },
+ 'ips' : {
+ 'edit' : False
+ },
+ 'attachment-points' : {
+ 'edit' : False
+ },
+ 'tag' : {
+ 'edit' : False
+ },
+ 'host-alias' : { 'help_text' : 'Host alias',
+ 'edit' : False,
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ },
+ },
+
+ 'host': {
+ # hosts are now directly fetched via rest api. 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'device',
+ 'config-obj-type' : 'host-config',
+
+ 'fields': {
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'max_length': 17,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'vlan' : {
+ 'help_text' : 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null' : True,
+ 'type' : 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'dpid' : {
+ 'edit' : False,
+ 'type' : 'ForeignKey',
+ 'rel_field_name' : 'dpid',
+ 'rel_obj_type' : 'switches',
+ },
+ 'ipv4' : {
+ 'edit' : False,
+ },
+ # Attachment point isn't searchable
+ #'attachment-points' : {
+ #'edit' : False
+ #},
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ },
+ },
+
+
+ 'host-attachment-point' : {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'controller',
+ 'url' : 'device',
+
+ 'fields': {
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ },
+ 'vlan' : {
+ 'help_text': 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'id' : {
+ 'help_text': '#|mac|dpid|ingress-port',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ },
+ 'dpid' : { 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'dpid',
+ 'rel_obj_type': 'switch',
+ 'type': 'ForeignKey',
+ },
+ 'ingress-port' : {
+ 'help_text': 'Open flow port number of ingress port',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ },
+ 'status' : {
+ 'help_text': 'Error description, blank mean no error ',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': True,
+ 'type': 'CharField',
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ 'ipv4' : { # added to enable searching
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ },
+ },
+
+ 'host-network-address': {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'switch',
+ 'url' : 'device',
+
+ 'fields': {
+ 'mac' : { 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ 'edit' : False,
+ },
+ 'vlan' : {
+ 'help_text': 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'id' : {
+ 'help_text': '#|mac|ipv4',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ },
+ 'ip-address': {
+ 'help_text': 'IP Address of host',
+ 'json_serialize_string': True,
+ 'max_length': 15,
+ 'null': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ 'ipv4' : { # added to enable searching
+ 'max_length': 15,
+ 'null': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'dpid' : {
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ },
+ }
+ }
+ else:
+ additional_model_info_dict = {
+ 'flow-entry' : {
+ 'source' : 'user-config',
+ 'update-alias' : ['switch', 'port'],
+ },
+
+
+ 'feature' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'netvirt-feature' : {
+ 'edit' : False},
+ 'static-flow-pusher-feature' : {
+ 'edit' : False },
+ 'performance-monitor-feature' : {
+ 'edit' : False},
+ }
+ },
+
+
+ 'system-interfaces' : {
+ 'source' : '',
+
+ 'fields' : {
+ 'name' : {
+ 'type' : 'CharField' },
+ 'addr' : {
+ 'type' : 'CharField' },
+ 'peer' : {
+ 'type' : 'CharField' },
+ 'netmask' : {
+ 'type' : 'CharField' },
+ 'broadcast' : {
+ 'type' : 'CharField' },
+ }
+ },
+
+
+ 'switch-cluster' : {
+ 'source' : 'user-config',
+
+ 'fields' : {
+ 'cluster-id' : {
+ 'primary_key': True
+ },
+ 'switches' : {
+ },
+ }
+ },
+
+ 'switches' : {
+ # switches are now directly fetched via rest api.
+ # 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'switches',
+ 'config-obj-type' : 'switch-config',
+
+ 'fields' : {
+ 'dpid' : {
+ 'edit' : False,
+ 'max_length': 32,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'active' : {
+ 'edit' : False
+ },
+ 'core-switch' : {
+ 'edit' : False,
+ },
+ 'connected-since' : {
+ 'edit' : False
+ },
+ 'capabilities' : {
+ 'edit' : False
+ },
+ 'actions' : {
+ 'edit' : False
+ },
+ 'ip-address' : {
+ 'edit' : False
+ },
+ 'socket-address' : {
+ 'edit' : False
+ },
+ 'buffers' : {
+ 'edit' : False
+ },
+ 'controller' : {
+ 'edit' : False,
+ },
+ 'tables' : {
+ 'edit' : False
+ },
+ 'switch-alias' : {
+ 'help_text' : 'Switch alias for DPID',
+ 'edit' : False,
+ },
+ 'tunnels' : {
+ 'edit' : False,
+ },
+ 'tunnel-supported' : {
+ 'edit' : False,
+ },
+ 'tunnel-termination' : {
+ 'edit' : False,
+ },
+ 'tunnel-active' : {
+ 'edit' : False,
+ },
+ 'dp-desc' : {
+ 'edit' : False,
+ },
+ 'hw-desc' : {
+ 'edit' : False,
+ },
+ 'sw-desc' : {
+ 'edit' : False,
+ },
+ 'serial-num' : {
+ 'edit' : False,
+ },
+ }
+ },
+
+ 'interfaces' : {
+ # switches are now directly fetched via rest api.
+ # 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'display',
+ 'url' : 'switches',
+ 'config-obj-type' : 'switch-interface-config',
+
+ 'fields' : {
+ 'id' : {
+ 'edit' : False,
+ 'max_length': 48,
+ 'null': False,
+ 'primary_key': True,
+ 'type' : 'compound-key',
+ 'edit' : False,
+ 'help_text' : '#!dpid',
+ 'compound_key_fields': [ 'dpid' ]
+ },
+ 'dpid' : {
+ #'type' : 'ForeignKey',
+ #'rel_field_name' : 'dpid',
+ #'rel_obj_type' : 'switch',
+ },
+ 'name' : {
+ },
+ 'number' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ }
+ },
+
+
+ 'switch-config' : {
+ 'source' : 'debug-only',
+ },
+
+
+ 'switch-alias' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+ },
+
+
+ 'switch-interface-config' : {
+ 'source' : 'debug-only',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ 'broadcast' : { 'edit' : False
+ },
+ 'name' : { 'edit' : False
+ },
+ 'mode' : {
+ 'edit' : False
+ },
+ },
+ },
+
+
+ 'host-alias' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+ },
+
+
+ 'link' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'link-type' : {
+ 'type' : 'CharField'
+ },
+ }
+ },
+
+
+ 'port' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'switch' : {
+ },
+ 'number' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ }
+ },
+
+ 'switch-interfaces' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'Idx' : {
+ 'edit' : False,
+ 'type' : 'CharField'
+ },
+ 'id' : {
+ 'primary_key': True,
+ # format's out of the sorting business
+ # 'sort' : 'tail-integer',
+ },
+ 'switch' : {
+ },
+ 'name' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ },
+ 'hardware-address' : {
+ },
+ 'config' : {
+ },
+ 'state' : {
+ },
+ 'stp-state' : {
+ },
+ 'current-features' : {
+ },
+ 'advertised-features' : {
+ },
+ 'supported-features' : {
+ },
+ 'peer-features' : {
+ },
+ 'receiveBytes' : {
+ },
+ 'receivePackets' : {
+ },
+ 'receiveErrors' : {
+ },
+ 'transmitBytes' : {
+ },
+ 'transmitPackets' : {
+ },
+ 'transmitErrors' : {
+ },
+ },
+ },
+
+ 'config' : {
+ 'source' : 'user-config',
+
+ 'fields' : {
+ 'name' : { 'primary_key': True },
+ 'version' : { },
+ 'length' : { },
+ 'timestamp': { },
+ },
+ },
+
+ 'controller_switches' : {
+ 'source' : 'user-config',
+
+ 'fields' : {
+ 'dpid' : { 'primary_key' : True,
+ },
+ }
+ },
+
+ 'test-pktin-route' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'cluster' : {
+ },
+ 'hop' : {
+ },
+ 'dpid' : {
+ },
+ 'inPort' : {
+ },
+ 'outPort': {
+ },
+ },
+ },
+
+
+ 'performance-data' : {
+ 'source' : 'debug-only' ,
+
+ 'fields' : {
+ 'Pkts' : {
+ },
+ 'CompName' : {
+ },
+ 'StartTime': {
+ },
+ }
+ },
+
+
+ 'flow-cache-counters' : {
+ 'source' : 'sdnplatform',
+ 'field-orderings' : {
+ 'details' : [
+ 'applName',
+ 'maxFlows',
+ 'activeCnt',
+ 'inactiveCnt',
+ 'addCnt',
+ 'delCnt',
+ 'activatedCnt',
+ 'deactivatedCnd',
+ 'cacheHitCnt',
+ 'missCnt',
+ 'flowModRemovalMsgLossCnt',
+ 'notStoredFullCnt',
+ 'fcObjFreedCnt',
+ 'unknownOperCnt',
+ 'flowCacheAlmostFull',
+ ],
+
+ },
+
+ 'fields' : {
+ 'applName' : {
+ },
+ 'maxFlows' : {
+ },
+ 'activeCnt' : {
+ },
+ 'inactiveCnt' : {
+ },
+ 'addCnt' : {
+ },
+ 'delCnt' : {
+ },
+ 'activatedCnt' : {
+ },
+ 'deactivatedCnd' : {
+ },
+ 'cacheHitCnt' : {
+ },
+ 'missCnt' : {
+ },
+ 'flowModRemovalMsgLossCnt' : {
+ },
+ 'notStoredFullCnt' : {
+ },
+ 'fcObjFreedCnt' : {
+ },
+ 'unknownOperCnt' : {
+ },
+ 'flowCacheAlmostFull' : {
+ },
+ },
+ },
+
+
+ 'flow-cache' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Source-Switch' : {
+ },
+ 'InputPort' : {
+ },
+ 'SrcMAC' : {
+ },
+ 'DestMAC' : {
+ },
+ 'EtherType' : {
+ },
+ 'Protocol' : {
+ },
+ 'SrcPort' : {
+ },
+ 'DstPort' : {
+ },
+ 'Time' : {
+ },
+ }
+ },
+
+
+ 'ev-hist-topology-switch' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Idx' : {
+ 'primary_key' : True,
+ },
+ 'Time' : {
+ },
+ 'Switch' : {
+ },
+ 'Port' : {
+ },
+ 'IpAddr' : {
+ },
+ 'Action' : {
+ },
+ 'Reason' : {
+ },
+ 'State' : {
+ },
+ }
+ },
+
+
+ 'ev-hist-topology-cluster' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Time' : {
+ 'primary_key' : False,
+ },
+ 'Switch' : {
+ },
+ 'Action' : {
+ },
+ 'Reason' : {
+ },
+ 'State' : {
+ },
+ }
+ },
+
+
+ 'ev-hist-topology-link' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Time' : {
+ 'primary_key' : False,
+ },
+ 'Source-Switch' : {
+ },
+ 'Dest-Switch' : {
+ },
+ 'SrcPort' : {
+ },
+ 'DstPort' : {
+ },
+ 'SrcPortState' : {
+ },
+ 'DstPortState' : {
+ },
+ 'Action' : {
+ },
+ 'Reason' : {
+ },
+ 'State' : {
+ },
+ }
+ },
+
+
+ 'ev-hist-attachment-point' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Time_ns' : {
+ 'primary_key' : False,
+ },
+ 'Host' : {
+ },
+ 'Switch' : {
+ },
+ 'Port' : {
+ },
+ 'VLAN' : {
+ },
+ 'Action' : {
+ },
+ 'Reason' : {
+ },
+ }
+ },
+
+
+ 'ev-hist-packet-in' : {
+ 'source' : 'debug-only',
+
+ 'fields' : {
+ 'Time' : {'primary_key' : False,
+ },
+ 'wildcards' : {
+ },
+ 'dataLayerSource' : {
+ },
+ 'dataLayerDestination' : {
+ },
+ 'dataLayerType' : {
+ },
+ 'dataLayerVirtualLan' : {
+ },
+ 'dataLayerVirtualLanPriorityCodePoint' : {
+ },
+ 'inputSwitch' : {
+ },
+ 'inputPort' : {
+ },
+ 'networkSource' : {
+ },
+ 'networkDestination' : {
+ },
+ 'networkSourceMaskLen' : {
+ },
+ 'networkDestinationMaskLen' : {
+ },
+ 'networkProtocol' : {
+ },
+ 'networkTypeOfService' : {
+ },
+ 'transportSource' : {
+ },
+ 'transportDestination' : {
+ },
+ 'Action ' : {
+ },
+ 'Reason' : {
+ },
+ }
+ },
+
+
+ 'vns-definition' : {
+ 'source' : 'user-config',
+ 'source' : 'show',
+ 'cascade_delete' : True,
+ 'show-this' : [
+ ['vns-definition', 'default'],
+ ['vns-interface-rule', 'vns-config' ],
+ ],
+
+ 'fields' : {
+ 'active' : {
+ 'edit' : False,
+ },
+ 'priority' : {
+ 'edit' : False,
+ },
+ 'arp-mode' : {
+ 'edit' : False,
+ },
+ 'dhcp-mode' : {
+ 'edit' : False,
+ },
+ 'dhcp-ip' : {
+ 'edit' : False,
+ },
+ 'broadcast' : {
+ 'edit' : False,
+ },
+ }
+ },
+
+
+ 'vns-interface-rule' : {
+ 'source' : 'debug-only',
+ 'cascade_delete' : True,
+ 'title' : 'VNS Interface Rules',
+
+ 'fields': {
+ 'rule' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ },
+ 'vns' : {
+ },
+ 'mac' : { 'edit' : False,
+ },
+ 'tags' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ },
+ 'active' : { 'edit' : False },
+ 'allow-multiple' : { 'edit' : False },
+ 'vlan-tag-on-egress' : { 'edit' : False },
+ 'description' : { 'edit' : False },
+ 'ip-subnet' : { 'edit' : False },
+ 'ports' : { 'edit' : False },
+ 'priority' : { 'edit' : False },
+ 'rule' : { 'edit' : False },
+ 'switch' : { 'edit' : False },
+ 'tags' : { 'edit' : False },
+ 'vlans' : { 'edit' : False },
+ }
+ },
+
+
+ 'display-vns-interface' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+
+ 'fields': {
+ 'id' : {
+ 'edit' : False,
+ 'type' : 'CharField',
+ },
+ 'rule' : {
+ 'edit' : False,
+ 'type' : 'CharField',
+ },
+ 'mac' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'vlan' : {
+ 'type' : 'Charfield',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'ips' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'attachment-points' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'last-seen' : { 'edit' : False,
+ }
+ }
+ },
+
+
+ 'vns-interface-display' : {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+
+ 'fields': {
+ 'id' : {
+ 'edit' : False,
+ 'type' : 'CharField',
+ },
+ 'rule' : {
+ 'edit' : False,
+ 'type' : 'CharField',
+ },
+ 'mac' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'vlan' : {
+ 'type' : 'Charfield',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'ips' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'attachment-points' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False },
+ 'last-seen' : { 'edit' : False,
+ }
+ }
+ },
+
+
+ 'vns-access-list': {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ 'name' : {
+ 'edit' : False,
+ 'cascade_delete' : True
+ },
+ }
+ },
+
+
+ 'vns-access-list-entry': {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ #
+ # vns-acl-entry fields are a bit uncommon. the action and type
+ # can only be configured via the create portion of the command,
+ # while many other fields requre specific validation so that
+ # alternate values can be replaced for some keywords
+ #
+ # the values of the 'validate' field is the name of the
+ # def to call (in the bigSh class)
+ #
+ 'vns-access-list' : {
+ },
+ 'rule' : {
+ 'cascade_delete' : True,
+ 'sort' : 'integer'
+ },
+ 'action' : {
+ 'edit' : False
+ },
+ 'type' : {
+ 'edit' : False
+ },
+ 'src-ip' : {
+ },
+ 'src-ip-mask' : {
+ },
+ 'dst-ip' : {
+ },
+ 'dst-ip-mask' : {
+ },
+ 'src-tp-port-op' : {
+ },
+ 'src-tp-port' : {
+ },
+ 'dst-tp-port-op' : {
+ },
+ 'dst-tp-port' : {
+ },
+ 'icmp-type' : {
+ },
+ 'ether-type' : {
+ },
+ }
+ },
+
+
+ 'vns-interface-access-list': {
+ 'source' : 'user-config',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ 'vns' : {
+ 'type' : 'CharField',
+ 'max_length' : 32
+ },
+ 'vns-interface-name' : {
+ 'type' : 'CharField',
+ 'max_length' : 32
+ },
+ 'name' : {
+ 'type' : 'CharField',
+ 'max_length' : 32
+ },
+ }
+ },
+
+
+ 'tag' : {
+ 'source' : 'user-config',
+ 'source' : 'switch',
+ },
+
+
+ 'tag-mapping' : {
+ 'source' : 'user-config',
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'type' : {
+ },
+ 'host' : {
+ },
+ }
+ },
+
+
+ 'syncd-config' : {
+ 'source' : 'debug-only',
+ },
+
+ 'syncd-progress-info' : {
+ 'source' : 'debug-only',
+ },
+
+ 'syncd-transport-config' : {
+ 'source' : 'debug-only',
+ },
+
+ 'statd-config' : {
+ 'source' : 'debug-only',
+ },
+
+ 'statdropd-config' : {
+ 'source' : 'debug-only',
+ },
+
+ 'statdropd-progress-info' : {
+ 'source' : 'debug-only',
+ },
+
+ 'tech-support-config' : {
+ },
+
+ 'tunnel-details' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ 'dpid' : {
+ 'primary_key': True,
+ },
+ 'localTunnelIPAddr' : {
+ },
+ 'tunnelPorts' : {
+ },
+ },
+ },
+
+
+ 'controller-summary' : {
+ 'source' : 'switch',
+
+ 'fields' : {
+ '# Access Control Lists' : {
+ },
+ '# VNS Interfaces' : {
+ },
+ '# hosts' : {
+ },
+ '# VNSes' : {
+ },
+ '# attachment points' : {
+ },
+ '# inter-switch links' : {
+ },
+ '# IP Addresses' : {
+ },
+ '# VNS Interfaces with ACL applied' : {
+ },
+ },
+ },
+
+
+ 'switch-interface-alias' : {
+ 'source' : 'commands',
+ 'cascade_delete' : True,
+
+ 'fields' : {
+ 'id' : {
+ }
+ }
+ },
+
+
+ 'host-config' : {
+ 'source' : 'show',
+ 'url' : 'device',
+
+ 'fields' : {
+ 'Idx' : {
+ 'edit' : False,
+ 'type' : 'CharField'
+ },
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'max_length': 17,
+ 'null': False,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'vendor' : {
+ 'edit' : False,
+ },
+ 'ips' : {
+ 'edit' : False
+ },
+ 'attachment-points' : {
+ 'edit' : False
+ },
+ 'tag' : {
+ 'edit' : False
+ },
+ 'host-alias' : { 'help_text' : 'Host alias',
+ 'edit' : False,
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ },
+ },
+
+ 'host': {
+ # hosts are now directly fetched via rest api. 'has_rest_model' isn't set
+ # for this table.
+ # XXX perhaps these types of descriptions need to be
+ # in a file other than climodelinfo?
+ 'source' : 'user-config',
+ 'source' : 'display',
+ 'url' : 'device',
+ 'config-obj-type' : 'host-config',
+
+ 'fields': {
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'max_length': 17,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'address-space' : {
+ 'edit' : False,
+ 'type' : 'ForeignKey',
+ 'rel_field_name' : 'name',
+ 'rel_obj_type' : 'address-space',
+ },
+ 'vlan' : {
+ 'help_text' : 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null' : True,
+ 'type' : 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'dpid' : {
+ 'edit' : False,
+ 'type' : 'ForeignKey',
+ 'rel_field_name' : 'dpid',
+ 'rel_obj_type' : 'switches',
+ },
+ 'ipv4' : {
+ 'edit' : False,
+ },
+ # Attachment point isn't searchable
+ #'attachment-points' : {
+ #'edit' : False
+ #},
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ },
+ },
+
+
+ 'host-attachment-point' : {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'controller',
+ 'url' : 'device',
+
+ 'fields': {
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ },
+ 'vlan' : {
+ 'help_text': 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'id' : {
+ 'help_text': '#|mac|dpid|ingress-port',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ },
+ 'dpid' : { 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'dpid',
+ 'rel_obj_type': 'switch',
+ 'type': 'ForeignKey',
+ },
+ 'ingress-port' : {
+ 'help_text': 'Open flow port number of ingress port',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ },
+ 'status' : {
+ 'help_text': 'Error description, blank mean no error ',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': True,
+ 'type': 'CharField',
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ 'ipv4' : { # added to enable searching
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ },
+ },
+
+ 'host-network-address': {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'switch',
+ 'url' : 'device',
+
+ 'fields': {
+ 'mac' : { 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ 'edit' : False,
+ },
+ 'vlan' : {
+ 'help_text': 'VLAN Associated with host',
+ 'json_serialize_string': False,
+ 'null': True,
+ 'type': 'IntegerField',
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ 'id' : {
+ 'help_text': '#|mac|ipv4',
+ 'json_serialize_string': True,
+ 'max_length': 64,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'CharField',
+ },
+ 'ip-address': {
+ 'help_text': 'IP Address of host',
+ 'json_serialize_string': True,
+ 'max_length': 15,
+ 'null': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ 'ipv4' : { # added to enable searching
+ 'max_length': 15,
+ 'null': True,
+ 'type': 'CharField',
+ 'edit' : False,
+ },
+ 'dpid' : {
+ 'edit' : False,
+ 'searchable' : True,
+ },
+ },
+ },
+
+ 'host-vns-interface' : {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'controller',
+ 'url' : 'vns/device-interface',
+ 'cascade_delete' : True,
+
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'vns', 'host', 'ips', ],
+ 'vns-config' : [ 'Idx', 'host', 'ips', ]
+ },
+ 'fields' : {
+ 'id' : {
+ 'compound_key_fields': [
+ 'vns',
+ 'vlan',
+ 'mac',
+ 'interface'
+ ],
+ 'help_text': '#|host|interface',
+ 'json_serialize_string': False,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'compound-key',
+ },
+ 'address-space' : {
+ 'json_serialize_string': True,
+ 'null': False,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ 'edit' : False,
+ },
+ 'vlan' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False
+ },
+ 'mac' : {
+ 'json_serialize_string': True,
+ 'null': False,
+ 'rel_field_name': 'mac',
+ 'rel_obj_type': 'host',
+ 'type': 'ForeignKey',
+ 'edit' : False,
+ },
+ 'interface': {
+ 'json_serialize_string': True,
+ 'null': False,
+ 'rel_field_name': 'id',
+ 'rel_obj_type': 'vns-interface',
+ 'type': 'ForeignKey',
+ },
+ 'ips' : {
+ 'type' : 'CharField',
+ 'max_length' : 32,
+ 'edit' : False
+ },
+ }
+ },
+
+ 'vns-interface' : {
+ # directly fetched via rest api.
+ # 'has_rest_model' isn't set for this table.
+ 'source' : 'controller',
+ 'url' : 'vns/interface',
+
+ 'field-orderings' : {
+ 'default' : ['Idx', 'vns', 'interface', 'rule', 'last-seen', ],
+ 'vns-config' : ['Idx', 'interface', 'rule', 'last-seen', ]
+ },
+ 'fields' : {
+ 'id' : {
+ 'compound_key_fields': [ 'vns',
+ 'interface'],
+ 'help_text': '#|vns|interface',
+ 'json_serialize_string': False,
+ 'null': False,
+ 'primary_key': True,
+ 'type': 'compound-key',
+ },
+ 'vns' : {
+ 'json_serialize_string': True,
+ 'null': False,
+ 'rel_field_name': 'id',
+ 'rel_obj_type': 'vns-definition',
+ 'type': 'ForeignKey',
+ },
+ 'interface' : {
+ 'json_serialize_string': True,
+ 'max_length': 32,
+ 'null': False,
+ 'type': 'CharField',
+ },
+ 'rule' : { 'json_serialize_string': True,
+ 'null': True,
+ 'rel_field_name': 'id',
+ 'rel_obj_type': 'vns-interface-rule',
+ 'type': 'ForeignKey',
+ },
+ 'last-seen' : {
+ 'help_text': 'Last time a packet was seen by the controller on this interface',
+ 'json_serialize_string': True,
+ 'null': True,
+ 'type': 'DateTimeField',
+ },
+ }
+ }
+
+ # done.
+ }