Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions config/main.py
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,94 @@ def load_minigraph():
_restart_services()
print "Please note setting loaded from minigraph will be lost after system reboot. To preserve setting, run `config save`."

#
# 'vlan' group
#
@cli.group()
@click.pass_context
@click.option('-s', '--redis-unix-socket-path', help='unix socket path for redis connection')
def vlan(ctx, redis_unix_socket_path):
"""VLAN-related configuration tasks"""
kwargs = {}
if redis_unix_socket_path:
kwargs['unix_socket_path'] = redis_unix_socket_path
config_db = ConfigDBConnector(**kwargs)
config_db.connect(wait_for_init=False)
ctx.obj = {'db': config_db}
pass

@vlan.command('add')
@click.argument('vid', metavar='<vid>', required=True, type=int)
@click.pass_context
def add_vlan(ctx, vid):
db = ctx.obj['db']
vlan = 'Vlan{}'.format(vid)
if len(db.get_entry('VLAN', vlan)) != 0:
print "{} already exists".format(vlan)
raise click.Abort
db.set_entry('VLAN', vlan, {'vlanid': vid})

@vlan.command('del')
@click.argument('vid', metavar='<vid>', required=True, type=int)
@click.pass_context
def del_vlan(ctx, vid):
db = ctx.obj['db']
keys = [ (k, v) for k, v in db.get_table('VLAN_MEMBER') if k == 'Vlan{}'.format(vid) ]
for k in keys:
db.set_entry('VLAN_MEMBER', k, None)
db.set_entry('VLAN', 'Vlan{}'.format(vid), None)

@vlan.group('member')
@click.pass_context
def vlan_member(ctx):
pass

@vlan_member.command('add')
@click.argument('vid', metavar='<vid>', required=True, type=int)
@click.argument('interface_name', metavar='<interface_name>', required=True)
@click.option('-u', '--untagged', is_flag=True)
@click.pass_context
def add_vlan_member(ctx, vid, interface_name, untagged):
db = ctx.obj['db']
vlan_name = 'Vlan{}'.format(vid)
vlan = db.get_entry('VLAN', vlan_name)
if len(vlan) == 0:
print "{} doesn't exist".format(vlan_name)
raise click.Abort
members = vlan.get('members', [])
if interface_name in members:
print "{} is already a member of {}".format(interface_name, vlan_name)
raise click.Abort
members.append(interface_name)
vlan['members'] = members
db.set_entry('VLAN', vlan_name, vlan)
db.set_entry('VLAN_MEMBER', (vlan_name, interface_name), {'tagging_mode': "untagged" if untagged else "tagged" })


@vlan_member.command('del')
@click.argument('vid', metavar='<vid>', required=True, type=int)
@click.argument('interface_name', metavar='<interface_name>', required=True)
@click.pass_context
def del_vlan_member(ctx, vid, interface_name):
db = ctx.obj['db']
vlan_name = 'Vlan{}'.format(vid)
vlan = db.get_entry('VLAN', vlan_name)
if len(vlan) == 0:
print "{} doesn't exist".format(vlan_name)
raise click.Abort
members = vlan.get('members', [])
if interface_name not in members:
print "{} is not a member of {}".format(interface_name, vlan_name)
raise click.Abort
members.remove(interface_name)
if len(members) == 0:
del vlan['members']
else:
vlan['members'] = members
db.set_entry('VLAN', vlan_name, vlan)
db.set_entry('VLAN_MEMBER', (vlan_name, interface_name), None)


#
# 'bgp' group
#
Expand Down
27 changes: 27 additions & 0 deletions show/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from click_default_group import DefaultGroup
from natsort import natsorted
from tabulate import tabulate
from swsssdk import ConfigDBConnector

try:
# noinspection PyPep8Naming
Expand Down Expand Up @@ -721,6 +722,32 @@ def id(bridge_name):
command="sudo brctl showmacs {}".format(bridge_name)
run_command(command)

@vlan.command()
@click.option('-s', '--redis-unix-socket-path', help='unix socket path for redis connection')
def config(redis_unix_socket_path):
kwargs = {}
if redis_unix_socket_path:
kwargs['unix_socket_path'] = redis_unix_socket_path
config_db = ConfigDBConnector(**kwargs)
config_db.connect(wait_for_init=False)
data = config_db.get_table('VLAN')
keys = data.keys()

def mode(key, data):
info = []
for m in data.get('members', []):
entry = config_db.get_entry('VLAN_MEMBER', (key, m))
mode = entry.get('tagging_mode')
if mode == None:
info.append('?')
else:
info.append(mode)
return '\n'.join(info)

header = ['Name', 'VID', 'Member', 'Mode']
click.echo(tabulate([ [k, data[k]['vlanid'], '\n'.join(data[k].get('members', [])), mode(k, data[k])] for k in keys ], header))


@cli.command('services')
def services():
"""Show all daemon services"""
Expand Down