Daniel Farrell
Software Engineer, Red Hat SDN Team
[~/sandbox]$ vagrant init -m centos/7
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "centos/7"
end
[~/sandbox]$ vagrant up
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$
[vagrant@localhost ~]$ curl -o distribution-karaf-0.2.3-Helium-SR3.tar.gz \
<long tarball URL>
[vagrant@localhost ~]$ sudo mkdir /opt/opendaylight
[vagrant@localhost ~]$ sudo tar -x
--strip-components=1
--directory=/opt/opendaylight
-f <long tarball name>
[vagrant@localhost ~]$ sudo /opt/opendaylight/bin/karaf server
karaf: java command not found
[vagrant@localhost ~]$ sudo yum install -y java
vagrant@localhost ~]$ sudo /opt/opendaylight/bin/karaf server &
[vagrant@localhost bin]$ ps -u -p `pgrep java` | awk {'print $1'}
root
[~/pakdep-toolbox-opendaylight]$ vagrant status
Current machine states:
pakdep not created (virtualbox)
cached not created (virtualbox)
pakdep-toolbox-odl-0.1.0.tar VirtualBox-5.0.0-101573-OSX.dmg VirtualBox-5.0.0-101573-Win.exe VirtualBox-5.0-5.0.0_101573_fedora18-1.x86_64.rpm VirtualBox-5.0-5.0.0_101573_fedora22-1.x86_64.rpm virtualbox-5.0_5.0.0-101573-Ubuntu-trusty_amd64.deb
vagrant_1.7.4_x86_64.rpm vagrant_1.7.4_x86_64.deb vagrant_1.7.4.dmg vagrant_1.7.4.msi 7z920-x64.msi 7z920.exe Git-1.9.5-preview20150319.exe
[~]$ tar xf pakdep-toolbox-odl-0.1.0.tar
[~]$ cd pakdep-toolbox-opendaylight
[~/pakdep-toolbox-opendaylight]$ vagrant status
Current machine states:
pakdep not created (virtualbox)
cached not created (virtualbox)
[~/pakdep-toolbox-opendaylight]$ vagrant box add --name "dfarrell07/pakdep" pakdep.box
[~/pakdep-toolbox-opendaylight]$ vagrant up cached
[~]$ sudo curl -so /etc/yum.repos.d/opendaylight.repo <long Copr URL>
[~]$ sudo yum install -y opendaylight
<snip>
Installed:
opendaylight.noarch 0:0.2.3-2.fc20
Complete!
[~]$ sudo systemctl start opendaylight
[~]$ sudo systemctl is-active opendaylight
active
[/opt/opendaylight/bin]$ ./client
<snip>
opendaylight-user@root>feature:install ...
[~/pakdep-toolbox-opendaylight]$ vagrant ssh cached
Last login: Sun Jul 26 07:04:58 2015 from 10.0.2.2
Welcome to your Packer-built virtual machine.
[vagrant@localhost ~]$
[vagrant@localhost ~]$ cd /vagrant/integration/packaging/rpm/
[vagrant@localhost rpm]$
[vagrant@localhost rpm]$ ls
build.sh connect.sh install.sh opendaylight.spec README.md uninstall.sh Vagrantfile
[vagrant@localhost rpm]$ grep -rniI el7.centos .
./build.sh:22:rpm_release="2.el7.centos"
./install.sh:20:rpm_release="2.el7.centos"
[vagrant@localhost rpm]$ sed -i 's/el7.centos/fc21/' build.sh install.sh
[vagrant@localhost rpm]$ grep -rniI el7.centos .
[vagrant@localhost rpm]$
[vagrant@localhost rpm]$ grep "rpmbuild -ba" build.sh
rpmbuild -ba opendaylight.spec
[vagrant@localhost rpm]$ sed -i 's/rpmbuild -ba/rpmbuild -bb/' build.sh
[vagrant@localhost rpm]$ grep "rpmbuild -ba" build.sh
[vagrant@localhost rpm]$ grep "rpmbuild -bb" build.sh
rpmbuild -bb opendaylight.spec
[vagrant@localhost rpm]$ ./build.sh /vagrant/cache/
^^don't forget the param[vagrant@localhost rpm]$ ls -rc /vagrant/cache/ | tail -n 1
opendaylight-3.0.0-2.fc21.noarch.rpm
[vagrant@localhost rpm]$ ./install.sh /vagrant/cache/
^^don't forget the paramInstalling ODL from /vagrant/cache//opendaylight-3.0.0-2.fc21.noarch.rpm
+ sudo rpm -i /vagrant/cache//opendaylight-3.0.0-2.fc21.noarch.rpm
[vagrant@localhost rpm]$ sudo systemctl is-active opendaylight
unknown
[vagrant@localhost rpm]$ sudo systemctl start opendaylight
[vagrant@localhost rpm]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost rpm]$ ./connect.sh
opendaylight-user@root>info
Karaf
Karaf version 3.0.3
Karaf home /opt/opendaylight
...
[vagrant@localhost rpm]$ sudo systemctl stop opendaylight
[vagrant@localhost rpm]$ ./uninstall.sh
Uninstalling ODL
+ sudo rpm -e opendaylight-3.0.0
We work to make contributing easy.
class { 'opendaylight':
install_method => 'tarball',
tarball_url => '<URL to your custom tarball>',
unitfile_url => '<URL to your custom unitfile>',
}
[~]$ less genesis/puppet/opnfv/manifests/network.pp
<snip>
class { "opendaylight":
features => [<OPNFV's Karaf features>],
}
<snip>
[~/puppet-opendaylight]$ bundle exec rake test
---> syntax:manifests
---> syntax:templates
---> syntax:hiera:yaml
Finished in 14.14 seconds (files took 0.53374 seconds to load)
537 examples, 0 failures
Total resources: 17
Touched resources: 17
Resource coverage: 100.00%
metadata-json-lint metadata.json
Bringing machine 'centos-7' up with 'virtualbox' provider...
centos-7 12:45:09$ yum install -y puppet
centos-7 12:45:46$ puppet apply <test manifest>
centos-7 12:49:37$ /bin/sh -c systemctl\ is-active\ opendaylight
active
centos-7 executed in 0.04 seconds
should be running
centos-7 12:49:37$ /bin/sh -c id\ odl
uid=1001(odl) gid=1001(odl) groups=1001(odl)
centos-7 executed in 0.04 seconds
should exist
centos-7 executed in 0.05 seconds
should match /^featuresBoot=standard,ssh/
Finished in 5 minutes 22 seconds (files took 1 minute 10.87 seconds to load)
51 examples, 0 failures
# Box that installs ODL via Puppet RPM method on CentOS 7
config.vm.define "cent7_pup_rpm" do |cent7_pup_rpm|
# Build Vagrant box based on CentOS 7
cent7_pup_rpm.vm.box = "chef/centos-7.0"
# Add EPEL repo for access to Puppet et al
cent7_pup_rpm.vm.provision "shell", inline: "yum install -y epel-release"
# Install Puppet
cent7_pup_rpm.vm.provision "shell", inline: "yum install -y puppet"
# Install OpenDaylight using its Puppet module
cent7_pup_rpm.vm.provision "puppet" do |puppet|
puppet.module_path = ["modules"]
puppet.manifest_file = "odl_install.pp"
end
end
# Install OpenDaylight using its Puppet module
cent7_pup_rpm.vm.provision "puppet" do |puppet|
puppet.module_path = ["modules"]
puppet.manifest_file = "odl_install.pp"
end
puppet.module_path = ["modules"]
[~/vagrant-opendaylight]$ librarian-puppet install
[~/vagrant-opendaylight]$ ls modules
archive java opendaylight stdlib
[~/vagrant-opendaylight]$ cat Puppetfile
#!/usr/bin/env ruby
forge "https://forgeapi.puppetlabs.com"
mod 'dfarrell07-opendaylight',
:git => 'git://github.com/dfarrell07/puppet-opendaylight.git',
:ref => 'origin/master'
puppet.manifest_file = "odl_install.pp"
[~/vagrant-opendaylight]$ cat manifests/odl_install.pp
class { 'opendaylight':
extra_features => ['odl-ovsdb-openstack'],
}
[~/vagrant-opendaylight]$ vagrant up cent7_pup_rpm
Notice: /Stage[main]/Opendaylight::Install/Yumrepo[opendaylight]/ensure: created
Notice: /Stage[main]/Opendaylight::Install/Package[opendaylight]/ensure: created
/Stage[main]/Opendaylight::Config/File[org.apache.karaf.features.cfg]/content: content changed '<hash>' to '<different hash>'
[~/vagrant-opendaylight]$ vagrant ssh cent7_pup_rpm
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ /vagrant/scripts/connect.sh
opendaylight-user@root>config:list | grep featuresBoot\ =
featuresBoot = <default features>,odl-ovsdb-openstack
opendaylight-user@root>feature:list | grep odl-ovsdb-openstack
odl-ovsdb-openstack | 1.0.3-Helium-SR3 | x | ovsdb-1.0.3-Helium-SR3 <snip>
[vagrant@localhost puppet-opendaylight]$ vim spec/classes/opendaylight_spec.rb
[vagrant@localhost puppet-opendaylight]$ git diff
- karaf_feature_tests(extra_features: extra_features)
+ karaf_feature_tests(extra_features: ['odl-toaster'])
[vagrant@localhost puppet-opendaylight]$ bundle exec rake spec
# snip
537 examples, 1 failure
Failed examples:
rspec ./spec/classes/opendaylight_spec.rb[1:2:1:2:18] # opendaylight Karaf feature tests using default features and passing extra features should contain File[org.apache.karaf.features.cfg] with ensure => "file", path => "/opt/opendaylight/etc/org.apache.karaf.features.cfg", owner => "odl", group => "odl" and content =~ /^featuresBoot=config,standard,region,package,kar,ssh,management,odl-toaster/
[vagrant@localhost puppet-opendaylight]$ git checkout -- spec/classes/opendaylight_spec.rb
[vagrant@localhost puppet-opendaylight]$ git diff
[vagrant@localhost puppet-opendaylight]$ bundle exec rake spec
# snip
537 examples, 0 failures
[~/ansible-opendaylight]$ cat tasks/main.yml
- include: install_odl_via_rpm_repo.yml
when: install_method == "rpm_repo"
- include: install_odl_via_rpm_path.yml
when: install_method == "rpm_path"
- include: configure_karaf_features.yml
- include: configure_nb_rest_port.yml
- include: open_nb_rest_port.yml
- include: start_odl_systemd_service.yml
- name: Start ODL systemd service
service:
name=opendaylight
enabled=yes
state=started
- name: Configure ODL Karaf features
template:
src=org.apache.karaf.features.cfg
dest=/opt/opendaylight/etc/
owner=odl
group=odl
notify:
- Stop ODL
- Cleanup Karaf
- Start ODL
[~/ansible-opendaylight]$ wc -l **/*.yml
<snip>
186 total
“don’t unit test your playbook"
“Ansible believes you should not need another framework to validate basic things of your infrastructure”
# Box that installs ODL via its Ansible role on CentOS 7
config.vm.define "cent7_ansible" do |cent7_ansible|
# Build Vagrant box based on CentOS 7
cent7_ansible.vm.box = "chef/centos-7.0"
# Install ODL using the Ansible provisioner
cent7_ansible.vm.provision "ansible" do |ansible|
# Path to playbook that installs ODL using ODL's Ansible role
ansible.playbook = "provisioning/playbook.yml"
end
end
ansible.playbook = "provisioning/playbook.yml"
[~/vagrant-opendaylight]$ cat provisioning/playbook.yml
---
- hosts: all
sudo: yes
roles:
- opendaylight
[~/vagrant-opendaylight]$ vagrant up cent7_ansible
TASK: [opendaylight | Add ODL yum repo] **********************************
changed: [cent7_ansible]
TASK: [opendaylight | Install ODL RPM] ***********************************
changed: [cent7_ansible]
TASK: [opendaylight | Configure ODL Karaf features] **********************
changed: [cent7_ansible]
TASK: [opendaylight | Configure ODL NB REST port] ************************
changed: [cent7_ansible]
TASK: [opendaylight | Check if FirewallD service is running] *************
ok: [cent7_ansible]
TASK: [opendaylight | Open ODL NB REST port via FirewallD] ***************
skipping: [cent7_ansible]
TASK: [opendaylight | Start ODL systemd service] *************************
changed: [cent7_ansible]
[~/vagrant-opendaylight]$ vagrant ssh cent7_ansible
[vagrant@localhost ~]$
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[~/vagrant-opendaylight]$ cat provisioning/playbook.yml
---
- hosts: all
sudo: yes
roles:
- role: opendaylight
extra_features: ['odl-ovsdb-openstack']
TASK: [opendaylight | Configure ODL Karaf features] **********************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Stop ODL] **************************************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Cleanup Karaf] *********************************
changed: [cent7_ansible]
NOTIFIED: [opendaylight | Start ODL] *************************************
changed: [cent7_ansible]
[~/vagrant-opendaylight]$ vagrant ssh cent7_ansible
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ /vagrant/scripts/connect.sh
opendaylight-user@root>config:list | grep odl-ovsdb-openstack
featuresBoot = config,<snip>,odl-ovsdb-openstack
opendaylight-user@root>feature:list | grep odl-ovsdb-openstack
odl-ovsdb-openstack | 1.0.3-Helium-SR3 | x | ovsdb-1.0.3-Helium-SR3 <snip>
[~]$ sudo ansible-galaxy install dfarrell07.opendaylight
[~/sandbox]$ cat /etc/ansible/hosts
odl_box ansible_ssh_host=10.3.12.87 ansible_ssh_user=centos
[~/sandbox]$ cat install_odl.yml
---
- hosts: odl_box
sudo: yes
roles:
- opendaylight
[~/sandbox]$ ansible-playbook install_odl.yml
TASK: [opendaylight | Configure ODL Karaf features] **************************
changed: [odl_box]
TASK: [opendaylight | Start ODL systemd service] *****************************
changed: [odl_box]
[~/sandbox]$ ssh ansible0
[centos@dfarrell-ansible0 ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ ansible-galaxy list
- dfarrell07.opendaylight, 0.4.0
[vagrant@localhost ~]$ cat playbook.yml
---
- hosts: localhost
sudo: yes
roles:
- role: dfarrell07.opendaylight
install_method: "rpm_path"
rpm_path: "/vagrant/cache/opendaylight-3.0.0-2.el7.centos.noarch.rpm"
[vagrant@localhost ~]$ ansible-playbook playbook.yml
[vagrant@localhost ~]$ vim playbook.yml
[vagrant@localhost ~]$ cat playbook.yml
---
- hosts: localhost
sudo: yes
roles:
- role: dfarrell07.opendaylight
install_method: "rpm_path"
rpm_path: "/vagrant/cache/opendaylight-3.0.0-2.el7.centos.noarch.rpm"
extra_features: ['odl-toaster']
[vagrant@localhost ~]$ ansible-playbook playbook.yml
TASK: [dfarrell07.opendaylight | Configure ODL Karaf features] ***********
changed: [localhost]
[vagrant@localhost ~]$ grep "^featuresBoot=" /opt/opendaylight/etc/org.apache.karaf.features.cfg
featuresBoot=config,standard,region,package,kar,ssh,management,odl-toaster
[~/sandbox]$ docker run -ti dfarrell07/odl:0.2.3 ./bin/karaf
[~/sandbox]$ docker ps
CONTACONTAINER ID IMAGE COMMAND
b2869594fab3 dfarrell07/odl:0.2.3 "./bin/karaf"
[~/integration/packaging/docker]$ docker build -t dfarrell07/odl:0.2.3 .
Step 0 : FROM debian:7
---> 479215127fa7
Step 2 : RUN apt-get update && apt-get install -y openjdk-7-jre-headless wget
---> Using cache
---> 7f3f5c682c1c
Step 5 : RUN wget...
Step 6 : EXPOSE 162 179 1088 1790 1830 2400 2550 2551 2552 4189 4342 5005 5666 6633 6640 6653 7800 8000 8080 8101 8181 8383 12001
---> Running in 8625b7f32695
---> 0be36e6be661
Step 9 : CMD ./bin/karaf server
---> Running in 16cab37bf9c2
---> af863ac2de74
[vagrant@localhost ~]$ cd /vagrant/integration/packaging/docker/
[vagrant@localhost docker]$
[vagrant@localhost docker]$ docker run -ti dfarrell07/odl ./bin/karaf
opendaylight-user@root>feature:install odl-toaster
opendaylight-user@root>feature:list | grep toaster
odl-toaster | 1.1.3-Helium-SR3 | x | odl-mdsal-1.1.3-Helium-SR3
[vagrant@localhost docker]$ docker build -t odl:0.2.3 .
[vagrant@localhost docker]$ docker run -ti odl:0.2.3 bash
root@5d25df28e880:/opt/opendaylight#
root@5d25df28e880:/opt/opendaylight# ./bin/karaf
opendaylight-user@root>info
opendaylight-user@root>^D
root@5d25df28e880:/opt/opendaylight# exit
[vagrant@localhost docker]$
[~/sandbox]$ vagrant init -m dfarrell07/opendaylight
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "dfarrell07/opendaylight"
end
[~/sandbox]$ vagrant up
default: URL: https://atlas.hashicorp.com/dfarrell07/opendaylight
==> default: Adding box 'dfarrell07/opendaylight' (v2.3.0)
[~/sandbox]$ vagrant status
Current machine states:
default running (virtualbox)
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[~/pakdep-toolbox-opendaylight]$ ls -lh cache/opendaylight-2.3.0-centos-1503.box
-rw-rw-r--. 1 daniel daniel 1.1G Jul 24 16:07 cache/opendaylight-2.3.0-centos-1503.box
[~/pakdep-toolbox-opendaylight]$ vagrant box add \
--name "opendaylight" \
cache/opendaylight-2.3.0-centos-1503.box \
--force
==> box: Successfully added box 'opendaylight' (v0) for 'virtualbox'!
[~/pakdep-toolbox-opendaylight]$ mkdir sandbox
[~/pakdep-toolbox-opendaylight]$ cd sandbox
[~/pakdep-toolbox-opendaylight/sandbox]$ vagrant init -m opendaylight
[~/pakdep-toolbox-opendaylight/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "opendaylight"
end
[~/pakdep-toolbox-opendaylight/sandbox]$ vagrant status
Current machine states:
default not created (virtualbox)
[~/pakdep-toolbox-opendaylight/sandbox]$ vagrant up
[~/pakdep-toolbox-opendaylight/sandbox]$ vagrant ssh
Last login: Fri Jun 12 17:59:10 2015 from 10.0.2.2
[vagrant@localhost ~]$
[vagrant@localhost ~]$ pgrep java
909
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
[vagrant@localhost ~]$ ssh -p 8101 karaf@localhost
("yes" to RSA cert, password "karaf`)opendaylight-user@root>feature:list | grep odl-toaster
odl-toaster | 1.1.3-Helium-SR3 | x | odl-mdsal-1.1.3-Helium-SR3
opendaylight-user@root>^D
Connection to localhost closed.
[vagrant@localhost ~]$ logout
Connection to 127.0.0.1 closed.
[~/pakdep-toolbox-opendaylight/sandbox]$ vagrant suspend
==> default: Saving VM state and suspending execution...
[~/integration/packaging/packer]$ packer build centos.json
"provisioners": [
{
"type": "shell",
"scripts":
[
"config_vagrant.sh",
"config_virtualbox.sh",
"config_ansible.sh"
]
},
#..."provisioners": [
{
"type": "ansible-local",
"playbook_file": "install_odl.yml"
}
"post-processors": [
{
"type": "vagrant",
"compression_level": "9",
"output": "opendaylight-{{ user `box_version` }}-centos-1503.box"
}
]
==> Builds finished. The artifacts of successful builds are:
--> virtualbox' provider box: opendaylight-2.3.0-centos-1503.box
[~/integration/packaging/packer]$ ls -rc | tail -n 1
opendaylight-2.3.0-centos-1503.box
[~/sandbox]$ vagrant box add --name "opendaylight" \
opendaylight-2.3.0-centos-1503.box
[~/sandbox]$ vagrant init -m opendaylight
[~/sandbox]$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "opendaylight"
end
[~/sandbox]$ vagrant up
==> default: Importing base box 'opendaylight'...
[~/sandbox]$ vagrant ssh
[vagrant@localhost ~]$ sudo systemctl is-active opendaylight
active
By Daniel Farrell
Tutorial given at OpenDaylight Summit 2015