summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Atteka <ansisatteka@gmail.com>2018-01-15 16:18:30 -0800
committerAnsis Atteka <aatteka@ovn.org>2018-02-12 10:47:03 -0800
commit6feddcd5417d8b57a342f4378776f3b3751ea341 (patch)
treef435d371d609003fd8f1a253c648350858974000
parent6deeb55a3ec9357c42c21ca1582668136ed264c4 (diff)
downloadopenvswitch-6feddcd5417d8b57a342f4378776f3b3751ea341.tar.gz
poc: Introduce Proof of Concepts (Package building)
This patch sets up foundations for Proof of Concepts that simply materialize documentation into Ansible instructions executed in virtualized Vagrant environment. This Proof of Concept allows to easily build: 1. *.deb packages on Ubuntu 16.04; AND 2. *.rpm packages on CentOS 7.4. It also sets up DEB and RPM repository over HTTP that can be used to pull these openvswitch packages with apt-get or yum from another host. This particular Proof of Concept is intended to address following use-cases: 1. for new OVS users to see how debian and rpm packages are built; 2. for developers to easily check for packaging build regressions; 3. for developers to easily share their sandbox builds into QE setups (opposed to manually copying binaries); 4. for developers to add other Proof of Concepts that possibly may require full end-to-end integration with other thirdparty projects (e.g. DPI, libvirt, IPsec) and need Open vSwitch packages. Tested-by: Greg Rose <gvrose8192@gmail.com> Reviewed-by: Greg Rose <gvrose8192@gmail.com> Signed-off-by: Ansis Atteka <aatteka@ovn.org>
-rw-r--r--.gitignore2
-rw-r--r--Documentation/topics/testing.rst56
-rw-r--r--Makefile.am3
-rw-r--r--poc/builders/Vagrantfile33
-rw-r--r--poc/playbook-centos-builder.yml108
-rw-r--r--poc/playbook-ubuntu-builder.yml70
6 files changed, 272 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index 8019bee41..81faf270d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@
*.lib
*.pdb
*.pyc
+*.retry
*.so
*.suo
**/*.sym
@@ -29,6 +30,7 @@
.dirstamp
.libs
.tmp_versions
+.vagrant
.gitattributes
/Makefile
/Makefile.in
diff --git a/Documentation/topics/testing.rst b/Documentation/topics/testing.rst
index a49336b79..253857171 100644
--- a/Documentation/topics/testing.rst
+++ b/Documentation/topics/testing.rst
@@ -389,3 +389,59 @@ validate the suitability of different vSwitch implementations in a telco
deployment environment. More information can be found on the `OPNFV wiki`_.
.. _OPNFV wiki: https://wiki.opnfv.org/display/vsperf/VSperf+Home
+
+Proof of Concepts
+~~~~~~~~~~~~~~~~~
+
+Proof of Concepts are documentation materialized into Ansible recipes
+executed in VirtualBox or Libvirt environments orchastrated by Vagrant.
+Proof of Concepts allow developers to create small virtualized setups that
+demonstrate how certain Open vSwitch features are intended to work avoiding
+user introduced errors by overlooking instructions. Proof of Concepts
+are also helpful when integrating with thirdparty software, because standard
+unit tests with make check are limited.
+
+Vagrant by default uses VirtualBox provider. However, if Libvirt is your
+choice of virtualization technology, then you can use it by installing Libvirt
+plugin:
+
+ $ vagrant plugin install vagrant-libvirt
+
+And then appending --provider=libvirt flag to vagrant commands.
+
+The host where Vagrant runs does not need to have any special software
+installed besides vagrant, virtualbox (or libvirt and libvirt-dev) and
+ansible.
+
+The following Proof of Concepts are supported:
+
+Builders
+++++++++
+
+This particular Proof of Concept demonsrtates integration with Debian and RPM
+packaging tools:
+
+ $ cd ./poc/builders
+
+ $ vagrant up
+
+Once that command finished you can get packages from /var/www/html
+directory. Since those hosts are also configured as repositories then
+you can add them to /etc/apt/sources.list.d or /etc/yum.repos.d
+configuration files on another host to retrieve packages with yum or
+apt-get.
+
+hen you have made changes to OVS source code and want to rebuild packages run:
+ $ git commit -a
+ $ vagrant rsync && vagrant provision
+
+Whenever packages are rebuilt the Open vSwitch release number increases
+by one and you can simply upgrade Open vSwitch by running yum or apt-get
+update commands.
+
+Once you are done with experimenting you can tear down setup with:
+
+ $ vagrant destroy
+
+Sometimes deployment of Proof of Concept may fail, if, for example, VMs
+don't have network reachability to the Internet.
diff --git a/Makefile.am b/Makefile.am
index d397f652f..80a043531 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -90,6 +90,9 @@ EXTRA_DIST = \
build-aux/sodepends.py \
build-aux/soexpand.py \
build-aux/xml2nroff \
+ poc/builders/Vagrantfile \
+ poc/playbook-centos-builder.yml \
+ poc/playbook-ubuntu-builder.yml \
$(MAN_FRAGMENTS) \
$(MAN_ROOTS) \
Vagrantfile \
diff --git a/poc/builders/Vagrantfile b/poc/builders/Vagrantfile
new file mode 100644
index 000000000..af2986789
--- /dev/null
+++ b/poc/builders/Vagrantfile
@@ -0,0 +1,33 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+VAGRANTFILE_API_VERSION = "2"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.ssh.insert_key = false
+
+ # Centos-7.4 builder host
+ config.vm.define "centosbuilder" do |builder|
+ builder.vm.hostname = "centosbuilder.dev"
+ builder.vm.box = "centos/7"
+ builder.vm.synced_folder "../../", "/git/ovs", type: "rsync",
+ rsync__args: ["--archive", "--delete", "-z"]
+ builder.vm.provision "builder", type: "ansible" do |ansible|
+ ansible.playbook = "../playbook-centos-builder.yml"
+ ansible.sudo = true
+ end
+ end
+
+ # Ubuntu-16.04 builder host
+ config.vm.define "ubuntubuilder" do |builder|
+ builder.vm.hostname = "ubuntubuilder.dev"
+ builder.vm.box = "generic/ubuntu1604"
+ builder.vm.synced_folder "../../", "/git/ovs", type: "rsync",
+ rsync__args: ["--archive", "--delete", "-z"]
+ builder.vm.provision "builder", type: "ansible" do |ansible|
+ ansible.playbook = "../playbook-ubuntu-builder.yml"
+ ansible.sudo = true
+ end
+ end
+
+end
diff --git a/poc/playbook-centos-builder.yml b/poc/playbook-centos-builder.yml
new file mode 100644
index 000000000..71f104010
--- /dev/null
+++ b/poc/playbook-centos-builder.yml
@@ -0,0 +1,108 @@
+---
+- hosts: all
+ become: true
+ name: builder
+ tasks:
+
+ - name: Create Ansible Local Facts Directory
+ file: path=/etc/ansible/facts.d state=directory
+
+ - name: Initiate Build Numbering
+ copy:
+ content: '{ "release":"1" }'
+ dest: "/etc/ansible/facts.d/builder.fact"
+ force: no
+
+ - name: Set source directory for building
+ set_fact:
+ SOURCE: "/root/rpmbuild/SOURCES"
+
+ - name: Reload Ansible Local Facts
+ setup: filter=ansible_local
+
+ - name: Install "yum-utils", "rpmdevtools", "createrepo", "httpd", "git"
+ yum: update_cache=yes name={{item}} state=present
+ with_items:
+ - yum-utils
+ - rpmdevtools
+ - createrepo
+ - httpd
+ - git
+
+ - name: Remove untracked files from Open vSwitch GIT repository
+ command: chdir=/git/ovs/ git clean -xdf
+
+ - name: Reset Open vSwitch GIT repository to last comitted state
+ command: chdir=/git/ovs/ git reset --hard
+
+ - name: Generate spec files for easy build dependency retrieval
+ shell: sed -e 's/@VERSION@/0.0.1/' {{item}}.in > /tmp/{{item}}
+ args:
+ chdir: /git/ovs/rhel
+ with_items:
+ - openvswitch.spec
+ - openvswitch-kmod-rhel6.spec
+
+ - name: Install build dependencies specified from spec files
+ shell: echo "y" | yum-builddep /tmp/{{item}}
+ with_items:
+ - openvswitch.spec
+ - openvswitch-kmod-rhel6.spec
+
+ - name: Create rpm dev tree
+ command: rpmdev-setuptree
+
+ - name: Run "./boot.sh"
+ command: chdir=/git/ovs/ ./boot.sh
+
+ - name: Run "./configure"
+ command: chdir=/git/ovs/ ./configure
+
+ - name: Run "make dist"
+ command: chdir=/git/ovs/ make dist
+
+ - name: Parse out Open vSwitch version from "configure.ac"
+ command: chdir=/git/ovs autoconf -t AC_INIT:'$2'
+ register: version
+
+ - name: Copy source tarball to rpm dev tree
+ command: cp /git/ovs/openvswitch-{{version.stdout}}.tar.gz {{SOURCE}}
+
+ - name: Unarchive openvswitch source tarball
+ unarchive:
+ src: "{{SOURCE}}/openvswitch-{{version.stdout}}.tar.gz"
+ dest: "{{SOURCE}}"
+ remote_src: yes
+
+ - name: Update release number in spec files
+ lineinfile:
+ path: "{{SOURCE}}/openvswitch-{{version.stdout}}/rhel/{{item}}"
+ regexp: '^Release:'
+ line: "Release: {{ ansible_local.builder.release }}"
+ with_items:
+ - openvswitch.spec
+ - openvswitch-kmod-rhel6.spec
+
+ - name: Build Open vSwitch user space rpms
+ command: rpmbuild -bb --without check rhel/openvswitch.spec
+ args:
+ chdir: "{{SOURCE}}/openvswitch-{{version.stdout}}"
+
+ - name: Build Open vSwitch kmod rpms (only for currently loaded kernel)
+ command: rpmbuild -bb --without check rhel/openvswitch-kmod-rhel6.spec
+ args:
+ chdir: "{{SOURCE}}/openvswitch-{{version.stdout}}"
+
+ - name: Copy RPM packages to /var/www/html
+ command: cp -r /root/rpmbuild/RPMS/ /var/www/html
+
+ - name: Create RPM Package index file for repository
+ command: chdir=/var/www/html createrepo /var/www/html
+
+ - name: Make sure Apache is running
+ systemd: state=started name=httpd
+
+ - name: Bump up Build Number
+ copy:
+ content: '{ "release":"{{ansible_local.builder.release|int+1}}" }'
+ dest: "/etc/ansible/facts.d/builder.fact"
diff --git a/poc/playbook-ubuntu-builder.yml b/poc/playbook-ubuntu-builder.yml
new file mode 100644
index 000000000..5a13c6069
--- /dev/null
+++ b/poc/playbook-ubuntu-builder.yml
@@ -0,0 +1,70 @@
+---
+- hosts: all
+ become: true
+ name: builder
+ gather_facts: no
+ pre_tasks:
+ - name: 'install python2'
+ raw: sudo apt-get -y install python-simplejson
+ tasks:
+
+ - name: Create Ansible Local Facts Directory
+ file: path=/etc/ansible/facts.d state=directory
+
+ - name: Initiate Build Numbering
+ copy:
+ content: '{ "release":"1" }'
+ dest: "/etc/ansible/facts.d/builder.fact"
+ force: no
+
+ - name: Reload Ansible Local Facts
+ setup: filter=ansible_local
+
+ - name: Install "devscripts", "equivs", "apache2", "autoconf"
+ apt: update_cache=yes name={{item}} state=present
+ with_items:
+ - devscripts
+ - equivs
+ - apache2
+ - autoconf
+
+ - name: Remove untracked files from Open vSwitch GIT repository
+ command: chdir=/git/ovs/ git clean -xdf
+
+ - name: Reset Open vSwitch GIT repository to last comitted state
+ command: chdir=/git/ovs/ git reset --hard
+
+ - name: Parse out Open vSwitch version from "configure.ac"
+ command: chdir=/git/ovs autoconf -t AC_INIT:'$2'
+ register: version
+
+ - name: Concatenate full version
+ set_fact:
+ full_version: "{{version.stdout}}-{{ansible_local.builder.release}}"
+
+ - name: Update Open vSwitch version to {{full_version}}
+ command: chdir=/git/ovs/ dch -b -v {{full_version}} Vagrant Build
+
+ - name: Build debian package with Open vSwitch build dependencies
+ command: chdir=/git/ovs/ mk-build-deps -B debian/control
+
+ - name: Install Open vSwitch {{full_version}} build dependencies
+ apt: deb=/git/ovs/openvswitch-build-deps-depends_{{full_version}}_all.deb
+
+ - name: Build Open vSwitch {{full_version}} debian packages
+ shell: DEB_BUILD_OPTIONS='nocheck' fakeroot debian/rules binary
+ args:
+ chdir: /git/ovs/
+
+ - name: Move debian packages to /var/www/html
+ shell: mv /git/*.deb /var/www/html/
+
+ - name: Create Debian Package index file for repository
+ shell: dpkg-scanpackages . | gzip -9c > Packages.gz
+ args:
+ chdir: /var/www/html
+
+ - name: Bump up Build Number
+ copy:
+ content: '{ "release":"{{ansible_local.builder.release|int+1}}" }'
+ dest: "/etc/ansible/facts.d/builder.fact"