diff --git a/API_REFERENCE.rst b/API_REFERENCE.rst index 2135d13..ebb0a10 100644 --- a/API_REFERENCE.rst +++ b/API_REFERENCE.rst @@ -4,8 +4,11 @@ Tap as a Service API REFERENCE This documents is an API REFERENCE for Tap-as-a-Service Neutron extension. -The documents is organized into three section, TaaS Resources, API Reference -and WorkFlow. +The documents is organized into the following sections: +* TaaS Resources +* API Reference +* TaaS CLI Reference +* Workflow TaaS Resources ============== @@ -229,17 +232,32 @@ extension \ +TaaS CLI Reference +================== +The TaaS commands can be executed using TaaS CLI, which is integrated with neutron. +It can be used to send REST request and interact with the TaaS +extension. Given below are the detail of the CLIs: -The TaaS client can be used to send REST request and interact with the TaaS -extension. For usage type **taas --help** in the terminal after TaaS has been -installed. +- **neutron tap-service-create**: Creates a Tap service. +- **neutron tap-service-list**: Lists all the Tap services. +- **neutron tap-service-show**: Show the details for a Tap service. +- **neutron tap-service-update**: Update the information for a Tap service. +- **neutron tap-service-delete**: Delete an existing Tap service. +- **neutron tap-flow-create**: Creates a Tap flow. +- **neutron tap-flow-list**: Lists all the Tap flows. +- **neutron tap-flow-show**: Show the details for a Tap flow. +- **neutron tap-flow-update**: Update the information for a Tap flow. +- **neutron tap-flow-delete**: Delete an existing Tap flow. -Work Flow +For usage type **--help** after any of the above commands +in the terminal after TaaS has been installed. + +Workflow ========= In this section we describe a simple sequence of steps to use TaaS. -Work Flow Sequence +Workflow Sequence ------------------ 1. Create a Neutron port with 'port_security_enabled' set to 'false'. diff --git a/neutron_taas/taas_cli/__init__.py b/neutron_taas/taas_cli/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/neutron_taas/taas_cli/openrc.sh b/neutron_taas/taas_cli/openrc.sh deleted file mode 100755 index 6e582d5..0000000 --- a/neutron_taas/taas_cli/openrc.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -# URL for authentication service -export OS_AUTH_URL=http://10.0.2.15:5000/v2.0 - -# Tenant name -export OS_TENANT_NAME="demo" - -# Username -export OS_USERNAME="demo" - -# Password -echo "Please enter your OpenStack Password: " -read -sr OS_PASSWORD_INPUT -export OS_PASSWORD=$OS_PASSWORD_INPUT diff --git a/neutron_taas/taas_cli/taas_cli.py b/neutron_taas/taas_cli/taas_cli.py deleted file mode 100755 index a4b33e3..0000000 --- a/neutron_taas/taas_cli/taas_cli.py +++ /dev/null @@ -1,536 +0,0 @@ -#!/usr/bin/python - -# Copyright (C) 2015 Ericsson AB -# Copyright (C) 2015 Gigamon -# -# 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 json -import os -import requests - - -SUCCESS = 0 -FAILURE = 1 - - -class taas_rest_api(object): - - def __init__(self): - # - # Initialize authentication service endpoint and user - # credentials from environment variables - # - self.auth_url = os.environ['OS_AUTH_URL'] - self.tenant_name = os.environ['OS_TENANT_NAME'] - self.username = os.environ['OS_USERNAME'] - self.password = os.environ['OS_PASSWORD'] - - self.token_id = None - - return - - def authenticate(self): - # Generate a new authentication token - req_data = {} - req_data['auth'] = { - 'tenantName': self.tenant_name, - 'passwordCredentials': { - 'username': self.username, - 'password': self.password - } - } - - req_data_json = json.dumps(req_data) - - url = '%s/tokens' % self.auth_url - - response = requests.post(url, req_data_json) - res_data = response.json() - - if response.status_code != 200: - error = res_data['error'] - print ('Error code: %s (%s)' % (error['code'], error['title'])) - return FAILURE - - # Remember new token ID - self.token_id = res_data['access']['token']['id'] - - # Remember tenant ID - self.tenant_id = res_data['access']['token']['tenant']['id'] - - # Find network service endpoint - found = False - service_catalog = res_data['access']['serviceCatalog'] - for service in service_catalog: - if service['type'] == 'network': - endpoints = service['endpoints'] - endpoint = endpoints[0] - network_service_url = endpoint['publicURL'] - found = True - break - - if found is False: - print ('Error: Could not find network service endpoint') - return FAILURE - - # Formulate and remember TaaS endpoint - self.taas_url = '%s/v2.0/taas/' % network_service_url - - return SUCCESS - - def tap_service_create(self, - name, - description, - port_id, - network_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - req_data = {} - req_data['tap_service'] = { - 'tenant_id': self.tenant_id, - 'name': name, - 'description': description, - 'port_id': port_id, - 'network_id': network_id - } - - req_data_json = json.dumps(req_data) - - url = '%s/tap-services' % self.taas_url - - response = requests.post(url, req_data_json, headers=header_data) - res_data = response.json() - - if response.status_code != 201: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_service = res_data['tap_service'] - - # Show information of the new tap service - self.tap_service_show(tap_service['id']) - - return SUCCESS - - def tap_service_delete(self, tap_service_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-services/%s' % (self.taas_url, tap_service_id) - - response = requests.delete(url, headers=header_data) - - if response.status_code != 204: - res_data = response.json() - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - return SUCCESS - - def tap_service_list(self): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-services' % self.taas_url - - response = requests.get(url, headers=header_data) - res_data = response.json() - - if response.status_code != 200: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_services = res_data['tap_services'] - - sep = '+' + '-' * 38 + '+' + '-' * 12 + '+' + '-' * 38 + '+' - print (sep) - print ('| {:36s} | {:10s} | {:36s} |'.format('ID', 'Name', 'Port ID')) - print (sep) - for tap_service in tap_services: - print ('| {:36s} | {:10s} | {:36s} |' - .format(tap_service['id'], - tap_service['name'], - tap_service['port_id'])) - print (sep) - - return SUCCESS - - def tap_service_show(self, tap_service_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-services/%s' % (self.taas_url, tap_service_id) - - response = requests.get(url, headers=header_data) - res_data = response.json() - - if response.status_code != 200: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_service = res_data['tap_service'] - - sep = '+' + '-' * 13 + '+' + '-' * 38 + '+' - print (sep) - print ('| {:11} | {:36s} |'.format('Field', 'Value')) - print (sep) - print ('| {:11} | {:36s} |' - .format('Name', tap_service['name'])) - print ('| {:11} | {:36s} |' - .format('Description', tap_service['description'])) - print ('| {:11} | {:36s} |' - .format('ID', tap_service['id'])) - print ('| {:11} | {:36s} |' - .format('Port ID', tap_service['port_id'])) - print ('| {:11} | {:36s} |' - .format('Tenant ID', tap_service['tenant_id'])) - print (sep) - - return SUCCESS - - def tap_flow_create(self, - name, - description, - port_id, - direction, - tap_service_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - req_data = {} - req_data['tap_flow'] = { - 'tenant_id': self.tenant_id, - 'name': name, - 'description': description, - 'source_port': port_id, - 'direction': direction, - 'tap_service_id': tap_service_id - } - - req_data_json = json.dumps(req_data) - - url = '%s/tap-flows' % self.taas_url - - response = requests.post(url, req_data_json, headers=header_data) - res_data = response.json() - - if response.status_code != 201: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_flow = res_data['tap_flow'] - - # Show information of the new tap flow - self.tap_flow_show(tap_flow['id']) - - return SUCCESS - - def tap_flow_delete(self, tap_flow_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-flows/%s' % (self.taas_url, tap_flow_id) - - response = requests.delete(url, headers=header_data) - - if response.status_code != 204: - res_data = response.json() - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - return SUCCESS - - def tap_flow_list(self, tap_service_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-flows' % self.taas_url - - response = requests.get(url, headers=header_data) - res_data = response.json() - - if response.status_code != 200: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_flows = res_data['tap_flows'] - - sep = '+' + '-' * 38 + '+' + '-' * 12 + \ - '+' + '-' * 38 + '+' + '-' * 38 + '+' - print (sep) - print ('| {:36s} | {:10s} | {:36s} | {:36s} |'.format( - 'ID', 'Name', 'Port ID', 'Tap Service ID')) - print (sep) - for tap_flow in tap_flows: - # - # If a tap service has been specified only display tap flows - # associated with that tap service; otherwise display all tap - # flows that belong to the tenant - # - if (tap_service_id is None or - tap_service_id == tap_flow['tap_service_id']): - - print ('| {:36s} | {:10s} | {:36s} | {:36s} |' - .format(tap_flow['id'], - tap_flow['name'], - tap_flow['source_port'], - tap_flow['tap_service_id'])) - print (sep) - - return SUCCESS - - def tap_flow_show(self, tap_flow_id): - header_data = {} - header_data['X-Auth-Token'] = self.token_id - - url = '%s/tap-flows/%s' % (self.taas_url, tap_flow_id) - - response = requests.get(url, headers=header_data) - res_data = response.json() - - if response.status_code != 200: - error = res_data['NeutronError'] - print (error['message']) - return FAILURE - - tap_flow = res_data['tap_flow'] - - sep = '+' + '-' * 16 + '+' + '-' * 38 + '+' - print (sep) - print ('| {:14} | {:36s} |'.format('Field', 'Value')) - print (sep) - print ('| {:14} | {:36s} |' - .format('Name', tap_flow['name'])) - print ('| {:14} | {:36s} |' - .format('Description', tap_flow['description'])) - print ('| {:14} | {:36s} |' - .format('ID', tap_flow['id'])) - print ('| {:14} | {:36s} |' - .format('Port ID', tap_flow['source_port'])) - print ('| {:14} | {:36s} |' - .format('Direction', tap_flow['direction'])) - print ('| {:14} | {:36s} |' - .format('Tap Service ID', tap_flow['tap_service_id'])) - print ('| {:14} | {:36s} |' - .format('Tenant ID', tap_flow['tenant_id'])) - print (sep) - - return SUCCESS - - -# Handler for 'tap-service-create' subcommand -def tap_service_create(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_service_create(args.name, - args.description, - args.port_id, - args.network_id) - - -# Handler for 'tap-service-delete' subcommand -def tap_service_delete(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_service_delete(args.id) - - -# Handler for 'tap-service-list' subcommand -def tap_service_list(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_service_list() - - -# Handler for 'tap-service-show' subcommand -def tap_service_show(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_service_show(args.id) - - -# Handler for 'tap-flow-create' subcommand -def tap_flow_create(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_flow_create(args.name, - args.description, - args.port_id, - args.direction, - args.tap_service_id) - - -# Handler for 'tap-flow-delete' subcommand -def tap_flow_delete(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_flow_delete(args.id) - - -# Handler for 'tap-flow-list' subcommand -def tap_flow_list(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_flow_list(args.tap_service_id) - - -# Handler for 'tap-flow-show' subcommand -def tap_flow_show(args): - api = taas_rest_api() - - retval = api.authenticate() - if retval != SUCCESS: - return retval - - return api.tap_flow_show(args.id) - - -def main(): - parser = argparse.ArgumentParser( - description='Command-line interface \ - to the OpenStack Tap-as-a-Service API') - subparsers = parser.add_subparsers(title='subcommands') - - # Sub-parser for 'tap-service-create' subcommand - parser_tap_service_create = subparsers.add_parser( - 'tap-service-create', - help='Create a tap service for a given tenant') - parser_tap_service_create.add_argument('--name', - dest='name', - required=False, - default='') - parser_tap_service_create.add_argument('--description', - dest='description', - required=False, - default='') - parser_tap_service_create.add_argument('--port-id', - dest='port_id', - required=True) - parser_tap_service_create.add_argument('--network-id', - dest='network_id', - required=True) - parser_tap_service_create.set_defaults(func=tap_service_create) - - # Sub-parser for 'tap-service-delete' subcommand - parser_tap_service_delete = subparsers.add_parser( - 'tap-service-delete', - help='Delete a given tap service') - parser_tap_service_delete.add_argument('id') - parser_tap_service_delete.set_defaults(func=tap_service_delete) - - # Sub-parser for 'tap-service-list' subcommand - parser_tap_service_list = subparsers.add_parser( - 'tap-service-list', - help='List tap services that belong to a given tenant') - parser_tap_service_list.set_defaults(func=tap_service_list) - - # Sub-parser for 'tap-service-show' subcommand - parser_tap_service_show = subparsers.add_parser( - 'tap-service-show', - help='Show information of a given tap service') - parser_tap_service_show.add_argument('id') - parser_tap_service_show.set_defaults(func=tap_service_show) - - # Sub-parser for 'tap-flow-create' subcommand - parser_tap_flow_create = subparsers.add_parser( - 'tap-flow-create', - help='Create a tap flow for a given tap service') - parser_tap_flow_create.add_argument('--name', - dest='name', - required=False, - default='') - parser_tap_flow_create.add_argument('--description', - dest='description', - required=False, - default='') - parser_tap_flow_create.add_argument('--port-id', - dest='port_id', - required=True) - parser_tap_flow_create.add_argument('--direction', - dest='direction', - required=True) - parser_tap_flow_create.add_argument('--tap-service-id', - dest='tap_service_id', - required=True) - parser_tap_flow_create.set_defaults(func=tap_flow_create) - - # Sub-parser for 'tap-flow-delete' subcommand - parser_tap_flow_delete = subparsers.add_parser( - 'tap-flow-delete', - help='Delete a given tap flow') - parser_tap_flow_delete.add_argument('id') - parser_tap_flow_delete.set_defaults(func=tap_flow_delete) - - # Sub-parser for 'tap-flow-list' subcommand - parser_tap_flow_list = subparsers.add_parser( - 'tap-flow-list', - help='List tap flows that belong to given tenant') - parser_tap_flow_list.add_argument('--tap-service-id', - dest='tap_service_id', - required=False, - default=None) - parser_tap_flow_list.set_defaults(func=tap_flow_list) - - # Sub-parser for 'tap-flow-show' subcommand - parser_tap_flow_show = subparsers.add_parser( - 'tap-flow-show', - help='Show information of a given tap flow') - parser_tap_flow_show.add_argument('id') - parser_tap_flow_show.set_defaults(func=tap_flow_show) - - args = parser.parse_args() - - return args.func(args) - - -if __name__ == '__main__': - main() diff --git a/setup.cfg b/setup.cfg index 1cf8609..4dc814e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -46,7 +46,6 @@ output_file = neutron_taas/locale/tap-as-a-service.pot [entry_points] console_scripts = - taas = neutron_taas.taas_cli.taas_cli:main neutron-taas-openvswitch-agent = neutron_taas.services.taas.agents.ovs.agent:main neutron.service_plugins = taas = neutron_taas.services.taas.taas_plugin:TaasPlugin