diff --git a/config/main.py b/config/main.py old mode 100644 new mode 100755 index 1e8fa1f30c..7572513a4e --- a/config/main.py +++ b/config/main.py @@ -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='', 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='', 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='', required=True, type=int) +@click.argument('interface_name', metavar='', 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='', required=True, type=int) +@click.argument('interface_name', metavar='', 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 # diff --git a/show/main.py b/show/main.py index 3e735474d8..a91f375076 100755 --- a/show/main.py +++ b/show/main.py @@ -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 @@ -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"""