nfifo
Version:
Simple node.js lib and cli that connects with a Project-FiFo API
128 lines (110 loc) • 3.35 kB
JavaScript
var Table = require('cli-table'),
Stream = require('stream'),
util = require('util')
var Writable = Stream.Writable
util.inherits(TableStream, Writable)
function TableStream(opts) {
Writable.call(this, opts)
this.text = ''
this.resource = opts.resource
}
TableStream.prototype._write = function(chunk, encoding, cb) {
this.text += chunk.toString()
cb()
}
TableStream.prototype.end = function() {
var txt = buildTable(this.resource, JSON.parse(this.text))
console.log(txt)
}
var rowsDefinition = {
packages: [
{title: 'Name', getter: 'name'},
{title: 'Ram', getter: 'ram'},
{title: 'Cpu Cap', getter: 'cpu_cap'},
{title: 'Quota', getter: 'quota'},
{title: 'Compression', getter: 'compression'},
],
vms: [
{title: 'Alias', getter: 'config.alias'},
{title: 'State', getter: 'state'},
{title: 'IP', getter: 'config.networks[0].ip'},
{title: 'Ram', getter: 'config.ram'},
{title: 'Cpu Cap', getter: 'config.cpu_cap'},
{title: 'Cpu Share', getter: 'config.cpu_shares'},
{title: 'Type', getter: 'config.type'},
{title: 'Package', getter: 'package'},
{title: 'Dataset', getter: 'config.dataset'},
{title: 'Server', getter: 'hypervisor'},
],
datasets: [
{title: 'Name', getter: 'name'},
{title: 'Version', getter: 'version'},
{title: 'OS', getter: 'os'},
{title: 'Type', getter: 'type'},
{title: 'Imported', getter: 'imported'},
{title: 'Image Size', getter: 'image_size'},
],
hypervisors: [
{title: 'Alias', getter: 'alias'},
{title: 'Host', getter: 'host'},
{title: 'Networks', getter: 'networks.join(", ")'},
{title: 'Pool status', getter: 'pools.zones.health'},
{title: 'Pool free space', getter: 'pools.zones.free'},
{title: 'Total memory', getter: 'resources["total-memory"]'},
{title: 'Free memory', getter: 'resources["free-memory"]'},
{title: 'Product', getter: 'sysinfo.Product'},
{title: 'vCPUs', getter: 'sysinfo["CPU Total Cores"]'},
{title: 'Raid', getter: 'sysinfo["Zpool Profile"]'},
],
users: [
{title: 'Name', getter: 'name'},
{title: 'Active Org', getter: 'org'},
],
networks: [
{title: 'Name', getter: 'name'},
],
ipranges: [
{title: 'Name', getter: 'name'},
{title: 'Tag', getter: 'tag'},
{title: 'Network', getter: 'network'},
{title: 'Netmask', getter: 'netmask'},
{title: 'Gateway', getter: 'gateway'},
{title: 'Used IPs', getter: 'used.length'},
{title: 'Free IPs', getter: 'free.length'},
],
orgs: [
{title: 'Name', getter: 'name'},
],
roles: [
{title: 'Name', getter: 'name'},
],
dtrace: [
{title: 'Name', getter: 'name'},
],
}
function getValue(row, getter) {
//TODO: eval is evil!
var val = eval('row.' + getter)
//If its a uuid, print a shorter version..
if (val && val.length == 36 && val.split('-').length == 5)
return val.split('-')[0]
return val
}
function buildTable(resource, json) {
var definition = rowsDefinition[resource],
table = new Table({
head: ['UUID'].concat(definition.map(function(r) {return r.title})),
chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''},
style: {head: ['green'], border: ['black']}
})
json.forEach(function(row) {
var h = {},
key = row.uuid
h[key] = definition.map(function(def, idx) {
return getValue(row, def.getter) || ''
})
table.push(h)
})
return table.toString()
}
module.exports = TableStream