#!/usr/bin/python
# Copyright 2013 Mellanox Technologies, Ltd
#
# Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
#
# 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 argparse
import sys

from networking_mlnx.eswitchd.cli import conn_utils
from networking_mlnx.eswitchd.cli import exceptions

client = conn_utils.ConnUtil()


def parse():
    """Main method that manages supported CLI commands.

    The actions that are supported throught the CLI are:
    write-sys, del-port, allocate-port and add-port
    Each action is matched with method that should handle it
    e.g. write-sys action is matched with  write_sys method
    """

    parser = argparse.ArgumentParser(prog='ebrctl')
    parser.add_argument('action', action='store_true')

    parent_parser = argparse.ArgumentParser(add_help=False)
    parent_parser.add_argument('vnic_mac')
    parent_parser.add_argument('device_id')
    parent_parser.add_argument('fabric')
    parent_parser.add_argument('vnic_type')
    subparsers = parser.add_subparsers()

    parser_add_port = subparsers.add_parser('add-port',
                                            parents=[parent_parser])
    parser_add_port.add_argument('dev_name')
    parser_add_port.set_defaults(func=add_port)

    parser_add_port = subparsers.add_parser('allocate-port',
                                            parents=[parent_parser])
    parser_add_port.set_defaults(func=allocate_port)

    parser_del_port = subparsers.add_parser('del-port')
    parser_del_port.set_defaults(func=del_port)
    parser_del_port.add_argument('fabric')
    parser_del_port.add_argument('vnic_mac')

    parser_write_sys = subparsers.add_parser('write-sys')
    parser_write_sys.set_defaults(func=write_sys)
    parser_write_sys.add_argument('path')
    parser_write_sys.add_argument('value')

    args = parser.parse_args()
    args.func(args)


def allocate_port(args):
    try:
        dev = client.allocate_nic(args.vnic_mac, args.device_id,
                                  args.fabric, args.vnic_type)
    except exceptions.MlxException as e:
        sys.stderr.write("Error in allocate command")
        sys.stderr.write(e.message)
        sys.exit(1)
    sys.stdout.write(dev)
    sys.exit(0)


def add_port(args):
    try:
        dev = client.plug_nic(args.vnic_mac, args.device_id, args.fabric,
                              args.vnic_type, args.dev_name)

    except exceptions.MlxException as e:
        sys.stderr.write("Error in add-port command")
        sys.stderr.write(e.message)
        sys.exit(1)
    sys.stdout.write(dev)
    sys.exit(0)


def del_port(args):
    try:
        client.deallocate_nic(args.vnic_mac, args.fabric)
    except exceptions.MlxException as e:
        sys.stderr.write("Error in del-port command")
        sys.stderr.write(e.message)
        sys.exit(1)
    sys.exit(0)


def write_sys(args):
    try:
        fd = open(args.path, 'w')
        fd.write(args.value)
        fd.close()
    except Exception as e:
        sys.stderr.write("Error in write-sys command")
        sys.stderr.write(e.message)
        sys.exit(1)
    sys.exit(0)


def main():
    parse()

[(23, 'networking_mlnx.eswitchd.cli.conn_utils.ConnUtil', 'conn_utils.ConnUtil', ([], {}), False, 'from networking_mlnx.eswitchd.cli import conn_utils\n'), (35, 'argparse.ArgumentParser', 'argparse.ArgumentParser', ([], {'prog': '"""ebrctl"""'}), False, 'import argparse\n'), (38, 'argparse.ArgumentParser', 'argparse.ArgumentParser', ([], {'add_help': '(False)'}), False, 'import argparse\n'), (76, 'sys.stdout.write', 'sys.stdout.write', (['dev'], {}), False, 'import sys\n'), (77, 'sys.exit', 'sys.exit', (['(0)'], {}), False, 'import sys\n'), (89, 'sys.stdout.write', 'sys.stdout.write', (['dev'], {}), False, 'import sys\n'), (90, 'sys.exit', 'sys.exit', (['(0)'], {}), False, 'import sys\n'), (100, 'sys.exit', 'sys.exit', (['(0)'], {}), False, 'import sys\n'), (112, 'sys.exit', 'sys.exit', (['(0)'], {}), False, 'import sys\n'), (73, 'sys.stderr.write', 'sys.stderr.write', (['"""Error in allocate command"""'], {}), False, 'import sys\n'), (74, 'sys.stderr.write', 'sys.stderr.write', (['e.message'], {}), False, 'import sys\n'), (75, 'sys.exit', 'sys.exit', (['(1)'], {}), False, 'import sys\n'), (86, 'sys.stderr.write', 'sys.stderr.write', (['"""Error in add-port command"""'], {}), False, 'import sys\n'), (87, 'sys.stderr.write', 'sys.stderr.write', (['e.message'], {}), False, 'import sys\n'), (88, 'sys.exit', 'sys.exit', (['(1)'], {}), False, 'import sys\n'), (97, 'sys.stderr.write', 'sys.stderr.write', (['"""Error in del-port command"""'], {}), False, 'import sys\n'), (98, 'sys.stderr.write', 'sys.stderr.write', (['e.message'], {}), False, 'import sys\n'), (99, 'sys.exit', 'sys.exit', (['(1)'], {}), False, 'import sys\n'), (109, 'sys.stderr.write', 'sys.stderr.write', (['"""Error in write-sys command"""'], {}), False, 'import sys\n'), (110, 'sys.stderr.write', 'sys.stderr.write', (['e.message'], {}), False, 'import sys\n'), (111, 'sys.exit', 'sys.exit', (['(1)'], {}), False, 'import sys\n')]