kaanalnet
Version:
Virtual Network Emulator Lab for SDN and traditional networks
257 lines (231 loc) • 7.54 kB
JavaScript
// Generated by CoffeeScript 1.9.3
(function() {
var Schema, SwitchBuilder, brctl, delLink, keystore, netem, ovs, util;
brctl = require('brctldriver');
ovs = require('ovsdriver');
util = require('util');
netem = require('linuxtcdriver');
delLink = require('linuxtcdriver').delLink;
keystore = require('mem-db');
Schema = require('./../schema').switchschema;
SwitchBuilder = (function() {
var bridge;
bridge = null;
function SwitchBuilder() {
this.registry = new keystore("switch", Schema);
}
SwitchBuilder.prototype.list = function(callback) {
return callback(this.registry.list());
};
SwitchBuilder.prototype.get = function(id, callback) {
return callback(this.registry.get(id));
};
SwitchBuilder.prototype.create = function(data, callback) {
var id;
id = this.registry.add(data);
util.log("new switch data created - data " + id + " ");
if (id instanceof Error || false) {
return callback(new Error("invalid Schema"));
}
if (data.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
return bridge.createBridge(data.name, (function(_this) {
return function(result) {
util.log("Bridge creation " + result);
if (result === false) {
data.status = "failed";
data.reason = "failed to create";
} else {
data.status = "created";
}
_this.registry.update(id, data);
return callback({
"id": id,
"status": data.status,
"reason": data.reason != null ? data.reason : void 0
});
};
})(this));
};
SwitchBuilder.prototype.addInterface = function(id, body, callback) {
var sdata;
util.log("addInterface body is " + JSON.stringify(body));
util.log("addInterface data is " + id);
sdata = this.registry.get(id);
util.log("addInterface sdata is " + JSON.stringify(sdata));
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
if (sdata.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
return bridge.addInterface(sdata.name, body.ifname, (function(_this) {
return function(result) {
util.log("addif" + result);
return callback({
"id": sdata.id,
"status": sdata.status,
"reason": sdata.reason != null ? sdata.reason : void 0
});
};
})(this));
};
SwitchBuilder.prototype.CreateTapInterfaces = function(ifname1, ifname2) {
bridge = brctl;
return bridge.createTapPeers(ifname1, ifname2, (function(_this) {
return function(result) {
util.log("createTapPeers " + result);
return result;
};
})(this));
};
SwitchBuilder.prototype.start = function(id, callback) {
var sdata;
sdata = this.registry.get(id);
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
if (sdata.make === "openvswitch") {
bridge = ovs;
if (sdata.controller != null) {
bridge.setController(sdata.name, sdata.controller, (function(_this) {
return function(result) {
util.log(result);
return bridge.setOFVersion(sdata.name, sdata.ofversion, function(res) {
var val;
util.log(res);
val = "00000000000000" + sdata.datapathid;
return bridge.setDPid(sdata.name, val, function(res) {
return util.log(res);
});
});
};
})(this));
}
} else {
bridge = brctl;
}
return bridge.enableBridge(sdata.name, (function(_this) {
return function(result) {
util.log("enableBridge" + result);
if (result === false) {
sdata.status = "failed";
sdata.reason = "failed to start";
} else {
sdata.status = "started";
}
_this.registry.update(sdata.id, sdata);
return callback({
"id": sdata.id,
"status": sdata.status,
"reason": sdata.reason != null ? sdata.reason : void 0
});
};
})(this));
};
SwitchBuilder.prototype.stop = function(id, callback) {
var sdata;
sdata = this.registry.get(id);
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
if (sdata.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
return bridge.disableBridge(sdata.name, (function(_this) {
return function(result) {
util.log("disableBridge" + result);
if (result === false) {
sdata.status = "failed";
sdata.reason = "failed to stop";
} else {
sdata.status = "stopped";
}
_this.registry.update(sdata.id, sdata);
return callback({
"id": sdata.id,
"status": sdata.status,
"reason": sdata.reason != null ? sdata.reason : void 0
});
};
})(this));
};
SwitchBuilder.prototype.del = function(id, callback) {
var sdata;
sdata = this.registry.get(id);
if (sdata.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
return bridge.deleteBridge(sdata.name, (function(_this) {
return function(result) {
util.log("deletBridge" + result);
if (result === false) {
return callback(new Error("Failed to Delete the Switch"));
}
_this.registry.del(sdata.id);
return callback({
"id": sdata.id,
"status": "deleted"
});
};
})(this));
};
SwitchBuilder.prototype.dellink = function(ifname, callback) {
return netem.delLink(ifname, function(result) {
return callback(result);
});
};
SwitchBuilder.prototype.status = function(id, callback) {
var sdata;
sdata = this.registry.get(id);
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
if (sdata.data.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
return bridge.getStatus(sdata.name, (function(_this) {
return function(result) {
util.log("SwitchCtrl getStatus" + result);
sdata.status = result;
_this.registry.update(id, sdata);
return callback(sdata);
};
})(this));
};
SwitchBuilder.prototype.setLinkChars = function(id, chars, callback) {
var Netem, sdata;
sdata = this.registry.get(id);
if (sdata.make === "openvswitch") {
bridge = ovs;
} else {
bridge = brctl;
}
if (sdata == null) {
return callback(new Error("Switch details not found in DB"));
}
if (chars.config == null) {
return callback(true);
}
Netem = new netem(chars.name, chars.config);
Netem.create();
return callback(true);
};
return SwitchBuilder;
})();
module.exports = new SwitchBuilder;
}).call(this);