blob: 19722db5b1941b36be5220783b58fdb66832f720 [file] [log] [blame]
#
# 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
import error
def virtualrouter_origin_external(data):
"""
Return origin-name when the virtualrouter wasn't created by the cli,
return None otherwise.
"""
pk = command.mi.pk('virtualrouter')
if not pk in data:
return None;
virtualrouter = command.sdnsh.get_table_from_store('virtualrouter',
pk,
data[pk])
if len(virtualrouter) == 0:
return None
local = ['cli', 'rest']
if 'origin' in virtualrouter[0] and not virtualrouter[0]['origin'] in local:
return virtualrouter[0]['origin']
return None
def virtualrouter_warn_external_config(data):
"""
From the named virtualrouter, 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 virtualrouter
(along with the originator name)
"""
external_origin = virtualrouter_origin_external(data)
if external_origin:
command.sdnsh.warning('router %s may not be intended for cli update, '
'origin/creator "%s" ' % (data['id'], external_origin))
def verify_router_intf_ip(data):
if data['ip-address']=='0.0.0.0':
raise error.ArgumentValidationError("0.0.0.0 is not a valid router interface ip address")
if data['subnet-mask']=='255.255.255.255':
raise error.ArgumentValidationError("0.0.0.0 is not a valid router interface ip subnet mask")
def verify_router_gw_ip(data):
if data['ip-address']=='0.0.0.0':
raise error.ArgumentValidationError("0.0.0.0 is not a valid router interface ip address")
def virtualrouter_preprocess(data):
current_mode=command.sdnsh.current_mode()
if current_mode.startswith('config-tenant'):
for x in command.sdnsh.mode_stack:
if x['mode_name'] == 'config-tenant':
tenant = x['obj']
if current_mode.startswith('config-tenant-router'):
for x in command.sdnsh.mode_stack:
if x['mode_name'] == 'config-tenant-router':
data['virtual-router'] = x['obj']
if 'outgoing-intf' in data:
current_obj=command.sdnsh.get_current_mode_obj()
if current_mode.startswith('config-tenant-router-intf') or current_mode.startswith('config-tenant-router-gw'):
for x in command.sdnsh.mode_stack:
if x['mode_name'] == 'config-tenant-router':
current_obj = x['obj']
data['outgoing-intf']=current_obj+'|'+data['outgoing-intf']
if 'gateway-pool' in data:
current_obj=command.sdnsh.get_current_mode_obj()
if current_mode.startswith('config-tenant-router-intf') or current_mode.startswith('config-tenant-router-gw'):
for x in command.sdnsh.mode_stack:
if x['mode_name'] == 'config-tenant-router':
current_obj = x['obj']
data['gateway-pool']=current_obj+'|'+data['gateway-pool']
if 'src-vns' in data:
if not'src-tenant' in data:
data['src-tenant']=tenant
data['src-vns']= data['src-tenant'] + '|' + data ['src-vns']
if 'dst-vns' in data:
if not 'dst-tenant' in data:
data['dst-tenant']=tenant
data['dst-vns']= data['dst-tenant'] + '|' + data ['dst-vns']
if 'vns-connected' in data:
data['vns-connected']=tenant+'|'+data['vns-connected']
if 'router-connected-tenant' in data:
if tenant !='system' and data['router-connected-tenant']!='system':
command.sdnsh.warning('Tenant router interface can only connected to system tenant router\n')
data['router-connected']= data['router-connected-tenant'] +'|'+ data['router-connected']
del data['router-connected-tenant']
command.add_action('virtualrouter-warn-external-config', virtualrouter_warn_external_config,
{'kwargs': {'data' : '$data',}})
command.add_action('virtualrouter-preprocess', virtualrouter_preprocess,
{'kwargs': {'data' : '$data',}})
command.add_action('verify-router-intf-ip', verify_router_intf_ip,
{'kwargs': {'data' : '$data',}})
command.add_action('verify-router-gw-ip', verify_router_gw_ip,
{'kwargs': {'data' : '$data',}})
def complete_virtualrouter_preprocess(data):
obj_id = command.sdnsh.get_current_mode_obj()
if '|' in obj_id:
parts=obj_id.split('|')
data['tenant']=parts[0]
data['virtual-router']=parts[0]+'|' + parts[1]
else:
data['tenant']=obj_id
if 'vrname' in data:
data['virtual-router']=obj_id+'|'+data['vrname']
if 'router-connected-tenant' in data:
data['tenant'] = data['router-connected-tenant']
if 'src-tenant' in data:
data['tenant']=data['src-tenant']
if 'dst-tenant' in data:
data['tenant']=data['dst-tenant']
def complete_virtualrouter_postprocess(data,completions):
obj_id = command.sdnsh.get_current_mode_obj()
parts=obj_id.split('|')
tenant=parts[0]
if tenant !='system': #non-system virtual router can only connected to system virtual router
completions.clear()
completions['system ']='Tenant Selection'
else: # system virtual router can't connect to itself
if 'system ' in completions:
del completions['system ']
command.add_completion('complete-virtualrouter-postprocess', complete_virtualrouter_postprocess,
{'kwargs': {'data': '$data',
'completions' : '$completions',}})
command.add_completion('complete-virtualrouter-preprocess', complete_virtualrouter_preprocess,
{'kwargs': {'data': '$data',
}})
def virtualrouter_confirm_external_delete(data):
"""
From the named virtualrouter, 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 virtualrouter
(along with the originator name)
"""
external_origin = virtualrouter_origin_external(data)
if external_origin:
confirm = command.action_registry['confirm'][0] # XXX accessor?
confirm('virtual router %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('virtualrouter-confirm-external-delete', virtualrouter_confirm_external_delete,
{'kwargs': {'data' : '$data',}})
"""
#
# ----------------------------------------------------------------------
# router submode commands
#
VROUTER_COMMAND_DESCRIPTION = {
'name' : 'router',
'help' : 'Enter virtual router definition submode',
'mode' : 'config-tenant*',
'command-type' : 'config-submode',
'obj-type' : 'virtualrouter',
'submode-name' : 'config-tenant-router',
'feature' : 'vns',
'short-help' : 'Enter virtual router definition submode',
'doc' : 'vns|tenant-vrouter',
'doc-example' : 'vns|tenant-vrouter-example',
'args' : (
{
'field' : 'vrname',
'type' : 'identifier',
'completion' : 'complete-object-field',
'scoped' : True,
'syntax-help' : 'Enter a router name',
'action' : (
{
'proc' : 'virtualrouter-warn-external-config',
},
{ 'proc' : 'tenant-show-preprocess'
},
{
'proc' : 'push-mode-stack',
},
),
'no-action' : (
{
'proc' : 'virtualrouter-confirm-external-delete',
},
{ 'proc' : 'tenant-show-preprocess'
},
{
'proc' : 'delete-objects',
},
)
}
),
}
virtualrouter_show_action = (
{ 'proc' : 'tenant-show-preprocess'},
{
'proc' : 'query-table',
},
{
'proc' : 'display',
'format' : 'virtualrouter',
},
)
VIRTUALROUTER_SHOW_COMMAND_DESCRIPTION = {
'name' : 'show',
'obj-type' : 'virtualrouter',
'mode' : 'config-tenant*',
'command-type' : 'display-table',
'action' : virtualrouter_show_action,
'short-help' : 'Show specific virtual router, identified by name',
'doc' : 'vns|show-tenant-id-router',
'doc-example' : 'vns|show-tenant-id-router-example',
'args' : (
'router',
)
}
VIRTUALROUTER_SHOW_ID_COMMAND_DESCRIPTION = {
'name' : 'show',
'obj-type' : 'virtualrouter',
'mode' : 'config-tenant*',
'command-type' : 'display-table',
'action' : virtualrouter_show_action,
'short-help' : 'Show specific virtual router, identified by name',
'doc' : 'vns|show-tenant-vrouter-id',
'doc-example' : 'vns|show-tenant-vrouter-id-example',
'args' : (
'router',
{
'field' : 'vrname',
'type' : 'identifier',
'completion' : 'complete-object-field',
'help-name' : "virtualrouter-id",
'scoped' : True,
},
{
'optional' : True,
'choices' : (
{
'token' : 'ip-address-pool',
'obj-type' : 'interface-address-pool',
'doc' : 'vns|show-tenant-id-router-ippool',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'interface-address-pool'},
),
},
{
'field' : 'route',
'type' : 'enum',
'values' : 'route',
'obj-type' : 'virtualrouter-routingrule',
'doc' : 'vns|show-tenant-id-router-route',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table',},
{
'proc' : 'display',
'format' : 'virtualrouter-routingrule'},
),
},
(
{
'field' : 'interfaces',
'type' : 'enum',
'values' : 'interfaces',
'obj-type' : 'virtualrouter-interface',
'doc' : 'vns|show-tenant-id-router-interfaces',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'virtualrouter-interface'},
),
},
{
'optional' : True,
'args' : (
{
'field' : 'vriname',
'obj-type' : 'virtualrouter-interface',
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'virtualrouter-interface|vriname',
'scoped' : 'virtual-router',
'explicit' : True,
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'virtualrouter-interface'},
),
},
{'optional' : True,
'token' : 'ip-address-pool',
'obj-type' : 'interface-address-pool',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'interface-address-pool'},
),
},
),
},
),
(
{
'field' : 'gateway-pools',
'type' : 'enum',
'values' : 'gateway-pools',
'obj-type' : 'virtualrouter-gwpool',
'doc' : 'vns|show-tenant-id-router-gwpools',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'virtualrouter-gwpool'},
),
},
{
'optional' : True,
'args' : (
{
'field' : 'vrgwname',
'obj-type' : 'virtualrouter-gwpool',
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'virtualrouter-gwpool|vrgwname',
'scoped' : 'virtual-router',
'explicit' : True,
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'virtualrouter-gwpool'},
),
},
{'optional' : True,
'token' : 'gw-address-pool',
'obj-type' : 'gateway-address-pool',
'action' : (
{ 'proc' : 'tenant-show-preprocess'},
{ 'proc' : 'query-table'},
{ 'proc' : 'display',
'format' : 'gateway-address-pool'},
),
},
),
},
),
),
},
)
}
VIRTUALROUTER_DEF_DESCRIPTION_COMMAND_DESCRIPTION = {
'name' : 'description',
'mode' : 'config-tenant-router',
'command-type' : 'config',
'short-help' : 'Provide description for a virtual router instance',
'doc' : 'vns|tenant-router-description',
'doc-example' : 'vns|tenant-router-description-example',
'args' : (
{
'field' : 'description',
'type' : 'string',
}
),
}
VIRTUALROUTER_DEF_ORIGIN_COMMAND_DESCRIPTION = {
'name' : 'origin',
'mode' : 'config-tenant-router',
'command-type' : 'config',
'short-help' : 'Describe virtual router origin',
'doc' : 'virtualrouter|origin',
'doc-example' : 'virtualrouter|origin-example',
'args' : (
{
'field' : 'origin',
'type' : 'string',
'action' : (
{
'proc' : 'virtualrouter-warn-external-config',
},
{
'proc' : 'write-fields',
},
),
},
),
}
VIRTUALROUTER_INTF_DEF_ORIGIN_COMMAND_DESCRIPTION = {
'name' : 'origin',
'mode' : 'config-tenant-router-intf',
'command-type' : 'config',
'short-help' : 'Describe virtual router interface origin',
'doc' : 'virtualrouter|origin',
'doc-example' : 'virtualrouter|origin-example',
'args' : (
{
'field' : 'origin',
'type' : 'string',
'action' : (
{
'proc' : 'virtualrouter-warn-external-config',
},
{
'proc' : 'write-fields',
},
),
},
),
}
#
# ----------------------------------------------------------------------
# router interface submode commands
#
VROUTER_INTERFACE_COMMAND_DESCRIPTION = {
'name' : 'interface',
'help' : 'Enter virtual router interface definition submode',
'mode' : 'config-tenant-router*',
'command-type' : 'config-submode',
'obj-type' : 'virtualrouter-interface',
'submode-name' : 'config-tenant-router-intf',
'short-help' : 'Enter virtual router interface definition submode',
'doc' : 'vns|tenant-router-interface',
'doc-example' : 'vns|tenant-router-interface-example',
'args' : (
{
'field' : 'vriname',
'type' : 'identifier',
'scoped' : 'virtual-router',
'explicit' : True,
'completion' : [ 'complete-virtualrouter-preprocess',
'complete-object-field',
],
'other' : 'virtualrouter-interface|vriname',
'syntax-help' : 'Enter a router interface name',
'action' : (
{
'proc' : 'virtualrouter-preprocess',
},
{
'proc' : 'push-mode-stack',
},
),
'no-action' : (
{
'proc' : 'virtualrouter-preprocess',
},
{
'proc' : 'delete-objects',
},
)
},
{
'optional' : True,
'optional-for-no' : True,
'choices' : (
(
{
'token' : 'vns',
'doc' : 'vns|interface-vns-connected',
},
{
'field' :'vns-connected',
'type' : 'identifier',
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'vns-definition|vnsname',
'syntax-help' : 'Enter a VNS to connect',
'scoped' : 'tenant',
'explicit' : True,
}
),
(
{
'token' : 'tenant',
'doc' : 'vns|interface-router-connected',
},
{ 'field' :'router-connected-tenant',
'type' : 'identifier',
'completion' : ['complete-from-another',
'complete-virtualrouter-postprocess'],
'other' : 'tenant|name',
'syntax-help' : 'Enter a Tenant Router to connect',
},
{
'field' :'router-connected',
'type' : 'identifier',
'scoped' : 'tenant',
'explicit' : True,
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'virtualrouter|vrname',
'syntax-help' : 'Enter a Tenant Router to connect',
},
)
),
},
),
}
VRI_DEF_ACTIVE_COMMAND_DESCRIPTION = {
'name' : 'active',
'mode' : 'config-tenant-router-intf',
'short-help' : 'Set Virtual Router Interface active',
'doc' : 'vns|tenant-router-active',
'doc-example' : 'vns|tenant-router-active-example',
'doc-include' : [ 'default' ],
'obj-type' : 'virtualrouter-interface',
'args' : (),
'action' : (
{
'proc' : 'write-fields',
'data' : { 'active' : True },
'syntax-help' : 'mark the interface as active',
}
),
'no-action' : (
{
'proc' : 'write-fields',
'data' : { 'active' : False },
'syntax-help' : 'mark the interface as inactive',
}
)
}
VRI_DEF_IP_COMMAND_DESCRIPTION = {
'name' : 'ip',
'mode' : 'config-tenant-router-intf',
'short-help' : 'Set Virtual Router Interface IP address',
'doc' : 'vns|tenant-router-interfaceip',
'doc-example' : 'vns|tenant-router-interfaceip-example',
'doc-include' : [ 'default' ],
'parent-field' : 'virtual-router-interface',
'command-type' : 'config-object',
'obj-type' : 'interface-address-pool',
'data' : {
'ip-address' : None,
'subnet-mask' : None,
},
'args' : (
{ 'choices': (
(
{
'field' : 'ip-address',
'type' : 'ip-address-not-mask',
'doc' : 'vns|vns-access-list-ip-and-mask-ip',
},
{
'field' : 'subnet-mask',
'type' : 'netmask',
'data-handler' : 'convert-inverse-netmask',
'doc' : 'vns|vns-access-list-ip-and-mask-mask',
},
),
(
{
'field' : 'ip-address',
'type' : 'cidr-range',
'help-name' : 'src-cidr',
'data-handler' : 'split-cidr-data-inverse',
'dest-ip' : 'ip-address',
'dest-netmask' : 'subnet-mask',
'doc' : 'vns|vns-access-list-cidr-range',
}
),
)
}
),
'action' : ( {
'proc' : 'verify-router-intf-ip'
},
{
'proc' : 'write-object',
},
),
'no-action' : (
{
'proc' : 'delete-objects',
},
),
}
#
# ----------------------------------------------------------------------
# gateway pool submode commands
#
VROUTER_GWPOOL_COMMAND_DESCRIPTION = {
'name' : 'gateway-pool',
'help' : 'Enter virtual router gateway pool submode',
'mode' : 'config-tenant-router*',
'command-type' : 'config-submode',
'obj-type' : 'virtualrouter-gwpool',
'submode-name' : 'config-tenant-router-gw',
'short-help' : 'Enter virtual router gateway pool definition submode',
'doc' : 'vns|tenant-router-gwpool',
'doc-example' : 'vns|tenant-router-gwpool-example',
'args' : (
{
'field' : 'vrgwname',
'type' : 'identifier',
'scoped' : 'virtual-router',
'explicit' : True,
'completion' : [ 'complete-virtualrouter-preprocess',
'complete-object-field',
],
'other' : 'virtualrouter-gwpool|vrgwname',
'syntax-help' : 'Enter a router gateway pool name',
'action' : (
{
'proc' : 'virtualrouter-preprocess',
},
{
'proc' : 'push-mode-stack',
},
),
'no-action' : (
{
'proc' : 'virtualrouter-preprocess',
},
{
'proc' : 'delete-objects',
},
)
},
),
}
VRGW_DEF_IP_COMMAND_DESCRIPTION = {
'name' : 'ip',
'mode' : 'config-tenant-router-gw',
'short-help' : 'Add IP address to the gateway pool',
'doc' : 'vns|tenant-router-gwip',
'doc-example' : 'vns|tenant-router-gwip-example',
'doc-include' : [ 'default' ],
'parent-field' : 'virtual-router-gwpool',
'command-type' : 'config-object',
'obj-type' : 'gateway-address-pool',
'data' : {
'ip-address' : None,
},
'args' : (
{
'field' : 'ip-address',
'type' : 'ip-address-not-mask',
'doc' : 'vns|vns-access-list-ip-and-mask-ip',
'action' : (
{
'proc' : 'verify-router-gw-ip'
},
{
'proc' : 'write-object',
},
),
'no-action' : (
{
'proc' : 'delete-objects',
},
),
},
),
}
STATIC_ARP_COMMAND_DESCRIPTION = {
'name' : 'arp',
'mode' : 'config*',
'short-help' : 'Set Static ARP',
'doc' : 'static-arp',
'doc-example' : 'static-arp-example',
'doc-include' : [ 'default' ],
'command-type' : 'config',
'obj-type' : 'static-arp',
'data' : {
'ip' : None,
'mac' : None,
},
'args' : (
{
'field' : 'ip',
'type' : 'ip-address-not-mask',
},
{
'field' : 'mac',
'type' : 'mac-address',
},
),
'action' : (
{
'proc' : 'write-object',
},
),
'no-action' : (
{
'proc' : 'delete-objects',
},
),
}
tenant_show_action = (
{
'proc' : 'query-table',
},
{
'proc' : 'display',
'format' : 'staticarp',
},
)
STATIC_ARP_SHOW_COMMAND_DESCRIPTION = {
'name' : 'show',
'mode' : 'login',
'all-help' : 'Show static ARP details',
'short-help' : 'Show all configured static ARPs',
'command-type' : 'display-table',
'obj-type' : 'static-arp',
'doc' : 'show-arp',
'doc-example' : 'show-arp-example',
'action' : tenant_show_action,
'args' : (
'arp',
)
}
#
# FORMATS
ARP_FORMAT = {
'staticarp' : {
'field-orderings' : {
'default' : [ 'Idx', 'ip', 'mac'],
},
'fields' : {
'ip' : {
},
'mac' : {
},
}
},
}
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' : 'netmask',
'doc' : 'vns|vns-access-list-ip-and-mask-mask',
'data-handler' : 'convert-inverse-netmask',
},
),
(
{
'field' : 'src-ip',
'type' : 'ip-address-not-mask',
'data' : {
'src-ip-mask' : '0.0.0.0',
},
'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',
'doc' : 'vns|vns-access-list-cidr-range',
}
),
(
{
'token' : 'any',
'data' : {
'src-ip' : '0.0.0.0',
'src-ip-mask' : '255.255.255.255',
},
'doc' : 'vns|vns-access-list-ip-any',
}
),
)
}
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' : 'netmask',
'doc' : 'vns|vns-access-list-ip-and-mask-mask',
'data-handler' : 'convert-inverse-netmask',
},
),
(
{
'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',
}
),
)
}
ROUTING_RULE_COMMAND_DESCRIPTION = {
'name' : 'route',
'mode' : 'config-tenant-router*',
'short-help' : 'Set Routing Rule',
'doc' : 'vns|tenant-router-route',
'doc-example' : 'vns|tenant-router-route-example',
'doc-include' : [ 'default' ],
'command-type' : 'config-object',
'obj-type' : 'virtualrouter-routingrule',
'args' : (
{'token' : 'from'
},
{
'choices': (
({'token' : 'tenant'},
{'field' : 'src-tenant',
'type' : 'identifier',
'completion' : 'complete-from-another',
'other' : 'tenant|name',
'help-name' : 'source tenant'
},
{
'optional' : True,
'optional-for-no' : True,
'args' : (
{'token' : 'vns',
},
{'field' : 'src-vns',
'type' : 'identifier',
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'vns-definition|vnsname',
'help-name' : 'source VNS',
},
),
},
),
({'token' : 'vns',
},
{'field' : 'src-vns',
'type' : 'identifier',
'completion' : 'complete-from-another',
'other' : 'vns-definition|vnsname',
'help-name' : 'source VNS',
},
),
( SRC_IP_MATCH,
)
)
},
{'token' : 'to',
},
{
'choices': (
({'token' : 'tenant'},
{'field' : 'dst-tenant',
'type' : 'identifier',
'completion' : 'complete-from-another',
'other' : 'tenant|name',
'help-name' : 'destination tenant'
},
{
'optional' : True,
'optional-for-no' : True,
'args' : (
{'token' : 'vns',
},
{'field' : 'dst-vns',
'type' : 'identifier',
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'vns-definition|vnsname',
'help-name' : 'destination VNS',
},
),
},
),
({'token' : 'vns',
},
{'field' : 'dst-vns',
'type' : 'identifier',
'completion' : 'complete-from-another',
'other' : 'vns-definition|vnsname',
'help-name' : 'destination VNS',
},
),
( DST_IP_MATCH,
)
)
},
{
'optional' : True,
'optional-for-no' : True,
'choices' : (
(
{
'field' : 'nh-ip',
'type' : 'ip-address-not-mask',
'help-name': 'next hop ip address',
'doc' : 'vns|vns-access-list-ip-only',
},
),
(
{'token' : 'gw-pool',
},
{
'field' : 'gateway-pool',
'type' : 'identifier',
'scoped' : 'virtual-router',
'explicit' : True,
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'virtualrouter-gwpool|vrgwname',
'help-name' : 'gateway pool name',
'doc' : 'vns|gateway-pool',
},
),
),
},
{
'field' : 'outgoing-intf',
'type' : 'identifier',
'scoped' : 'virtual-router',
'explicit' : True,
'completion' : ['complete-virtualrouter-preprocess',
'complete-from-another'],
'other' : 'virtualrouter-interface|vriname',
'optional' : True,
'optional-for-no' : True,
'help-name' : 'outgoing interface',
'doc' : 'vns|outgoing-interface',
},
{'field' : 'action',
'type' : 'enum',
'values' : ('deny', 'permit'),
}
),
'action' : (
{
'proc' : 'virtualrouter-preprocess'
},
{
'proc' : 'write-object',
},
),
'no-action' : (
{
'proc' : 'virtualrouter-preprocess'
},
{
'proc' : 'delete-objects',
},
),
}
# FORMATS
VIRTUALROUTER_FORMAT = {
'virtualrouter' : {
'field-orderings' : {
'default' : [ 'Idx', 'tenant', 'vrname', 'description'],
'details' : [ 'Idx', 'tenant', 'vrname', 'description'],
'brief' : [ 'Idx', 'tenant', 'vrname'],
},
'fields' : {
'tenant' : { 'verbose-name' : 'Tenant ID',
},
'vrname' : {
},
'description' : {
},
}
},
}
VIRTUALROUTER_INTERFACE_FORMAT = {
'virtualrouter-interface' : {
'field-orderings' : {
'default' : [ 'Idx', 'virtual-router', 'vriname', 'active', 'vns-connected','router-connected'],
'details' : [ 'Idx', 'virtual-router', 'vriname', 'active', 'vns-connected','router-connected'],
'brief' : [ 'Idx', 'virtual-router', 'vriname', 'active'],
},
'fields' : {
'virtual-router' : {},
'vriname' : {},
'active' : {},
'vns-connected' : {},
'router-connected' : {},
}
},
}
VIRTUALROUTER_GWPOOL_FORMAT = {
'virtualrouter-gwpool' : {
'field-orderings' : {
'default' : [ 'Idx', 'virtual-router', 'vrgwname'],
'details' : [ 'Idx', 'virtual-router', 'vrgwname'],
'brief' : [ 'Idx', 'virtual-router', 'vrgwname'],
},
'fields' : {
'virtual-router' : {},
'vrgwname' : {},
}
},
}
GATEWAY_ADDRESS_POOL_FORMAT = {
'gateway-address-pool' : {
'field-orderings' : {
'default' : [ 'Idx', 'virtual-router-gwpool', 'ip-address'],
},
'fields' : {
'virtual-router-gwpool' : {'verbose-name' : 'Virtual Router Gateway Pool',},
'ip-address' : {'verbose-name' : 'IP Address',},
}
},
}
VIRTUALROUTER_ROUTINGRULE_FORMAT = {
'virtualrouter-routingrule' : {
'field-orderings' : {
'default' : [ 'Idx', 'virtual-router','action','src-tenant','src-vns','src-ip','src-ip-mask','dst-tenant','dst-vns','dst-ip','dst-ip-mask','nh-ip','gateway-pool','outgoing-intf'],
},
'fields' : {
'virtual-router' : {},
'src-tenant' : {},
'src-vns' : {},
'src-ip' : {},
'src-ip-mask' : {'formatter' : fmtcnv.convert_inverse_netmask_handler,},
'dst-tenant' : {},
'dst-vns' : {},
'dst-ip' : {},
'dst-ip-mask' : {'formatter' : fmtcnv.convert_inverse_netmask_handler,},
'nh-ip' : {},
'gateway-pool' : {},
'outgoing-intf' : {},
'action' : {},
}
},
}
INTERFACE_ADDRESS_POOL_FORMAT = {
'interface-address-pool' : {
'field-orderings' : {
'default' : [ 'Idx', 'virtual-router-interface', 'ip-address', 'subnet-mask'],
},
'fields' : {
'virtual-router-interface' : {'verbose-name' : 'Virtual Router Interface',},
'ip-address' : {'verbose-name' : 'IP Address',},
'subnet-mask' : {'formatter' : fmtcnv.convert_inverse_netmask_handler,},
}
},
}
"""