#!/usr/bin/python
#
# Create a static route on CSR1000V
# given parameters in code as global vars
# and route / nexthop or interface names as arguments
#
# darien@sdnessentials.com
#
import argparse
import netaddr
import requests
import sys


HOST = 'ios-xe-mgmt.cisco.com'
PORT = 9443
USER = 'root'
PASS = 'C!sc0123'
BASE = 'GigabitEthernet3'


def create_static(host, port, user, password, route, nexthop, insecure):
    """Function to create a static route on CSR1000V."""

    url = "https://{h}:{p}/api/running/native/ip/route".format(h=HOST, p=PORT)
    headers = {'content-type': 'application/vnd.yang.data+json',
               'accept': 'application/vnd.yang.data+json'}
    try:
        result = requests.patch(url, auth=(USER, PASS), data=data,
                                headers=headers, verify=not insecure)
    except Exception:
        print(str(sys.exc_info()[0]))
        return -1

    return result.text

    if result.status_code == 201:
        return 0

    # somethine went wrong
    print(result.status_code, result.text)
    return -1


def main():
    """Main method to create static route."""
    parser = argparse.ArgumentParser()
    parser.add_argument('route', help="static route (IPv4)")
    parser.add_argument('nexthop', help="nexthop for (Interface or IPv4)")
    parser.add_argument('--insecure', '-k', action='store_true', help="relax SSL verification")
    parser.add_argument('--user', '-u', default=USER, help="user name on remote host")
    parser.add_argument('--password', '-p', default=PASS, help="password on remote host")
    parser.add_argument('--port', '-P', default=PORT, help="port on remote host")
    parser.add_argument('--host', '-H', default=HOST, help="remote host")
    args = parser.parse_args()

    # check for valid prefix
    try:
        ip = netaddr.IPNetwork(args.route)
    except netaddr.core.AddrFormatError as e:
        parser.print_usage()
        print(e)
        return -1

    # insecure?
    if args.insecure:
        requests.packages.urllib3.disable_warnings()

        return create_static(args.host, args.port, args.user, args.password,
                             args.route, args.nexthop, args.insecure)

if __name__ == '__main__':
    sys.exit(main())