Jump to: navigation, search

OpenDaylight Controller:Installation

This was last updated for the Helium release and needs to be updated. Please bear that in mind when reading the content and feel free to help update it.

OpenDaylight Controller Contents
Installation Guide
Programmer Guide
Back to Top

OpenDaylight Controller runs in a JVM. Being a Java application, it can potentially run on any operating system that supports Java. However, for best results we recommend the following:

  • A recent Linux distribution
  • Java Virtual Machine 1.7

Note: The following instructions assumes:

  • You are installing OpenDaylight Controller on your local Linux machine
  • You will use the Mininet VM to create a virtual network

OpenDaylight Controller has not been tested in other environments.

Installing OpenDaylight Controller

NOTE The following instructions are for running/installing the helium and earlier release. Please see (link) for more details.

There are two options for obtaining the OpenDaylight Controller code. Option #1 is the easiest for beginners to download the prebuilt current build. Option #2 is more advanced by building the modules on your machine.

Option #1 (Beginner)

Download the latest build of controller already built to have running in a couple of steps:

Download and Run the controller

  • The source code of the OpenDaylight Controller is in a directory called opendaylight. In this directory (the coresponding directory in the git repository is usually the distribution/opendaylight/target/distribution.opendaylight-0.1.6-SNAPSHOT-osgipackage/opendaylight), you will see the following files:
  • run.sh — launches the OpenDaylight Controller on Linux/Unix systems
  • run.bat — launches OpenDaylight Controller on Windows systems
  • version.properties — indicates the build version
  • configuration — basic initialization files (internal to OpenDaylight Controller)
  • lib — Java libraries
  • plugins — OpenDaylight Controller's OSGi plugins
2. Enter ./run.sh or ./run.bat with administrator privileges to launch the OpenDaylight Controller application.
3. Navigate to http://controller-ip:8080 to open the web interface, then use the following credentials to log in:
  • User: admin
  • Password: admin
4. Once logged in, please ensure to change the default admin password. To do so, navigate to the admin menu in the top right corner of the web interface. Select Users and then select the admin user. A pop-up will then present the option to Change Password.

Option #2 (Advanced)

If you wish to build the controller from source, please see the developer section in Pulling, Hacking, and Pushing the Code from the CLI. However, the following instructions are for the stable/helium git branch.



1. Out of memory error - java.lang.OutOfMemoryError: PermGen space

  • Can be resolved by setting maven options:

Increase the amount of memory by changing the "MAVEN_OPTS" ENV variable. An example for a Bash shell is as follows:

export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=512m"
/* syntax for setting varies on the OS used by the build machine. */

You can verify the variable is set with the following in a Bash shell.

$ export | grep MAVEN_OPTS
declare -x MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=512m"
 An example on a Linux based machine or a Mac you simply put "export" before
 the variable. e.g. export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=512m"
 (parentheses around the value after the equals sign). That ENV variable is not 
persistent unless you put it into a shell startup script. In Linux for example 
the ~/.bashrc file and Mac the ~/.bash_profile file.

2. Maven out of memory error when building northbound integration tests

If you receive a Maven error when building northbound integration tests that will also state "java.lang.OutOfMemoryError: PermGen space:" you can skip building those tests running the following:

mvn clean install -DskipTests 
/* instead of "mvn clean install" */

3. GetLocalHost() failure on MacOS and java7u5

If you see the following message when running the controller you have stumbled on a Java bug for MacOS:

"Failed to get local hostname java.net.UnknownHostException: repenno-mac: repenno-mac: nodename nor servname provided, or not known" 

This is a known bug that has plagued Java for Macos for some time. For reference:



First try adding an extra line to edit /etc/hosts like: <your-host-name>

But in some systems this is not enough. The <your-host-name> needs to be the same you get as the output of scutil.

For example, a good output of scutil assuming the host name is <sailing-mac> is:

sailing-mac:controller repenno$ scutil --get LocalHostName
sailing-mac:controller repenno$ scutil --get HostName
sailing-mac:controller repenno$ scutil --get ComputerName

So, make sure all have the same name:

sailing-mac:controller repenno$ scutil --set LocalHostName <your-host-name>
sailing-mac:controller repenno$ scutil --set HostName <yout-host-name>
sailing-mac:controller repenno$ scutil --set ComputerName <your-host-name>

4. Out of Memory Error: java.lang.OutOfMemoryError: Java heap space

Increase the amount of Heap space at start up:

./run.sh -Xmx1024m

