Change-Id: I15ff94437501318f148c62e39d64b43c951d46f6
This commit is contained in:
Fabio Verboso 2018-07-10 10:57:16 +02:00
parent 5c3a1641cc
commit e8d5d5fe1b
8 changed files with 278 additions and 10 deletions

View File

@ -125,8 +125,8 @@ def get_client(api_version, os_auth_token=None, iotronic_url=None,
if session: if session:
try: try:
# Pass the endpoint, it will be used to get hostname # Pass the endpoint, it will be used to get hostname
# and port that will be used for API version caching. It will # and port.py that will be used for API version caching.
# be also set as endpoint_override. # It will be also set as endpoint_override.
endpoint = session.get_endpoint( endpoint = session.get_endpoint(
service_type=os_service_type, service_type=os_service_type,
interface=os_endpoint_type, interface=os_endpoint_type,

View File

@ -75,7 +75,7 @@ def save_data(host, port, data):
"""Save 'data' for a particular 'host' in the appropriate cache dir. """Save 'data' for a particular 'host' in the appropriate cache dir.
param host: The host that we need to save data for param host: The host that we need to save data for
param port: The port on the host that we need to save data for param port.py: The port.py on the host that we need to save data for
param data: The data we want saved param data: The data we want saved
""" """
key = _build_key(host, port) key = _build_key(host, port)
@ -85,11 +85,11 @@ def save_data(host, port, data):
def retrieve_data(host, port, expiry=None): def retrieve_data(host, port, expiry=None):
"""Retrieve the version stored for an iotronic 'host', if it's not stale. """Retrieve the version stored for an iotronic 'host', if it's not stale.
Check to see if there is valid cached data for the host/port Check to see if there is valid cached data for the host/port.py
combination and return that if it isn't stale. combination and return that if it isn't stale.
param host: The host that we need to retrieve data for param host: The host that we need to retrieve data for
param port: The port on the host that we need to retrieve data for param port.py: The port.py on the host that we need to retrieve data for
param expiry: The age in seconds before cached data is deemed invalid param expiry: The age in seconds before cached data is deemed invalid
""" """
# Ensure that a cache file exists first # Ensure that a cache file exists first

View File

@ -81,7 +81,7 @@ def _extract_error_json(body):
def get_server(endpoint): def get_server(endpoint):
"""Extract and return the server & port that we're connecting to.""" """Extract and return the server & port.py that we're connecting to."""
if endpoint is None: if endpoint is None:
return None, None return None, None
parts = urlparse.urlparse(endpoint) parts = urlparse.urlparse(endpoint)
@ -440,7 +440,7 @@ class VerifiedHTTPSConnection(six.moves.http_client.HTTPSConnection):
self.insecure = insecure self.insecure = insecure
def connect(self): def connect(self):
"""Connect to a host on a given (SSL) port. """Connect to a host on a given (SSL) port.py.
If ca_file is pointing somewhere, use it to check Server Certificate. If ca_file is pointing somewhere, use it to check Server Certificate.

View File

@ -22,6 +22,7 @@ from iotronicclient.v1 import board
from iotronicclient.v1 import exposed_service from iotronicclient.v1 import exposed_service
from iotronicclient.v1 import plugin from iotronicclient.v1 import plugin
from iotronicclient.v1 import plugin_injection from iotronicclient.v1 import plugin_injection
from iotronicclient.v1 import port
from iotronicclient.v1 import service from iotronicclient.v1 import service
@ -66,3 +67,7 @@ class Client(object):
self.service = service.ServiceManager(self.http_client) self.service = service.ServiceManager(self.http_client)
self.exposed_service = exposed_service.ExposedServiceManager( self.exposed_service = exposed_service.ExposedServiceManager(
self.http_client) self.http_client)
self.port = port.PortManager(
self.http_client)
self.portonboard = port.PortOnBoardManager(
self.http_client)

102
iotronicclient/v1/port.py Normal file
View File

@ -0,0 +1,102 @@
# 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 logging
from iotronicclient.common import base
from iotronicclient.common.i18n import _
from iotronicclient.common import utils
from iotronicclient import exc
LOG = logging.getLogger(__name__)
_DEFAULT_POLL_INTERVAL = 2
class Port(base.Resource):
def __repr__(self):
return "<Port %s>" % self._info
class PortOnBoardManager(base.Manager):
resource_class = Port
_resource_name = 'boards'
def attach_port(self, board_ident, network_ident, subnetwork_ident):
path = "%s/ports" % board_ident
body = {"network": network_ident,
"subnet": subnetwork_ident}
return self._update(path, body, method='PUT')
def detach_port(self, board_ident, port_ident):
path = "%s/ports/" % board_ident
path = path + port_ident
return self._delete(resource_id=path)
class PortManager(base.Manager):
resource_class = Port
_resource_name = 'ports'
def list(self, marker=None, limit=None,
detail=False, sort_key=None, sort_dir=None, fields=None):
"""Retrieve a list of ports.
:param marker: Optional, the UUID of a port, eg the last
port from a previous result set. Return
the next result set.
:param limit: The maximum number of results to return per
request, if:
1) limit > 0, the maximum number of ports to return.
2) limit == 0, return the entire list of ports.
3) limit param is NOT specified (None), the number of items
returned respect the maximum imposed by the Iotronic API
(see Iotronic's api.max_limit option).
:param detail: Optional, boolean whether to return detailed information
about ports.
:param sort_key: Optional, field used for sorting.
:param sort_dir: Optional, direction of sorting, either 'asc' (the
default) or 'desc'.
:param fields: Optional, a list with a specified set of fields
of the resource to be returned. Can not be used
when 'detail' is set.
:returns: A list of ports.
"""
if limit is not None:
limit = int(limit)
if detail and fields:
raise exc.InvalidAttribute(_("Can't fetch a subset of fields "
"with 'detail' set"))
filters = utils.common_filters(marker, limit, sort_key, sort_dir,
fields)
path = ''
if detail:
path += 'detail'
if filters:
path += '?' + '&'.join(filters)
if limit is None:
return self._list(self._path(path), "ports")
else:
return self._list_pagination(self._path(path), "ports",
limit=limit)

View File

@ -0,0 +1,131 @@
# 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.
from iotronicclient.common import cliutils
from iotronicclient.common import utils
from iotronicclient.v1 import resource_fields as res_fields
def _print_port_show(port, fields=None, json=False):
if fields is None:
fields = res_fields.PORT_RESOURCE.fields
data = dict(
[(f, getattr(port, f, '')) for f in fields])
cliutils.print_dict(data, wrap=72, json_flag=json)
@cliutils.arg('board',
metavar='<board>',
help="Name or UUID of the board.")
@cliutils.arg('port',
metavar='<port>',
help="Name or UUID of the port.")
def do_port_detach(cc, args):
"""Detach a port from a board."""
cc.portonboard.detach_port(args.board, args.port)
'''
try:
cc.port.attach_port(args.board, args.port)
print(_('Port %(port)s has been detached from board %(board)s') % {
'board': args.board, 'port': args.port})
except exceptions.ClientException as e:
exceptions.ClientException(
"Failed to detach port on board %(board)s: %(error)s" % {
'board': args.board, 'error': e})
'''
@cliutils.arg('board',
metavar='<board>',
help="Name or UUID of the board.")
@cliutils.arg('network',
metavar='<network>',
help="Name or UUID of the network.")
@cliutils.arg('subnetwork',
metavar='<subnetwork>',
help="Name or UUID of the subnetwork.")
def do_port_attach(cc, args):
"""Attach a port to a board."""
port = cc.portonboard.attach_port(args.board, args.network,
args.subnetwork)
_print_port_show(port)
@cliutils.arg(
'--limit',
metavar='<limit>',
type=int,
help='Maximum number of ports to return per request, '
'0 for no limit. Default is the maximum number used '
'by the Iotronic API Service.')
@cliutils.arg(
'--marker',
metavar='<port>',
help='Service UUID (for example, of the last port in the list from '
'a previous request). Returns the list of ports after this UUID.')
@cliutils.arg(
'--sort-key',
metavar='<field>',
help='Service field that will be used for sorting.')
@cliutils.arg(
'--sort-dir',
metavar='<direction>',
choices=['asc', 'desc'],
help='Sort direction: "asc" (the default) or "desc".')
@cliutils.arg(
'--detail',
dest='detail',
action='store_true',
default=False,
help="Show detailed information about the ports.")
@cliutils.arg(
'--fields',
nargs='+',
dest='fields',
metavar='<field>',
action='append',
default=[],
help="One or more port fields. Only these fields will be fetched from "
"the server. Can not be used when '--detail' is specified.")
def do_port_list(cc, args):
"""List the ports which are registered with the Iotronic port."""
params = {}
if args.detail:
fields = res_fields.PORT_DETAILED_RESOURCE.fields
field_labels = res_fields.PORT_DETAILED_RESOURCE.labels
elif args.fields:
utils.check_for_invalid_fields(
args.fields[0], res_fields.PORT_DETAILED_RESOURCE.fields)
resource = res_fields.Resource(args.fields[0])
fields = resource.fields
field_labels = resource.labels
else:
fields = res_fields.PORT_RESOURCE.fields
field_labels = res_fields.PORT_RESOURCE.labels
sort_fields = res_fields.PORT_DETAILED_RESOURCE.sort_fields
sort_field_labels = res_fields.PORT_DETAILED_RESOURCE.sort_labels
params.update(utils.common_params_for_list(args,
sort_fields,
sort_field_labels))
ports = cc.port.list(**params)
cliutils.print_list(ports, fields,
field_labels=field_labels,
sortby_index=None,
json_flag=args.json)

View File

@ -58,6 +58,10 @@ class Resource(object):
'public_port': 'Public Port', 'public_port': 'Public Port',
'pid': 'Pid', 'pid': 'Pid',
'protocol': 'Protocol', 'protocol': 'Protocol',
'MAC_add': 'Mac Address',
'VIF_name': 'VIF',
'network': 'Network',
'ip': 'ip'
# #
# 'address': 'Address', # 'address': 'Address',
@ -159,7 +163,7 @@ BOARD_DETAILED_RESOURCE = Resource(
'updated_at', 'updated_at',
'location', 'location',
'project', 'project',
'owner', 'owner'
], ],
sort_excluded=[ sort_excluded=[
@ -230,7 +234,6 @@ SERVICE_DETAILED_RESOURCE = Resource(
'extra', 'extra',
]) ])
SERVICE_RESOURCE = Resource( SERVICE_RESOURCE = Resource(
['uuid', ['uuid',
'name', 'name',
@ -253,3 +256,29 @@ EXPOSED_SERVICE_RESOURCE = Resource(
'created_at', 'created_at',
'updated_at', 'updated_at',
]) ])
PORT_RESOURCE = Resource(
['uuid',
'MAC_add',
'VIF_name',
'network',
'board_uuid',
'ip'
]
)
# Service
PORT_DETAILED_RESOURCE = Resource(
['uuid',
'MAC_add',
'VIF_name',
'network',
'ip',
'board_uuid',
'extra',
'created_at',
'updated_at',
],
sort_excluded=[
'extra',
])

View File

@ -16,15 +16,16 @@ from iotronicclient.v1 import board_shell
from iotronicclient.v1 import exposed_service_shell from iotronicclient.v1 import exposed_service_shell
from iotronicclient.v1 import plugin_injection_shell from iotronicclient.v1 import plugin_injection_shell
from iotronicclient.v1 import plugin_shell from iotronicclient.v1 import plugin_shell
from iotronicclient.v1 import port_shell
from iotronicclient.v1 import service_shell from iotronicclient.v1 import service_shell
COMMAND_MODULES = [ COMMAND_MODULES = [
board_shell, board_shell,
plugin_shell, plugin_shell,
plugin_injection_shell, plugin_injection_shell,
service_shell, service_shell,
exposed_service_shell, exposed_service_shell,
port_shell,
] ]