function controller_status(data_source){
/*    var data = [{name:'onos9vpc',  onos: 1, cassandra: 1},
		{name:'onos10vpc', onos: 0, cassandra: 1},
		{name:'onos11vpc', onos: 1, cassandra: 1},
		{name:'onos12vpc', onos: 0, cassandra: 1}] */

    var barWidth = 100;
    var width = (barWidth + 10) * 4
    var height = 50;


    var Servers = d3.select("#servers").
	append("svg:svg").
	attr("width", 800).
	attr("height", 30);

    var ContStatus = d3.select("#onos-status").
	append("svg:svg").
	attr("width", 800).
	attr("height", 50);

    var CassandraStatus = d3.select("#cassandra-status").
	append("svg:svg").
	attr("width", 800).
	attr("height", 50);

    d3.json(data_source, draw);

    function draw(json){
//	var data = json.data;
	var data = json;
	var server = Servers.selectAll("text").data(data);
	var controller_rect = ContStatus.selectAll("rect").data(data);
	var controller_text = ContStatus.selectAll("text").data(data);
	var cassandra_rect = CassandraStatus.selectAll("rect").data(data);
	var cassandra_text = CassandraStatus.selectAll("text").data(data);

	var x = d3.scale.linear().domain([0, data.length]).range([0, width]);
	var y = d3.scale.linear().domain([0, d3.max(data, function(datum) { return datum.onos; })]).rangeRound([0, height]);
	var y2 = d3.scale.linear().domain([0, d3.max(data, function(datum) { return datum.cassandra; })]).rangeRound([0, height]);

	console.log(data)
	server.
	    enter().
	    append("svg:text").
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return 20; }).
	    text(function(datum) { return datum.name; });

	controller_rect.
	    enter().
	    append("svg:rect").
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return height - y(datum.onos); }).
	    attr("height", function(datum) { return y(datum.onos); }).
	    attr("width", barWidth).
	    attr("fill", "#2d578b");

	controller_text.
	    enter().
	    append("svg:text").
	    text(function(){return "ONOS"}).
	    attr("x", function(datum, index) { return x(index)+10; }).
	    attr("y", function(datum) { return 30 ; }).
	    attr("height", function(datum) { return y(datum.onos); }).
	    attr("width", barWidth).
	    attr('fill', 'white'); 

	cassandra_rect.
	    enter().
	    append("svg:rect").
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return height - y2(datum.cassandra); }).
	    attr("height", function(datum) { return y2(datum.cassandra); }).
	    attr("width", barWidth).
	    attr("fill", "#aa0000");

	cassandra_text.
	    enter().
	    append("svg:text").
	    text(function(){return "Cassandra"}).
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return 30 ; }).
	    attr("height", function(datum) { return y(datum.onos); }).
	    attr("width", barWidth).
	    attr('fill', 'white'); 

	controller_rect.
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return height - y(datum.onos); }).
	    attr("height", function(datum) { return y(datum.onos); }).
	    attr("width", barWidth).
	    attr("fill", "#2d578b");

	controller_text.
	    text(function(){return "ONOS"}).
	    attr("x", function(datum, index) { return x(index)+10; }).
	    attr("y", function(datum) { return 30 ; }).
	    attr("height", function(datum) { return y(datum.onos); }).
	    attr("width", barWidth).
	    attr('fill', 'white'); 

	cassandra_rect.
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return height - y2(datum.cassandra); }).
	    attr("height", function(datum) { return y2(datum.cassandra); }).
	    attr("width", barWidth).
	    attr("fill", "#aa0000");

	cassandra_text.
	    text(function(){return "Cassandra"}).
	    attr("x", function(datum, index) { return x(index); }).
	    attr("y", function(datum) { return 30 ; }).
	    attr("height", function(datum) { return y(datum.cassandra); }).
	    attr("width", barWidth).
	    attr('fill', 'white'); 


	server.exit().remove();
	controller_rect.exit().remove();
	controller_text.exit().remove();
	cassandra_rect.exit().remove();
	cassandra_text.exit().remove();
    }
    $("#more").click( function() {
        $.ajax({
	    url: 'http://gui.onlab.us:8080/controller_status1',
	    success: function(json) {
		draw(json);
	    },
	    dataType: "json"
        });
    });
    $("#less").click( function() {
        $.ajax({
	    url: 'http://gui.onlab.us:8080/controller_status2',
	    success: function(json) {
		draw(json);
	    },
	    dataType: "json"
        });
    });

}

