176 lines
4.4 KiB
Python
176 lines
4.4 KiB
Python
import click
|
|
import json
|
|
import matplotlib
|
|
matplotlib.use('Agg') # don't show windows
|
|
import matplotlib.pyplot as plt
|
|
import networkx as nx
|
|
import os
|
|
|
|
from x import actions as xa
|
|
from x import deployment as xd
|
|
from x import resource as xr
|
|
from x import signals as xs
|
|
|
|
|
|
@click.group()
|
|
def cli():
|
|
pass
|
|
|
|
|
|
def init_cli_resource():
|
|
@click.group()
|
|
def resource():
|
|
pass
|
|
|
|
cli.add_command(resource)
|
|
|
|
@click.command()
|
|
@click.argument('resource_path')
|
|
@click.argument('action_name')
|
|
def action(action_name, resource_path):
|
|
print 'action', resource_path, action_name
|
|
r = xr.load(resource_path)
|
|
xa.resource_action(r, action_name)
|
|
|
|
resource.add_command(action)
|
|
|
|
@click.command()
|
|
@click.argument('name')
|
|
@click.argument('base_path')
|
|
@click.argument('dest_path')
|
|
@click.argument('args')
|
|
def create(args, dest_path, base_path, name):
|
|
print 'create', name, base_path, dest_path, args
|
|
args = json.loads(args)
|
|
xr.create(name, base_path, dest_path, args)
|
|
|
|
resource.add_command(create)
|
|
|
|
@click.command()
|
|
@click.argument('resource_path')
|
|
@click.argument('tag_name')
|
|
@click.option('--add/--delete', default=True)
|
|
def tag(add, tag_name, resource_path):
|
|
print 'Tag', resource_path, tag_name, add
|
|
r = xr.load(resource_path)
|
|
if add:
|
|
r.add_tag(tag_name)
|
|
else:
|
|
r.remove_tag(tag_name)
|
|
r.save()
|
|
|
|
resource.add_command(tag)
|
|
|
|
@click.command()
|
|
@click.argument('path')
|
|
@click.option('--all/--one', default=False)
|
|
@click.option('--tag', default=None)
|
|
def show(tag, all, path):
|
|
if all or tag:
|
|
for name, resource in xr.load_all(path).items():
|
|
show = True
|
|
if tag:
|
|
if tag not in resource.tags:
|
|
show = False
|
|
|
|
if show:
|
|
print resource
|
|
print
|
|
else:
|
|
print xr.load(path)
|
|
|
|
resource.add_command(show)
|
|
|
|
@click.command()
|
|
@click.argument('path')
|
|
@click.argument('args')
|
|
def update(args, path):
|
|
print 'Update', path, args
|
|
args = json.loads(args)
|
|
# Need to load all resources for bubbling effect to take place
|
|
# TODO: resources can be scattered around, this is a simple
|
|
# situation when we assume resources are all in one directory
|
|
base_path, name = os.path.split(path)
|
|
all = xr.load_all(base_path)
|
|
r = all[name]
|
|
r.update(args)
|
|
|
|
resource.add_command(update)
|
|
|
|
|
|
def init_cli_connect():
|
|
@click.command()
|
|
@click.argument('emitter')
|
|
@click.argument('receiver')
|
|
@click.option('--mapping', default=None)
|
|
def connect(mapping, receiver, emitter):
|
|
print 'Connect', emitter, receiver
|
|
emitter = xr.load(emitter)
|
|
receiver = xr.load(receiver)
|
|
print emitter
|
|
print receiver
|
|
if mapping is not None:
|
|
mapping = json.loads(mapping)
|
|
xs.connect(emitter, receiver, mapping=mapping)
|
|
|
|
cli.add_command(connect)
|
|
|
|
@click.command()
|
|
@click.argument('emitter')
|
|
@click.argument('receiver')
|
|
def disconnect(receiver, emitter):
|
|
print 'Disconnect', emitter, receiver
|
|
emitter = xr.load(emitter)
|
|
receiver = xr.load(receiver)
|
|
print emitter
|
|
print receiver
|
|
xs.disconnect(emitter, receiver)
|
|
|
|
cli.add_command(disconnect)
|
|
|
|
|
|
def init_cli_connections():
|
|
@click.group()
|
|
def connections():
|
|
pass
|
|
|
|
cli.add_command(connections)
|
|
|
|
@click.command()
|
|
def show():
|
|
print json.dumps(xs.CLIENTS, indent=2)
|
|
|
|
connections.add_command(show)
|
|
|
|
# TODO: this requires graphing libraries
|
|
@click.command()
|
|
def graph():
|
|
g = xs.connection_graph()
|
|
pos = nx.spring_layout(g)
|
|
nx.draw_networkx_nodes(g, pos)
|
|
nx.draw_networkx_edges(g, pos, arrows=True)
|
|
nx.draw_networkx_labels(g, pos)
|
|
plt.axis('off')
|
|
plt.savefig('graph.png')
|
|
|
|
connections.add_command(graph)
|
|
|
|
|
|
def init_cli_deployment_config():
|
|
@click.command()
|
|
@click.argument('filepath')
|
|
def deploy(filepath):
|
|
print 'Deploying from file {}'.format(filepath)
|
|
xd.deploy(filepath)
|
|
|
|
cli.add_command(deploy)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
init_cli_resource()
|
|
init_cli_connect()
|
|
init_cli_connections()
|
|
init_cli_deployment_config()
|
|
|
|
cli()
|