Remove old TaaS CLI repo, update API reference
With the introduction of NeutronExtension for TaaS, the previous TaaS CLI repository is not required anymore. Therefore this patch removes the old TaaS CLI repo. Also, with the introduction of the Neutron base TaaS CLI, the API reference document is updated. Change-Id: Iade483ab93583c5699ceee2259e3c309c3c5bb10
This commit is contained in:
parent
22af25fa1f
commit
87c469126c
@ -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'.
|
||||
|
@ -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
|
@ -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()
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user