./run.sh -Xmx512m also works but the startup sequence is noticeably significantly slower. In some systems ./run.sh -Xmx256m it not enough.

Using Mininet

  1. Download Mininet. OpenDaylight Controller has been tested against the Mininet VM (Option 1). It has not been tested against other Mininet installation options.
  2. Launch the Mininet VM with VirtualBox or another virtualization application.
  3. Log on to the Mininet VM with the following credentials:
    • user: mininet
    • password: mininet
  4. Determine the IP address of the server hosting OpenDaylight Controller, and use it to start a virtual network: sudo mn --controller=remote,ip=controller-ip --topo tree,3.

Mininet will connect to OpenDaylight Controller and set up a three-level tree topology.

mininet@mininet-vm:~$ sudo mn --controller=remote,ip= --topo tree,3
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2 h3 h4 h5 h6 h7 h8 
*** Adding switches:
s1 s2 s3 s4 s5 s6 s7 
*** Adding links:
(h1, s3) (h2, s3) (h3, s4) (h4, s4) (h5, s6) (h6, s6) (h7, s7) (h8, s7) (s1, s2) (s1, s5) (s2, s3) (s2, s4) (s5, s6) (s5, s7) 
*** Configuring hosts 
h1 h2 h3 h4 h5 h6 h7 h8 
*** Starting controller
*** Starting 7 switches
s1 s2 s3 s4 s5 s6 s7 
*** Starting CLI:

Note: See the Mininet Walkthrough for a more detailed explanation of Mininet's configuration options. There is an appendix that explains how to configure Mininet to use a remote controller.

Important troubleshooting - if you are running VirtualBox on the same host/desktop where the controller is running, and trying to start the virtual network on Mininet VM produces this error: "Unable to contact the remote controller at ...", then the following resolves the problem:

1. In VirtualBox, go to File-Preferences-Network and make sure you have at least one interface defined as Host-Only. Lets say its name is vboxnet0

2. In VirtualBox - Mininet Vm - Settings - Network, check that the adapter is of type Host only , and is connected to the interface from item 1 (vboxnet0)

3. On your host where controller and VirtualBox run, do "ifconfig" command to display all network interfaces on the machine.

Search for the interface as in item 1 (vboxnet0 in our example) Take the ip address specified there (most probably - default), and that is the correct remote controller ip address to use when starting a virtual network in mininet vm as stated in the example above (--controller=remote,ip= .

4. If you are still not able to connect, you might want to consider temporarily disabling firewall on the host running the controller (on Linux, for example, iptables -F will do the job)

5. Sometimes, the way you start the mininet is a problem, it does not give error, but does not connect to the remote server. Here is a wrong example:

   sudo mn --topo=tree,3 --mac --switch=ovsk --controller=remote, ip=

Here is the correct example:

   sudo mn --topo=tree,3 --mac --switch=ovsk --controller=remote,ip=

The difference is the "SPACE" between "remote," and "ip".

Resetting Mininet

Here's a perl from the appendix mentioned above:

If Mininet crashes or if you lose your console from a remote connection, the switches remain configured in the database and you'll want to clean them up.

$ sudo mn -c

Using the Simple Forwarding Application

The OpenDaylight Controller includes an application called Simple Forwarding that lets you use the basic services for making forwarding decisions and install flows across all devices on the Openflow network. This application discovers the presence of a host via ARP message and installs dest-only /32 entries across all switches in the network, with the corresponding output ports toward the host.

1. With OpenDaylight Controller and Mininet running as described in previous sections, log into the web interface.


2. Drag and drop devices to organize the topology into its logical arrangement, then save the configuration.


3. Click the Add Gateway IP Address button (shown above) and add the IP and subnet of


4 Confirm that hosts are now reachable from one another. On the console where Mininet is running, have one host ping another.
mininet> h1 ping h7
PING ( 56(84) bytes of data.
64 bytes from icmp_req=1 ttl=64 time=1.52 ms
64 bytes from icmp_req=2 ttl=64 time=0.054 ms
64 bytes from icmp_req=3 ttl=64 time=0.060 ms
64 bytes from icmp_req=4 ttl=64 time=0.052 ms
--- ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.052/0.422/1.523/0.635 ms
5. Click the Troubleshooting tab and then load the Flow Details for one of the switches.


6. View the Port Details.


7. On the OSGI console, type ss simple. You will see that the Simple Forwarding app is ACTIVE.
osgi> ss simple
"Framework is launched."

id	State       Bundle
45	ACTIVE      org.opendaylight.controller.samples.simpleforwarding_0.4.0.SNAPSHOT