v1.5 updates
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# Sphinx build info version 1
|
||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
|
||||
config: 390104d5a7e55c9d1dd51e2c690ef52c
|
||||
config: 9cc56b0e7a3966388527623e29025148
|
||||
tags: fbb0d17656682115ca4d033fb2f83ba1
|
||||
|
||||
9
doc/_sources/configuration.txt
Normal file
9
doc/_sources/configuration.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
*************
|
||||
Configuration
|
||||
*************
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
tls.rst
|
||||
|
||||
@@ -15,6 +15,7 @@ Contents:
|
||||
getting_started.rst
|
||||
openstack.rst
|
||||
developing.rst
|
||||
configuration.rst
|
||||
|
||||
Indices and tables
|
||||
==================
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
.. include:: ../../README.rst
|
||||
75
doc/_sources/tls.txt
Normal file
75
doc/_sources/tls.txt
Normal file
@@ -0,0 +1,75 @@
|
||||
********************
|
||||
Setup TLS Connection
|
||||
********************
|
||||
|
||||
If you want to use secure channel to connect OpenFlow switches, you
|
||||
need to use TLS connection. This document describes how to setup Ryu
|
||||
to connect to the Open vSwitch over TLS.
|
||||
|
||||
|
||||
Configuring a Public Key Infrastructure
|
||||
========================================
|
||||
|
||||
If you don't have a PKI, the ovs-pki script included with Open vSwitch
|
||||
can help you. This section is based on the INSTALL.SSL in the Open
|
||||
vSwitch source code.
|
||||
|
||||
NOTE: How to install Open vSwitch isn't described in this
|
||||
document. Please refer to the Open vSwitch documents.
|
||||
|
||||
|
||||
Create a PKI by using ovs-pki script::
|
||||
|
||||
% ovs-pki init
|
||||
(Default directory is /usr/local/var/lib/openvswitch/pki)
|
||||
|
||||
The pki directory consists of controllerca and switchca
|
||||
subdirectories. Each directory contains CA files.
|
||||
|
||||
|
||||
Create a controller private key and certificate::
|
||||
|
||||
% ovs-pki req+sign ctl controller
|
||||
|
||||
ctl-privkey.pem and ctl-cert.pem are generated in the current
|
||||
directory.
|
||||
|
||||
|
||||
Create a switch private key and certificate::
|
||||
|
||||
% ovs-pki req+sign sc switch
|
||||
|
||||
sc-privkey.pem and sc-cert.pem are generated in the current directory.
|
||||
|
||||
|
||||
Testing TLS Connection
|
||||
======================
|
||||
|
||||
Configuring ovs-vswitchd to use CA files using the ovs-vsctl "set-ssl"
|
||||
command, e.g.::
|
||||
|
||||
% ovs-vsctl set-ssl sc-privkey.pem sc-cert.pem /usr/local/var/lib/openvswitch/pki/controllerca/cacert.pem
|
||||
% ovs-vsctl add-br br0
|
||||
% ovs-vsctl set-controller br0 ssl:127.0.0.1:6633
|
||||
|
||||
|
||||
Run Ryu with CA files::
|
||||
|
||||
% ryu-manager --ctl_privkey ctl-privkey.pem \
|
||||
--ctl_cert ctl-cert.pem \
|
||||
--ca_cert /usr/local/var/lib/openvswitch/pki/switchca/cacert.pem \
|
||||
--verbose
|
||||
|
||||
You can see something like::
|
||||
|
||||
loading app ryu.controller.ofp_handler
|
||||
instantiating app ryu.controller.ofp_handler
|
||||
connected socket:<SSLSocket fileno=4 sock=127.0.0.1:6633 peer=127.0.0.1:56493> address:('127.0.0.1', 56493)
|
||||
unhandled event <ryu.controller.dispatcher.EventQueueCreate object at 0x2fdcd90>
|
||||
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x2fdce90>
|
||||
move onto config mode
|
||||
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0>
|
||||
switch features ev version: 0x1 msg_type 0x6 xid 0xc23353f2 port OFPPhyPort(port_no=65534, hw_addr='\x16\xd8u\xe7[C', name='br0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', config=1, state=1, curr=0, advertised=0, supported=0, peer=0)
|
||||
move onto main mode
|
||||
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0>
|
||||
|
||||
4
doc/_static/basic.css
vendored
4
doc/_static/basic.css
vendored
@@ -79,11 +79,11 @@ div.sphinxsidebar input {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="text"] {
|
||||
div.sphinxsidebar #searchbox input[type="text"] {
|
||||
width: 170px;
|
||||
}
|
||||
|
||||
div.sphinxsidebar input[type="submit"] {
|
||||
div.sphinxsidebar #searchbox input[type="submit"] {
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
|
||||
9398
doc/_static/jquery.js
vendored
9398
doc/_static/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
830
doc/_static/underscore.js
vendored
830
doc/_static/underscore.js
vendored
@@ -1,23 +1,807 @@
|
||||
// Underscore.js 0.5.5
|
||||
// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Underscore is freely distributable under the terms of the MIT license.
|
||||
// Portions of Underscore are inspired by or borrowed from Prototype.js,
|
||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||||
// For all details and documentation:
|
||||
// http://documentcloud.github.com/underscore/
|
||||
(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
|
||||
a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
|
||||
var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
|
||||
d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
|
||||
function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
|
||||
function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
|
||||
0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
|
||||
e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
|
||||
a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
|
||||
return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
|
||||
var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
|
||||
if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
|
||||
0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
|
||||
a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
|
||||
" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
|
||||
o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
|
||||
// Underscore.js 1.1.6
|
||||
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
|
||||
// Underscore is freely distributable under the MIT license.
|
||||
// Portions of Underscore are inspired or borrowed from Prototype,
|
||||
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
||||
// For all details and documentation:
|
||||
// http://documentcloud.github.com/underscore
|
||||
|
||||
(function() {
|
||||
|
||||
// Baseline setup
|
||||
// --------------
|
||||
|
||||
// Establish the root object, `window` in the browser, or `global` on the server.
|
||||
var root = this;
|
||||
|
||||
// Save the previous value of the `_` variable.
|
||||
var previousUnderscore = root._;
|
||||
|
||||
// Establish the object that gets returned to break out of a loop iteration.
|
||||
var breaker = {};
|
||||
|
||||
// Save bytes in the minified (but not gzipped) version:
|
||||
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
|
||||
|
||||
// Create quick reference variables for speed access to core prototypes.
|
||||
var slice = ArrayProto.slice,
|
||||
unshift = ArrayProto.unshift,
|
||||
toString = ObjProto.toString,
|
||||
hasOwnProperty = ObjProto.hasOwnProperty;
|
||||
|
||||
// All **ECMAScript 5** native function implementations that we hope to use
|
||||
// are declared here.
|
||||
var
|
||||
nativeForEach = ArrayProto.forEach,
|
||||
nativeMap = ArrayProto.map,
|
||||
nativeReduce = ArrayProto.reduce,
|
||||
nativeReduceRight = ArrayProto.reduceRight,
|
||||
nativeFilter = ArrayProto.filter,
|
||||
nativeEvery = ArrayProto.every,
|
||||
nativeSome = ArrayProto.some,
|
||||
nativeIndexOf = ArrayProto.indexOf,
|
||||
nativeLastIndexOf = ArrayProto.lastIndexOf,
|
||||
nativeIsArray = Array.isArray,
|
||||
nativeKeys = Object.keys,
|
||||
nativeBind = FuncProto.bind;
|
||||
|
||||
// Create a safe reference to the Underscore object for use below.
|
||||
var _ = function(obj) { return new wrapper(obj); };
|
||||
|
||||
// Export the Underscore object for **CommonJS**, with backwards-compatibility
|
||||
// for the old `require()` API. If we're not in CommonJS, add `_` to the
|
||||
// global object.
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = _;
|
||||
_._ = _;
|
||||
} else {
|
||||
root._ = _;
|
||||
}
|
||||
|
||||
// Current version.
|
||||
_.VERSION = '1.1.6';
|
||||
|
||||
// Collection Functions
|
||||
// --------------------
|
||||
|
||||
// The cornerstone, an `each` implementation, aka `forEach`.
|
||||
// Handles objects implementing `forEach`, arrays, and raw objects.
|
||||
// Delegates to **ECMAScript 5**'s native `forEach` if available.
|
||||
var each = _.each = _.forEach = function(obj, iterator, context) {
|
||||
if (obj == null) return;
|
||||
if (nativeForEach && obj.forEach === nativeForEach) {
|
||||
obj.forEach(iterator, context);
|
||||
} else if (_.isNumber(obj.length)) {
|
||||
for (var i = 0, l = obj.length; i < l; i++) {
|
||||
if (iterator.call(context, obj[i], i, obj) === breaker) return;
|
||||
}
|
||||
} else {
|
||||
for (var key in obj) {
|
||||
if (hasOwnProperty.call(obj, key)) {
|
||||
if (iterator.call(context, obj[key], key, obj) === breaker) return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Return the results of applying the iterator to each element.
|
||||
// Delegates to **ECMAScript 5**'s native `map` if available.
|
||||
_.map = function(obj, iterator, context) {
|
||||
var results = [];
|
||||
if (obj == null) return results;
|
||||
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
|
||||
each(obj, function(value, index, list) {
|
||||
results[results.length] = iterator.call(context, value, index, list);
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
||||
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
|
||||
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
|
||||
var initial = memo !== void 0;
|
||||
if (obj == null) obj = [];
|
||||
if (nativeReduce && obj.reduce === nativeReduce) {
|
||||
if (context) iterator = _.bind(iterator, context);
|
||||
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
|
||||
}
|
||||
each(obj, function(value, index, list) {
|
||||
if (!initial && index === 0) {
|
||||
memo = value;
|
||||
initial = true;
|
||||
} else {
|
||||
memo = iterator.call(context, memo, value, index, list);
|
||||
}
|
||||
});
|
||||
if (!initial) throw new TypeError("Reduce of empty array with no initial value");
|
||||
return memo;
|
||||
};
|
||||
|
||||
// The right-associative version of reduce, also known as `foldr`.
|
||||
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
|
||||
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
|
||||
if (obj == null) obj = [];
|
||||
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
|
||||
if (context) iterator = _.bind(iterator, context);
|
||||
return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
|
||||
}
|
||||
var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
|
||||
return _.reduce(reversed, iterator, memo, context);
|
||||
};
|
||||
|
||||
// Return the first value which passes a truth test. Aliased as `detect`.
|
||||
_.find = _.detect = function(obj, iterator, context) {
|
||||
var result;
|
||||
any(obj, function(value, index, list) {
|
||||
if (iterator.call(context, value, index, list)) {
|
||||
result = value;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
};
|
||||
|
||||
// Return all the elements that pass a truth test.
|
||||
// Delegates to **ECMAScript 5**'s native `filter` if available.
|
||||
// Aliased as `select`.
|
||||
_.filter = _.select = function(obj, iterator, context) {
|
||||
var results = [];
|
||||
if (obj == null) return results;
|
||||
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
|
||||
each(obj, function(value, index, list) {
|
||||
if (iterator.call(context, value, index, list)) results[results.length] = value;
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
// Return all the elements for which a truth test fails.
|
||||
_.reject = function(obj, iterator, context) {
|
||||
var results = [];
|
||||
if (obj == null) return results;
|
||||
each(obj, function(value, index, list) {
|
||||
if (!iterator.call(context, value, index, list)) results[results.length] = value;
|
||||
});
|
||||
return results;
|
||||
};
|
||||
|
||||
// Determine whether all of the elements match a truth test.
|
||||
// Delegates to **ECMAScript 5**'s native `every` if available.
|
||||
// Aliased as `all`.
|
||||
_.every = _.all = function(obj, iterator, context) {
|
||||
var result = true;
|
||||
if (obj == null) return result;
|
||||
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
|
||||
each(obj, function(value, index, list) {
|
||||
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
|
||||
});
|
||||
return result;
|
||||
};
|
||||
|
||||
// Determine if at least one element in the object matches a truth test.
|
||||
// Delegates to **ECMAScript 5**'s native `some` if available.
|
||||
// Aliased as `any`.
|
||||
var any = _.some = _.any = function(obj, iterator, context) {
|
||||
iterator || (iterator = _.identity);
|
||||
var result = false;
|
||||
if (obj == null) return result;
|
||||
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
||||
each(obj, function(value, index, list) {
|
||||
if (result = iterator.call(context, value, index, list)) return breaker;
|
||||
});
|
||||
return result;
|
||||
};
|
||||
|
||||
// Determine if a given value is included in the array or object using `===`.
|
||||
// Aliased as `contains`.
|
||||
_.include = _.contains = function(obj, target) {
|
||||
var found = false;
|
||||
if (obj == null) return found;
|
||||
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
|
||||
any(obj, function(value) {
|
||||
if (found = value === target) return true;
|
||||
});
|
||||
return found;
|
||||
};
|
||||
|
||||
// Invoke a method (with arguments) on every item in a collection.
|
||||
_.invoke = function(obj, method) {
|
||||
var args = slice.call(arguments, 2);
|
||||
return _.map(obj, function(value) {
|
||||
return (method.call ? method || value : value[method]).apply(value, args);
|
||||
});
|
||||
};
|
||||
|
||||
// Convenience version of a common use case of `map`: fetching a property.
|
||||
_.pluck = function(obj, key) {
|
||||
return _.map(obj, function(value){ return value[key]; });
|
||||
};
|
||||
|
||||
// Return the maximum element or (element-based computation).
|
||||
_.max = function(obj, iterator, context) {
|
||||
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
|
||||
var result = {computed : -Infinity};
|
||||
each(obj, function(value, index, list) {
|
||||
var computed = iterator ? iterator.call(context, value, index, list) : value;
|
||||
computed >= result.computed && (result = {value : value, computed : computed});
|
||||
});
|
||||
return result.value;
|
||||
};
|
||||
|
||||
// Return the minimum element (or element-based computation).
|
||||
_.min = function(obj, iterator, context) {
|
||||
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
|
||||
var result = {computed : Infinity};
|
||||
each(obj, function(value, index, list) {
|
||||
var computed = iterator ? iterator.call(context, value, index, list) : value;
|
||||
computed < result.computed && (result = {value : value, computed : computed});
|
||||
});
|
||||
return result.value;
|
||||
};
|
||||
|
||||
// Sort the object's values by a criterion produced by an iterator.
|
||||
_.sortBy = function(obj, iterator, context) {
|
||||
return _.pluck(_.map(obj, function(value, index, list) {
|
||||
return {
|
||||
value : value,
|
||||
criteria : iterator.call(context, value, index, list)
|
||||
};
|
||||
}).sort(function(left, right) {
|
||||
var a = left.criteria, b = right.criteria;
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
}), 'value');
|
||||
};
|
||||
|
||||
// Use a comparator function to figure out at what index an object should
|
||||
// be inserted so as to maintain order. Uses binary search.
|
||||
_.sortedIndex = function(array, obj, iterator) {
|
||||
iterator || (iterator = _.identity);
|
||||
var low = 0, high = array.length;
|
||||
while (low < high) {
|
||||
var mid = (low + high) >> 1;
|
||||
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
|
||||
}
|
||||
return low;
|
||||
};
|
||||
|
||||
// Safely convert anything iterable into a real, live array.
|
||||
_.toArray = function(iterable) {
|
||||
if (!iterable) return [];
|
||||
if (iterable.toArray) return iterable.toArray();
|
||||
if (_.isArray(iterable)) return iterable;
|
||||
if (_.isArguments(iterable)) return slice.call(iterable);
|
||||
return _.values(iterable);
|
||||
};
|
||||
|
||||
// Return the number of elements in an object.
|
||||
_.size = function(obj) {
|
||||
return _.toArray(obj).length;
|
||||
};
|
||||
|
||||
// Array Functions
|
||||
// ---------------
|
||||
|
||||
// Get the first element of an array. Passing **n** will return the first N
|
||||
// values in the array. Aliased as `head`. The **guard** check allows it to work
|
||||
// with `_.map`.
|
||||
_.first = _.head = function(array, n, guard) {
|
||||
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
|
||||
};
|
||||
|
||||
// Returns everything but the first entry of the array. Aliased as `tail`.
|
||||
// Especially useful on the arguments object. Passing an **index** will return
|
||||
// the rest of the values in the array from that index onward. The **guard**
|
||||
// check allows it to work with `_.map`.
|
||||
_.rest = _.tail = function(array, index, guard) {
|
||||
return slice.call(array, (index == null) || guard ? 1 : index);
|
||||
};
|
||||
|
||||
// Get the last element of an array.
|
||||
_.last = function(array) {
|
||||
return array[array.length - 1];
|
||||
};
|
||||
|
||||
// Trim out all falsy values from an array.
|
||||
_.compact = function(array) {
|
||||
return _.filter(array, function(value){ return !!value; });
|
||||
};
|
||||
|
||||
// Return a completely flattened version of an array.
|
||||
_.flatten = function(array) {
|
||||
return _.reduce(array, function(memo, value) {
|
||||
if (_.isArray(value)) return memo.concat(_.flatten(value));
|
||||
memo[memo.length] = value;
|
||||
return memo;
|
||||
}, []);
|
||||
};
|
||||
|
||||
// Return a version of the array that does not contain the specified value(s).
|
||||
_.without = function(array) {
|
||||
var values = slice.call(arguments, 1);
|
||||
return _.filter(array, function(value){ return !_.include(values, value); });
|
||||
};
|
||||
|
||||
// Produce a duplicate-free version of the array. If the array has already
|
||||
// been sorted, you have the option of using a faster algorithm.
|
||||
// Aliased as `unique`.
|
||||
_.uniq = _.unique = function(array, isSorted) {
|
||||
return _.reduce(array, function(memo, el, i) {
|
||||
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo[memo.length] = el;
|
||||
return memo;
|
||||
}, []);
|
||||
};
|
||||
|
||||
// Produce an array that contains every item shared between all the
|
||||
// passed-in arrays.
|
||||
_.intersect = function(array) {
|
||||
var rest = slice.call(arguments, 1);
|
||||
return _.filter(_.uniq(array), function(item) {
|
||||
return _.every(rest, function(other) {
|
||||
return _.indexOf(other, item) >= 0;
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Zip together multiple lists into a single array -- elements that share
|
||||
// an index go together.
|
||||
_.zip = function() {
|
||||
var args = slice.call(arguments);
|
||||
var length = _.max(_.pluck(args, 'length'));
|
||||
var results = new Array(length);
|
||||
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
|
||||
return results;
|
||||
};
|
||||
|
||||
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
|
||||
// we need this function. Return the position of the first occurrence of an
|
||||
// item in an array, or -1 if the item is not included in the array.
|
||||
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
|
||||
// If the array is large and already in sort order, pass `true`
|
||||
// for **isSorted** to use binary search.
|
||||
_.indexOf = function(array, item, isSorted) {
|
||||
if (array == null) return -1;
|
||||
var i, l;
|
||||
if (isSorted) {
|
||||
i = _.sortedIndex(array, item);
|
||||
return array[i] === item ? i : -1;
|
||||
}
|
||||
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
||||
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
||||
return -1;
|
||||
};
|
||||
|
||||
|
||||
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
|
||||
_.lastIndexOf = function(array, item) {
|
||||
if (array == null) return -1;
|
||||
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
|
||||
var i = array.length;
|
||||
while (i--) if (array[i] === item) return i;
|
||||
return -1;
|
||||
};
|
||||
|
||||
// Generate an integer Array containing an arithmetic progression. A port of
|
||||
// the native Python `range()` function. See
|
||||
// [the Python documentation](http://docs.python.org/library/functions.html#range).
|
||||
_.range = function(start, stop, step) {
|
||||
if (arguments.length <= 1) {
|
||||
stop = start || 0;
|
||||
start = 0;
|
||||
}
|
||||
step = arguments[2] || 1;
|
||||
|
||||
var len = Math.max(Math.ceil((stop - start) / step), 0);
|
||||
var idx = 0;
|
||||
var range = new Array(len);
|
||||
|
||||
while(idx < len) {
|
||||
range[idx++] = start;
|
||||
start += step;
|
||||
}
|
||||
|
||||
return range;
|
||||
};
|
||||
|
||||
// Function (ahem) Functions
|
||||
// ------------------
|
||||
|
||||
// Create a function bound to a given object (assigning `this`, and arguments,
|
||||
// optionally). Binding with arguments is also known as `curry`.
|
||||
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
|
||||
// We check for `func.bind` first, to fail fast when `func` is undefined.
|
||||
_.bind = function(func, obj) {
|
||||
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
|
||||
var args = slice.call(arguments, 2);
|
||||
return function() {
|
||||
return func.apply(obj, args.concat(slice.call(arguments)));
|
||||
};
|
||||
};
|
||||
|
||||
// Bind all of an object's methods to that object. Useful for ensuring that
|
||||
// all callbacks defined on an object belong to it.
|
||||
_.bindAll = function(obj) {
|
||||
var funcs = slice.call(arguments, 1);
|
||||
if (funcs.length == 0) funcs = _.functions(obj);
|
||||
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
|
||||
return obj;
|
||||
};
|
||||
|
||||
// Memoize an expensive function by storing its results.
|
||||
_.memoize = function(func, hasher) {
|
||||
var memo = {};
|
||||
hasher || (hasher = _.identity);
|
||||
return function() {
|
||||
var key = hasher.apply(this, arguments);
|
||||
return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
|
||||
};
|
||||
};
|
||||
|
||||
// Delays a function for the given number of milliseconds, and then calls
|
||||
// it with the arguments supplied.
|
||||
_.delay = function(func, wait) {
|
||||
var args = slice.call(arguments, 2);
|
||||
return setTimeout(function(){ return func.apply(func, args); }, wait);
|
||||
};
|
||||
|
||||
// Defers a function, scheduling it to run after the current call stack has
|
||||
// cleared.
|
||||
_.defer = function(func) {
|
||||
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
|
||||
};
|
||||
|
||||
// Internal function used to implement `_.throttle` and `_.debounce`.
|
||||
var limit = function(func, wait, debounce) {
|
||||
var timeout;
|
||||
return function() {
|
||||
var context = this, args = arguments;
|
||||
var throttler = function() {
|
||||
timeout = null;
|
||||
func.apply(context, args);
|
||||
};
|
||||
if (debounce) clearTimeout(timeout);
|
||||
if (debounce || !timeout) timeout = setTimeout(throttler, wait);
|
||||
};
|
||||
};
|
||||
|
||||
// Returns a function, that, when invoked, will only be triggered at most once
|
||||
// during a given window of time.
|
||||
_.throttle = function(func, wait) {
|
||||
return limit(func, wait, false);
|
||||
};
|
||||
|
||||
// Returns a function, that, as long as it continues to be invoked, will not
|
||||
// be triggered. The function will be called after it stops being called for
|
||||
// N milliseconds.
|
||||
_.debounce = function(func, wait) {
|
||||
return limit(func, wait, true);
|
||||
};
|
||||
|
||||
// Returns a function that will be executed at most one time, no matter how
|
||||
// often you call it. Useful for lazy initialization.
|
||||
_.once = function(func) {
|
||||
var ran = false, memo;
|
||||
return function() {
|
||||
if (ran) return memo;
|
||||
ran = true;
|
||||
return memo = func.apply(this, arguments);
|
||||
};
|
||||
};
|
||||
|
||||
// Returns the first function passed as an argument to the second,
|
||||
// allowing you to adjust arguments, run code before and after, and
|
||||
// conditionally execute the original function.
|
||||
_.wrap = function(func, wrapper) {
|
||||
return function() {
|
||||
var args = [func].concat(slice.call(arguments));
|
||||
return wrapper.apply(this, args);
|
||||
};
|
||||
};
|
||||
|
||||
// Returns a function that is the composition of a list of functions, each
|
||||
// consuming the return value of the function that follows.
|
||||
_.compose = function() {
|
||||
var funcs = slice.call(arguments);
|
||||
return function() {
|
||||
var args = slice.call(arguments);
|
||||
for (var i=funcs.length-1; i >= 0; i--) {
|
||||
args = [funcs[i].apply(this, args)];
|
||||
}
|
||||
return args[0];
|
||||
};
|
||||
};
|
||||
|
||||
// Returns a function that will only be executed after being called N times.
|
||||
_.after = function(times, func) {
|
||||
return function() {
|
||||
if (--times < 1) { return func.apply(this, arguments); }
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// Object Functions
|
||||
// ----------------
|
||||
|
||||
// Retrieve the names of an object's properties.
|
||||
// Delegates to **ECMAScript 5**'s native `Object.keys`
|
||||
_.keys = nativeKeys || function(obj) {
|
||||
if (obj !== Object(obj)) throw new TypeError('Invalid object');
|
||||
var keys = [];
|
||||
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
|
||||
return keys;
|
||||
};
|
||||
|
||||
// Retrieve the values of an object's properties.
|
||||
_.values = function(obj) {
|
||||
return _.map(obj, _.identity);
|
||||
};
|
||||
|
||||
// Return a sorted list of the function names available on the object.
|
||||
// Aliased as `methods`
|
||||
_.functions = _.methods = function(obj) {
|
||||
return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
|
||||
};
|
||||
|
||||
// Extend a given object with all the properties in passed-in object(s).
|
||||
_.extend = function(obj) {
|
||||
each(slice.call(arguments, 1), function(source) {
|
||||
for (var prop in source) {
|
||||
if (source[prop] !== void 0) obj[prop] = source[prop];
|
||||
}
|
||||
});
|
||||
return obj;
|
||||
};
|
||||
|
||||
// Fill in a given object with default properties.
|
||||
_.defaults = function(obj) {
|
||||
each(slice.call(arguments, 1), function(source) {
|
||||
for (var prop in source) {
|
||||
if (obj[prop] == null) obj[prop] = source[prop];
|
||||
}
|
||||
});
|
||||
return obj;
|
||||
};
|
||||
|
||||
// Create a (shallow-cloned) duplicate of an object.
|
||||
_.clone = function(obj) {
|
||||
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
|
||||
};
|
||||
|
||||
// Invokes interceptor with the obj, and then returns obj.
|
||||
// The primary purpose of this method is to "tap into" a method chain, in
|
||||
// order to perform operations on intermediate results within the chain.
|
||||
_.tap = function(obj, interceptor) {
|
||||
interceptor(obj);
|
||||
return obj;
|
||||
};
|
||||
|
||||
// Perform a deep comparison to check if two objects are equal.
|
||||
_.isEqual = function(a, b) {
|
||||
// Check object identity.
|
||||
if (a === b) return true;
|
||||
// Different types?
|
||||
var atype = typeof(a), btype = typeof(b);
|
||||
if (atype != btype) return false;
|
||||
// Basic equality test (watch out for coercions).
|
||||
if (a == b) return true;
|
||||
// One is falsy and the other truthy.
|
||||
if ((!a && b) || (a && !b)) return false;
|
||||
// Unwrap any wrapped objects.
|
||||
if (a._chain) a = a._wrapped;
|
||||
if (b._chain) b = b._wrapped;
|
||||
// One of them implements an isEqual()?
|
||||
if (a.isEqual) return a.isEqual(b);
|
||||
// Check dates' integer values.
|
||||
if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
|
||||
// Both are NaN?
|
||||
if (_.isNaN(a) && _.isNaN(b)) return false;
|
||||
// Compare regular expressions.
|
||||
if (_.isRegExp(a) && _.isRegExp(b))
|
||||
return a.source === b.source &&
|
||||
a.global === b.global &&
|
||||
a.ignoreCase === b.ignoreCase &&
|
||||
a.multiline === b.multiline;
|
||||
// If a is not an object by this point, we can't handle it.
|
||||
if (atype !== 'object') return false;
|
||||
// Check for different array lengths before comparing contents.
|
||||
if (a.length && (a.length !== b.length)) return false;
|
||||
// Nothing else worked, deep compare the contents.
|
||||
var aKeys = _.keys(a), bKeys = _.keys(b);
|
||||
// Different object sizes?
|
||||
if (aKeys.length != bKeys.length) return false;
|
||||
// Recursive comparison of contents.
|
||||
for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
// Is a given array or object empty?
|
||||
_.isEmpty = function(obj) {
|
||||
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
|
||||
for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
// Is a given value a DOM element?
|
||||
_.isElement = function(obj) {
|
||||
return !!(obj && obj.nodeType == 1);
|
||||
};
|
||||
|
||||
// Is a given value an array?
|
||||
// Delegates to ECMA5's native Array.isArray
|
||||
_.isArray = nativeIsArray || function(obj) {
|
||||
return toString.call(obj) === '[object Array]';
|
||||
};
|
||||
|
||||
// Is a given variable an arguments object?
|
||||
_.isArguments = function(obj) {
|
||||
return !!(obj && hasOwnProperty.call(obj, 'callee'));
|
||||
};
|
||||
|
||||
// Is a given value a function?
|
||||
_.isFunction = function(obj) {
|
||||
return !!(obj && obj.constructor && obj.call && obj.apply);
|
||||
};
|
||||
|
||||
// Is a given value a string?
|
||||
_.isString = function(obj) {
|
||||
return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
|
||||
};
|
||||
|
||||
// Is a given value a number?
|
||||
_.isNumber = function(obj) {
|
||||
return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
|
||||
};
|
||||
|
||||
// Is the given value `NaN`? `NaN` happens to be the only value in JavaScript
|
||||
// that does not equal itself.
|
||||
_.isNaN = function(obj) {
|
||||
return obj !== obj;
|
||||
};
|
||||
|
||||
// Is a given value a boolean?
|
||||
_.isBoolean = function(obj) {
|
||||
return obj === true || obj === false;
|
||||
};
|
||||
|
||||
// Is a given value a date?
|
||||
_.isDate = function(obj) {
|
||||
return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear);
|
||||
};
|
||||
|
||||
// Is the given value a regular expression?
|
||||
_.isRegExp = function(obj) {
|
||||
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
|
||||
};
|
||||
|
||||
// Is a given value equal to null?
|
||||
_.isNull = function(obj) {
|
||||
return obj === null;
|
||||
};
|
||||
|
||||
// Is a given variable undefined?
|
||||
_.isUndefined = function(obj) {
|
||||
return obj === void 0;
|
||||
};
|
||||
|
||||
// Utility Functions
|
||||
// -----------------
|
||||
|
||||
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
|
||||
// previous owner. Returns a reference to the Underscore object.
|
||||
_.noConflict = function() {
|
||||
root._ = previousUnderscore;
|
||||
return this;
|
||||
};
|
||||
|
||||
// Keep the identity function around for default iterators.
|
||||
_.identity = function(value) {
|
||||
return value;
|
||||
};
|
||||
|
||||
// Run a function **n** times.
|
||||
_.times = function (n, iterator, context) {
|
||||
for (var i = 0; i < n; i++) iterator.call(context, i);
|
||||
};
|
||||
|
||||
// Add your own custom functions to the Underscore object, ensuring that
|
||||
// they're correctly added to the OOP wrapper as well.
|
||||
_.mixin = function(obj) {
|
||||
each(_.functions(obj), function(name){
|
||||
addToWrapper(name, _[name] = obj[name]);
|
||||
});
|
||||
};
|
||||
|
||||
// Generate a unique integer id (unique within the entire client session).
|
||||
// Useful for temporary DOM ids.
|
||||
var idCounter = 0;
|
||||
_.uniqueId = function(prefix) {
|
||||
var id = idCounter++;
|
||||
return prefix ? prefix + id : id;
|
||||
};
|
||||
|
||||
// By default, Underscore uses ERB-style template delimiters, change the
|
||||
// following template settings to use alternative delimiters.
|
||||
_.templateSettings = {
|
||||
evaluate : /<%([\s\S]+?)%>/g,
|
||||
interpolate : /<%=([\s\S]+?)%>/g
|
||||
};
|
||||
|
||||
// JavaScript micro-templating, similar to John Resig's implementation.
|
||||
// Underscore templating handles arbitrary delimiters, preserves whitespace,
|
||||
// and correctly escapes quotes within interpolated code.
|
||||
_.template = function(str, data) {
|
||||
var c = _.templateSettings;
|
||||
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
|
||||
'with(obj||{}){__p.push(\'' +
|
||||
str.replace(/\\/g, '\\\\')
|
||||
.replace(/'/g, "\\'")
|
||||
.replace(c.interpolate, function(match, code) {
|
||||
return "'," + code.replace(/\\'/g, "'") + ",'";
|
||||
})
|
||||
.replace(c.evaluate || null, function(match, code) {
|
||||
return "');" + code.replace(/\\'/g, "'")
|
||||
.replace(/[\r\n\t]/g, ' ') + "__p.push('";
|
||||
})
|
||||
.replace(/\r/g, '\\r')
|
||||
.replace(/\n/g, '\\n')
|
||||
.replace(/\t/g, '\\t')
|
||||
+ "');}return __p.join('');";
|
||||
var func = new Function('obj', tmpl);
|
||||
return data ? func(data) : func;
|
||||
};
|
||||
|
||||
// The OOP Wrapper
|
||||
// ---------------
|
||||
|
||||
// If Underscore is called as a function, it returns a wrapped object that
|
||||
// can be used OO-style. This wrapper holds altered versions of all the
|
||||
// underscore functions. Wrapped objects may be chained.
|
||||
var wrapper = function(obj) { this._wrapped = obj; };
|
||||
|
||||
// Expose `wrapper.prototype` as `_.prototype`
|
||||
_.prototype = wrapper.prototype;
|
||||
|
||||
// Helper function to continue chaining intermediate results.
|
||||
var result = function(obj, chain) {
|
||||
return chain ? _(obj).chain() : obj;
|
||||
};
|
||||
|
||||
// A method to easily add functions to the OOP wrapper.
|
||||
var addToWrapper = function(name, func) {
|
||||
wrapper.prototype[name] = function() {
|
||||
var args = slice.call(arguments);
|
||||
unshift.call(args, this._wrapped);
|
||||
return result(func.apply(_, args), this._chain);
|
||||
};
|
||||
};
|
||||
|
||||
// Add all of the Underscore functions to the wrapper object.
|
||||
_.mixin(_);
|
||||
|
||||
// Add all mutator Array functions to the wrapper.
|
||||
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
|
||||
var method = ArrayProto[name];
|
||||
wrapper.prototype[name] = function() {
|
||||
method.apply(this._wrapped, arguments);
|
||||
return result(this._wrapped, this._chain);
|
||||
};
|
||||
});
|
||||
|
||||
// Add all accessor Array functions to the wrapper.
|
||||
each(['concat', 'join', 'slice'], function(name) {
|
||||
var method = ArrayProto[name];
|
||||
wrapper.prototype[name] = function() {
|
||||
return result(method.apply(this._wrapped, arguments), this._chain);
|
||||
};
|
||||
});
|
||||
|
||||
// Start chaining a wrapped Underscore object.
|
||||
wrapper.prototype.chain = function() {
|
||||
this._chain = true;
|
||||
return this;
|
||||
};
|
||||
|
||||
// Extracts the result from a wrapped and chained object.
|
||||
wrapper.prototype.value = function() {
|
||||
return this._wrapped;
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
85
doc/configuration.html
Normal file
85
doc/configuration.html
Normal file
@@ -0,0 +1,85 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Configuration — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/print.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="next" title="Setup TLS Connection" href="tls.html" />
|
||||
<link rel="prev" title="Packet library" href="library_packet.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Configuration</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
«  <a href="library_packet.html">Packet library</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="tls.html">Setup TLS Connection</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="configuration">
|
||||
<h1>Configuration<a class="headerlink" href="#configuration" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="toctree-wrapper compound">
|
||||
<ul>
|
||||
<li class="toctree-l1"><a class="reference internal" href="tls.html">Setup TLS Connection</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="tls.html#configuring-a-public-key-infrastructure">Configuring a Public Key Infrastructure</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="tls.html#testing-tls-connection">Testing TLS Connection</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
|
||||
<p>
|
||||
«  <a href="library_packet.html">Packet library</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="tls.html">Setup TLS Connection</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Writing Your Ryu Application — Ryu 1.3 documentation</title>
|
||||
<title>Writing Your Ryu Application — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,13 +27,13 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="next" title="The First Application" href="writing_ryu_app.html" />
|
||||
<link rel="prev" title="How Ryu L2 segregation works" href="how_l2_segregation_works.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Writing Your Ryu Application</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -83,7 +83,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -10,7 +10,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Index — Ryu 1.3 documentation</title>
|
||||
<title>Index — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -19,7 +19,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -29,11 +29,11 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Index</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Getting Started — Ryu 1.3 documentation</title>
|
||||
<title>Getting Started — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,13 +27,13 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="next" title="OpenStack Integration" href="openstack.html" />
|
||||
<link rel="prev" title="Welcome to RYU the Network Operating System(NOS)" href="index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Getting Started</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -59,7 +59,7 @@
|
||||
API that make it easy for operators to create new network management
|
||||
and control applications. Currently, Ryu manages network devices by
|
||||
using OpenFlow. You can say that Ryu is an OpenFlow Controller, which
|
||||
support OpenFlow v1.0, v1.2, and Nicira Extensions.</p>
|
||||
support OpenFlow v1.0, v1.2, v1.3, and Nicira Extensions.</p>
|
||||
<p>All of the code is freely available under the Apache 2.0 license. Ryu
|
||||
is fully written in Python.</p>
|
||||
</div>
|
||||
@@ -110,7 +110,7 @@ is also available.</p>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>How Ryu L2 segregation works — Ryu 1.3 documentation</title>
|
||||
<title>How Ryu L2 segregation works — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,14 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="OpenStack Integration" href="openstack.html" />
|
||||
<link rel="next" title="Writing Your Ryu Application" href="developing.html" />
|
||||
<link rel="prev" title="Step-by-step example for testing ryu with OpenStack" href="step_by_step.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>How Ryu L2 segregation works</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -143,7 +143,7 @@ and the all OVS ports that belongs to the network id</li>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Welcome to RYU the Network Operating System(NOS) — Ryu 1.3 documentation</title>
|
||||
<title>Welcome to RYU the Network Operating System(NOS) — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,12 +27,12 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="#" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="#" />
|
||||
<link rel="next" title="Getting Started" href="getting_started.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="#">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Welcome to RYU the Network Operating System(NOS)</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -69,6 +69,10 @@
|
||||
<li class="toctree-l2"><a class="reference internal" href="library.html">Library</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a><ul>
|
||||
<li class="toctree-l2"><a class="reference internal" href="tls.html">Setup TLS Connection</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="indices-and-tables">
|
||||
@@ -95,7 +99,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Library — Ryu 1.3 documentation</title>
|
||||
<title>Library — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,14 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="Writing Your Ryu Application" href="developing.html" />
|
||||
<link rel="next" title="Packet library" href="library_packet.html" />
|
||||
<link rel="prev" title="The First Application" href="writing_ryu_app.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Library</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -77,7 +77,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Packet library — Ryu 1.3 documentation</title>
|
||||
<title>Packet library — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,13 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="Library" href="library.html" />
|
||||
<link rel="next" title="Configuration" href="configuration.html" />
|
||||
<link rel="prev" title="Library" href="library.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Packet library</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -42,6 +43,8 @@
|
||||
«  <a href="library.html">Library</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="configuration.html">Configuration</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
@@ -134,13 +137,15 @@ is building an arp packet.</p>
|
||||
«  <a href="library.html">Library</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="configuration.html">Configuration</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,6 +1,6 @@
|
||||
# Sphinx inventory version 2
|
||||
# Project: Ryu
|
||||
# Version: 1.3
|
||||
# Version: 1.5
|
||||
# The remainder of this file is compressed using zlib.
|
||||
xÚm<EFBFBD>ÁjÃ0DïúŠ…žhŽý€¦…¶)59ÕZdY2Òǯ¥<C2AF>ºä¦<C3A4>y3²\0x<30>LæÅë_ô ŸÁVu×QïŸà<C5B8>ߢ<C39F>æ:ÌòfTú3šÑc
|
||||
eÔ©í¶‘¢Uº)À·¶(Æì‚U“£NÅC&Ýž·ÑGD)ZÉŽ¼gO,ÂÏ<ÂÒÓŽ&M¬6s&ì<>¬†fM輯>NÐÆ@)z<>ItqRŽWäí"vü^e´ íÒC¡ÊªÅ•Ždɽ-<2D>¼åcpXMa‘x–Z†'Bóï“uÒ=¦Z[ayƒå†¦Üâ
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>OpenStack Integration — Ryu 1.3 documentation</title>
|
||||
<title>OpenStack Integration — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,13 +27,13 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="next" title="Using Ryu Network Operating System with OpenStack as OpenFlow controller" href="using_with_openstack.html" />
|
||||
<link rel="prev" title="Getting Started" href="getting_started.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>OpenStack Integration</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -78,7 +78,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,116 +0,0 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Ryu Network Operating System — Ryu 1.2 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/print.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.2',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.2 documentation" href="index.html" />
|
||||
<link rel="next" title="Writing Ryu Application" href="writing_ryu_app.html" />
|
||||
<link rel="prev" title="Welcome to RYU the Network Operating System(NOS)" href="index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.2 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Ryu Network Operating System</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
«  <a href="index.html">Welcome to RYU the Network Operating System(NOS)</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="writing_ryu_app.html">Writing Ryu Application</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="ryu-network-operating-system">
|
||||
<h1>Ryu Network Operating System<a class="headerlink" href="#ryu-network-operating-system" title="Permalink to this headline">¶</a></h1>
|
||||
<div class="section" id="what-s-ryu">
|
||||
<h2>What’s Ryu<a class="headerlink" href="#what-s-ryu" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Ryu is an Operating System for Software Defined Networking.</p>
|
||||
<p>Ryu aims to provide a logically centralized control and well defined
|
||||
API that make it easy for operators to create new network management
|
||||
and control applications. Currently, Ryu manages network devices by
|
||||
using OpenFlow. You can say that Ryu is an OpenFlow Controller, which
|
||||
support OpenFlow v1.0, v1.2, and Nicira Extensions.</p>
|
||||
<p>All of the code is freely available under the Apache 2.0 license. Ryu
|
||||
is fully written in Python.</p>
|
||||
</div>
|
||||
<div class="section" id="quick-start">
|
||||
<h2>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Installing Ryu is quite easy:</p>
|
||||
<div class="highlight-python"><pre>% pip install ryu</pre>
|
||||
</div>
|
||||
<p>If you prefer to install Ryu from the source code:</p>
|
||||
<div class="highlight-python"><pre>% git clone git://github.com/osrg/ryu.git
|
||||
% cd ryu; python ./setup.py install</pre>
|
||||
</div>
|
||||
<p>If you want to use Ryu with <a class="reference external" href="http://openstack.org/">OpenStack</a>,
|
||||
please refer <a class="reference external" href="http://www.osrg.net/ryu/overview.html">detailed documents</a>.
|
||||
You can create tens of thousands of isolated virtual networks without
|
||||
using VLAN. The Ryu application is included in OpenStack mainline as
|
||||
of Essex release.</p>
|
||||
<p>If you want to run your Ryu application, have a look at
|
||||
<a class="reference external" href="https://github.com/osrg/ryu/blob/master/ryu/app/simple_switch.py">a simple example</a>.
|
||||
After writing your application, just type:</p>
|
||||
<div class="highlight-python"><pre>% ryu-manager yourapp.py</pre>
|
||||
</div>
|
||||
</div>
|
||||
<div class="section" id="support">
|
||||
<h2>Support<a class="headerlink" href="#support" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Ryu Official site is <a class="reference external" href="http://osrg.github.com/ryu/">http://osrg.github.com/ryu/</a>.</p>
|
||||
<p>If you have any
|
||||
questions, suggestions, and patches, the mailing list is available at
|
||||
<a class="reference external" href="https://lists.sourceforge.net/lists/listinfo/ryu-devel">ryu-devel ML</a>.
|
||||
<a class="reference external" href="http://dir.gmane.org/gmane.network.ryu.devel">The ML archive at Gmane</a>
|
||||
is also available.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
|
||||
<p>
|
||||
«  <a href="index.html">Welcome to RYU the Network Operating System(NOS)</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
  ::  
|
||||
<a href="writing_ryu_app.html">Writing Ryu Application</a>  »
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Getting Started — Ryu 1.3 documentation</title>
|
||||
<title>Getting Started — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,11 +27,11 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Getting Started</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -186,7 +186,7 @@ ryu.app.event_dumper: event <ryu.controller.dispatcher.EventDispatcherChange
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Search — Ryu 1.3 documentation</title>
|
||||
<title>Search — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -28,7 +28,7 @@
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/searchtools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<script type="text/javascript">
|
||||
jQuery(function() { Search.loadIndex("searchindex.js"); });
|
||||
</script>
|
||||
@@ -37,7 +37,7 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Search</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -85,7 +85,7 @@
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Step-by-step example for testing ryu with OpenStack — Ryu 1.3 documentation</title>
|
||||
<title>Step-by-step example for testing ryu with OpenStack — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,14 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="OpenStack Integration" href="openstack.html" />
|
||||
<link rel="next" title="How Ryu L2 segregation works" href="how_l2_segregation_works.html" />
|
||||
<link rel="prev" title="Using Ryu Network Operating System with OpenStack as OpenFlow controller" href="using_with_openstack.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Step-by-step example for testing ryu with OpenStack</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -437,7 +437,7 @@ Just leave it blank:</p>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
125
doc/tls.html
Normal file
125
doc/tls.html
Normal file
@@ -0,0 +1,125 @@
|
||||
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Setup TLS Connection — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/print.css" type="text/css" />
|
||||
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
};
|
||||
</script>
|
||||
<script type="text/javascript" src="_static/jquery.js"></script>
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="Configuration" href="configuration.html" />
|
||||
<link rel="prev" title="Configuration" href="configuration.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Setup TLS Connection</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
|
||||
<p>
|
||||
«  <a href="configuration.html">Configuration</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
<div class="content">
|
||||
|
||||
|
||||
<div class="section" id="setup-tls-connection">
|
||||
<h1>Setup TLS Connection<a class="headerlink" href="#setup-tls-connection" title="Permalink to this headline">¶</a></h1>
|
||||
<p>If you want to use secure channel to connect OpenFlow switches, you
|
||||
need to use TLS connection. This document describes how to setup Ryu
|
||||
to connect to the Open vSwitch over TLS.</p>
|
||||
<div class="section" id="configuring-a-public-key-infrastructure">
|
||||
<h2>Configuring a Public Key Infrastructure<a class="headerlink" href="#configuring-a-public-key-infrastructure" title="Permalink to this headline">¶</a></h2>
|
||||
<p>If you don’t have a PKI, the ovs-pki script included with Open vSwitch
|
||||
can help you. This section is based on the INSTALL.SSL in the Open
|
||||
vSwitch source code.</p>
|
||||
<p>NOTE: How to install Open vSwitch isn’t described in this
|
||||
document. Please refer to the Open vSwitch documents.</p>
|
||||
<p>Create a PKI by using ovs-pki script:</p>
|
||||
<div class="highlight-python"><pre>% ovs-pki init
|
||||
(Default directory is /usr/local/var/lib/openvswitch/pki)</pre>
|
||||
</div>
|
||||
<p>The pki directory consists of controllerca and switchca
|
||||
subdirectories. Each directory contains CA files.</p>
|
||||
<p>Create a controller private key and certificate:</p>
|
||||
<div class="highlight-python"><pre>% ovs-pki req+sign ctl controller</pre>
|
||||
</div>
|
||||
<p>ctl-privkey.pem and ctl-cert.pem are generated in the current
|
||||
directory.</p>
|
||||
<p>Create a switch private key and certificate:</p>
|
||||
<div class="highlight-python"><pre>% ovs-pki req+sign sc switch</pre>
|
||||
</div>
|
||||
<p>sc-privkey.pem and sc-cert.pem are generated in the current directory.</p>
|
||||
</div>
|
||||
<div class="section" id="testing-tls-connection">
|
||||
<h2>Testing TLS Connection<a class="headerlink" href="#testing-tls-connection" title="Permalink to this headline">¶</a></h2>
|
||||
<p>Configuring ovs-vswitchd to use CA files using the ovs-vsctl “set-ssl”
|
||||
command, e.g.:</p>
|
||||
<div class="highlight-python"><pre>% ovs-vsctl set-ssl sc-privkey.pem sc-cert.pem /usr/local/var/lib/openvswitch/pki/controllerca/cacert.pem
|
||||
% ovs-vsctl add-br br0
|
||||
% ovs-vsctl set-controller br0 ssl:127.0.0.1:6633</pre>
|
||||
</div>
|
||||
<p>Run Ryu with CA files:</p>
|
||||
<div class="highlight-python"><pre>% ryu-manager --ctl_privkey ctl-privkey.pem \
|
||||
--ctl_cert ctl-cert.pem \
|
||||
--ca_cert /usr/local/var/lib/openvswitch/pki/switchca/cacert.pem \
|
||||
--verbose</pre>
|
||||
</div>
|
||||
<p>You can see something like:</p>
|
||||
<div class="highlight-python"><pre>loading app ryu.controller.ofp_handler
|
||||
instantiating app ryu.controller.ofp_handler
|
||||
connected socket:<SSLSocket fileno=4 sock=127.0.0.1:6633 peer=127.0.0.1:56493> address:('127.0.0.1', 56493)
|
||||
unhandled event <ryu.controller.dispatcher.EventQueueCreate object at 0x2fdcd90>
|
||||
hello ev <ryu.controller.ofp_event.EventOFPHello object at 0x2fdce90>
|
||||
move onto config mode
|
||||
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0>
|
||||
switch features ev version: 0x1 msg_type 0x6 xid 0xc23353f2 port OFPPhyPort(port_no=65534, hw_addr='\x16\xd8u\xe7[C', name='br0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', config=1, state=1, curr=0, advertised=0, supported=0, peer=0)
|
||||
move onto main mode
|
||||
unhandled event <ryu.controller.dispatcher.EventDispatcherChange object at 0x2fdcfd0></pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="bottomnav">
|
||||
|
||||
<p>
|
||||
«  <a href="configuration.html">Configuration</a>
|
||||
  ::  
|
||||
<a class="uplink" href="index.html">Contents</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>Using Ryu Network Operating System with OpenStack as OpenFlow controller — Ryu 1.3 documentation</title>
|
||||
<title>Using Ryu Network Operating System with OpenStack as OpenFlow controller — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,14 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="OpenStack Integration" href="openstack.html" />
|
||||
<link rel="next" title="Step-by-step example for testing ryu with OpenStack" href="step_by_step.html" />
|
||||
<link rel="prev" title="OpenStack Integration" href="openstack.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>Using Ryu Network Operating System with OpenStack as OpenFlow controller</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -386,7 +386,7 @@ setups.</p>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
|
||||
<title>The First Application — Ryu 1.3 documentation</title>
|
||||
<title>The First Application — Ryu 1.5 documentation</title>
|
||||
|
||||
<link rel="stylesheet" href="_static/haiku.css" type="text/css" />
|
||||
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
|
||||
@@ -17,7 +17,7 @@
|
||||
<script type="text/javascript">
|
||||
var DOCUMENTATION_OPTIONS = {
|
||||
URL_ROOT: '',
|
||||
VERSION: '1.3',
|
||||
VERSION: '1.5',
|
||||
COLLAPSE_INDEX: false,
|
||||
FILE_SUFFIX: '.html',
|
||||
HAS_SOURCE: true
|
||||
@@ -27,14 +27,14 @@
|
||||
<script type="text/javascript" src="_static/underscore.js"></script>
|
||||
<script type="text/javascript" src="_static/doctools.js"></script>
|
||||
<script type="text/javascript" src="_static/theme_extras.js"></script>
|
||||
<link rel="top" title="Ryu 1.3 documentation" href="index.html" />
|
||||
<link rel="top" title="Ryu 1.5 documentation" href="index.html" />
|
||||
<link rel="up" title="Writing Your Ryu Application" href="developing.html" />
|
||||
<link rel="next" title="Library" href="library.html" />
|
||||
<link rel="prev" title="Writing Your Ryu Application" href="developing.html" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header"><h1 class="heading"><a href="index.html">
|
||||
<span>Ryu 1.3 documentation</span></a></h1>
|
||||
<span>Ryu 1.5 documentation</span></a></h1>
|
||||
<h2 class="heading"><span>The First Application</span></h2>
|
||||
</div>
|
||||
<div class="topnav">
|
||||
@@ -164,7 +164,7 @@ directory.</p>
|
||||
|
||||
<div class="footer">
|
||||
© Copyright 2011, 2012 Nippon Telegraph and Telephone Corporation.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.2.
|
||||
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user