os-faults/os_faults/cmd/main.py

89 lines
2.9 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.
import logging
import click
import yaml
import os_faults
from os_faults import registry
READABLE_FILE = click.Path(dir_okay=False, readable=True, exists=True,
resolve_path=True)
WRITABLE_FILE = click.Path(dir_okay=False, writable=True, resolve_path=True)
config_option = click.option('-c', '--config', type=READABLE_FILE,
help='path to os-faults cloud connection config')
def print_version(ctx, param, value):
if not value or ctx.resilient_parsing:
return
click.echo('Version: %s' % os_faults.get_release())
ctx.exit()
@click.group()
@click.option('--debug', '-d', is_flag=True, help='Enable debug logs')
@click.option('--version', is_flag=True, callback=print_version,
expose_value=False, is_eager=True, help='Show version and exit.')
def main(debug):
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s',
level=logging.DEBUG if debug else logging.INFO)
@main.command()
@config_option
def verify(config):
"""Verify connection to the cloud"""
config = config or os_faults.get_default_config_file()
destructor = os_faults.connect(config_filename=config)
destructor.verify()
@main.command()
@click.argument('output', type=WRITABLE_FILE)
@config_option
def discover(config, output):
"""Discover services/nodes and save them to output config file"""
config = config or os_faults.get_default_config_file()
with open(config) as f:
cloud_config = yaml.safe_load(f.read())
discovered_config = os_faults.discover(cloud_config)
with open(output, 'w') as f:
f.write(yaml.safe_dump(discovered_config, default_flow_style=False))
click.echo('Saved {}'.format(output))
@main.command()
@config_option
def nodes(config):
"""List cloud nodes"""
config = config or os_faults.get_default_config_file()
destructor = os_faults.connect(config_filename=config)
hosts = [{'ip': host.ip, 'mac': host.mac, 'fqdn': host.fqdn}
for host in destructor.get_nodes().hosts]
click.echo(yaml.safe_dump(hosts, default_flow_style=False), nl=False)
@main.command()
def drivers():
"""List os-faults drivers"""
drivers = sorted(registry.get_drivers().keys())
click.echo(yaml.safe_dump(drivers, default_flow_style=False), nl=False)
if __name__ == '__main__':
main()