# Copyright 2015 Mirantis, Inc.
#
#    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 os
import sys

from keystoneauth1 import identity
from keystoneauth1 import session
from neutronclient.v2_0 import client


parser = argparse.ArgumentParser(description='GenericSwitch functional test')
parser.add_argument('--switch_name',
                    type=str,
                    required=True,
                    help='Name of the switch')
parser.add_argument('--switch_id',
                    type=str,
                    required=True,
                    help='Switch id to create a local_link_information with')
parser.add_argument('--port',
                    type=str,
                    required=True,
                    help='OVS port to manage')
parser.add_argument('--network',
                    type=str,
                    default='private',
                    help='Neutron network name to create port in')
parser.add_argument('--auth-url',
                    type=str,
                    default='http://127.0.0.1:5000/v3',
                    help='Keystone auth URL endpoint')
parser.add_argument('--username',
                    type=str,
                    default='admin',
                    help='Keystone user name, must have admin access')
parser.add_argument('--password',
                    type=str,
                    default='admin',
                    help='Keystone user password, must have admin access')
parser.add_argument('--project-name',
                    type=str,
                    default='admin',
                    help='Keystone user project name, must have admin access')
parser.add_argument('--user-domain-id',
                    type=str,
                    help='Keystone user domain ID')
parser.add_argument('--project-domain-id',
                    type=str,
                    help='Keystone project domain ID')
opts = parser.parse_args()

auth_params = {
    "username": os.environ.get("OS_USERNAME", opts.username),
    "password": os.environ.get("OS_PASSWORD", opts.password),
    "tenant_name": os.environ.get("OS_PROJECT_NAME", opts.project_name),
}

user_domain_id = os.environ.get("OS_USER_DOMAIN_ID", opts.user_domain_id)
if user_domain_id:
    auth_params["user_domain_id"] = user_domain_id
project_domain_id = os.environ.get("OS_PROJECT_DOMAIN_ID",
                                   opts.project_domain_id)
if project_domain_id:
    auth_params["project_domain_id"] = project_domain_id


auth = identity.Password(os.environ.get("OS_AUTH_URL", opts.auth_url),
                         **auth_params)
try:
    sess = session.Session(auth=auth)
    nc = client.Client(session=sess)

    network_name = opts.network

    network = nc.list_networks(name=network_name)['networks'][0]
    print(network['provider:segmentation_id'])

    create_body = {
        'port':
            {'network_id': network['id'],
             'admin_state_up': True,
             'name': 'generic_switch_test'
             }
    }
    port_id = nc.create_port(create_body)['port']['id']
    host = nc.list_agents(
        agent_type='Open vSwitch agent')['agents'][0]['host']
    update_body = {
        'port': {
            'device_owner': 'baremetal:none',
            'device_id': 'fake-instance-uuid',
            'admin_state_up': True,
            'binding:vnic_type': 'baremetal',
            'binding:host_id': host,
            'binding:profile': {
                'local_link_information': [{
                    'switch_info': opts.switch_name,
                    'switch_id': opts.switch_id,
                    'port_id': opts.port}]
            }
        }
    }

    nc.update_port(port_id, update_body)
except Exception as exc:
    msg = "Failed to create and update port, exception is %s" % exc
    sys.exit(msg)