add ansible playbooks

Introduce playbooks to do:
- setup-jenkins-slave - setup a usualy or special jenkins-slave
- setup-gsm-tester - setup the gsm-tester

Change-Id: I7007a4e6c38f73843390ec2b3b91133aff21e36a
This commit is contained in:
Alexander Couzens 2018-03-06 14:07:16 +01:00 committed by Harald Welte
parent 0765327601
commit 196402ac65
34 changed files with 843 additions and 0 deletions

5
ansible/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
poky-*
cov-analysis-*.tar.gz
*.retry
*.swo
*.swp

23
ansible/files/README.md Normal file
View File

@ -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`

11
ansible/hosts Normal file
View File

@ -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

View File

@ -0,0 +1 @@
# Install docker for debian

View File

@ -0,0 +1,4 @@
---
# Adds this user to the group docker which is allowed to access docker
jenkins_user: jenkins

View File

@ -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

View File

@ -0,0 +1 @@
# Install drivers for multiple modems or BTS's

View File

@ -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

View File

@ -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.

View File

@ -0,0 +1,3 @@
---
bts_interface: eth1

View File

@ -0,0 +1,6 @@
---
- name: setup the network configuration
template:
src: interface.j2
dest: /etc/network/interfaces.d/gsm-tester

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -0,0 +1,2 @@
#!/bin/sh
/sbin/setcap cap_net_admin+ep "$1"

View File

@ -0,0 +1,3 @@
#!/bin/sh
/sbin/setcap cap_net_raw+ep "$1"

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
# Install coverity compiler
Install the coverity compiler to /opt/coverity/cover..-$version/ and
create a link to /opt/coverity/current

View File

@ -0,0 +1,4 @@
---
coverity_version: 2017.07
coverity_installer_file: "cov-analysis-linux64-{{ coverity_version }}.tar.gz"

View File

@ -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]

View File

@ -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`.

View File

@ -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

View File

@ -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]

View File

@ -0,0 +1,2 @@
# Setup a usual jenkins slave

View File

@ -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

View File

@ -0,0 +1,3 @@
[user]
email = jenkins@osmocom.org
name = Jenkins Builder

View File

@ -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

View File

@ -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'

View File

@ -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

View File

@ -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"

View File

@ -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.

View File

@ -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

View File

@ -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