config/sysinv/cgts-client/cgts-client/cgtsclient/v1/address_pool_shell.py

141 lines
4.4 KiB
Python

#!/usr/bin/env python
#
# Copyright (c) 2015 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# All Rights Reserved.
#
from cgtsclient.common import utils
from cgtsclient import exc
def _address_range_formatter(values):
result = []
for start, end in values:
result.append(str(start) + "-" + str(end))
return result
def _address_range_pool_formatter(pool):
return _address_range_formatter(pool.ranges)
def _print_address_pool_show(obj):
fields = ['uuid', 'name', 'network', 'prefix', 'order', 'ranges',
'floating_address', 'controller0_address', 'controller1_address',
'gateway_address']
data = [(f, getattr(obj, f, '')) for f in fields]
utils.print_tuple_list(
data, formatters={'ranges': _address_range_formatter})
@utils.arg('address_pool_uuid',
metavar='<address_pool_uuid>',
help="UUID of IP address pool")
def do_addrpool_show(cc, args):
"""Show IP address pool attributes."""
address_pool = cc.address_pool.get(args.address_pool_uuid)
_print_address_pool_show(address_pool)
def do_addrpool_list(cc, args):
"""List IP address pools."""
address_pools = cc.address_pool.list()
fields = ['uuid', 'name', 'network', 'prefix', 'order', 'ranges',
'floating_address', 'controller0_address', 'controller1_address',
'gateway_address']
utils.print_list(address_pools, fields, fields, sortby=1,
formatters={'ranges': _address_range_pool_formatter})
@utils.arg('address_pool_uuid',
metavar='<address_pool uuid>',
help="UUID of IP address pool entry")
def do_addrpool_delete(cc, args):
"""Delete an IP address pool."""
cc.address_pool.delete(args.address_pool_uuid)
print 'Deleted address pool: %s' % (args.address_pool_uuid)
def _get_range_tuples(data):
"""Split the ranges field from a comma separated list of start-end to a
real list of (start, end) tuples.
"""
ranges = []
for r in data['ranges'].split(',') or []:
start, end = r.split('-')
ranges.append((start, end))
return ranges
@utils.arg('name',
metavar='<name>',
help="Name of the Address Pool [REQUIRED]")
@utils.arg('network',
metavar='<network address>',
help="Network IP address [REQUIRED]")
@utils.arg('prefix',
metavar='<network prefix>',
help="Network IP address prefix length [REQUIRED]")
@utils.arg('--ranges',
metavar='<start-end>,[<start-end],...',
help="The inclusive range of addresses to allocate")
@utils.arg('--order',
metavar='<sequential | random>',
help="The allocation order within the start/end range")
def do_addrpool_add(cc, args):
"""Add an IP address pool."""
field_list = ['name', 'network', 'prefix', 'order', 'ranges']
# Prune input fields down to required/expected values
data = dict((k, v) for (k, v) in vars(args).items()
if k in field_list and not (v is None))
if 'ranges' in data:
data['ranges'] = _get_range_tuples(data)
address_pool = cc.address_pool.create(**data)
uuid = getattr(address_pool, 'uuid', '')
try:
address_pool = cc.address_pool.get(uuid)
except exc.HTTPNotFound:
raise exc.CommandError('Created address pool UUID not found: %s' % uuid)
_print_address_pool_show(address_pool)
@utils.arg('address_pool_uuid',
metavar='<address_pool uuid>',
help="UUID of IP address pool entry")
@utils.arg('--name',
metavar='<name>',
help="Name of the Address Pool]")
@utils.arg('--ranges',
metavar='<start-end>,[<start-end],...',
help="The inclusive range of addresses to allocate")
@utils.arg('--order',
metavar='<sequential | random>',
help="The allocation order within the start/end range")
def do_addrpool_modify(cc, args):
"""Modify interface attributes."""
rwfields = ['name', 'ranges', 'order']
data = dict((k, v) for (k, v) in vars(args).items()
if k in rwfields and not (v is None))
if 'ranges' in data:
data['ranges'] = _get_range_tuples(data)
patch = []
for (k, v) in data.items():
patch.append({'op': 'replace', 'path': '/' + k, 'value': v})
address_pool = cc.address_pool.update(args.address_pool_uuid, patch)
_print_address_pool_show(address_pool)