Adding ONOS Segment Routing CLI files to new repo
diff --git a/cli/desc/version200/vns.py b/cli/desc/version200/vns.py
new file mode 100755
index 0000000..8ea1f19
--- /dev/null
+++ b/cli/desc/version200/vns.py
@@ -0,0 +1,1892 @@
+#
+# Copyright (c) 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.
+#
+
+import command
+import fmtcnv
+'''
+def vns_origin_external(data):
+ """
+ Return origin-name when the vns wasn't created by the cli,
+ return None otherwise.
+ """
+ pk = command.mi.pk('vns-definition')
+ if not pk in data:
+ return;
+
+ vns = command.sdnsh.get_table_from_store('vns-definition',
+ pk,
+ data[pk])
+ if len(vns) == 0:
+ return None
+
+ local = ['cli', 'rest']
+ if 'origin' in vns[0] and not vns[0]['origin'] in local:
+ return vns[0]['origin']
+ return None
+
+
+def vns_warn_external_config(data):
+ """
+ From the named vns, look up the entry, if it exists in the
+ database, validate the 'origin' is either null, or 'cli',
+ otherwise provide a warning about this particular vns
+ (along with the originator name)
+ """
+ external_origin = vns_origin_external(data)
+ if external_origin:
+ command.sdnsh.warning('vns %s may not be intended for cli update, '
+ 'origin/creator "%s" ' % (data['id'], external_origin))
+
+command.add_action('vns-warn-external-config', vns_warn_external_config,
+ {'kwargs': {'data' : '$data',}})
+
+def complete_tenantname_preprocess(data):
+ data['tenant']='default'
+ if 'name' in data:
+ data['tenant']= data['name']
+ del data['name']
+ else:
+ current_mode=command.sdnsh.current_mode()
+ if not current_mode.startswith('config-tenant'):
+ data['tenant']='default'
+ if current_mode.startswith('config-tenant'):
+ for x in command.sdnsh.mode_stack:
+ if x['mode_name'] == 'config-tenant':
+ data['tenant'] = x['obj']
+
+
+command.add_completion('complete-tenantname-preprocess', complete_tenantname_preprocess,
+ {'kwargs': {'data': '$data',
+ }})
+
+def vns_confirm_external_delete(data):
+ """
+ From the named vns, look up the entry, if it exists in the
+ database, validate the 'origin' is either null, or 'cli',
+ otherwise provide a warning about this particular vns
+ (along with the originator name)
+ """
+ external_origin = vns_origin_external(data)
+ if external_origin:
+ confirm = command.action_registry['confirm'][0] # XXX accessor?
+ confirm('vns %s may not be intended for cli delete, '
+ 'origin/creator "%s"\nEnter y or yes to continue delete: '
+ % (data['id'], external_origin))
+
+command.add_action('vns-confirm-external-delete', vns_confirm_external_delete,
+ {'kwargs': {'data' : '$data',}})
+
+command.add_action('vns-confirm-external-delete', vns_confirm_external_delete,
+ {'kwargs': {'data' : '$data',}})
+'''
+"""
+#
+# ----------------------------------------------------------------------
+# vns-definition submode commands
+#
+
+# notice the submode is called 'config-def-vns', this was
+# changed from 'config-vns-def' so that the vns submode,
+# which is called 'config-vns', wouldn't be a string-prefix
+# submode of config-vns. Various command, such as the
+# vns-submode access-list command were showing up in the
+# vns-definition submode due to this prefixing.
+
+VNS_DEFINITION_COMMAND_DESCRIPTION = {
+ 'name' : 'vns-definition',
+ 'help' : 'Enter VNS definition submode',
+ 'mode' : 'config*',
+ 'command-type' : 'config-submode',
+ 'obj-type' : 'vns-definition',
+ 'submode-name' : 'config-tenant-def-vns',
+ 'feature' : 'vns',
+ 'short-help' : 'Enter VNS definition submode',
+ 'doc' : 'vns|vns-definition',
+ 'doc-example' : 'vns|vns-definition-example',
+ 'args' : (
+ {
+ 'field' : 'vnsname',
+ 'type' : 'identifier',
+ 'completion' : ['complete-tenantname-preprocess',
+ 'complete-object-field'],
+ 'other' : 'vns-definition|vnsname',
+# 'scoped' : 'tenant',
+ 'syntax-help' : 'Enter a vns name',
+ 'doc' : 'vns|vns-id',
+ 'doc-example' : 'vns|vns-id-example',
+ 'doc-include' : [ 'type-doc' ],
+ 'action' : (
+ {
+ 'proc' : 'vns-warn-external-config',
+ },
+ {
+ 'proc' : 'tenant-show-preprocess',
+ },
+ {
+ 'proc' : 'push-mode-stack',
+ },
+ ),
+ 'no-action' : (
+ {
+ 'proc' : 'vns-confirm-external-delete',
+ },
+ {
+ 'proc' : 'tenant-show-preprocess',
+ },
+ {
+ 'proc' : 'delete-objects',
+ },
+ )
+ }
+ ),
+}
+
+vns_show_action = (
+ {
+ 'proc' : 'tenant-show-preprocess',
+ },
+ {
+ 'proc' : 'query-table',
+ },
+ {
+ 'proc' : 'display',
+ 'format' : 'vns-definition',
+ },
+)
+
+VNS_SHOW_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'mode' : 'login',
+ 'all-help' : 'Show VNS details',
+ 'short-help' : 'Show all defined VNSs belong to current tenant',
+ 'command-type' : 'display-table',
+ 'obj-type' : 'vns-definition',
+ 'action' : vns_show_action,
+ 'doc' : 'vns|show',
+ 'doc-example' : 'vns|show-example',
+ 'args' : (
+ 'vns',
+ ),
+}
+VNS_SHOW_ID_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'obj-type' : 'vns-definition',
+ 'mode' : 'login',
+ 'command-type' : 'display-table',
+ 'action' : vns_show_action,
+ 'short-help' : 'Show specific VNS, identified by name',
+ 'doc' : 'vns|show-id',
+ 'doc-example' : 'vns|show-id-example',
+ 'args' : (
+ 'vns',
+ {
+ 'choices' : (
+ {
+ 'field' : 'vnsname',
+ 'type' : 'identifier',
+# 'completion' : 'complete-object-field',
+ 'completion' : ['complete-tenantname-preprocess',
+ 'complete-from-another'],
+ 'other' : 'vns-definition|vnsname',
+ 'scoped' : 'tenant',
+ 'help-name' : "vns-id",
+ },
+ {
+ 'field' : 'vnsname',
+ 'type' : 'enum',
+ 'values' : 'all',
+ }
+ ),
+ },
+ {
+ 'field' : 'detail',
+ 'optional' : True,
+ 'type' : 'enum',
+ 'values' : ('details', 'brief'),
+ 'doc' : 'format|+',
+ }
+ )
+}
+
+VNS_SHOW_ID_DETAILS_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'obj-type' : 'vns-definition',
+ 'mode' : 'login',
+ 'command-type' : 'display-table',
+ 'short-help' : 'Show VNS associated details based on name',
+ 'doc' : 'vns|show-id',
+ 'doc-example' : 'vns|show-id-example',
+ 'args' : (
+ 'vns',
+ {
+ 'choices' : (
+ {
+ 'field' : 'vnsname',
+ 'type' : 'identifier',
+ 'completion' : ['complete-tenantname-preprocess',
+ 'complete-from-another'],
+ 'other' : 'vns-definition|vnsname',
+ 'scoped' : 'tenant',
+ 'help-name' : "vns-id",
+ },
+ {
+ 'field' : 'vnsname',
+ 'type' : 'enum',
+ 'values' : 'all',
+ }
+ ),
+ },
+ {
+ 'choices' : (
+ {
+ 'field' : 'vns-interface',
+ 'type' : 'enum',
+ 'values' : 'interfaces',
+ 'obj-type' : 'vns-interface',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ 'short-help' : 'Show VNS associated interfaces',
+ },
+ {
+ 'field' : 'mac-address-table',
+ 'type' : 'enum',
+ 'values' : 'mac-address-table',
+ 'obj-type' : 'host-vns-interface-vns',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ 'short-help' : 'Show VNS associated mac addresses',
+ },
+ {
+ 'field' : 'interface-rules',
+ 'type' : 'enum',
+ 'values' : 'interface-rules',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'display-table'),
+ 'obj-type' : 'vns-interface-rule',
+ 'short-help' : 'Show VNS configured interfaces-rules',
+ 'doc' : 'vns|show-id-interface-rules',
+ },
+ {
+ 'field' : 'access-lists',
+ 'type' : 'enum',
+ 'values' : 'access-lists',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'display-table'),
+ 'obj-type' : 'vns-access-list-entry',
+ 'detail' : 'acl-brief',
+ 'short-help' : 'Show VNS configured access-lists',
+ 'doc' : 'vns|show-id-access-lists',
+ },
+ {
+ 'field' : 'running-config',
+ 'type' : 'enum',
+ 'values' : 'running-config',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ 'short-help' : 'Show VNS running-config',
+ },
+ {
+ 'field' : 'legacy-cli',
+ 'type' : 'enum',
+ 'values' : 'switch',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ 'obj-type' : 'vns-switch-ports',
+ 'short-help' : 'Show VNS associated switches',
+ },
+ (
+ {
+ 'field' : 'legacy-cli',
+ 'type' : 'enum',
+ 'values' : 'flow',
+ 'obj-type' : 'vns-flow',
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ 'short-help' : 'Show VNS associated flows',
+ 'doc' : 'vns|show-id-flow',
+ },
+ {
+ 'field' : 'detail',
+ 'type' : 'enum',
+ 'values' : ('brief',
+ 'full-detail',
+ 'details',
+ 'summary',
+ ),
+ 'optional' : True,
+ 'short-help' : 'Detail level',
+ 'doc' : 'format|+'
+ }
+ )
+ )
+ }
+ ),
+}
+
+HOST_VNS_INTERFACE_VNS_FORMAT = {
+ 'host-vns-interface-vns' : { # with vns know, no vns column
+ 'source' : 'only display',
+
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'tenant', 'vns', 'address-space', 'host', 'vlan', 'ips', 'attachment-points', 'last-seen' ],
+ 'vns' : [ 'Idx', 'address-space', 'host', 'vlan', 'ips', 'attachment-points', 'last-seen' ],
+ },
+ 'fields' : {
+ 'Idx' : { 'verbose-name' : '#',
+ },
+ 'host' : { 'verbose-name' : 'MAC Address',
+ 'formatter' : fmtcnv.print_host_and_alias,
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'vlan' : {
+ 'verbose-name' : 'VLAN',
+ },
+ 'ips' : { 'verbose-name' : 'IP Address',
+ 'formatter' : fmtcnv.print_ip_addresses,
+ 'entry_formatter' : fmtcnv.print_all_ip_addresses,
+ },
+ 'attachment-points' : { 'verbose-name' : 'Attachment Point',
+ 'formatter' : fmtcnv.print_host_attachment_point,
+ 'entry_formatter' : fmtcnv.print_all_host_attachment_points,
+ },
+ 'last-seen' : { 'verbose-name' : 'Last Seen',
+ 'formatter' : fmtcnv.print_time_since_utc
+ },
+ 'tenant' : {'verbose-name' : 'Tenant',
+ }
+ }
+ },
+}
+
+
+
+VNS_DEF_DESCRIPTION_COMMAND_DESCRIPTION = {
+ 'name' : 'description',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Provide description for a VNS instance',
+ 'doc' : 'vns|description',
+ 'doc-example' : 'vns|description-example',
+ 'args' : (
+ {
+ 'field' : 'description',
+ 'type' : 'string',
+ }
+ ),
+}
+
+
+VNS_DEF_ACTIVE_COMMAND_DESCRIPTION = {
+ 'name' : 'active',
+ 'mode' : 'config-tenant-def-vns',
+ 'short-help' : 'Set vns active',
+ 'doc' : 'vns|active',
+ 'doc-example' : 'vns|active-example',
+ 'doc-include' : [ 'default' ],
+ 'args' : (),
+ 'action' : (
+ {
+ 'proc' : 'write-fields',
+ 'data' : { 'active' : True },
+ 'syntax-help' : 'mark the vns as active',
+ }
+ ),
+ 'no-action' : (
+ {
+ 'proc' : 'write-fields',
+ 'data' : { 'active' : False },
+ 'syntax-help' : 'mark the vns as inactive',
+ }
+ )
+}
+
+VNS_DEF_ORIGIN_COMMAND_DESCRIPTION = {
+ 'name' : 'origin',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Describe vns origin',
+ 'doc' : 'vns|origin',
+ 'doc-example' : 'vns|origin-example',
+ 'args' : (
+ {
+ 'field' : 'origin',
+ 'type' : 'string',
+ 'action' : (
+ {
+ 'proc' : 'vns-warn-external-config',
+ },
+ {
+ 'proc' : 'write-fields',
+ },
+ ),
+ },
+ ),
+}
+
+VNS_DEF_USE_ADDRESS_SPACE_COMMAND_DESCRIPTION = {
+ 'name' : 'use',
+ 'short-help' : 'Associate address space',
+ 'all-help' : 'Associate VNS with other objects',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'obj-type' : 'vns-definition',
+ 'doc' : 'vns|use-address-space',
+ 'doc-example' : 'vns|use-address-space-example',
+ 'doc-include' : 'default',
+ 'args' : (
+ 'address-space',
+ {
+ 'field' : 'address-space',
+ 'type' : 'identifier',
+ 'completion' : [
+ 'complete-object-field',
+ 'complete-from-another',
+ ],
+ 'other' : 'address-space',
+ 'syntax-help' : 'Enter associated address-space name',
+ 'optional-for-no' : False,
+ 'match-for-no' : 'address-space',
+ }
+ )
+}
+
+VNS_DEF_ARP_MODE_COMMAND_DESCRIPTION = {
+ 'name' : 'arp-mode',
+ 'short-help' : 'Configure arp mode',
+ 'doc' : 'vns|arp-mode',
+ 'doc-example' : 'vns|arp-mode-example',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'doc-include' : [ 'default' ],
+ 'args' : (
+ {
+ 'field' : 'arp-mode',
+ 'type' : 'enum',
+ 'values' : ('always-flood', 'flood-if-unknown', 'drop-if-unknown'),
+ 'doc' : 'vns|arp-mode-value-+',
+ }
+ ),
+}
+
+VNS_DEF_BROADCAST_COMMAND_DESCRIPTION = {
+ 'name' : 'broadcast',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Configure broadcast mode',
+ 'doc' : 'vns|broadcast',
+ 'doc-example' : 'vns|broadcast-example',
+ 'doc-include' : [ 'default' ],
+ 'args' : (
+ {
+ 'field' : 'broadcast',
+ 'type' : 'enum',
+ 'values' : ('always-flood', 'forward-to-known', 'drop'),
+ 'doc' : 'vns|broadcast-value-+',
+ }
+ ),
+}
+
+VNS_DEF_DHCP_IP_COMMAND_DESCRIPTION = {
+ 'name' : 'dhcp-ip',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Configure dhcp ip address',
+ 'doc' : 'vns|dhcp-ip',
+ 'doc-example' : 'vns|dhcp-ip-example',
+ 'args' : (
+ {
+ 'field' : 'dhcp-ip',
+ 'type' : 'ip-address',
+ 'syntax-help' : 'Enter an IP Address',
+ }
+ ),
+}
+
+VNS_DEF_DHCP_MODE_COMMAND_DESCRIPTION = {
+ 'name' : 'dhcp-mode',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Set dhcp mode',
+ 'doc' : 'vns|dhcp-mode',
+ 'doc-example' : 'vns|dhcp-mode-example',
+ 'doc-include' : [ 'default' ],
+ 'args' : (
+ {
+ 'field' : 'dhcp-mode',
+ 'type' : 'enum',
+ 'values' : ('always-flood', 'flood-if-unknown', 'static'),
+ 'doc' : 'vns|dhcp-value-+',
+ }
+ ),
+}
+
+VNS_INTERFACE_RULE_COMMAND_DESCRIPTION = {
+ 'name' : 'interface-rule',
+ 'mode' : 'config-tenant-def-vns*',
+ 'command-type' : 'config-submode',
+ 'obj-type' : 'vns-interface-rule',
+ 'parent-field' : 'vns',
+ 'submode-name' : 'config-tenant-def-vns-if-rule',
+ 'short-help' : 'Enter interface-rule submode, configure vns details',
+ 'doc' : 'vns|interface-rule',
+ 'doc-example' : 'vns|interface-rule-example',
+ 'args' : (
+ {
+ 'field' : 'rule',
+ 'type' : 'identifier',
+ 'syntax-help' : 'Enter a vns interface rule name',
+ 'completion' : 'complete-object-field',
+ 'scoped' : True,
+ }
+ )
+}
+
+VNS_PRIORITY_COMMAND_DESCRIPTION = {
+ 'name' : 'priority',
+ 'mode' : 'config-tenant-def-vns',
+ 'command-type' : 'config',
+ 'short-help' : 'Set vns priority',
+ 'doc' : 'vns|priority',
+ 'doc-example' : 'vns|priority-example',
+ 'args' : (
+ {
+ 'field' : 'priority',
+ 'base-type' : 'integer',
+ 'range' : (0, 65535),
+ }
+ )
+}
+
+#
+# ----------------------------------------------------------------------
+# vns-def-if submode commands
+# (vns definition interface rules submode)
+#
+
+VNS_DEF_IF_ACTIVE_COMMAND_DESCRIPTION = {
+ 'name' : 'active',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Set rule to Active',
+ 'doc' : 'vns|interface-rule-active',
+ 'doc-example' : 'vns|interface-rule-active-example',
+ 'doc-inlcude' : [ 'default' ],
+ 'args' : (),
+ 'action' : (
+ {
+ 'proc' : 'write-fields',
+ 'data' : { 'active' : True }
+ }
+ ),
+ 'no-action' : (
+ {
+ 'proc' : 'write-fields',
+ 'data' : { 'active' : False }
+ }
+ )
+}
+
+VNS_DEF_IF_ALLOW_MULTIPLE_COMMAND_DESCRIPTION = {
+ 'name' : 'allow-multiple',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Enable multiple interface rule matches',
+ 'doc' : 'vns|interface-rule-allow-multiple',
+ 'doc-example' : 'vns|interface-rule-allow-multiple-example',
+ 'doc-include' : [ 'default' ],
+ 'args' : (),
+ 'action' : (
+ {
+ 'proc' : 'write-fields',
+ 'data' : { 'allow-multiple' : True }
+ }
+ ),
+ 'no-action' : (
+ {
+ 'proc' : 'reset-fields',
+ 'fields' : [ 'allow-multiple' ]
+ }
+ )
+}
+
+#
+# XXX vlan-tag-on-egress required in future releases when multiple vlans
+# tagging are supported in vns egress.
+#
+#VNS_DEF_IF_VLAN_TAG_ON_EGRESS_TMP_COMMAND_DESCRIPTION = {
+# 'name' : 'vlan-tag-on-egress',
+# 'short-help' : 'Enable vlan tagging on egress',
+# 'mode' : 'config-def-vns-if-rule',
+# 'command-type' : 'config',
+# 'args' : (),
+# 'action' : (
+# {
+# 'proc' : 'write-fields',
+# 'data' : { 'vlan-tag-on-egress' : True }
+# }
+# ),
+# 'no-action' : (
+# {
+# 'proc' : 'reset-fields',
+# 'fields' : [ 'vlan-tag-on-egress' ]
+# }
+# )
+# }
+
+VNS_DEF_IF_DESCRIPTION_COMMAND_DESCRIPTION = {
+ 'name' : 'description',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'short-help' : 'Provide description for interface rule',
+ 'doc' : 'vns|interface-rule-description',
+ 'doc-example' : 'vns|interface-rule-description-example',
+ 'command-type' : 'config',
+ 'args' : (
+ {
+ 'field' : 'description',
+ 'type' : 'string',
+ }
+ ),
+}
+
+VNS_DEF_IF_PRIORITY_COMMAND_DESCRIPTION = {
+ 'name' : 'priority',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Describe priority for interface rule',
+ 'doc' : 'vns|interface-rule-priority',
+ 'doc-example' : 'vns|interface-rule-priority-example',
+ 'args' : (
+ {
+ 'field' : 'priority',
+ 'value' : 'integer',
+ }
+ ),
+}
+
+
+VNS_DEF_IF_MATCH_MAC_COMMAND_DESCRIPTION = {
+ 'name' : 'match',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Associate mac (host) with interface rule',
+ 'all-help' : 'Configure a match for this interface rule',
+ 'doc' : 'vns|interface-rule-match-mac',
+ 'doc-example' : 'vns|interface-rule-match-mac-example',
+ 'doc-all' : 'address-space|match',
+ 'data' : { 'mac' : None }, # for no command reset
+ 'obj-type' : 'vns-interface-rule',
+ 'args' : (
+ {
+ 'token' : 'mac',
+ },
+ {
+ 'field' : 'mac',
+ 'type' : 'host',
+ 'help-name' : 'host mac or alias',
+ 'completion' : ['complete-object-field',
+ 'complete-from-another',
+ ],
+ 'scoped' : True,
+ 'data-handler' : 'alias-to-value',
+ 'other' : 'host',
+ 'optional-for-no' : True,
+ 'doc' : 'vns|interface-rule-match-mac-field',
+ }
+ ),
+}
+
+
+VNS_DEF_IF_MATCH_IP_SUBNET_COMMAND_DESCRIPTION = {
+ 'name' : 'match',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Associate ip-subnet (ip or cidr range) for interface rule',
+ 'doc' : 'vns|interface-rule-match-ip-subnet',
+ 'doc-example' : 'vns|interface-rule-match-ip-subnet-example',
+ 'data' : { 'ip-subnet' : None }, # for no command reset
+ 'args' : (
+ {
+ 'token' : 'ip-subnet',
+ },
+ {
+ 'field' : 'ip-subnet',
+ 'type' : 'cidr-range',
+ 'help-name' : 'ip address (10.10.10.10), or cidr (10.20.30.0/24)',
+ 'optional-for-no' : True,
+ 'doc' : 'vns|interface-rule-match-ip-subnet-field',
+ }
+ ),
+}
+
+
+VNS_DEF_IF_MATCH_SWITCH_COMMAND_DESCRIPTION = {
+ 'name' : 'match',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'obj-type' : 'vns-interface-rule',
+ 'short-help' : 'Associate switch with interface rule',
+ 'doc' : 'vns|interface-rule-match-switch',
+ 'doc-example' : 'vns|interface-rule-match-switch-example',
+ 'data' : { # for no command reset
+ 'switch' : None,
+ 'ports' : None,
+ },
+ 'args' : (
+ {
+ 'token' : 'switch',
+ },
+ {
+ # constructed as args to ensure that the ports isn't
+ # completed along with swtich values for 'no match switch'
+ 'optional-for-no' : True,
+ 'args' : (
+ {
+ 'field' : 'switch',
+ 'type' : 'string',
+ 'parent-field' : None,
+ 'completion' : [
+ 'complete-object-field',
+ 'complete-alias-choice',
+ ],
+ 'help-name' : 'switch dpid or switch alias',
+ 'data-handler' : 'alias-to-value',
+ 'other' : 'switches|dpid',
+ },
+ {
+ 'field' : 'ports',
+ 'optional' : True,
+ 'type' : 'string',
+ 'help-name' : 'switch interface, or range, or list',
+ 'completion' : 'complete-interface-list',
+ 'data-handler' : 'warn-missing-interface',
+ 'optional-for-no' : True,
+ },
+ ),
+ },
+ ),
+}
+
+
+VNS_DEF_IF_MATCH_TAGS_COMMAND_DESCRIPTION = {
+ 'name' : 'match',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Associate tags with interface rule',
+ 'doc' : 'vns|interface-rule-match-tag',
+ 'doc-example' : 'vns|interface-rule-match-tag-example',
+ 'data' : { # for no command reset
+ 'tags' : None,
+ },
+ 'args' : (
+ {
+ 'token' : 'tags',
+ },
+ {
+ 'field' : 'tags',
+ 'type' : 'string',
+ 'optional-for-no' : True,
+ }
+ ),
+}
+
+# Remove match vlan command temporarily on gregor's requres
+# the running config can still generate these commands, but
+# they won't get read correctly
+VNS_DEF_IF_MATCH_VLANS_COMMAND_DESCRIPTION = {
+ 'name' : 'match',
+ 'mode' : 'config-tenant-def-vns-if-rule',
+ 'command-type' : 'config',
+ 'short-help' : 'Associate vlans with interface rule',
+ 'doc' : 'vns|interface-rule-match-vlans',
+ 'doc-example' : 'vns|interface-rule-match-vlans-example',
+ 'data' : { # for no command reset
+ 'vlans' : None,
+ },
+ 'args' : (
+ {
+ 'token' : 'vlans',
+ },
+ {
+ 'field' : 'vlans',
+ 'value' : 'string',
+ 'help-name' : 'Vlan number (0-4096) or range, or list',
+ 'optional-for-no' : True,
+ }
+ ),
+}
+
+#
+# ----------------------------------------------------------------------
+# vns submode commands
+#
+
+
+VNS_COMMAND_DESCRIPTION = {
+ 'name' : 'vns',
+ 'short-help' : 'Enter VNS submode, manage access lists',
+ 'mode' : 'config*',
+ 'feature' : 'vns',
+ 'no-supported' : False,
+ 'command-type' : 'config-submode',
+ 'obj-type' : 'vns-definition',
+ 'submode-name' : 'config-tenant-vns',
+ 'syntax-help' : 'Enter a vns name',
+ 'create' : False,
+ 'doc' : 'vns|vns',
+ 'doc-example' : 'vns|vns-example',
+ 'args' : (
+ {
+ 'field' : 'vnsname',
+ 'type' : 'identifier',
+ 'completion' : ['complete-tenantname-preprocess',
+ 'complete-from-another'],
+ 'other' : 'vns-definition|vnsname',
+ 'scoped' : 'tenant',
+ 'syntax-help' : 'Enter a vns name',
+ 'doc' : 'vns|vns-id',
+ 'doc-include' : [ 'type-doc' ],
+ 'action' : (
+ {
+ 'proc' : 'tenant-show-preprocess',
+ },
+ {
+ 'proc' : 'push-mode-stack',
+ }
+ ),
+
+ }
+ )
+}
+
+VNS_INTERFACE_COMMAND_DESCRIPTION = {
+ 'name' : 'interface',
+ 'short-help' : 'Enter VNS-if submode',
+ 'mode' : 'config-tenant-vns*',
+ 'command-type' : 'config-submode',
+ 'obj-type' : 'vns-interface-config',
+ 'parent-field' : 'vns',
+ 'current-mode-obj-id' : 'vns-definition',
+ 'submode-name' : 'config-tenant-vns-if',
+ 'syntax-help' : 'Enter an interface name',
+ 'doc' : 'vns|vns-interface',
+ 'doc-example' : 'vns|vns-interface-example',
+ 'args' : (
+ {
+ 'field' : 'interface',
+ 'completion' : 'complete-object-field',
+ 'doc' : 'vns|vns-interface-field',
+ }
+ )
+}
+
+VNS_ACCESS_GROUP_COMMAND_DESCRIPTION = {
+ 'name' : 'access-group',
+ 'short-help' : 'Associate interface with access-list',
+ 'mode' : 'config-tenant-vns-if',
+ 'command-type' : 'config',
+ 'obj-type' : 'vns-interface-access-list',
+ 'parent-field' : 'vns-interface',
+ # 'current-mode-obj-id' : 'vns-definition',
+ 'submode-name' : 'config-tenant-vns-if',
+ 'doc' : 'vns|vns-access-group',
+ 'doc-example' : 'vns|vns-access-group-example',
+ 'args' : (
+ {
+ 'field' : 'vns-access-list',
+ 'type' : 'string',
+ 'completion' : 'complete-from-another',
+ 'other' : 'vns-access-list|name',
+ 'optional-for-no' : False,
+ },
+ {
+ 'field' : 'in-out',
+ 'type' : 'enum',
+ 'values' : ('in', 'out'),
+ 'syntax-help' : 'apply access-list in this direction',
+ 'optional-for-no' : False,
+ 'doc' : 'vns|vns-access-group-direction-+',
+ }
+ ),
+ 'action' : (
+ {
+ 'proc' : 'convert-vns-access-list',
+ },
+ {
+ 'proc' : 'write-object',
+ },
+ ),
+ 'no-action' : (
+ {
+ 'proc' : 'convert-vns-access-list',
+ },
+ {
+ 'proc' : 'delete-objects',
+ },
+ )
+}
+
+SHOW_VNS_ACCESS_GROUP_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'mode' : 'config-tenant-vns-if*',
+ 'action' : 'display-table',
+ 'command-type' : 'display-table',
+ 'scoped' : True, # displayed entries filtered by pushed obj id
+ 'obj-type' : 'vns-interface-access-list',
+ 'short-help' : 'show access-group details',
+ 'args' : (
+ 'access-group',
+ )
+}
+
+
+SHOW_VNS_ACCESS_LIST_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'mode' : ['config-tenant-vns-*'],
+ 'short-help' : 'Show VNS access lists',
+ 'action' : 'display-table',
+ 'command-type' : 'display-table',
+ 'obj-type' : 'vns-access-list',
+ 'scoped' : True, # displayed entries filtered by pushed obj id
+ 'args' : (
+ 'access-list',
+ )
+}
+
+SHOW_VNS_INTERFACES_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'mode' : ['config-tenant-vns', 'config-tenant-vns-if'],
+ 'short-help' : 'Show VNS associated interfaces',
+ 'doc' : 'vns|vns-show-interface',
+ 'obj-type' : 'vns-interface',
+ 'args' : (
+ {
+ 'token' : 'interfaces',
+ 'scoped' : True,
+ 'action' : ({'proc' : 'tenant-show-preprocess'},
+ 'legacy-cli'),
+ }
+ )
+}
+
+SHOW_VNS_ACCESS_LIST_ENTRY_COMMAND_DESCRIPTION = {
+ 'name' : 'show',
+ 'mode' : 'config-tenant-vns*',
+ 'short-help' : 'show VNS access list rules',
+ 'action' : 'display-table',
+ 'command-type' : 'display-table',
+ 'obj-type' : 'vns-access-list-entry',
+ 'detail' : 'acl-brief',
+ 'args' : (
+ 'access-list-entry',
+ ),
+}
+
+VNS_ACCESS_LIST_COMMAND_DESCRIPTION = {
+ 'name' : 'access-list',
+ 'mode' : 'config-tenant-vns*',
+ 'command-type' : 'config-submode',
+ 'obj-type' : 'vns-access-list',
+ 'parent-field' : 'vns',
+ 'submode-name' : 'config-tenant-vns-acl',
+ 'syntax-help' : 'Enter an access list name',
+ 'short-help' : 'Enter vns access-list submode',
+ 'doc' : 'vns|vns-access-list',
+ 'doc-example' : 'vns|vns-access-list-example',
+ 'args' : (
+ {
+ 'field' : 'name',
+ 'completion' : 'complete-object-field',
+ 'doc' : 'vns|vns-access-list-name'
+ }
+ )
+}
+
+
+VNS_ACCESS_LIST_DESCRIPTION_COMMAND_DESCRIPTION = {
+ 'name' : 'description',
+ 'mode' : 'config-tenant-vns-acl',
+ 'short-help' : 'Provide a description for a VNS access list',
+ 'doc' : 'vns|vns-access-list-description',
+ 'doc-example' : 'vns|vns-access-list-description-example',
+ 'command-type' : 'config',
+ 'args' : (
+ {
+ 'field' : 'description',
+ 'type' : 'string',
+ }
+ ),
+}
+
+
+VNS_ACCESS_LIST_PRIORITY_COMMAND_DESCRIPTION = {
+ 'name' : 'priority',
+ 'mode' : 'config-tenant-vns-acl',
+ 'short-help' : 'Set VNS priority',
+ 'doc' : 'vns|vns-access-list-priority',
+ 'doc-example' : 'vns|vns-access-list-priority-example',
+ 'doc-include' : [ 'default', 'range' ],
+ 'command-type' : 'config',
+ 'args' : (
+ {
+ 'field' : 'priority',
+ 'base-type' : 'integer',
+ 'range' : (0, 65535),
+ }
+ )
+}
+
+
+#
+# ----------------------------------------------------------------------
+# vns access list command
+#
+
+SRC_IP_MATCH = {
+ 'choices' : (
+ (
+ {
+ 'field' : 'src-ip',
+ 'type' : 'ip-address-not-mask',
+ 'doc' : 'vns|vns-access-list-ip-and-mask-ip',
+ },
+ {
+ 'field' : 'src-ip-mask',
+ 'type' : 'inverse-netmask',
+ 'data' : {
+ 'dst-ip' : '0.0.0.0',
+ 'dst-ip-mask' : '255.255.255.255',
+ },
+ 'doc' : 'vns|vns-access-list-ip-and-mask-mask',
+ },
+ ),
+ (
+ {
+ 'field' : 'src-ip',
+ 'type' : 'ip-address-not-mask',
+ 'data' : {
+ 'src-ip-mask' : '0.0.0.0',
+ 'dst-ip' : '0.0.0.0',
+ 'dst-ip-mask' : '255.255.255.255',
+ },
+ 'doc' : 'vns|vns-access-list-ip-only',
+ },
+ ),
+ (
+ {
+ 'field' : 'src-ip',
+ 'type' : 'cidr-range',
+ 'help-name' : 'src-cidr',
+ 'data-handler' : 'split-cidr-data-inverse',
+ 'dest-ip' : 'src-ip',
+ 'dest-netmask' : 'src-ip-mask',
+ 'data' : {
+ 'dst-ip' : '0.0.0.0',
+ 'dst-ip-mask' : '255.255.255.255',
+ },
+ 'doc' : 'vns|vns-access-list-cidr-range',
+ }
+ ),
+ (
+ {
+ 'token' : 'any',
+ 'data' : {
+ 'src-ip' : '0.0.0.0',
+ 'src-ip-mask' : '255.255.255.255',
+ 'dst-ip' : '0.0.0.0',
+ 'dst-ip-mask' : '255.255.255.255',
+ },
+ 'doc' : 'vns|vns-access-list-ip-any',
+ }
+ ),
+ )
+}
+
+
+SRC_PORT_MATCH = (
+ {
+ 'field' : 'src-tp-port-op',
+ 'type' : 'enum',
+ 'values' : ('eq', 'neq'),
+ 'doc' : 'vns|vns-access-list-port-op-+',
+ },
+ {
+ 'choices' : (
+ {
+ 'field' : 'src-tp-port',
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (0,65535),
+ 'data-handler' : 'hex-to-integer',
+ 'doc' : 'vns|vns-access-list-port-hex',
+ 'doc-include' : [ 'range' ],
+ },
+ {
+ 'field' : 'src-tp-port',
+ 'type' : 'enum',
+ 'values' : fmtcnv.tcp_name_to_number_dict,
+ 'permute' : 'skip',
+ 'doc' : 'vns|vns-access-list-port-type',
+ },
+ ),
+ },
+)
+
+
+DST_IP_MATCH = {
+ 'choices' : (
+ (
+ {
+ 'field' : 'dst-ip',
+ 'type' : 'ip-address-not-mask',
+ 'doc' : 'vns|vns-access-list-ip-and-mask-ip',
+ },
+ {
+ 'field' : 'dst-ip-mask',
+ 'type' : 'inverse-netmask',
+ 'doc' : 'vns|vns-access-list-ip-and-mask-mask',
+ },
+ ),
+ (
+ {
+ 'field' : 'dst-ip',
+ 'type' : 'ip-address-not-mask',
+ 'data' : {
+ 'dst-ip-mask' : '0.0.0.0',
+ },
+ 'doc' : 'vns|vns-access-list-ip-only',
+ },
+ ),
+ (
+ {
+ 'field' : 'dst-ip',
+ 'type' : 'cidr-range',
+ 'help-name' : 'dst-cidr',
+ 'data-handler' : 'split-cidr-data-inverse',
+ 'dest-ip' : 'dst-ip',
+ 'dest-netmask' : 'dst-ip-mask',
+ 'doc' : 'vns|vns-access-list-cidr-range',
+ },
+ ),
+ (
+ {
+ 'token' : 'any',
+ 'data' : {
+ 'dst-ip' : '0.0.0.0',
+ 'dst-ip-mask' : '255.255.255.255',
+ },
+ 'doc' : 'vns|vns-access-list-ip-any',
+ }
+ ),
+ )
+}
+
+
+DST_PORT_MATCH = (
+ {
+ 'field' : 'dst-tp-port-op',
+ 'type' : 'enum',
+ 'values' : ('eq', 'neq'),
+ 'doc' : 'vns|vns-access-list-port-op+',
+ },
+ {
+ 'choices' : (
+ {
+ 'field' : 'dst-tp-port',
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (0,65535),
+ 'data-handler' : 'hex-to-integer',
+ 'doc' : 'vns|vns-access-list-port-hex',
+ },
+ {
+ 'field' : 'dst-tp-port',
+ 'type' : 'enum',
+ 'values' : fmtcnv.tcp_name_to_number_dict,
+ 'permute' : 'skip'
+ },
+ ),
+ }
+)
+
+
+# Unfortunatly, the model defines the compound key using the
+# rule field as a character field, not an integer.
+# Since '00' is then the same rule as '0', two rows could be
+# created describing the same integer rule.
+# Here the character string is normalized.
+# (This may be the result of having a requirement that all fields used to
+# construct compound keys must be character fields)
+#
+# Additionally, for tcp and udp matches, the *tp_port_op needs
+# to be set.
+#
+def vns_normalize_rule(data):
+ data['rule'] = str(int(data['rule']))
+
+ if data.get('type', '') in ['tcp', 'udp']:
+ if not 'src-tp-port-op' in data or data['src-tp-port-op'] == None:
+ data['src-tp-port-op'] = 'any'
+ if not 'dst-tp-port-op' in data or data['dst-tp-port-op'] == None:
+ data['dst-tp-port-op'] = 'any'
+
+
+command.add_action('vns-normalize-rule', vns_normalize_rule,
+ {'kwargs' : { 'data' : '$data' }})
+#
+
+VNS_ACCESS_LIST_ENTRY_COMMAND_DESCRIPTION = {
+ 'name' : { 'type' : 'pattern',
+ 'pattern' : r'\d',
+ 'field' : 'rule',
+ 'title' : '<acl rule number>',
+ 'completion' : 'complete-object-field',
+ 'obj-type' : 'vns-access-list-entry',
+ },
+ 'mode' : 'config-tenant-vns-acl',
+ 'short-help' : 'Define ACL details for this access-list',
+ 'doc' : 'vns|vns-access-list-entry',
+ 'doc-example' : 'vns|vns-access-list-entry-example',
+ 'command-type' : 'config-object',
+ 'parent-field' : 'vns-access-list',
+ 'obj-type' : 'vns-access-list-entry',
+ 'data' : {
+ 'ether-type' : None,
+ 'src-ip' : None,
+ 'src-ip-mask' : None,
+ 'dst-ip' : None,
+ 'dst-ip-mask' : None,
+ 'src-tp-port' : None,
+ 'src-tp-port-op' : None,
+ 'dst-tp-port' : None,
+ 'dst-tp-port-op' : None,
+ 'src-mac' : None,
+ 'dst-mac' : None,
+ 'vlan' : None,
+ 'icmp-type' : None,
+ },
+ 'args' : (
+ {
+ 'field' : 'action',
+ 'type' : 'enum',
+ 'values' : ( 'permit', 'deny' ),
+ 'doc' : 'vns|vns-access-list-entry-action-+',
+ },
+ {
+ 'choices' : (
+ (
+ {
+ 'choices' : (
+ {
+ 'field' : 'type',
+ 'type' : 'enum',
+ 'values' : ('ip','tcp','udp'),
+ 'doc' : 'vns|vns-access-list-entry-type-+',
+ },
+ {
+ 'field' : 'type',
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (0,255),
+ 'help-name' : 'ip protocol',
+ 'data-handler' : 'hex-to-integer',
+ 'doc' : 'vns|vns-access-entry-type-ip-protocol',
+ 'doc-include' : [ 'range' ],
+ },
+ )
+ },
+ # Complexity arises from the SRC_IP match part
+ # being, required, while the port match
+ # is optional, as is the DST_IP match, but the
+ # DST_PORT_MATCH is only possible to describe when
+ # the DST_IP part is included
+ SRC_IP_MATCH,
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : SRC_PORT_MATCH,
+ },
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : (
+ DST_IP_MATCH,
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : DST_PORT_MATCH,
+ },
+ ),
+ },
+ ),
+ (
+ # Only allow the icmp type for icmp syntax
+ # this further increases the syntax complexity
+ {
+ 'field' : 'type',
+ 'type' : 'enum',
+ 'values' : 'icmp',
+ 'doc' : 'vns|vns-access-list-ip-+',
+ },
+ SRC_IP_MATCH,
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : SRC_PORT_MATCH
+ },
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : (
+ DST_IP_MATCH,
+ {
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'args' : DST_PORT_MATCH,
+ },
+ ),
+ },
+ {
+ 'field' : 'icmp-type',
+ 'optional' : True,
+ 'optional-for-no' : True,
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (0,255),
+ 'data-handler' : 'hex-to-integer',
+ },
+ ),
+ (
+ {
+ 'field' : 'type',
+ 'type' : 'enum',
+ 'values' : 'mac',
+ 'doc' : 'vns|vns-access-list-mac',
+ },
+ {
+ 'choices' : (
+ {
+ 'token' : 'any',
+ },
+ {
+ 'field' : 'src-mac',
+ 'type' : 'host',
+ 'completion' : [ 'complete-alias-choice',
+ ],
+ 'other' : 'host|mac',
+ 'data-handler' : 'alias-to-value',
+ },
+ )
+ },
+ {
+ 'choices' : (
+ {
+ 'token' : 'any',
+ },
+ {
+ 'field' : 'dst-mac',
+ 'type' : 'host',
+ 'completion' : [ 'complete-alias-choice',
+ ],
+ 'other' : 'host|mac',
+ 'data-handler' : 'alias-to-value',
+ },
+ ),
+ },
+ {
+ 'optional' : True,
+ 'choices' : (
+ {
+ 'field' : 'ether-type',
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (1536,65536),
+ 'data-handler' : 'hex-to-integer',
+ 'doc' : 'vns|vns-access-list-ether-type',
+ },
+ {
+ 'field' : 'ether-type',
+ 'type' : 'enum',
+ 'values' : fmtcnv.ether_type_to_number_dict,
+ 'permute' : 'skip'
+ },
+ )
+ },
+ {
+ 'field' : 'vlan',
+ 'tag' : 'vlan',
+ 'base-type' : 'hex-or-decimal-integer',
+ 'range' : (1,4096), # no zero? really?
+ 'data-handler' : 'hex-to-integer',
+ 'optional' : True,
+ 'optional-for-no' : True,
+ },
+ ),
+ )
+ }
+ ),
+ 'action' : (
+ {
+ 'proc' : 'vns-normalize-rule',
+ 'field' : 'rule',
+ },
+ {
+ 'proc' : 'write-object',
+ },
+ ),
+}
+
+VNS_DEFINITION_FORMAT = {
+ 'vns-definition' : {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'tenant','vnsname', 'active', 'priority', 'arp-mode',
+ 'dhcp-mode', 'dhcp-ip', 'broadcast',
+ 'address-space' ],
+ 'vns-config' : [ 'Idx', 'tenant','vnsname','active', 'priority', 'arp-mode',
+ 'dhcp-mode', 'dhcp-ip', 'broadcast',
+ 'address-space', ],
+ 'brief' : [ 'Idx', 'tenant', 'vnsname', 'address-space', ]
+ },
+ 'fields' : {
+ 'vnsname' : { 'verbose-name' : 'VNS ID',
+ },
+ 'active' : {
+ },
+ 'address-space' : { 'verbose-name' : 'Address Space',
+ },
+ 'priority' : {
+ },
+ 'arp-mode' : { 'verbose-name' : 'ARP Config Mode',
+ },
+ 'dhcp-mode' : { 'verbose-name' : 'DHCP Config Mode' ,
+ },
+ 'dhcp-ip' : { 'verbose-name' : 'DHCP Ip' ,
+ },
+ 'broadcast' : { 'verbose-name' : 'Broadcast Mode' ,
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+
+ }
+ },
+}
+
+VNS_INTERFACE_RULE_FORMAT = {
+ 'vns-interface-rule' : {
+ 'field-orderings': {
+ 'default' : [ 'Idx', 'tenant', 'vnsname', 'rule', 'description',
+ 'allow-multiple', 'active', 'priority',
+ 'mac', 'vlans', 'ip-subnet', 'switch', 'ports', 'tags'
+ ],
+ 'vns-config' : [ 'Idx', 'rule', 'description', 'allow-multiple', 'active',
+ 'priority', 'mac', 'vlans', 'ip-subnet', 'switch', 'ports', 'tags'
+ ],
+ },
+ 'fields': {
+ 'rule' : { 'verbose-name' : 'VNS Rule ID',
+ },
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : { 'verbose-name' : 'VNS ID'
+ },
+ 'mac' : {
+ 'formatter' : fmtcnv.print_host_and_alias
+ },
+ 'tags' : {
+ },
+ 'active' : {
+ },
+ 'allow-multiple' : {
+ },
+ 'description' : {
+ },
+ 'ip-subnet' : {
+ },
+ 'ports' : {
+ },
+ 'priority' : {
+ },
+ 'rule' : {
+ },
+ 'switch' : {
+ },
+ 'tags' : {
+ },
+ 'vlans' : {
+ },
+ }
+ },
+}
+
+
+VNS_DISPLAY_VNS_INTERFACE_FORMAT = {
+ 'display-vns-interface' : {
+ 'field-orderings' : {
+ 'default' : ['Idx', 'tenant', 'vnsname', 'address-space', 'id', 'rule', 'mac', 'vlan',
+ 'ips', 'attachment-points', 'last-seen'],
+ 'vns-config' : ['Idx', 'id', 'rule', 'mac', 'vlan',
+ 'ips', 'attachment-points', 'last-seen']
+ },
+ 'fields': {
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : {
+ 'verbose-name' : 'VNS ID',
+ },
+ 'id' : {
+ },
+ 'rule' : {
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'mac' : { 'verbose-name' : 'MAC Address',
+ 'formatter' : fmtcnv.print_host_and_alias,
+ },
+ 'vlan' : { 'verbose-name' : 'VLAN',
+ },
+ 'ips' : {
+ 'formatter' : fmtcnv.print_ip_addresses,
+ 'entry-formatter' : fmtcnv.print_all_ip_addresses,
+ },
+ 'attachment-points' : { 'formatter' : fmtcnv.print_host_attachment_point,
+ 'entry-formatter' : fmtcnv.print_all_host_attachment_points,
+ },
+ 'last-seen' : {
+ 'formatter' : fmtcnv.print_time_since_utc_timestr
+ }
+ }
+ },
+}
+
+
+VNS_INTERFACE_DISPLAY_FORMAT = {
+ 'vns-interface-display' : {
+ 'field-orderings' : {
+ 'default' : ['Idx', 'tenant', 'vnsname', 'address-space', 'id', 'rule', 'mac', 'vlan',
+ 'ips', 'attachment-points', 'last-seen'],
+ 'vns-config' : ['Idx', 'id', 'address-space', 'rule', 'mac', 'vlan',
+ 'ips', 'attachment-points', 'last-seen']
+ },
+ 'fields': {
+ 'id' : {
+ },
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : {
+ 'verbose-name' : 'VNS ID',
+ },
+ 'rule' : {
+ },
+ 'mac' : { 'verbose-name' : 'MAC Address',
+ 'formatter' : fmtcnv.print_host_and_alias,
+ },
+ 'vlan' : { 'verbose-name' : 'VLAN',
+ },
+ 'ips' : {
+ 'formatter' : fmtcnv.print_ip_addresses,
+ 'entry-formatter' : fmtcnv.print_all_ip_addresses,
+ },
+ 'attachment-points' : { 'formatter' : fmtcnv.print_host_attachment_point,
+ 'entry-formatter' : fmtcnv.print_all_host_attachment_points,
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'last-seen' : {
+ 'formatter' : fmtcnv.print_time_since_utc
+ }
+ }
+ },
+}
+
+
+VNS_INTERFACE_MACS_FORMAT = {
+ 'vns-interface-macs' : {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'tenant', 'vns', 'address-space',
+ 'veth', 'mac', 'vlan', 'ips', 'tags', 'last-seen'],
+ 'scoped' : [ 'Idx', 'address-space',
+ 'veth', 'mac', 'vlan', 'ips', 'tags', 'last-seen'],
+ },
+ 'fields': {
+ 'veth' : {
+ 'verbose-name' : 'Virtual I/F',
+ },
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : {
+ 'verbose-name': 'VNS ID'
+ },
+ 'mac' : {
+ 'verbose-name' : 'MAC Address',
+ 'formatter' : fmtcnv.print_host_and_alias,
+ },
+ 'vlan' : {
+ 'verbose-name' : 'VLAN',
+ },
+ 'ips' : {
+ 'verbose-name' : 'IP Address',
+ 'formatter' : fmtcnv.print_ip_addresses,
+ 'entry-formatter' : fmtcnv.print_all_ip_addresses,
+ },
+ 'tags' : {
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'last-seen' : {
+ 'verbose-name' : 'Last Seen',
+ 'formatter' : fmtcnv.print_time_since_utc
+ }
+ }
+ },
+}
+
+
+VNS_INTERFACE_PHYS_FORMAT = {
+ 'vns-interface-phys' : {
+ 'field-orderings' : {
+ 'default' : ['Idx', 'id', 'address-space', 'switch', 'last-seen' ],
+ },
+
+ 'fields' : {
+ 'id' : { 'formatter' : fmtcnv.print_vns_physical_interface_id,
+ 'verbose-name' : 'Physical I/F',
+ },
+ 'switch' : {
+ 'formatter' : fmtcnv.print_switch_and_alias
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'last-seen' : {
+ 'verbose-name' : 'Last Seen',
+ 'formatter' : fmtcnv.print_time_since_utc
+ }
+ }
+ },
+}
+
+
+VNS_VNS_SWITCH_PORTS_FORMAT = {
+ 'vns-switch-ports' : {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'tenant','vns', 'switch', 'port', 'reason' ],
+ },
+
+ 'fields' : {
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : {
+ 'verbose-name' : 'VNS ID',
+ },
+ 'switch' : {
+ 'formatter' : fmtcnv.replace_switch_with_alias
+ },
+ 'port' : {
+ 'verbose-name' : 'OF Port #',
+ 'formatter' : fmtcnv.decode_openflow_port
+ },
+ 'switch-port' : {
+ 'verbose-name' : 'Phy I/F'
+ },
+ 'reason' : {
+ 'formatter' : fmtcnv.print_host_list_and_alias
+ },
+ }
+ },
+}
+
+
+VNS_SWITCH_PORTS_VNS_PORTS_FORMAT = {
+ 'switch-ports-vns' : {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'switch', 'port', 'tenant','vnsname', 'reason' ],
+ },
+
+ 'fields' : {
+ 'tenant' : {
+ 'verbose-name' : 'Tenant',
+ },
+ 'vnsname' : { 'verbose-name' : 'VNS',
+ 'formatter' : fmtcnv.print_vns_count_dict
+ },
+ 'switch' : {
+ 'formatter' : fmtcnv.replace_switch_with_alias
+ },
+ 'port' : {
+ 'verbose-name' : 'OF Port #',
+ 'formatter' : fmtcnv.decode_openflow_port
+ },
+ 'reason' : {
+ 'formatter' : fmtcnv.print_host_list_and_alias
+ },
+ }
+ },
+}
+
+
+VNS_VNS_ACCESS_LIST_FORMAT = {
+ 'vns-access-list': {
+ 'show-this' : [
+ ['vns-access-list', 'default'],
+ ['vns-access-list-entry', 'acl-brief']
+ ],
+
+ 'field-orderings' : {
+ 'default' : [ 'tenant', 'vns', 'name', 'priority', 'description' ],
+ 'vns-config' : [ 'name', 'priority', 'description' ]
+ },
+ 'fields' : {
+ 'name' : {
+ },
+ }
+ },
+}
+
+
+VNS_ACCESS_LIST_ENTRY_FORMAT = {
+ 'vns-access-list-entry': {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'vns', 'vns-access-list', 'rule', 'action', 'type',
+ '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',
+ 'src-mac', 'dst-mac', 'ether-type',
+ 'vlan'
+ ],
+ 'vns-config' : ['Idx',
+ 'vns-access-list', 'rule', 'action', 'type',
+ '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',
+ 'src-mac', 'dst-mac', 'ether-type',
+ 'vlan'
+ ],
+ 'acl-brief' : ['vns-access-list', 'rule', 'action', 'type', 'acl-text'
+ ],
+ 'scoped-acl-brief' : [ 'rule', 'action', 'type', 'acl-text'
+ ],
+ },
+ '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 SDNSh class)
+ #
+ 'vns-access-list' : { 'verbose-name' : 'Acl'
+ },
+ 'rule' : { 'verbose-name' : 'Seq',
+ },
+ 'action' : { 'verbose-name' : 'Action',
+ },
+ 'type' : { 'verbose-name' : 'Type',
+ },
+ 'src-ip' : {
+ 'verbose-name' : 'Src-Ip'
+ },
+ 'src-ip-mask' : {
+ 'verbose-name' : 'Src-Ip-Mask'
+ },
+ 'dst-ip' : {
+ 'verbose-name' : 'Dst-Ip' },
+ 'dst-ip-mask' : {
+ 'verbose-name' : 'Dst-Ip-Mask' },
+ 'src-tp-port-op' : {
+ 'verbose-name' : 'Src-Port-Op' },
+ 'src-tp-port' : {
+ 'verbose-name' : 'Src-Port' },
+ 'dst-tp-port-op' : {
+ 'verbose-name' : 'Dst-Port-Op' },
+ 'dst-tp-port' : {
+ 'verbose-name' : 'Dst-Port' },
+ 'icmp-type' : {
+ },
+ 'ether-type' : {
+ },
+ 'vns' : {
+ 'verbose-name' : 'VNS ID',
+ }
+ }
+ },
+}
+
+
+VNS_INTERFACE_ACCESS_LIST_FORMAT = {
+ 'vns-interface-access-list': {
+ 'field-orderings' : {
+ 'default' : [ 'Idx', 'vnsname', 'vns-interface', 'name', 'in-out' ],
+ 'vns-config': [ 'Idx', 'vns-interface', 'name', 'in-out' ]
+ },
+ 'fields' : {
+ 'vnsname' : {
+ 'verbose-name' : 'VNS ID',
+ },
+ 'vns-interface-name' : {
+ 'verbose-name' : 'VNS Interface ID',
+ },
+ 'name' : {
+ 'verbose-name' : 'VNS Acl name',
+ },
+ }
+ },
+}
+
+
+VNS_INTERFACE_FORMAT = {
+ 'vns-interface' : {
+ 'field-orderings' : {
+ 'default' : ['Idx', 'vns', 'address-space', 'interface', 'rule', 'last-seen', ],
+ 'vns-config' : ['Idx', 'address-space', 'interface', 'rule', 'last-seen', ]
+ },
+ 'fields' : {
+ 'id' : {
+ 'verbose-name': 'ID',
+ },
+ 'vns' : {
+ 'verbose-name': 'VNS ID'
+ },
+ 'interface' : {
+ 'verbose-name': 'VNS Interface Name',
+ },
+ 'rule' : {
+ 'verbose-name': 'VNS Rule ID',
+ },
+ 'address-space' : {
+ 'verbose-name' : 'Address Space',
+ },
+ 'last-seen' : {
+ 'verbose-name': 'Last Seen',
+ 'formatter' : fmtcnv.timestamp_to_local_timestr,
+ },
+ }
+ },
+}
+"""
\ No newline at end of file