Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/square/libcrange

The libcrange cluster metadata library.
https://github.com/square/libcrange

Last synced: 8 days ago
JSON representation

The libcrange cluster metadata library.

Awesome Lists containing this project

README

        

libcrange
=========

A library for parsing and generating range expressions.

## Description

A library for parsing and generating range expressions. libcrange for modules to add symbolic name lookup features as well as functions to retreive additional data.

##Requirements

### Red Hat / Scientific / CentOS
* apr apr-devel flex pcre pcre-devel sqlite sqlite-devel libyaml libyaml-devel perl-YAML-Syck perl perl-core perl-devel perl-libs python-devel

### Ubuntu / Debian
* libapr1 libapr1-dev flex libpcre3 libpcre3-dev sqlite3 libsqlite3-dev libsqlite3-0 libyaml-0-2 libyaml-dev libyaml-syck-perl perl-base libperl5.14 libperl-dev

## Range Syntax

### Simple ranges:
* node1,node2,node3,node4 == node1..node4 == node1..4
* node1000..1099 == node1000..99 # auto pads digits to the end of the range
* 1..100 # numeric only ranges
* foo1-2.domain.com == foo1.domain.com-foo2.domain.com # domain support
* 209.131.40.1-209.131.40.255 == 209.131.40.1-255 # IP ranges


### Clusters:
A cluster is a way to store node membership into groups. Depending on your backend module how this is stored may vary. In the case of the YAML module, a cluster is defined by the membership of the CLUSTER key

* %cluster101 == nodes defined in /var/range/cluster101.yaml - Default key CLUSTER
* %cluster101:ALL or %cluster101:FOO == nodes defined in a specific key of ks301/nodes.cf
* %%all == assuming %all is a lust of clusters, the additional % will expand the list of clusters to node list that is their membership
* *node == returns the cluster(s) that node is a member of

### Operatons:
* range1,range2 == union
* range1,-range2 == set difference
* range1,&range2 == intersection
* ^range1 == admins for the nodes in range1
* range1,-(range2,range3) == () can be used for grouping
* range1,&/regex/ # all nodes in range1 that match regex
* range1,-/regex/ # all nodes in range1 that do not match regex

### Advanced ranges:

* foo{1,3,5} == foo1,foo3,foo5
* %cluster30{1,3} == %cluster301,%cluster303
* %cluster301-7 == nodes in clusters cluster301 to cluster307
* %all:KEYS == all defined sections in cluster all
* %{%all} == expands all clusters in %all
* %all:dc1,-({f,k}s301-7) == names for clusters in dc1 except ks301-7,fs301-7
* %all:dc1,-|ks| == clusters in dc1, except those matching ks

### Functions:

libcrange modules can define certain functions to look up data about hosts or clusters The yaml module for instance implements some of the following functions.

* has(KEY;value) - looks for a cluster that has a key with some certain value
* allclusters() - returns a range of all clusters
* * and get_clusters(node) - return the first cluster a node is a member of
* clusters(node) - return all clusters a node is a member of
* has(ENVIRONMENT; production) would return any clusters with the a key called ENVIRONMENT set to production
* mem(CLUSTER; foo.example.com) => which keys under CLUSTER is foo.example.com a member of

Other functions can be added via modules that provide useful insight into your environment

* vlan(host) - return vlan for this host
* dc(host) - return datacenter for this host
* drac(host) - might do an API call on backend to central host db to look up a drac IP for a host

## Install

### Ubuntu

#### Build and install mdbm:

* sudo apt-get update
* sudo apt-get install --yes build-essential git
* sudo apt-get install --yes openssl libssl-dev libcppunit-dev libreadline-dev
* git clone https://github.com/yahoo/mdbm.git
* cd mdbm && sudo make install PREFIX=/usr
* cd /usr/lib && sudo ln ../lib64/libmdbm.so.4

#### Build and install libcrange

* sudo apt-get install -qq libapr1 libapr1-dev flex libpcre3 libpcre3-dev sqlite3 libsqlite3-dev \
libsqlite3-0 libyaml-0-2 libyaml-dev libyaml-syck-perl perl-base libperl5.18 libperl-dev \
rubygems-integration ruby-ffi
* sudo apt-get install -qq automake autoconf m4 flex libfl-dev bison libbison-dev bison-doc libtool
* sudo apt-get install -qq python-pip python-dev libffi-dev
* sudo pip install cffi
* git clone https://github.com/square/libcrange.git
* cd libcrange/source && bash doit.sh && bash testit.sh && sudo make install