
Previous discovery API didn't allowed agents to get dependent resources synchronously, e.g. when discovering some service, get service's configuration file via FileDiscovery agent and have it cached so that subsequent discovery of that file would not produce a new resource. New API changes how discovery is done: agents now represent a caching resource factories, so when you ask for particular resource for the second time, it will return a cached instance. Resources no more accumulated in the main loop but instead collected from agents afterwards. This overcomes the fact that some agent could produce multiple resources while current API allows only one resource to be returned from agent's discover() method. Extended file discovery methods: now you can use wildcards to collect multiple files at once and use search paths (e.g. when you want to search for config file in several directories and collect whichever found first). Cleaned up PEP8 issues regarding unused imports and 'import *'. Added CLI options for discovery_test to output JSON and choose log level. IssueReporter subclasses now won't contain duplicate entries. Change-Id: I7371ccce1e2f3c0a649fe9d6a41b146f04c0f4c1
124 lines
3.1 KiB
Python
124 lines
3.1 KiB
Python
import argparse
|
|
from flask import json
|
|
from itertools import groupby
|
|
import logging
|
|
import sys
|
|
|
|
from rubick.common import MarkedIssue, Inspection
|
|
from rubick.discovery import OpenstackDiscovery
|
|
import rubick.inspections # noqa
|
|
import rubick.schemas # noqa
|
|
from rubick.json import openstack_for_json
|
|
|
|
|
|
def indent_prefix(indent=0):
|
|
s = ''
|
|
if indent > 0:
|
|
for i in range(0, indent):
|
|
s += ' '
|
|
return s
|
|
|
|
|
|
def print_issue(issue, indent=0):
|
|
prefix = indent_prefix(indent)
|
|
|
|
if hasattr(issue, 'mark'):
|
|
print(
|
|
'%s[%s] %s (line %d column %d)' %
|
|
(prefix, issue.type, issue.message,
|
|
issue.mark.line + 1, issue.mark.column + 1))
|
|
else:
|
|
print('%s[%s] %s' % (prefix, issue.type, issue.message))
|
|
|
|
|
|
def print_issues(issues, indent=0):
|
|
issue_source_f = lambda i: i.mark.source if isinstance(
|
|
i, MarkedIssue) else None
|
|
source_groupped_issues = groupby(
|
|
sorted(issues, key=issue_source_f), key=issue_source_f)
|
|
|
|
for source, issues in source_groupped_issues:
|
|
if source:
|
|
print('%sFile %s' % (indent_prefix(indent), source))
|
|
for issue in sorted(issues, key=lambda i: i.mark.line):
|
|
print_issue(issue, indent + 1)
|
|
else:
|
|
for issue in issues:
|
|
print_issue(issue, indent)
|
|
|
|
|
|
def print_service(service):
|
|
print(' ' + service.name)
|
|
print_issues(service.issues, indent=3)
|
|
|
|
|
|
def print_path(path):
|
|
print(' ' + path.path)
|
|
print_issues(path.all_issues, indent=3)
|
|
|
|
|
|
def print_host(host):
|
|
print(host)
|
|
|
|
print_issues(host.issues, indent=1)
|
|
|
|
print(' Services:')
|
|
|
|
for service in sorted(host.components, key=lambda c: c.name):
|
|
print_service(service)
|
|
|
|
print(' Filesystem:')
|
|
|
|
for path in sorted(host.filesystem.values(), key=lambda f: f.path):
|
|
print_path(path)
|
|
|
|
|
|
def print_openstack(openstack):
|
|
print_issues(openstack.issues)
|
|
|
|
for host in openstack.hosts:
|
|
print_host(host)
|
|
|
|
|
|
def parse_args(argv):
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-l', '--loglevel', default='INFO',
|
|
help='Loglevel to use')
|
|
parser.add_argument('-j', '--json', dest='json', default=False,
|
|
action='store_true',
|
|
help='Output result in JSON format')
|
|
args = parser.parse_args(argv[1:])
|
|
return args
|
|
|
|
|
|
def main(argv):
|
|
args = parse_args(argv)
|
|
params = vars(args)
|
|
|
|
logging.basicConfig(level=logging.WARNING)
|
|
logging.getLogger('rubick').setLevel(params['loglevel'])
|
|
|
|
discovery = OpenstackDiscovery()
|
|
try:
|
|
with open('test_rsa') as f:
|
|
private_key = f.read()
|
|
except Exception:
|
|
private_key = sys.stdin.read()
|
|
|
|
openstack = discovery.discover(
|
|
['172.18.65.179'],
|
|
private_key=private_key)
|
|
|
|
all_inspections = Inspection.all_inspections()
|
|
for inspection in all_inspections:
|
|
x = inspection()
|
|
x.inspect(openstack)
|
|
|
|
if params['json']:
|
|
print(json.dumps(openstack_for_json(openstack)))
|
|
else:
|
|
print_openstack(openstack)
|
|
|
|
if __name__ == '__main__':
|
|
main(sys.argv)
|