aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ansible/.gitignore5
-rw-r--r--ansible/files/README.md23
-rw-r--r--ansible/hosts11
-rw-r--r--ansible/roles/docker/README.md1
-rw-r--r--ansible/roles/docker/defaults/main.yml4
-rw-r--r--ansible/roles/docker/tasks/main.yml28
-rw-r--r--ansible/roles/gsm-tester-modems/README.md1
-rw-r--r--ansible/roles/gsm-tester-modems/tasks/main.yml45
-rw-r--r--ansible/roles/gsm-tester-network/README.md7
-rw-r--r--ansible/roles/gsm-tester-network/defaults/main.yml3
-rw-r--r--ansible/roles/gsm-tester-network/tasks/main.yml6
-rw-r--r--ansible/roles/gsm-tester-network/templates/interface.j256
-rw-r--r--ansible/roles/gsm-tester/defaults/main.yml7
-rw-r--r--ansible/roles/gsm-tester/files/dbus_osmo-gsm-tester.conf9
-rw-r--r--ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_admin.sh2
-rwxr-xr-xansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_raw.sh3
-rw-r--r--ansible/roles/gsm-tester/tasks/main.yml244
-rwxr-xr-xansible/roles/gsm-tester/templates/quad_modem_power_cycle.sh16
-rw-r--r--ansible/roles/install-coverity/README.md4
-rw-r--r--ansible/roles/install-coverity/defaults/main.yml4
-rw-r--r--ansible/roles/install-coverity/tasks/main.yml39
-rw-r--r--ansible/roles/install-poky-sdk/README.md10
-rw-r--r--ansible/roles/install-poky-sdk/defaults/main.yml7
-rw-r--r--ansible/roles/install-poky-sdk/tasks/main.yml42
-rw-r--r--ansible/roles/osmocom-jenkins-slave/README.md2
-rw-r--r--ansible/roles/osmocom-jenkins-slave/defaults/main.yml8
-rw-r--r--ansible/roles/osmocom-jenkins-slave/files/gitconfig3
-rw-r--r--ansible/roles/osmocom-jenkins-slave/files/jenkins.osmocom.org.pub2
-rw-r--r--ansible/roles/osmocom-jenkins-slave/tasks/debian.yml39
-rw-r--r--ansible/roles/osmocom-jenkins-slave/tasks/generic-slave.yml15
-rw-r--r--ansible/roles/osmocom-jenkins-slave/tasks/main.yml102
-rw-r--r--ansible/setup-gsm-tester.md21
-rw-r--r--ansible/setup-gsm-tester.yml39
-rw-r--r--ansible/setup-jenkins-slave.yml35
34 files changed, 843 insertions, 0 deletions
diff --git a/ansible/.gitignore b/ansible/.gitignore
new file mode 100644
index 0000000..2fa603c
--- /dev/null
+++ b/ansible/.gitignore
@@ -0,0 +1,5 @@
+poky-*
+cov-analysis-*.tar.gz
+*.retry
+*.swo
+*.swp
diff --git a/ansible/files/README.md b/ansible/files/README.md
new file mode 100644
index 0000000..c3c631d
--- /dev/null
+++ b/ansible/files/README.md
@@ -0,0 +1,23 @@
+Place 3rd party firmware/sdk files here.
+
+# role: gsm-tester-modems
+
+```
+./gobi
+./gobi/UQCN.mbn
+./gobi/amss.mbn
+./gobi/apps.mbn
+```
+
+# role: install-coverity
+
+The filename depends on the variable `coverity_version`.
+`coverity_version: 2017.07`
+
+E.g: `./cov-analysis-linux64-2017.07.tar.gz`
+
+# role: install-poky-sdk
+
+The filename depends on the variable `poky_installer_file`.
+
+`./poky-glibc-x86_64-meta-toolchain-osmo-armv5te-toolchain-osmo-2.3.2.sh`
diff --git a/ansible/hosts b/ansible/hosts
new file mode 100644
index 0000000..4f12cdf
--- /dev/null
+++ b/ansible/hosts
@@ -0,0 +1,11 @@
+[gsm-tester]
+# rnd
+10.9.25.101
+# production
+10.9.25.107
+
+[jenkins-slaves]
+# admin2-deb9build
+2a01:4f8:13b:828::1:300
+# admin2-deb8build
+2a01:4f8:13b:828::1:400
diff --git a/ansible/roles/docker/README.md b/ansible/roles/docker/README.md
new file mode 100644
index 0000000..878ddb5
--- /dev/null
+++ b/ansible/roles/docker/README.md
@@ -0,0 +1 @@
+# Install docker for debian
diff --git a/ansible/roles/docker/defaults/main.yml b/ansible/roles/docker/defaults/main.yml
new file mode 100644
index 0000000..2c03d90
--- /dev/null
+++ b/ansible/roles/docker/defaults/main.yml
@@ -0,0 +1,4 @@
+---
+
+# Adds this user to the group docker which is allowed to access docker
+jenkins_user: jenkins
diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml
new file mode 100644
index 0000000..1603175
--- /dev/null
+++ b/ansible/roles/docker/tasks/main.yml
@@ -0,0 +1,28 @@
+---
+
+- name: add https support
+ apt:
+ name: apt-transport-https
+ cache_valid_time: 3600
+ update_cache: yes
+
+- name: add docker gpg key to apt keyring
+ apt_key:
+ id: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
+ url: https://download.docker.com/linux/debian/gpg
+
+- apt_repository:
+ repo: "deb https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable"
+ state: present
+ update_cache: yes
+ when: ansible_distribution == "Debian"
+
+- name: install docker
+ apt:
+ name: docker-ce
+
+- name: add jenkins to the docker group
+ user:
+ name: "{{ jenkins_user }}"
+ groups: docker
+ append: yes
diff --git a/ansible/roles/gsm-tester-modems/README.md b/ansible/roles/gsm-tester-modems/README.md
new file mode 100644
index 0000000..9f5f29b
--- /dev/null
+++ b/ansible/roles/gsm-tester-modems/README.md
@@ -0,0 +1 @@
+# Install drivers for multiple modems or BTS's
diff --git a/ansible/roles/gsm-tester-modems/tasks/main.yml b/ansible/roles/gsm-tester-modems/tasks/main.yml
new file mode 100644
index 0000000..b766c73
--- /dev/null
+++ b/ansible/roles/gsm-tester-modems/tasks/main.yml
@@ -0,0 +1,45 @@
+---
+# modems
+- name: install dependecies for usrp
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - libuhd-dev
+ - uhd-host
+ register: uhd_installed
+
+- name: download firmware for uhd/usrp
+ command: uhd_images_downloader
+ args:
+ creates: /usr/share/uhd/images
+ when: uhd_installed | changed
+
+- name: allow jenkins to access USRP
+ user:
+ name: jenkins
+ groups: usrp
+ append: yes
+
+- name: install gobi2000 packages
+ apt:
+ name: gobi-loader
+ cache_valid_time: 3600
+ update_cache: yes
+
+- name: gobi firmwares
+ file: path=/lib/firmware/gobi state=directory
+
+- name: copy gobi firmwares
+ copy:
+ src: "{{ item.file }}"
+ dest: "/lib/firmware/{{ item.file }}"
+ with_items:
+ - file: gobi/amss.mbn
+ checksum: sha256:18d161dc5e9db5e795b1f1026e47d0590b6cc0ed9bef824ac0c4b771b529c364
+ - file: gobi/apps.mbn
+ checksum: sha256:cd7d9adaccf59f02b3bc8261334ed83c7644fbdbf697055189533467d6c882b2
+ - file: gobi/UQCN.mbn
+ checksum: sha256:37dfc789f899d0ec4c8ba2c403a1a4bc266c9017c94f2b90912e1b7e978c42e7
+ ignore_errors: yes
diff --git a/ansible/roles/gsm-tester-network/README.md b/ansible/roles/gsm-tester-network/README.md
new file mode 100644
index 0000000..e324929
--- /dev/null
+++ b/ansible/roles/gsm-tester-network/README.md
@@ -0,0 +1,7 @@
+# Setup setup specific configurations
+
+The network configuration is not set by default.
+
+# variables
+
+- `bts_interface` (eth1): on which network interface the bts is configured.
diff --git a/ansible/roles/gsm-tester-network/defaults/main.yml b/ansible/roles/gsm-tester-network/defaults/main.yml
new file mode 100644
index 0000000..3e506da
--- /dev/null
+++ b/ansible/roles/gsm-tester-network/defaults/main.yml
@@ -0,0 +1,3 @@
+---
+
+bts_interface: eth1
diff --git a/ansible/roles/gsm-tester-network/tasks/main.yml b/ansible/roles/gsm-tester-network/tasks/main.yml
new file mode 100644
index 0000000..c331b71
--- /dev/null
+++ b/ansible/roles/gsm-tester-network/tasks/main.yml
@@ -0,0 +1,6 @@
+---
+
+- name: setup the network configuration
+ template:
+ src: interface.j2
+ dest: /etc/network/interfaces.d/gsm-tester
diff --git a/ansible/roles/gsm-tester-network/templates/interface.j2 b/ansible/roles/gsm-tester-network/templates/interface.j2
new file mode 100644
index 0000000..9803358
--- /dev/null
+++ b/ansible/roles/gsm-tester-network/templates/interface.j2
@@ -0,0 +1,56 @@
+
+auto {{ bts_interface }}
+iface {{ bts_interface }} inet static
+ address 10.42.42.1
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:0
+iface {{ bts_interface }}:0 inet static
+ address 10.42.42.2
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:1
+iface {{ bts_interface }}:1 inet static
+ address 10.42.42.3
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:2
+iface {{ bts_interface }}:2 inet static
+ address 10.42.42.4
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:3
+iface {{ bts_interface }}:3 inet static
+ address 10.42.42.5
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:4
+iface {{ bts_interface }}:4 inet static
+ address 10.42.42.6
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:5
+iface {{ bts_interface }}:5 inet static
+ address 10.42.42.7
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:6
+iface {{ bts_interface }}:6 inet static
+ address 10.42.42.8
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:7
+iface {{ bts_interface }}:7 inet static
+ address 10.42.42.9
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:8
+iface {{ bts_interface }}:8 inet static
+ address 10.42.42.50
+ netmask 255.255.255.0
+
+auto {{ bts_interface }}:9
+iface {{ bts_interface }}:9 inet static
+ address 10.42.42.51
+ netmask 255.255.255.0
+
diff --git a/ansible/roles/gsm-tester/defaults/main.yml b/ansible/roles/gsm-tester/defaults/main.yml
new file mode 100644
index 0000000..a61d3be
--- /dev/null
+++ b/ansible/roles/gsm-tester/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+
+# how many modem are connected?
+# This is used when reseting the modems via quad_modem_power_cycle.sh,
+# because some modems take longer and the script waits until all
+# modems connected
+gsm_modems: 4
diff --git a/ansible/roles/gsm-tester/files/dbus_osmo-gsm-tester.conf b/ansible/roles/gsm-tester/files/dbus_osmo-gsm-tester.conf
new file mode 100644
index 0000000..d867833
--- /dev/null
+++ b/ansible/roles/gsm-tester/files/dbus_osmo-gsm-tester.conf
@@ -0,0 +1,9 @@
+<!-- Additional rules for the osmo-gsm-tester to access org.ofono from user
+land -->
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+<policy group="osmo-gsm-tester">
+<allow send_destination="org.ofono"/>
+</policy>
+</busconfig>
diff --git a/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_admin.sh b/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_admin.sh
new file mode 100644
index 0000000..60e527a
--- /dev/null
+++ b/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_admin.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+/sbin/setcap cap_net_admin+ep "$1"
diff --git a/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_raw.sh b/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_raw.sh
new file mode 100755
index 0000000..1f3a727
--- /dev/null
+++ b/ansible/roles/gsm-tester/files/osmo-gsm-tester_setcap_net_raw.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+/sbin/setcap cap_net_raw+ep "$1"
diff --git a/ansible/roles/gsm-tester/tasks/main.yml b/ansible/roles/gsm-tester/tasks/main.yml
new file mode 100644
index 0000000..b6de075
--- /dev/null
+++ b/ansible/roles/gsm-tester/tasks/main.yml
@@ -0,0 +1,244 @@
+---
+# gsm tester would only need the libraries, not the dev packages.
+# But the name of the -dev packages are more stable over multiple release.
+- name: install osmocom runtime dependencies
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - build-essential
+ - git
+ - automake
+ - libdbi-dev
+ - libdbd-sqlite3
+ - sqlite3
+ - libsctp-dev
+ - libortp-dev
+ - libpcap-dev
+ - libc-ares-dev
+ - libtool
+ - shtool
+ - pkg-config
+ - libtalloc-dev
+ - libpcsclite-dev
+ - libgnutls28-dev
+ - libmnl-dev
+ - libssl-dev
+ - libczmq-dev
+ - libsofia-sip-ua-glib-dev
+ - libsqlite3-dev
+ - libasound2-dev
+ - mdbus2
+
+- name: install ofono build dependencies
+ apt:
+ name: ofono
+ state: build-dep
+ cache_valid_time: 3600
+ update_cache: yes
+
+- name: install libqmi-glib a dependency of sysmocom ofono
+ apt:
+ name: libqmi-glib-dev
+ cache_valid_time: 3600
+ update_cache: yes
+
+- name: install uhub dependencies
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - libusb-1.0-0-dev
+
+- name: setup uhubctl repository
+ git:
+ repo: "https://github.com/mvp/uhubctl.git"
+ dest: /root/uhubctl
+ version: master
+ clone: yes
+ update: no
+
+- name: build uhubctl
+ shell: |
+ make && \
+ make install
+ args:
+ chdir: /root/uhubctl
+ creates: /usr/sbin/uhubctl
+
+# TODO: move this into restart-modems.d directory
+- name: copy quad_modem_power_cycle.sh
+ template:
+ src: quad_modem_power_cycle.sh
+ dest: /usr/local/bin/quad_modem_power_cycle.sh
+ mode: 0755
+ tags:
+ - ofono
+
+- name: setup ofono repository
+ git:
+ repo: 'git://git.sysmocom.de/ofono'
+ dest: /root/ofono
+ version: osmo-gsm-tester
+ clone: yes
+ update: no
+ tags:
+ - ofono
+
+- name: build ofono
+ shell: |
+ ./bootstrap && \
+ CFLAGS="-g" ./configure --disable-bluez4 && \
+ CFLAGS="-g" make -j3 && \
+ make install && \
+ systemctl daemon-reload
+ args:
+ chdir: /root/ofono
+ creates: /usr/local/sbin/ofonod
+ tags:
+ - ofono
+
+- name: ensure ofono is started
+ service:
+ name: ofono
+ state: started
+ enabled: yes
+ tags:
+ - ofono
+
+- name: install gsm tester dependencies
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - dbus
+ - tcpdump
+ - sqlite3
+ - python3
+ - python3-yaml
+ - python3-mako
+ - python3-gi
+ - ofono
+ - patchelf
+ - sudo
+ - libcap2-bin
+ - python3-pip
+
+- name: install gsm tester pip dependencies
+ pip:
+ name: "{{ item }}"
+ executable: pip3
+ editable: no
+ with_items:
+ - "git+https://github.com/podshumok/python-smpplib.git@master#egg=smpplib"
+ - pydbus
+ tags: [pip]
+
+- name: create group osmo-gsm-tester
+ group:
+ name: osmo-gsm-tester
+
+- name: add jenkins to osmo-gsm-tester and systemd-journal
+ user:
+ name: jenkins
+ groups: "{{ item }}"
+ append: yes
+ shell: /bin/bash
+ with_items:
+ - systemd-journal
+ - osmo-gsm-tester
+
+- name: setup state directory
+ file:
+ path: /var/tmp/osmo-gsm-tester/state
+ state: directory
+ group: osmo-gsm-tester
+ mode: g+rwxs
+
+- name: install acl
+ apt:
+ name: acl
+
+# Ensure the group always has access to all files
+- name: add acl to state directory
+ acl:
+ path: /var/tmp/osmo-gsm-tester/state
+ state: present
+ etype: group
+ entity: osmo-gsm-tester
+ default: yes
+ permissions: rwx
+
+- name: create trials directory
+ file:
+ path: /var/tmp/osmo-gsm-tester/trials
+ state: directory
+ group: osmo-gsm-tester
+ mode: g+rwxs
+
+- name: allow osmo-gsm-tester to access ofono
+ copy:
+ src: dbus_osmo-gsm-tester.conf
+ dest: /etc/dbus-1/system.d/osmo-gsm-tester.conf
+
+- name: ensure tcpdump can be called by osmo-gsm-tester
+ file:
+ path: /usr/sbin/tcpdump
+ group: osmo-gsm-tester
+ mode: 750
+
+- name: create a symlink for tcpdump
+ file:
+ src: /usr/sbin/tcpdump
+ dest: /usr/local/bin/tcpdump
+ state: link
+
+- name: add correct capabilities to tcpdump
+ capabilities:
+ path: /usr/sbin/tcpdump
+ capability: cap_net_raw,cap_net_admin=eip
+ state: present
+
+- name: allow core files for the group osmo-gsm-tester
+ copy:
+ content: "@osmo-gsm-tester - core unlimited"
+ dest: /etc/security/limits.d/osmo-gsm-tester_allowcore.conf
+
+- name: allow rt priority for the group osmo-gsm-tester
+ copy:
+ content: "@osmo-gsm-tester - rtprio 99"
+ dest: /etc/security/limits.d/osmo-gsm-tester_rtprio.conf
+
+- name: create a wrapper script to add CAP_NET_RAW
+ copy:
+ src: osmo-gsm-tester_setcap_net_raw.sh
+ dest: /usr/local/bin/osmo-gsm-tester_setcap_net_raw.sh
+ mode: 755
+
+- name: allow osmo-gsm-tester sudo osmo-gsm-tester_setcap_net_raw.sh
+ copy:
+ content: |
+ %osmo-gsm-tester ALL=(root) NOPASSWD: /usr/local/bin/osmo-gsm-tester_setcap_net_raw.sh
+ dest: /etc/sudoers.d/osmo-gsm-tester_setcap_net_raw
+ mode: 0440
+
+- name: create a wrapper script to add CAP_NET_ADMIN
+ copy:
+ src: osmo-gsm-tester_setcap_net_admin.sh
+ dest: /usr/local/bin/osmo-gsm-tester_setcap_net_admin.sh
+ mode: 755
+
+- name: allow osmo-gsm-tester sudo osmo-gsm-tester_setcap_net_admin.sh
+ copy:
+ content: |
+ %osmo-gsm-tester ALL=(root) NOPASSWD: /usr/local/bin/osmo-gsm-tester_setcap_net_admin.sh
+ dest: /etc/sudoers.d/osmo-gsm-tester_setcap_net_admin
+ mode: 0440
+
+- name: logrotate limit filesizes to 10M
+ copy:
+ content: "maxsize 10M"
+ dest: /etc/logrotate.d/maxsize
diff --git a/ansible/roles/gsm-tester/templates/quad_modem_power_cycle.sh b/ansible/roles/gsm-tester/templates/quad_modem_power_cycle.sh
new file mode 100755
index 0000000..9262f97
--- /dev/null
+++ b/ansible/roles/gsm-tester/templates/quad_modem_power_cycle.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+set -ex
+uhubctl -p 123456 -a 0
+# give a lot of time to discharge capacitors on the board
+sleep 20
+uhubctl -p 123456 -a 1
+attempts=30
+while [ "x$(uhubctl | grep -e 05c6 -e 1199 -c)" != "x{{ gsm_modems }}" ]; do
+ attempts=$(($attempts - 1))
+ if [ "$attempts" -le 0 ]; then
+ echo "Timeout"
+ exit 1
+ fi
+ sleep 1
+done
+uhubctl
diff --git a/ansible/roles/install-coverity/README.md b/ansible/roles/install-coverity/README.md
new file mode 100644
index 0000000..cd719f7
--- /dev/null
+++ b/ansible/roles/install-coverity/README.md
@@ -0,0 +1,4 @@
+# Install coverity compiler
+
+Install the coverity compiler to /opt/coverity/cover..-$version/ and
+create a link to /opt/coverity/current
diff --git a/ansible/roles/install-coverity/defaults/main.yml b/ansible/roles/install-coverity/defaults/main.yml
new file mode 100644
index 0000000..66b33f9
--- /dev/null
+++ b/ansible/roles/install-coverity/defaults/main.yml
@@ -0,0 +1,4 @@
+---
+
+coverity_version: 2017.07
+coverity_installer_file: "cov-analysis-linux64-{{ coverity_version }}.tar.gz"
diff --git a/ansible/roles/install-coverity/tasks/main.yml b/ansible/roles/install-coverity/tasks/main.yml
new file mode 100644
index 0000000..200a349
--- /dev/null
+++ b/ansible/roles/install-coverity/tasks/main.yml
@@ -0,0 +1,39 @@
+---
+- name: copy coverity installer
+ copy:
+ src: "{{ coverity_installer_file }}"
+ dest: "/tmp/{{ coverity_installer_file }}"
+ mode: 750
+ register: coverity_copy
+ ignore_errors: yes
+ tags: [coverity]
+
+- name: create /opt/coverity
+ file:
+ path: /opt/coverity/
+ state: directory
+ when: coverity_copy.failed == False
+ tags: [coverity]
+
+- name: unpack coverity
+ unarchive:
+ src: "/tmp/{{ coverity_installer_file }}"
+ dest: /opt/coverity/
+ remote_src: yes
+ when: coverity_copy.failed == False
+ tags: [coverity]
+
+- name: create link /opt/coverity/last
+ file:
+ src: /opt/coverity/cov-analysis-linux64-{{ coverity_version }}
+ dest: /opt/coverity/current
+ state: link
+ when: coverity_copy.failed == False
+ tags: [coverity]
+
+- name: "Please download {{ coverity_installer_file }} to your ansible directory to allow ansible to install coverity"
+ debug:
+ msg: "Ansible can not find {{ coverity_installer_file }}"
+ when: coverity_copy.failed
+ tags: [coverity]
+
diff --git a/ansible/roles/install-poky-sdk/README.md b/ansible/roles/install-poky-sdk/README.md
new file mode 100644
index 0000000..541ea3c
--- /dev/null
+++ b/ansible/roles/install-poky-sdk/README.md
@@ -0,0 +1,10 @@
+# Install the poky sdk used to build sysmobts binaries
+
+# Poky Installation
+
+The poky installation requires you to have the installer available.
+Put the `poky_installer_file` to the root directory of this repo.
+Also the exact filename must match the variable `poky_installer_file` and the
+`poky_version`.
+For the defaults of those variable have a look into `defaults/main.yml`.
+
diff --git a/ansible/roles/install-poky-sdk/defaults/main.yml b/ansible/roles/install-poky-sdk/defaults/main.yml
new file mode 100644
index 0000000..976a03f
--- /dev/null
+++ b/ansible/roles/install-poky-sdk/defaults/main.yml
@@ -0,0 +1,7 @@
+---
+# OS user
+jenkins_user: jenkins
+
+poky_installer_file: poky-glibc-x86_64-meta-toolchain-osmo-armv5te-toolchain-osmo-2.3.2.sh
+poky_version: 2.3.2
+
diff --git a/ansible/roles/install-poky-sdk/tasks/main.yml b/ansible/roles/install-poky-sdk/tasks/main.yml
new file mode 100644
index 0000000..dda60c5
--- /dev/null
+++ b/ansible/roles/install-poky-sdk/tasks/main.yml
@@ -0,0 +1,42 @@
+---
+
+- name: install bzip2 and tar
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - tar
+ - bzip2
+
+- name: copy poky installer
+ copy:
+ src: "{{ poky_installer_file }}"
+ dest: "/tmp/{{ poky_installer_file }}"
+ mode: 750
+ register: poky_copy
+ ignore_errors: yes
+ tags: [poky]
+
+- name: execute poky installer
+ command: "/tmp/{{ poky_installer_file }}"
+ args:
+ creates: "/opt/poky/{{ poky_version }}"
+ when: poky_copy.failed == false
+ tags: [poky]
+
+- name: change owner/group to jenkins user
+ file:
+ path: /opt/poky
+ owner: "{{ jenkins_user }}"
+ group: "{{ jenkins_user }}"
+ recurse: yes
+ when: poky_copy.failed == false
+ tags: [poky]
+
+- name: "Please download {{ poky_installer_file }} to your ansible directory to allow ansible to install poky"
+ debug:
+ msg: "Ansible can not find or copy {{ poky_installer_file }}"
+ when: poky_copy.failed
+ tags: [poky]
+
diff --git a/ansible/roles/osmocom-jenkins-slave/README.md b/ansible/roles/osmocom-jenkins-slave/README.md
new file mode 100644
index 0000000..e55d1be
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/README.md
@@ -0,0 +1,2 @@
+# Setup a usual jenkins slave
+
diff --git a/ansible/roles/osmocom-jenkins-slave/defaults/main.yml b/ansible/roles/osmocom-jenkins-slave/defaults/main.yml
new file mode 100644
index 0000000..872542c
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/defaults/main.yml
@@ -0,0 +1,8 @@
+---
+
+# OS user
+jenkins_user: jenkins
+
+# E.g. a generic_slave requires different tasks as a
+# special slave including the gsm-tester
+generic_slave: true
diff --git a/ansible/roles/osmocom-jenkins-slave/files/gitconfig b/ansible/roles/osmocom-jenkins-slave/files/gitconfig
new file mode 100644
index 0000000..aff4e55
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/files/gitconfig
@@ -0,0 +1,3 @@
+[user]
+ email = jenkins@osmocom.org
+ name = Jenkins Builder
diff --git a/ansible/roles/osmocom-jenkins-slave/files/jenkins.osmocom.org.pub b/ansible/roles/osmocom-jenkins-slave/files/jenkins.osmocom.org.pub
new file mode 100644
index 0000000..e581f10
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/files/jenkins.osmocom.org.pub
@@ -0,0 +1,2 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCzO4QUn9kFMqNz40HAhVZR/7juHGTeqjkpZ3km+9zngJNkh4Oxds0rCSrvxIxdM2ZQpcKHbBt0X30o+Dk7428IlmG3VYZ5XBskl2XsjOJG8uXjAMzEOejnOr6poZtor7qgxLwcZT0R2RoGED49DSmPpEPcKZmcIGQVJXB/ifPJOpjTiyjMxXccc5tlKS5jqHSLhUBX0EpPxcuLc0v0QG14fNJ75KygF+xXCKJ8h2/f1JPQRupPD7ZhjMJo3KFzvRttQDoM9PdXdND70zWY7Ntdu9vsqRoO3IeyqtgNSly3wYlsZNcTBW0T2TFtnkvWjbdrV3Hl6h9c8WDzbwI4Lvt9 root@jenkins.osmocom.org
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC6pjj0xKkxAN9e76T3h8+4GYfHMQ9XojCc4PQ42uQbnlX3zn+KtAXeeGN4QTDOWGdxz1kyQ/FpM08AqmWW1QZ4wPJBEgDVSfpEX/motagxxTKlIsoeCYDEqEdT5qiY/W7gVaKj+WGEpiIrLHU18m0fouuHdclBy/MXwhMvIowEpOjVoEYvnyuMoagrCkzaFMdZbljmYJN/eyuJvx0Bus7Vy6p8m+xcRSgA4Fy+yVyrpPlZU7pksd+YLUDaYE2E5Y68ZdMwnOxToLV4RwOZB4sWozCeQ38pKKXFNSpLpNh/uDKEN5T8M+Ft8vfAj5OW5VnqsFW0TxnNE8qEZs8mBK/5ij9KF5p5kgJ8dmww0srZie1YdBg3wmJ6FBv+ti/wfWrpo2kp5iRxd52xuOBJQnFONoi2w9VuHDtG/ZxC12owTLXGUJVoQyLVfyYBG8zLj1Or28MWBLUyWt3YsB99jRt/i612AZ5eyW2SZVnRBF7KlGqf0thCnq/tQPtZKvQqenRaXDRm+/Sh7bm8fxBR1vA7LiUyQz84qzrmiECO15FrorKRR+3enuI+xHb1HFn2ZE19LrK/tXzz3DYcUlhPRVzRpxncf8frX9QnA5d2Ytij3bcoMK6RqXFsRg5JMNBcbk4Uvdf479nfb6QLe3AUEtuSN2LaGS//eMmCfBCIpjvPWQ== osmocom-build
diff --git a/ansible/roles/osmocom-jenkins-slave/tasks/debian.yml b/ansible/roles/osmocom-jenkins-slave/tasks/debian.yml
new file mode 100644
index 0000000..a1f8574
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/tasks/debian.yml
@@ -0,0 +1,39 @@
+---
+
+- name: install jenkins utilities
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - htop
+ - virt-manager
+ - qemu
+ - qemu-user-static
+ - qemu-system-arm
+ - proot
+ - debootstrap
+ - fakeroot
+
+- name: enable backports for jessie
+ apt_repository:
+ repo: 'deb http://ftp.debian.org/debian jessie-backports main'
+ filename: 'backports'
+ update_cache: yes
+
+- name: install java for jessie
+ apt:
+ name: openjdk-8-jre-headless
+ cache_valid_time: 3600
+ update_cache: yes
+ default_release: jessie-backports
+ when: ansible_distribution == 'Debian' and ansible_distribution_release == 'jessie'
+
+- name: install java for stretch
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - openjdk-8-jre-headless
+ when: ansible_distribution == 'Debian' and ansible_distribution_release == 'stretch'
diff --git a/ansible/roles/osmocom-jenkins-slave/tasks/generic-slave.yml b/ansible/roles/osmocom-jenkins-slave/tasks/generic-slave.yml
new file mode 100644
index 0000000..6c50754
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/tasks/generic-slave.yml
@@ -0,0 +1,15 @@
+---
+
+- name: chown /usr/local/ to the jenkins user
+ file:
+ path: /usr/local/
+ recurse: yes
+ group: "{{ jenkins_user }}"
+ mode: "2775"
+
+- name: set jenkins user bin to osmo-ci
+ file:
+ src: "/home/{{ jenkins_user }}/osmo-ci/scripts"
+ dest: "/home/{{ jenkins_user }}/bin"
+ state: link
+ force: yes
diff --git a/ansible/roles/osmocom-jenkins-slave/tasks/main.yml b/ansible/roles/osmocom-jenkins-slave/tasks/main.yml
new file mode 100644
index 0000000..dc2e843
--- /dev/null
+++ b/ansible/roles/osmocom-jenkins-slave/tasks/main.yml
@@ -0,0 +1,102 @@
+---
+
+- name: install jenkins packages
+ include: debian.yml
+ when: ansible_distribution == 'Debian'
+
+- name: install build utilities
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - asciidoc
+ - autoconf
+ - automake
+ - bc
+ - bison
+ - coccinelle
+ - cppcheck
+ - debhelper
+ - devscripts
+ - dh-autoreconf
+ - dh-systemd
+ - doxygen
+ - flex
+ - g++
+ - gawk
+ - gcc
+ - gcc-arm-none-eabi
+ - git
+ - git-buildpackage
+ - libtool
+ - libboost-all-dev
+ - make
+ - mscgen
+ - osc
+ - pkgconf
+ - python-minimal
+ - python-setuptools
+ - python3
+ - python3-setuptools
+ - stow
+ - texinfo
+
+- name: install build dependencies and libraries
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - libc-ares-dev
+ - libdbd-sqlite3
+ - libdbi-dev
+ - libffi-dev
+ - libffi-dev
+ - libfftw3-dev
+ - libgmp-dev
+ - libgnutls28-dev
+ - libgps-dev
+ - libgsm1-dev
+ - libmnl-dev
+ - libncurses5-dev
+ - libortp-dev
+ - libpcap-dev
+ - libpcsclite-dev
+ - libreadline-dev
+ - libsctp-dev
+ - libsigsegv-dev
+ - libsnmp-dev
+ - libsofia-sip-ua-glib-dev
+ - libsqlite3-dev
+ - libssl-dev
+ - libsystemd-dev
+ - libtalloc-dev
+ - libusb-1.0-0-dev
+ - libusb-dev
+ - libzmq3-dev
+ - sqlite3
+ - libboost-dev
+ - libuhd-dev
+
+- name: add user jenkins
+ user:
+ name: "{{ jenkins_user }}"
+ generate_ssh_key: yes
+ ssh_key_bits: 4096
+ ssh_key_type: rsa
+ shell: /bin/bash
+
+- name: setup jenkins ssh key
+ authorized_key:
+ user: "{{ jenkins_user }}"
+ key: "{{ lookup('file', 'jenkins.osmocom.org.pub') }}"
+
+- name: include generic slave
+ include: generic-slave.yml
+ when: generic_slave
+
+- name: copy .gitconfig
+ copy:
+ src: gitconfig
+ dest: "/home/{{ jenkins_user }}/.gitconfig"
diff --git a/ansible/setup-gsm-tester.md b/ansible/setup-gsm-tester.md
new file mode 100644
index 0000000..47c479a
--- /dev/null
+++ b/ansible/setup-gsm-tester.md
@@ -0,0 +1,21 @@
+# Setup the osmo-gsm-tester
+
+The playbook `setup-gsm-tester.yml` setup a full working osmo-gsm-tester.
+
+# Requirements
+
+The remote host needs to be added to the `hosts` file under the section `osmo-gsm-tester`.
+It also needs to install python and have the **contrib non-free** repositories enabled in `/etc/apt/sources.list`.
+
+## 3rd party firmware
+
+To have the non-free gobi firmware installed, those files must be placed
+files/gobi/UQCN.mbn
+files/gobi/amss.mbn
+files/gobi/apps.mbn
+
+
+# Steps after the playbook ran
+
+The jenkins user needs to know the ssh-keys of all BTS which get accessed via ssh.
+E.g. the gsm-tester is connecting to a sysmobts via ssh.
diff --git a/ansible/setup-gsm-tester.yml b/ansible/setup-gsm-tester.yml
new file mode 100644
index 0000000..8232102
--- /dev/null
+++ b/ansible/setup-gsm-tester.yml
@@ -0,0 +1,39 @@
+---
+- name: setup osmo-gsm-tester apu
+ hosts: gsm-tester
+ user: root
+ tasks:
+ - name: install common utilities
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - vim
+ - tmux
+ - screen
+ - ca-certificates
+ - wget
+ - curl
+ roles:
+ - name: gsm-tester
+ # how many modems are connected via a quadmodem?
+ gsm_modems: 4
+ tags:
+ - gsm-tester
+
+ - name: gsm-tester-modems
+ tags:
+ - gsm-tester
+ - gsm-tester-modems
+
+ - name: gsm-tester-network
+ bts_interface: enp2s0
+ tags:
+ - gsm-tester
+
+ - name: osmocom-jenkins-slave
+ jenkins_user: jenkins
+ generic_slave: false
+ tags:
+ - jenkins-slave
diff --git a/ansible/setup-jenkins-slave.yml b/ansible/setup-jenkins-slave.yml
new file mode 100644
index 0000000..5963f6e
--- /dev/null
+++ b/ansible/setup-jenkins-slave.yml
@@ -0,0 +1,35 @@
+---
+- name: setup jenkins slaves
+ hosts: jenkins-slaves
+ user: root
+ tasks:
+ - name: install common utilities
+ apt:
+ name: "{{ item }}"
+ cache_valid_time: 3600
+ update_cache: yes
+ with_items:
+ - vim
+ - tmux
+ - screen
+ - ca-certificates
+ roles:
+ - name: docker
+ jenkins_user: osmocom-build
+ tags:
+ - docker
+
+ - name: install-poky-sdk
+ jenkins_user: osmocom-build
+ tags:
+ - poky
+
+ - name: osmocom-jenkins-slave
+ jenkins_user: osmocom-build
+ generic_slave: true
+ tags:
+ - jenkins-slave
+
+ - name: install-coverity
+ tags:
+ - coverity