virtualbmc/virtualbmc/cmd/vbmc.py

155 lines
6.2 KiB
Python

# 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 __future__ import print_function
import argparse
import sys
from prettytable import PrettyTable
import virtualbmc
from virtualbmc import exception
from virtualbmc.manager import VirtualBMCManager
def main():
parser = argparse.ArgumentParser(
prog='Virtual BMC',
description='A virtual BMC for controlling virtual instances',
)
parser.add_argument('--version', action='version',
version=virtualbmc.__version__)
subparsers = parser.add_subparsers()
# create the parser for the "add" command
parser_add = subparsers.add_parser('add', help='Add a new virtual BMC')
parser_add.set_defaults(command='add')
parser_add.add_argument('domain_name',
help='The name of the virtual machine')
parser_add.add_argument('--username',
dest='username',
default='admin',
help='The BMC username; defaults to "admin"')
parser_add.add_argument('--password',
dest='password',
default='password',
help='The BMC password; defaults to "password"')
parser_add.add_argument('--port',
dest='port',
type=int,
default=623,
help='Port to listen on; defaults to 623')
parser_add.add_argument('--address',
dest='address',
default='::',
help='The IPv6 address to bind to; defaults to ::')
parser_add.add_argument('--libvirt-uri',
dest='libvirt_uri',
default="qemu:///system",
help=('The libvirt URI; defaults to '
'"qemu:///system"'))
parser_add.add_argument('--libvirt-sasl-username',
dest='libvirt_sasl_username',
default=None,
help=('The libvirt SASL username; defaults to '
'None'))
parser_add.add_argument('--libvirt-sasl-password',
dest='libvirt_sasl_password',
default=None,
help=('The libvirt SASL password; defaults to '
'None'))
# create the parser for the "delete" command
parser_delete = subparsers.add_parser('delete',
help='Delete a virtual BMC')
parser_delete.set_defaults(command='delete')
parser_delete.add_argument('domain_names', nargs='+',
help='A list of virtual machine names')
# create the parser for the "start" command
parser_start = subparsers.add_parser('start', help='Start a virtual BMC')
parser_start.set_defaults(command='start')
parser_start.add_argument('domain_name',
help='The name of the virtual machine')
# create the parser for the "stop" command
parser_stop = subparsers.add_parser('stop', help='Stop a virtual BMC')
parser_stop.set_defaults(command='stop')
parser_stop.add_argument('domain_names', nargs='+',
help='A list of virtual machine names')
# create the parser for the "list" command
parser_stop = subparsers.add_parser('list', help='list all virtual BMCs')
parser_stop.set_defaults(command='list')
# create the parser for the "show" command
parser_stop = subparsers.add_parser('show', help='Show a virtual BMCs')
parser_stop.set_defaults(command='show')
parser_stop.add_argument('domain_name',
help='The name of the virtual machine')
args = parser.parse_args()
manager = VirtualBMCManager()
try:
if args.command == 'add':
# Check if the username and password were given for SASL
sasl_user = args.libvirt_sasl_username
sasl_pass = args.libvirt_sasl_password
if any((sasl_user, sasl_pass)):
if not all((sasl_user, sasl_pass)):
print("A password and username are required to use "
"Libvirt's SASL authentication", file=sys.stderr)
exit(1)
manager.add(username=args.username, password=args.password,
port=args.port, address=args.address,
domain_name=args.domain_name,
libvirt_uri=args.libvirt_uri,
libvirt_sasl_username=sasl_user,
libvirt_sasl_password=sasl_pass)
elif args.command == 'delete':
for domain in args.domain_names:
manager.delete(domain)
elif args.command == 'start':
manager.start(args.domain_name)
elif args.command == 'stop':
for domain in args.domain_names:
manager.stop(domain)
elif args.command == 'list':
ptable = PrettyTable(['Domain name', 'Status', 'Address', 'Port'])
for bmc in manager.list():
ptable.add_row([bmc['domain_name'], bmc['status'],
bmc['address'], bmc['port']])
print(ptable)
elif args.command == 'show':
ptable = PrettyTable(['Property', 'Value'])
bmc = manager.show(args.domain_name)
for key, val in sorted(bmc.items()):
ptable.add_row([key, val])
print(ptable)
except exception.VirtualBMCError as e:
print(e, file=sys.stderr)
exit(1)
if __name__ == '__main__':
main()