Repository: debops/debops (language: python)

Issue:
Deprecate debops_api role
The DebOps API is deprecated. It should be removed from the code base.

* https://github.com/debops/debops-api
* https://docs.debops.org/en/stable-3.0/ansible/roles/debops_api/index.html
* https://docs.debops.org/en/stable-3.0/debops-api/index.html

- [x] https://github.com/debops/debops-api is archived @drybjed 
- [x] Cron job is removed on server @drybjed 


Discussion / hints:

Fix patch:
diff --git a/.ansible-lint b/.ansible-lint
index 0d5dcc1467..78e9560fd1 100644
--- a/.ansible-lint
+++ b/.ansible-lint
@@ -8,8 +8,6 @@
 # Ignore these paths during auto-detection
 exclude_paths:
   - 'docs/ansible/roles/index.rst'
-  - 'docs/debops-api/_static/'
-  - 'lib/debops-api/tests/'
   - '.gitlab-ci.yml'
 
 # This is needed because ansible-lint is not able to find custom DebOps modules
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 138076e41b..307a652405 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -407,15 +407,6 @@ stages:
 
 # --- d --- [[[2
 
-# The 'debops_api' role is currently broken, needs to be updated.
-#'debops_api role':
-#  <<: *test_role_2nd_deps
-#  variables:
-#    JANE_TEST_PLAY: '${DEBOPS_PLAYBOOKS}/service/debops_api.yml'
-#    JANE_INVENTORY_GROUPS: 'debops_service_debops_api'
-#    JANE_DIFF_PATTERN: '.*/roles/debops_api/.*'
-#    JANE_LOG_PATTERN: '\[debops_api\]'
-
 'debops_fact role':
   <<: *test_role_no_deps
   variables:
diff --git a/.reuse/dep5 b/.reuse/dep5
index b018179747..3b2117a24f 100644
--- a/.reuse/dep5
+++ b/.reuse/dep5
@@ -29,11 +29,6 @@ Copyright: 2018 Maciej Delmanowski <drybjed@gmail.com>
            2018 DebOps <https://debops.org/>
 License: GPL-3.0-or-later
 
-Files: docs/debops-api/* lib/debops-api/*
-Copyright: 2016, Robin Schneider <ypid@riseup.net>
-           2016, DebOps <https://debops.org/>
-License: AGPL-3.0-only
-
 Files: lib/images/favicon.ico
 Copyright: 2020, Tasos Alvas <tasos.alvas@qwertyuiopia.com>
            2020, DebOps <https://debops.org/>
diff --git a/CODEOWNERS b/CODEOWNERS
index f50b73d103..a413fe2698 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -54,7 +54,6 @@ docs/news/releases.rst                              @drybjed @tasosalvas @ypid
 **netbox**                                          @drybjed @ypid
 
 # Application services
-**debops_api**                                      @drybjed @ypid
 **bitcoind**                                        @drybjed @ypid
 **x2go_server**                                     @drybjed @ypid
 
diff --git a/ansible/playbooks/layer/app.yml b/ansible/playbooks/layer/app.yml
index 688a5c412d..ae08d7f1d4 100644
--- a/ansible/playbooks/layer/app.yml
+++ b/ansible/playbooks/layer/app.yml
@@ -57,9 +57,6 @@
 - name: Configure Ansible Controller environment
   import_playbook: '../service/controller.yml'
 
-- name: Configure DebOps API service
-  import_playbook: '../service/debops_api.yml'
-
 - name: Configure Roundcube application
   import_playbook: '../service/roundcube.yml'
 
diff --git a/ansible/playbooks/service/debops_api.yml b/ansible/playbooks/service/debops_api.yml
deleted file mode 100644
index 21e2f9d10e..0000000000
--- a/ansible/playbooks/service/debops_api.yml
+++ /dev/null
@@ -1,46 +0,0 @@
----
-# Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# Copyright (C) 2016 DebOps <https://debops.org/>
-# SPDX-License-Identifier: GPL-3.0-only
-
-- name: Setup and manage a DebOps API server
-  collections: [ 'debops.debops', 'debops.roles01',
-                 'debops.roles02', 'debops.roles03' ]
-  hosts: [ 'debops_service_debops_api' ]
-  become: True
-
-  environment: '{{ inventory__environment | d({})
-                   | combine(inventory__group_environment | d({}))
-                   | combine(inventory__host_environment  | d({})) }}'
-
-  roles:
-
-    - role: keyring
-      tags: [ 'role::keyring', 'skip::keyring', 'role::nginx' ]
-      keyring__dependent_apt_keys:
-        - '{{ nginx__keyring__dependent_apt_keys }}'
-
-    - role: apt_preferences
-      tags: [ 'role::apt_preferences', 'skip::apt_preferences' ]
-      apt_preferences__dependent_list:
-        - '{{ nginx_apt_preferences_dependent_list }}'
-
-    - role: ferm
-      tags: [ 'role::ferm', 'skip::ferm' ]
-      ferm__dependent_rules:
-        - '{{ nginx_ferm_dependent_rules }}'
-
-    - role: python
-      tags: [ 'role::python', 'skip::python' ]
-      python__dependent_packages3:
-        - '{{ nginx__python__dependent_packages3 }}'
-      python__dependent_packages2:
-        - '{{ nginx__python__dependent_packages2 }}'
-
-    - role: nginx
-      tags: [ 'role::nginx', 'skip::nginx' ]
-      nginx__dependent_servers:
-        - '{{ debops_api__nginx__servers }}'
-
-    - role: debops_api
-      tags: [ 'role::debops_api', 'skip::debops_api' ]
diff --git a/ansible/roles/debops_api/COPYRIGHT b/ansible/roles/debops_api/COPYRIGHT
deleted file mode 100644
index 774b554683..0000000000
--- a/ansible/roles/debops_api/COPYRIGHT
+++ /dev/null
@@ -1,19 +0,0 @@
-debops.debops_api - Setup and manage a DebOps API server.
-
-Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-Copyright (C) 2016 DebOps <https://debops.org/>
-SPDX-License-Identifier: GPL-3.0-only
-
-This Ansible role is part of DebOps.
-
-DebOps is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 3, as
-published by the Free Software Foundation.
-
-DebOps is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with DebOps. If not, see https://www.gnu.org/licenses/.
diff --git a/ansible/roles/debops_api/defaults/main.yml b/ansible/roles/debops_api/defaults/main.yml
deleted file mode 100644
index c1a16c5ee5..0000000000
--- a/ansible/roles/debops_api/defaults/main.yml
+++ /dev/null
@@ -1,230 +0,0 @@
----
-# .. vim: foldmarker=[[[,]]]:foldmethod=marker
-
-# .. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# .. Copyright (C) 2016 DebOps <https://debops.org/>
-# .. SPDX-License-Identifier: GPL-3.0-only
-
-# .. _debops_api__ref_defaults:
-
-# debops.debops_api default variables [[[
-# =======================================
-#
-# .. contents:: Sections
-#    :local:
-#
-# .. include:: ../../../../includes/global.rst
-
-
-# Packages and installation [[[
-# -----------------------------
-
-# .. envvar:: debops_api__python_version [[[
-#
-# Python version to use. The Python 3 modules are not available in older
-# distribution releases. The Python 2 modules on the other hand are.
-# The primary testing and deployment environment is Python 3 but Python 2
-# should also work (at least to get the CI test passing).
-debops_api__python_version: '{{
-    3 if (ansible_distribution == "Debian" and ansible_distribution_major_version | int >= 8)
-    else 2 }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__python3_packages [[[
-#
-# List of Python 3 packaged modules to install.
-debops_api__python3_packages:
-  - 'python3-yaml'
-  - 'python3-git'
-  - 'python3-docutils'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__python2_packages [[[
-#
-# List of Python 2 packaged modules to install.
-debops_api__python2_packages:
-  - 'python-yaml'
-  - 'python-git'
-  - 'python-docutils'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__deploy_state [[[
-#
-# What is the desired state which this role should achieve? Possible options:
-#
-# ``present``
-#   Default. Ensure that the DebOps API is installed and configured as requested..
-#
-# ``absent``
-#   Ensure that the DebOps API is uninstalled and it's configuration is removed.
-#   Currently not fully supported.
-#
-debops_api__deploy_state: 'present'
-                                                                   # ]]]
-                                                                   # ]]]
-# DebOps API installation [[[
-# ---------------------------
-
-# .. envvar:: debops_api__user [[[
-#
-# System user of the DebOps API server.
-debops_api__user: 'debops-api'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__group [[[
-#
-# System group of the DebOps API server.
-debops_api__group: 'debops-api'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__home [[[
-#
-# Home directory of the DebOps API user.
-debops_api__home: '{{ ansible_local.nginx.www | d("/srv/www") + "/" + debops_api__user }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__public_api_dir [[[
-#
-# Public API data directory which is going to be served by ``nginx``.
-debops_api__public_api_dir: '{{ debops_api__home + "/sites/public" }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__app_repo_url [[[
-#
-# Source from where the DebOps API script will be installed.
-# TODO: Verified using debops-keyring.
-debops_api__app_repo_url: 'https://github.com/debops/debops-api.git'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__app_repo_path [[[
-#
-# Directory path where the DebOps API script repository will be installed.
-debops_api__app_repo_dest: '{{ (ansible_local.fhs.src | d("/usr/local/src"))
-                               + "/debops-api" }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__input_data_repo_update [[[
-#
-# When enables, input data repository will be updated on each Ansible run
-# (might take some time).
-debops_api__input_data_repo_update: False
-
-                                                                   # ]]]
-# .. envvar:: debops_api__input_data_repo_url [[[
-#
-# Repository containing all DebOps roles as ``git`` submodules.
-debops_api__input_data_repo_url: 'https://github.com/debops/docs.git'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__input_data_dir [[[
-#
-# Input data directory of the DebOps API.
-debops_api__input_data_dir: '{{ (ansible_local.fhs.var | d("/var/local"))
-                                + "/debops-api" }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__input_data_repo_dest [[[
-#
-# Directory where :envvar:`debops_api__input_data_repo_url` gets cloned to.
-debops_api__input_data_repo_dest: '{{ debops_api__input_data_dir + "/docs" }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__input_data_role_path [[[
-#
-# Role directory used as input for the DebOps API script.
-debops_api__input_data_role_path: '{{ debops_api__input_data_repo_dest + "/docs/ansible/roles/" }}'
-                                                                   # ]]]
-                                                                   # ]]]
-# DebOps API configuration [[[
-# ----------------------------
-
-# .. envvar:: debops_api__app_parameters [[[
-#
-# List of additional parameters passed to the DebOps API script.
-#
-# Useful when the API should be setup for another project then DebOps.
-# In this case, you can put something like this:
-#
-# .. code-block:: yaml
-#   :linenos:
-#
-#   debops_api__app_parameters:
-#     - [ '--docs-url-pattern', 'https://docs.example.org/en/latest/ansible/roles/ansible-{role_name}/docs/index.html', 'linebreak' ]
-#     - [ '--changelog-url-pattern', 'https://docs.example.org/en/latest/ansible/roles/ansible-{role_name}/docs/changelog.html', 'linebreak' ]
-#     - [ '--role-owner', 'example', 'linebreak' ]
-#
-# in your inventory.
-debops_api__app_parameters:
-  - [ '--no-strict', 'linebreak' ]
-
-                                                                   # ]]]
-# .. envvar:: debops_api__domain [[[
-#
-# Public domain of the DebOps API.
-debops_api__domain: 'api.{{ ansible_domain }}'
-                                                                   # ]]]
-                                                                   # ]]]
-# DebOps API update [[[
-# ---------------------
-
-# .. envvar:: debops_api__app_update [[[
-#
-# Before invoking the DebOps API script, pull the latest version of the DebOps
-# API script via ``git``.
-debops_api__app_update: False
-
-                                                                   # ]]]
-# .. envvar:: debops_api__cron_script [[[
-#
-# File path of the script setup by this role intended to be run by cron.
-debops_api__cron_script: '{{ debops_api__home + "/bin/debops-api-update" }}'
-
-                                                                   # ]]]
-# .. envvar:: debops_api__cron_entries [[[
-#
-# Before invoking the DebOps API script, pull the latest version of the DebOps
-# API script via ``git``.
-debops_api__cron_entries:
-  - name: 'debops-api-update'
-    cron_file: 'debops-api-update'
-    minute: '23'
-                                                                   # ]]]
-                                                                   # ]]]
-# Role-dependent configuration [[[
-# --------------------------------
-
-# .. envvar:: debops_api__nginx__servers [[[
-#
-# :program:`nginx` server configuration managed by the ``debops.debops_api``
-# role.
-debops_api__nginx__servers:
-
-  - by_role: 'debops.debops_api'
-    filename: 'debops.debops_api'
-    state: '{{ debops_api__deploy_state }}'
-    type: 'default'
-    name: '{{ debops_api__domain }}'
-    root: '{{ debops_api__public_api_dir }}'
-    webroot_create: False
-
-    location_list:
-      - pattern: '= /robots.txt'
-        options: |
-          log_not_found off;
-
-      - pattern: '/'
-        options: |
-          ## Allow directory listings for easy "browsing" of the API.
-          autoindex on;
-
-          default_type text/plain;
-
-          ## Allow browsers to use API responses regardless which website makes
-          ## use of the API.
-          ## Without this, browsers will not allow websites to use data
-          ## returned by this API for their own use.
-          ## Refer to: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
-          add_header 'Access-Control-Allow-Origin' '*';
-# ]]]
-# ]]]
-# ]]]
diff --git a/ansible/roles/debops_api/meta/main.yml b/ansible/roles/debops_api/meta/main.yml
deleted file mode 100644
index 1f4b2fbd35..0000000000
--- a/ansible/roles/debops_api/meta/main.yml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-# Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# Copyright (C) 2016-2022 DebOps <https://debops.org/>
-# SPDX-License-Identifier: GPL-3.0-only
-
-# Ensure that custom Ansible plugins and modules included in the main DebOps
-# collection are available to roles in other collections.
-collections: [ 'debops.debops' ]
-
-dependencies: []
-
-galaxy_info:
-
-  author: 'Robin Schneider'
-  description: 'Setup and manage a DebOps API server.'
-  company: 'DebOps'
-  license: 'GPL-3.0-only'
-  min_ansible_version: '2.0.0'
-
-  platforms:
-
-    - name: 'Ubuntu'
-      versions: [ 'all' ]
-
-    - name: 'Debian'
-      versions: [ 'all' ]
-
-  galaxy_tags:
-    - api
-    - debops
diff --git a/ansible/roles/debops_api/tasks/main.yml b/ansible/roles/debops_api/tasks/main.yml
deleted file mode 100644
index 97cda634c3..0000000000
--- a/ansible/roles/debops_api/tasks/main.yml
+++ /dev/null
@@ -1,154 +0,0 @@
----
-# .. vim: foldmarker=[[[,]]]:foldmethod=marker
-
-# Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# Copyright (C) 2016 DebOps <https://debops.org/>
-# SPDX-License-Identifier: GPL-3.0-only
-
-# System packages [[[
-
-- name: Ensure specified packages are in there desired state
-  ansible.builtin.apt:
-    name: '{{ q("flattened", (debops_api__python3_packages
-                              if (debops_api__python_version | int == 3)
-                              else debops_api__python2_packages)) }}'
-    state: '{{ "present" if (debops_api__deploy_state == "present") else "absent" }}'
-    install_recommends: False
-    purge: True
-  register: debops_api__register_packages
-  until: debops_api__register_packages is succeeded
-  tags: [ 'role::debops_api:pkts' ]
-
-# ]]]
-
-# System user [[[
-
-- name: Ensure DebOps API system group is present
-  ansible.builtin.group:
-    name: '{{ debops_api__group }}'
-    system: True
-    state: 'present'
-
-- name: Ensure DebOps API system user is present
-  ansible.builtin.user:
-    name: '{{ debops_api__user }}'
-    group: '{{ debops_api__group }}'
-    home: '{{ debops_api__home }}'
-    shell: '/sbin/nologin'
-    comment: 'DebOps API'
-    system: True
-    state: 'present'
-
-- name: Ensure the webserver can access the public directory
-  ansible.builtin.file:
-    path: '{{ debops_api__home }}'
-    state: 'directory'
-    owner: '{{ debops_api__user }}'
-    group: '{{ debops_api__group }}'
-    mode: '0755'
-
-# ]]]
-
-# DebOps API input data [[[
-
-- name: Ensure that input data directory is present
-  ansible.builtin.file:
-    path: '{{ debops_api__input_data_dir }}'
-    state: 'directory'
-    owner: '{{ debops_api__user }}'
-    group: '{{ debops_api__group }}'
-    mode: '0755'
-
-- name: Clone DebOps API input data
-  ansible.builtin.git:
-    repo: '{{ debops_api__input_data_repo_url }}'
-    dest: '{{ debops_api__input_data_repo_dest }}'
-    update: '{{ debops_api__input_data_repo_update | bool }}'
-    version: 'master'
-    recursive: True
-  become: True
-  become_user: '{{ debops_api__user }}'
-  tags: [ 'role::debops_api:git' ]
-
-# ]]]
-
-# DebOps API script installation [[[
-
-- name: Ensure DebOps API source code directory is owned by the DebOps API user
-  ansible.builtin.file:
-    path: '{{ debops_api__app_repo_dest }}'
-    state: 'directory'
-    owner: '{{ debops_api__user }}'
-    group: '{{ debops_api__group }}'
-    mode: '0755'
-
-- name: Clone debops-api source code
-  ansible.builtin.git:
-    repo: '{{ debops_api__app_repo_url }}'
-    dest: '{{ debops_api__app_repo_dest }}'
-    version: 'master'
-    update: True
-    # verify_commit:
-    # version:
-  become: True
-  become_user: '{{ debops_api__user }}'
-  tags: [ 'role::debops_api:git' ]
-
-# ]]]
-
-# DebOps API script setup [[[
-
-- name: Ensure DebOps API user bin directory is present
-  ansible.builtin.file:
-    path: '{{ debops_api__home + "/bin" }}'
-    state: 'directory'
-    owner: '{{ debops_api__user }}'
-    group: '{{ debops_api__group }}'
-    mode: '0755'
-
-- name: Ensure that the DebOps API data update script is present
-  ansible.builtin.template:
-    src: 'srv/www/debops-api/bin/debops-api-update.j2'
-    dest: '{{ debops_api__cron_script }}'
-    owner: 'root'
-    group: '{{ debops_api__group }}'
-    mode: '0754'
-
-# ]]]
-
-# DebOps API cron jobs [[[
-
-- name: Configuring cron jobs
-  ansible.builtin.cron:
-    cron_file:    '{{ item.cron_file | d(omit) }}'
-    day:          '{{ item.day | d(omit) }}'
-    hour:         '{{ item.hour | d(omit) }}'
-    job:          '{{ item.job | d(debops_api__cron_script) }}'
-    minute:       '{{ item.minute | d(omit) }}'
-    month:        '{{ item.month | d(omit) }}'
-    name:         '{{ item.name | d(item) }}'
-    special_time: '{{ item.special_time | d(omit) }}'
-    state:        '{{ item.state | d(omit) }}'
-    user:         '{{ item.user | d(debops_api__user) }}'
-    weekday:      '{{ item.weekday | d(omit) }}'
-  loop: '{{ debops_api__cron_entries }}'
-  tags: [ 'role::debops_api:cron' ]
-
-# ]]]
-
-# Run initial DebOps API data build [[[
-
-- name: Check if DebOps API data build has run before
-  ansible.builtin.stat:
-    path: '{{ debops_api__public_api_dir }}'
-  register: debops_api__register_public_api_dir
-
-- name: Run initial DebOps API data build
-  ansible.builtin.command: '{{ debops_api__cron_script }}'
-  register: debops_api__register_init
-  changed_when: debops_api__register_init.changed | bool
-  when: not debops_api__register_public_api_dir.stat.exists
-  become: True
-  become_user: '{{ debops_api__user }}'
-
-# ]]]
diff --git a/ansible/roles/debops_api/templates/srv/www/debops-api/bin/debops-api-update.j2 b/ansible/roles/debops_api/templates/srv/www/debops-api/bin/debops-api-update.j2
deleted file mode 100755
index 35562ec8b8..0000000000
--- a/ansible/roles/debops_api/templates/srv/www/debops-api/bin/debops-api-update.j2
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-
-# Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# Copyright (C) 2016 DebOps <https://debops.org/>
-# SPDX-License-Identifier: GPL-3.0-only
-
-set -e
-
-# {{ ansible_managed }}
-
-app_update="{{ debops_api__app_update | bool | lower }}"
-app_repo_dest="{{ debops_api__app_repo_dest }}"
-input_data_repo_dest="{{ debops_api__input_data_repo_dest }}"
-
-if [ "${app_update}" = "true" ] ; then
-    git -C "${app_repo_dest}" pull --ff-only
-fi
-
-git -C "${input_data_repo_dest}" pull --ff-only
-git -C "${input_data_repo_dest}" submodule update --init
-
-# shellcheck disable=SC1117
-read -r debops_api_command << EOF
-{% macro flatten_app_parameters_list(nested_list) %}{# [[[ #}
-{% for item in nested_list %}
-{%   if item is string %}
-{%     set _ = debops_api__tpl_app_parameters_flattened.append(item) %}
-{%   else %}
-{%     set _ = flatten_app_parameters_list(item) %}
-{%   endif %}
-{% endfor %}
-{% endmacro %}{# ]]] #}
-{% set debops_api__tpl_app_parameters_flattened = [ 'linebreak' ] %}
-{% set _ = flatten_app_parameters_list(
-   (debops_api__app_parameters | list) +
-   [ '--role-path', debops_api__input_data_role_path, 'linebreak' ] +
-   [ '--api-dir', debops_api__public_api_dir ]
-) %}
-python{{ debops_api__python_version | string }} {{ (debops_api__app_repo_dest + "/bin/debops-api") | quote }} {{ debops_api__tpl_app_parameters_flattened
-      | map("quote") | map("regex_replace", "^linebreak$", "\\\n    ") | join(" ") }}
-EOF
-
-eval "${debops_api_command}"
diff --git a/docs/ansible/role-index.rst b/docs/ansible/role-index.rst
index 6ee1eccb9e..e0b1ed3cbe 100644
--- a/docs/ansible/role-index.rst
+++ b/docs/ansible/role-index.rst
@@ -91,7 +91,6 @@ are not accessed directly by end users.
 - :ref:`debops.ansible`
 - :ref:`debops.apt_cacher_ng`
 - :ref:`debops.controller` - install DebOps on other hosts
-- :ref:`debops.debops_api`
 - :ref:`debops.gitlab_runner`
 - :ref:`debops.fcgiwrap`
 - :ref:`debops.freeradius`
diff --git a/docs/ansible/roles/debops_api/getting-started.rst b/docs/ansible/roles/debops_api/getting-started.rst
deleted file mode 100644
index 2589206b3d..0000000000
--- a/docs/ansible/roles/debops_api/getting-started.rst
+++ /dev/null
@@ -1,59 +0,0 @@
-.. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-.. Copyright (C) 2016 DebOps <https://debops.org/>
-.. SPDX-License-Identifier: GPL-3.0-only
-
-Getting started
-===============
-
-.. only:: html
-
-   .. contents::
-      :local:
-
-
-Example inventory
------------------
-
-To host the DebOps API, add the hosts to the
-``debops_service_debops_api`` Ansible inventory host group:
-
-.. code:: ini
-
-   [debops_service_debops_api]
-   hostname
-
-Example playbook
-----------------
-
-Here's an example playbook that can be used to host the DebOps API on a set of
-hosts:
-
-.. literalinclude:: ../../../../ansible/playbooks/service/debops_api.yml
-   :language: yaml
-   :lines: 1,5-
-
-Ansible tags
-------------
-
-You can use Ansible ``--tags`` or ``--skip-tags`` parameters to limit what
-tasks are performed during Ansible run. This can be used after host is first
-configured to speed up playbook execution, when you are sure that most of the
-configuration has not been changed.
-
-Available role tags:
-
-``role::debops_api``
-  Main role tag, should be used in the playbook to execute all of the role
-  tasks as well as role dependencies.
-
-``role::debops_api:pkg``
-  Tasks related to system package management like installing, upgrading or
-  removing packages.
-
-``role::debops_api:git``
-  Tasks related to ``git`` operations. Especially the tasks "DebOps API input
-  data" can take up to one minute so you might want to skip them on subsequent
-  role runs.
-
-``role::debops_api:cron``
-  Tasks related to ``cron`` job configuration.
diff --git a/docs/ansible/roles/debops_api/index.rst b/docs/ansible/roles/debops_api/index.rst
deleted file mode 100644
index 04660c3155..0000000000
--- a/docs/ansible/roles/debops_api/index.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-.. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-.. Copyright (C) 2016 DebOps <https://debops.org/>
-.. SPDX-License-Identifier: GPL-3.0-only
-
-.. _debops.debops_api:
-
-debops.debops_api
-=================
-
-.. include:: man_description.rst
-   :start-line: 7
-
-.. toctree::
-   :maxdepth: 2
-
-   getting-started
-   defaults/main
-
-Copyright
----------
-
-.. literalinclude:: ../../../../ansible/roles/debops_api/COPYRIGHT
-
-..
- Local Variables:
- mode: rst
- ispell-local-dictionary: "american"
- End:
diff --git a/docs/ansible/roles/debops_api/man_description.rst b/docs/ansible/roles/debops_api/man_description.rst
deleted file mode 100644
index 951d196ffe..0000000000
--- a/docs/ansible/roles/debops_api/man_description.rst
+++ /dev/null
@@ -1,10 +0,0 @@
-.. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-.. Copyright (C) 2016 DebOps <https://debops.org/>
-.. SPDX-License-Identifier: GPL-3.0-only
-
-Description
-===========
-
-``debops.debops_api`` can be used to setup the `DebOps API`__.
-
-.. __: https://github.com/debops/debops-api
diff --git a/docs/ansible/roles/debops_api/man_index.rst b/docs/ansible/roles/debops_api/man_index.rst
deleted file mode 100644
index 28f865ab87..0000000000
--- a/docs/ansible/roles/debops_api/man_index.rst
+++ /dev/null
@@ -1,21 +0,0 @@
-:orphan:
-
-.. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-.. Copyright (C) 2016 DebOps <https://debops.org/>
-.. SPDX-License-Identifier: GPL-3.0-only
-
-debops.debops_api
-=================
-
-.. toctree::
-   :maxdepth: 2
-
-   man_synopsis
-   man_description
-   getting-started
-
-..
- Local Variables:
- mode: rst
- ispell-local-dictionary: "american"
- End:
diff --git a/docs/ansible/roles/debops_api/man_synopsis.rst b/docs/ansible/roles/debops_api/man_synopsis.rst
deleted file mode 100644
index b7a6fca460..0000000000
--- a/docs/ansible/roles/debops_api/man_synopsis.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-.. Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-.. Copyright (C) 2016 DebOps <https://debops.org/>
-.. SPDX-License-Identifier: GPL-3.0-only
-
-Synopsis
-========
-
-``debops run service/debops_api`` [**--limit** `group,host,`...] [**--diff**] [**--check**] [**--tags** `tag1,tag2,`...] [**--skip-tags** `tag1,tag2,`...] [<``ansible-playbook`` options>] ...
diff --git a/docs/debops-api/_static/api/license b/docs/debops-api/_static/api/license
deleted file mode 100644
index 5373a2c06d..0000000000
--- a/docs/debops-api/_static/api/license
+++ /dev/null
@@ -1,696 +0,0 @@
-debops-api - Machine readable metadata about the DebOps Project.
-
-Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-SPDX-License-Identifier: GPL-3.0-or-later
-
-debops-api is part of DebOps.
-
-debops-api is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, version 3 of the
-License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-
-
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<https://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<https://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/docs/debops-api/_static/api/role/debops.unattended_upgrades.json b/docs/debops-api/_static/api/role/debops.unattended_upgrades.json
deleted file mode 100644
index 805129974b..0000000000
--- a/docs/debops-api/_static/api/role/debops.unattended_upgrades.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "role_owner": "debops",
-  "role_name": "unattended_upgrades",
-  "issue_url": "https://github.com/debops/ansible-unattended_upgrades/issues",
-  "vcs_last_committer_date": "2016-07-10 21:50:38 +0200",
-  "clone_url": "https://github.com/debops/ansible-unattended_upgrades.git",
-  "version": "0.2.0",
-  "role_format_version": "0.2.0",
-  "docs_url": "http://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/index.html",
-  "pr_url": "https://github.com/debops/ansible-unattended_upgrades/pulls",
-  "vcs_url": "https://github.com/debops/ansible-unattended_upgrades"
-}
diff --git a/docs/debops-api/_static/api/roles/count b/docs/debops-api/_static/api/roles/count
deleted file mode 100644
index d00491fd7e..0000000000
--- a/docs/debops-api/_static/api/roles/count
+++ /dev/null
@@ -1,1 +0,0 @@
-1
diff --git a/docs/debops-api/_static/api/roles/count:debops b/docs/debops-api/_static/api/roles/count:debops
deleted file mode 100644
index d00491fd7e..0000000000
--- a/docs/debops-api/_static/api/roles/count:debops
+++ /dev/null
@@ -1,1 +0,0 @@
-1
diff --git a/docs/debops-api/_static/api/roles/debops.json b/docs/debops-api/_static/api/roles/debops.json
deleted file mode 100644
index d25abca434..0000000000
--- a/docs/debops-api/_static/api/roles/debops.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "debops.unattended_upgrades": {
-    "role_owner": "debops",
-    "role_name": "unattended_upgrades",
-    "issue_url": "https://github.com/debops/ansible-unattended_upgrades/issues",
-    "vcs_last_committer_date": "2016-07-10 21:50:38 +0200",
-    "clone_url": "https://github.com/debops/ansible-unattended_upgrades.git",
-    "version": "0.2.0",
-    "role_format_version": "0.2.0",
-    "docs_url": "http://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/index.html",
-    "pr_url": "https://github.com/debops/ansible-unattended_upgrades/pulls",
-    "vcs_url": "https://github.com/debops/ansible-unattended_upgrades"
-  }
-}
diff --git a/docs/debops-api/_static/api/version b/docs/debops-api/_static/api/version
deleted file mode 100644
index 6e8bf73aa5..0000000000
--- a/docs/debops-api/_static/api/version
+++ /dev/null
@@ -1,1 +0,0 @@
-0.1.0
diff --git a/docs/debops-api/api-reference-v0.rst b/docs/debops-api/api-reference-v0.rst
deleted file mode 100644
index 5945ae1cd9..0000000000
--- a/docs/debops-api/api-reference-v0.rst
+++ /dev/null
@@ -1,158 +0,0 @@
-DebOps API reference v0
-=======================
-
-.. contents::
-   :local:
-
-API base URL: https://api.debops.org/v0
-
-HTTP GET queries
-----------------
-
-/version
-~~~~~~~~
-
-Returns the current version (including minor version and patch version) of the
-DebOps API as raw string.
-
-Example: https://api.debops.org/v0/version
-
-/license
-~~~~~~~~
-
-Returns license information about the API.
-
-Example: https://api.debops.org/v0/license
-
-/role/<role_owner>.<role_name>.json
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Returns the metadata for the given Ansible role.
-
-Example: https://api.debops.org/v0/role/debops.unattended_upgrades.json
-
-/roles/<role_owner>.json
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Returns the metadata for all Ansible role of the given role owner.
-
-Example: https://api.debops.org/v0/roles/debops.json
-
-/roles/<role_owner>.list
-~~~~~~~~~~~~~~~~~~~~~~~~
-
-Returns a simple list for all Ansible roles of the given role owner.
-
-Example: https://api.debops.org/v0/roles/debops.list
-
-/roles/count[:<owner>]
-~~~~~~~~~~~~~~~~~~~~~~
-
-Returns the total number of roles in the given name space.
-The ``[:<owner>]`` is optional and allows to limit the count to the given role
-owner.
-
-Examples:
-
-* https://api.debops.org/v0/roles/count
-* https://api.debops.org/v0/roles/count:debops
-
-Role metadata JSON format
--------------------------
-
-:regexp:`^/role/.*\.json$` API calls return a JSON object containing the keys
-described below.
-
-:regexp:`^/roles/.*\.json$` API calls return a JSON object. The outer dict maps
-from the full role name to the meta data (described below).
-
-.. note:: ``role_format_version`` below ``0.2.0`` are not fully supported by
-   this API. Keys might be missing for roles below ``v0.2.0``.
-   Do a version compare for ``0.2.0`` or higher or update the roles (or fixup
-   the DebOps API).
-
-``role_owner``
-  Ansible Galaxy role owner.
-
-``role_name``
-  Ansible Galaxy role name.
-
-``normalized_role_name``
-  Ansible role name as used in URLs. Currently the only case where this is
-  different to ``role_name`` is when ``role_name`` is :command:`ansible` (in this case
-  ``normalized_role_name`` will be ``role-ansible``).
-
-``authors``
-  List of dicts, one dict for each author.
-
-  ``name``
-    Full name of the author.
-
-  ``nick``
-    Nickname of the author.
-
-  ``maintainer``
-    Boolean value specifying if author is a maintainer.
-    Only available for ``role_format_version`` ``0.2.1`` or later.
-
-``clone_url``
-  Secure git URL where the repository can be cloned from.
-
-``description``
-  Description of the repository.
-
-``role_format_version``
-  To which version of the DebOps role standard does the role comply to.
-  TODO: The versions are currently not documented elsewhere.
-
-``docs_url``
-  HTML URL of the rendered documentation of the repository.
-
-``changelog_url``
-  HTML URL of the rendered changelog.
-
-``galaxy_url``
-  HTML URL of the role on Ansible Galaxy.
-
-``issue_url``
-  HTML URL on the VCS platform where issues can be reported to.
-
-``license``
-  License of the repository, as SPDX license identifier.
-
-``min_ansible_version``
-  Minimum required Ansible version to run this role.
-
-``platforms``
-  Corresponds with ``galaxy_info.platforms`` from the :file:`meta/main.yml` file of Ansible roles.
-
-``pr_url``
-  HTML URL on the VCS platform where Pull/Merge requests can be submitted to.
-
-``tags``
-  List of tags of the repository, currently equivalent with Ansible Galaxy role tags.
-
-``test_suite_url``
-  HTML URL to test suite for this repository.
-
-``ci_badge_url``
-  Image URL the build badge of the continues integration system on which the
-  repository is tested.
-
-``ci_url``
-  HTML URL for the test page of the continues integration system which is used
-  for the repository.
-
-``vcs_url``
-  HTML URL to the VCS platform where the repository is hosted.
-
-``version``
-  Latest released version of the repository.
-  Is ``0.0.0`` when no release has been made.
-
-``vcs_commits_since_last_release``
-  Number of commits since the last release.
-  Is missing when no release has been made.
-
-``vcs_last_committer_date``
-  Date of last commit in VCS.
diff --git a/docs/debops-api/getting-started.rst b/docs/debops-api/getting-started.rst
deleted file mode 100644
index 6591877191..0000000000
--- a/docs/debops-api/getting-started.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-Getting started
-===============
-
-.. contents::
-   :local:
-
-
-Checkout the following example to get started:
-
-.. code-block:: console
-
-   curl https://api.debops.org/v0/role/debops.unattended_upgrades.json -k | jq '.'
-
-You can also open that URL in your browser via HTTP GET:
-https://api.debops.org/v0/role/debops.unattended_upgrades.json
-
-But note that the encoded JSON object is not prettified.
diff --git a/docs/debops-api/index.rst b/docs/debops-api/index.rst
deleted file mode 100644
index 93d771e1a8..0000000000
--- a/docs/debops-api/index.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-.. _debops_api:
-
-DebOps API
-==========
-
-.. toctree::
-   :maxdepth: 2
-
-   introduction
-   getting-started
-   api-reference-v0
-
-..
- Local Variables:
- mode: rst
- ispell-local-dictionary: "american"
- End:
diff --git a/docs/debops-api/introduction.rst b/docs/debops-api/introduction.rst
deleted file mode 100644
index 4b1a3b55b3..0000000000
--- a/docs/debops-api/introduction.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-Introduction
-============
-
-This part of the documentation describes the public DebOps API which is used
-internally by the project but can also be used by third parties.
-
-API URL: https://api.debops.org/
-
-Example usages
---------------
-
-* https://github.com/debops/debops.github.io
-* https://github.com/debops/docs
-
-..
- Local Variables:
- mode: rst
- ispell-local-dictionary: "american"
- End:
diff --git a/docs/index.rst b/docs/index.rst
index 1b3daf0242..b0bfdc9fdd 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -130,7 +130,6 @@ infrastructure environments.
    meta/logo
    meta/other-projects
    meta/debops-oid-registry
-   debops-api/index
 
 .. toctree::
    :caption: News
diff --git a/lib/debops-api/.gitignore b/lib/debops-api/.gitignore
deleted file mode 100644
index 17b952f5dd..0000000000
--- a/lib/debops-api/.gitignore
+++ /dev/null
@@ -1,18 +0,0 @@
-## For quick testing.
-## Generated by https://github.com/ypid/ypid-ansible-common/blob/master/bin/sphinx-debops-role-build
-docs/Makefile
-docs/_build/
-docs/conf.py
-docs/defaults.rst
-docs/includes/global.rst
-docs/_templates/page.html
-docs/_templates/.gitkeep
-docs/_static/custom.css
-docs/_static/.gitkeep
-
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-.coverage
diff --git a/lib/debops-api/.travis.yml b/lib/debops-api/.travis.yml
deleted file mode 100644
index 5e739ebd5b..0000000000
--- a/lib/debops-api/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
----
-
-sudo: 'required'
-language: 'python'
-python: '3.4'
-
-install:
-  - 'pip3 install -r ./requirements.txt'
-
-script:
-  - 'make check'
-  - 'git clone --depth 1 https://github.com/nickjj/rolespec'
-  - 'cd rolespec ; bin/rolespec -r https://github.com/debops/test-suite'
diff --git a/lib/debops-api/CHANGES.rst b/lib/debops-api/CHANGES.rst
deleted file mode 100644
index 9ffef2243b..0000000000
--- a/lib/debops-api/CHANGES.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-Changelog
-=========
-
-.. include:: includes/all.rst
-
-**debops-api**
-
-This project adheres to `Semantic Versioning <http://semver.org/spec/v2.0.0.html>`__
-and `human-readable changelog <http://keepachangelog.com/>`_.
-
-The current role maintainer_ is ypid_.
-
-debops-api - unreleased
------------------------
-
-Added
-~~~~~
-
-- Initial coding and design. [ypid_]
-
-Security
-~~~~~~~~
-
-- The default ``yaml.load`` method from PyYAML which is used to read Ansigenome YAML files is unsafe.
-  As a result remote code execution was possible when the DebOps API script parsed role metadata.
-
-  Refer to the issue `Make load safe_load <https://github.com/yaml/pyyaml/issues/5>`_.
-  This has been fixed by switching to ``yaml.safe_load``. [ypid_]
diff --git a/lib/debops-api/COPYRIGHT b/lib/debops-api/COPYRIGHT
deleted file mode 100644
index 83f35f7722..0000000000
--- a/lib/debops-api/COPYRIGHT
+++ /dev/null
@@ -1,20 +0,0 @@
-debops-api - Machine readable metadata about the DebOps Project
-
-Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-Copyright (C) 2016 DebOps <https://debops.org/>
-SPDX-License-Identifier: AGPL-3.0-only
-
-debops-api is part of DebOps.
-
-debops-api is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, version 3 of the
-License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
diff --git a/lib/debops-api/LICENSE b/lib/debops-api/LICENSE
deleted file mode 100644
index 94a9ed024d..0000000000
--- a/lib/debops-api/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/lib/debops-api/Makefile b/lib/debops-api/Makefile
deleted file mode 100644
index 83a21f1356..0000000000
--- a/lib/debops-api/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-PIP_OPTIONS =
-NOSE_OPTIONS =
-
-.PHONY: FORCE_MAKE
-
-.PHONY: default
-default: list
-
-## list targets (help) {{{
-.PHONY: list
-# https://stackoverflow.com/a/26339924/2239985
-list:
-	@echo "This Makefile has the following targets:"
-	@$(MAKE) -pRrq -f $(lastword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^(:?[^[:alnum:]]|FORCE_MAKE$$)' -e '^$@$$' | sed 's/^/    /'
-## }}}
-
-## Fail when git working directory for the Make prerequisites has changed.
-.PHONY: check
-check: tests/api_data check-nose2
-	find tests/api_data -type f -print0 | xargs --null sed --in-place --regexp-extended '/meta name="generator"/d'
-	git diff --exit-code HEAD -- "$<"
-
-tests/api_data: bin/debops-api tests/example_roles FORCE_MAKE
-	"$<" --test-mode --role-path tests/example_roles/ --api-dir "$@"
-
-.PHONY: pre-commit-hook
-pre-commit-hook: hooks/pre-commit
-	ln -srf "$<" "$(shell git rev-parse --git-dir)/hooks"
-
-.PHONY: install-dependencies
-install-dependencies:
-	pip3 install $(PIP_OPTIONS) -r ./docs/_prepare/requirements.txt
-
-.PHONY: check-nose
-check-nose:
-	nosetests $(NOSE_OPTIONS)
-
-.PHONY: check-nose2
-check-nose2:
-	(nose2-3 --start-dir tests $(NOSE_OPTIONS) || nose2-3.4 $(NOSE_OPTIONS))
diff --git a/lib/debops-api/README.rst b/lib/debops-api/README.rst
deleted file mode 100644
index 5aa5cdd705..0000000000
--- a/lib/debops-api/README.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-`DebOps API`_
-~~~~~~~~~~~~~
-
-|Travis CI|
-
-.. |Travis CI| image:: https://img.shields.io/travis/debops/debops-api.svg?style=flat
-   :target: https://travis-ci.org/debops/debops-api
-
-The public DebOps API is used internally by the DebOps Project but can also be
-used by third parties.
-
-Refer to the `DebOps API documentation`_ for more details.
-If you want to set up a DebOps API server, checkout the Ansible role debops.debops_api_.
-
-.. _DebOps API: https://api.debops.org/
-.. _DebOps API documentation: https://docs.debops.org/en/latest/debops-api/index.html
-.. _debops.debops_api: https://github.com/debops/ansible-debops_api
diff --git a/lib/debops-api/bin/debops-api b/lib/debops-api/bin/debops-api
deleted file mode 120000
index 63d4b5692a..0000000000
--- a/lib/debops-api/bin/debops-api
+++ /dev/null
@@ -1,1 +0,0 @@
-../debops/api.py
\ No newline at end of file
diff --git a/lib/debops-api/debops/__init__.py b/lib/debops-api/debops/__init__.py
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/lib/debops-api/debops/api.py b/lib/debops-api/debops/api.py
deleted file mode 100755
index a5b01b194b..0000000000
--- a/lib/debops-api/debops/api.py
+++ /dev/null
@@ -1,759 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-# Copyright (C) 2016 DebOps <https://debops.org/>
-# SPDX-License-Identifier: AGPL-3.0-only
-#
-# debops-api is part of DebOps.
-#
-# debops-api is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, version 3 of the
-# License.
-#
-# debops-api is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-"""
-debops-api - Machine readable metadata about the DebOps Project.
-"""
-
-import os
-import sys
-import json
-import re
-import logging
-import pprint
-from distutils.version import StrictVersion
-import shutil
-
-import yaml
-import git
-from docutils import core
-from docutils.writers.html4css1 import Writer, HTMLTranslator
-
-__license__ = 'AGPL-3.0-only'
-__author__ = 'Robin Schneider <ypid@riseup.net>'
-__version__ = '0.1.0'
-
-
-class NoHeaderHTMLTranslator(HTMLTranslator):
-    def __init__(self, document):
-        HTMLTranslator.__init__(self, document)
-        self.head_prefix = ['', '', '', '', '']
-        self.body_prefix = []
-        self.body_suffix = []
-        self.stylesheet = []
-
-
-def reSTify(string):
-    _w = Writer()
-    _w.translator_class = NoHeaderHTMLTranslator
-    return core.publish_string(string, writer=_w)
-
-
-class DebOpsAPI:
-
-    def __init__(
-        self,
-        strict=True,
-        docs_url_pattern=None,
-        changelog_url_pattern=None,
-        role_owner=None,
-        test_mode=False,
-    ):
-
-        self._strict = strict
-        self._docs_url_pattern = docs_url_pattern
-        self._changelog_url_pattern = changelog_url_pattern
-        self._role_owner = role_owner
-        self._test_mode = test_mode
-
-        self._metadata = {}
-        self._roles = {}
-
-    def _get_role_full_name(self, role_owner, role_name):
-        """
-        Return the Ansible role name according to Ansible Galaxy naming
-        convention.
-        """
-
-        return '{}.{}'.format(role_owner, role_name)
-
-    def _get_repo_url(self, role_owner, role_name):
-        """
-        Return repository URL for the given Ansible role.
-        """
-
-        github_base_url = 'https://github.com'
-        return '/'.join([
-            github_base_url,
-            role_owner,
-            'ansible-' + self._get_normalized_role_name(role_name),
-        ])
-
-    def _read_github_repos_api_response(
-        self,
-        api_res_encoded_json,
-        role_owner=None
-    ):
-        """
-        Read GitHub API response for a /users/:username/repos or
-        /orgs/:org/repos query handed over as encoded JSON string.
-        Unfinished because relying on GitHub API is discouraged for the DebOps
-        Project in case there are other ways to do it.
-        """
-
-        api_response = json.load(api_res_encoded_json)
-        for repo in api_response:
-            _re = re.match(r'ansible-(?P<role_name>[a-z0-9_-]+)+$',
-                           repo['name'])
-            if not _re:
-                continue
-
-            role_name = _re.group('role_name')
-            role_full_name = self._get_role_full_name(role_owner, role_name)
-            role_owner = self._get_owner_from_vcs_url(repo['html_url'])
-
-            metadata_from_api = {
-                'role_owner': role_owner,
-                'role_name': role_name,
-                'vcs_url': repo['html_url'],
-                'role_format_version': '0.1.0',
-            }
-            self._metadata.setdefault(role_full_name, {})
-            self._metadata[role_full_name].update(metadata_from_api)
-
-    def read_github_repos_api_file(self, file_path, role_owner=None):
-        """
-        Read GitHub API response file for a /users/:username/repos or
-        /orgs/:org/repos query passed as file path.
-        """
-
-        with open(args.github_api_response_file) as gh_rsp_fh:
-            self._read_github_repos_api_response(
-                gh_rsp_fh,
-                role_owner=role_owner,
-            )
-
-    def _interpret_role_dir_name(self, role_dir_name):
-        """
-        Extract and return information from the role directory name.
-        """
-
-        version_by_pattern_map = {
-            '0.1.0': re.compile(
-                r'^(?P<role_owner>[^.]+)\.(?P<role_name>[a-z0-9_-]+)\.rst$'),
-            '0.2.0': re.compile(
-                r'^ansible-(?P<role_name>[a-z0-9_-]+)$'),
-        }
-
-        for role_format_version, pattern in version_by_pattern_map.items():
-            _re = pattern.search(role_dir_name)
-            if _re:
-                role_owner = None
-                if 'role_owner' in _re.groups():
-                    role_owner = _re.group('role_owner')
-                role_name = _re.group('role_name')
-                logger.debug('Detected docs format version {} '
-                             'for owner: {}, name: {} from {}'.format(
-                                    role_format_version,
-                                    role_owner,
-                                    role_name,
-                                    role_dir_name,
-                                ))
-                return {
-                    'role_format_version': role_format_version,
-                    'role_owner': role_owner,
-                    'role_name': role_name,
-                }
-
-        return None
-
-    def _get_decoded_yaml(self, yaml_file_path):
-        """
-        Get decoded YAML file.
-        """
-
-        try:
-            with open(yaml_file_path) as ansigenome_fh:
-                return yaml.safe_load(ansigenome_fh)
-        except OSError:
-            return {}
-
-    def _get_owner_from_vcs_url(self, vcs_url):
-        """
-        Return owner name from VCS URL.
-        Return `ypid` for `https://github.com/ypid/ansible-packages/`.
-        """
-
-        _re = re.match('[^:]+://[^/]+/(?P<owner_name>[^/]+)/', vcs_url)
-        if _re:
-            owner_name = _re.group('owner_name')
-            logger.debug("Detected owner '{}' for URL: {}".format(
-                owner_name,
-                vcs_url,
-            ))
-            return owner_name
-        else:
-            return None
-
-    def _get_vcs_info(self, dir_path):
-        """
-        Read VCS metadata for the given directory path.
-        """
-
-        g = git.Git(dir_path)
-
-        # %cd: committer date
-        last_committer_date = g.log('-1', '--format=%cd', '--date=iso8601')
-        #  logger.debug('Got last committer date {} for: {}'.format(
-        #      last_committer_date,
-        #      dir_path,
-        #  ))
-
-        #  describe_version = g.describe()
-        #  logger.debug(describe_version)
-
-        try:
-            version = g.describe('--abbrev=0', '--tags')
-        except Exception:
-            # Did not work on Travis test.
-            # except git.exc.GitCommandError:
-            version = '0.0.0'
-
-        if self._test_mode:
-            # Fake committer date in test mode
-            last_committer_date = '1970-01-01 00:00:00 +0000'
-
-        metadata = {
-            'vcs_last_committer_date': last_committer_date,
-            'version': re.sub(r'^v', '', version),
-        }
-
-        if not self._test_mode and version != '0.0.0':
-            try:
-                commits_since_last_release = len(
-                    g.log('{}...HEAD'.format(version), '--oneline').split('\n')
-                )
-            except Exception:
-                commits_since_last_release = None
-
-            if commits_since_last_release is not None:
-                metadata.update({
-                    'vcs_commits_since_last_release': (
-                        commits_since_last_release),
-                })
-
-        return metadata
-
-    def _get_maintainers_from_line(self, line):
-        # Modeled with the natural language processing from AIML in mind.
-        # TODO: Remove redundancy. Duplicated into ansigenome source code.
-        # Origin: debops-api
-        _re = re.match(
-            r'^[^.]*?maintainers?[\W_]+(:?is|are)[\W_]+`?(?P<nicks>.+?)\.?$',
-            line,
-            re.IGNORECASE
-        )
-        if _re:
-            return [x.rstrip('_') for x in re.split(r'[\s,]+',
-                    _re.group('nicks')) if x not in ['and', ',']]
-        else:
-            return None
-
-    def _get_maintainers_from_changelog(self, changes_file):
-        # TODO: Remove redundancy. Duplicated into ansigenome source code.
-        # Origin: debops-api
-        """
-        Extract the maintainer from CHANGES.rst file and return the nickname of
-        the maintainer.
-        """
-
-        try:
-            with open(changes_file, 'r') as changes_fh:
-                for line in changes_fh:
-                    nick = self._get_maintainers_from_line(line)
-                    if nick is not None:
-                        return nick
-        except FileNotFoundError:
-            return None
-        return None
-
-    def _get_role_metadata(self, role_path):
-        """
-        Read metadata for the given role.
-        """
-
-        role_metadata = {}
-
-        role_metadata['ansigenome'] = self._get_decoded_yaml(
-            os.path.join(role_path, 'meta', 'ansigenome.yml')
-        )['ansigenome_info']
-
-        role_metadata['meta'] = self._get_decoded_yaml(
-            os.path.join(role_path, 'meta', 'main.yml')
-        )
-
-        maintainer_nicks = self._get_maintainers_from_changelog(
-            os.path.join(role_path, 'CHANGES.rst')
-        )
-        if maintainer_nicks is not None:
-            role_metadata['maintainer_nicks'] = maintainer_nicks
-            role_metadata['role_format_version'] = '0.2.1'
-
-        return role_metadata
-
-    def _get_normalized_meta_ansigenome(self, meta_ansigenome):
-        """
-        Returns normalized meta/ansigenome.yml data intended for inclusion in
-        self._metadata.
-        """
-
-        metadata = {}
-
-        if 'authors' in meta_ansigenome:
-            metadata.setdefault('authors', [])
-
-            for author_item in meta_ansigenome['authors']:
-                metadata['authors'].append({
-                    'name': author_item['name'],
-                    'nick': author_item['github'],
-                    'maintainer': False,
-                })
-
-        return metadata
-
-    def _get_normalized_role_name(self, role_name):
-        """
-        Returns normalized role name as used in URLs
-        Example role name: `ansible`, returns: `role-ansible`.
-        """
-
-        if role_name == 'ansible':
-            role_name = 'role-' + role_name
-        return role_name
-
-    def _get_normalized_meta_main(self, meta_main):
-        """
-        Returns normalized meta/main.yml data intended for inclusion in
-        self._metadata.
-        """
-
-        metadata = {}
-        if 'galaxy_info' not in meta_main:
-            return metadata
-
-        license_map = {
-            'GNU General Public License v3': 'GPL-3.0-only',
-        }
-        skip_keys = [
-            'company',
-            'author',
-        ]
-        rename_keys = {
-            'galaxy_tags': 'tags',
-        }
-
-        for k, v in meta_main['galaxy_info'].items():
-            if k == 'license':
-                if v in license_map:
-                    v = license_map[v]
-            if k in skip_keys:
-                continue
-            k = rename_keys.get(k, k)
-
-            metadata[k] = v
-
-        return metadata
-
-    def gen_role_metadata(self):
-        """
-        Generate metadata based on already present metadata.
-        """
-
-        for role_full_name, metadata in self._metadata.items():
-
-            role_owner = metadata['role_owner']
-            role_name = metadata['role_name']
-
-            additonal_metadata = {
-                'normalized_role_name': (
-                    self._get_normalized_role_name(role_name)),
-                'ci_badge_url': (
-                    'https://api.travis-ci.org/{}/ansible-{}.png'.format(
-                        role_owner,
-                        self._get_normalized_role_name(role_name),
-                    )
-                ),
-                'ci_url': 'https://travis-ci.org/{}/ansible-{}'.format(
-                    role_owner,
-                    self._get_normalized_role_name(role_name),
-                ),
-                'test_suite_url': (
-                    'https://github.com/debops/test-suite/'
-                    'tree/master/ansible-{}'.format(
-                        self._get_normalized_role_name(role_name),
-                    )
-                ),
-                'galaxy_url': 'https://galaxy.ansible.com/{}/{}'.format(
-                    role_owner,
-                    role_name,
-                ),
-            }
-
-            if 'vcs_url' in metadata:
-                additonal_metadata.update({
-                    'clone_url': metadata['vcs_url'] + '.git',
-                    'issue_url': metadata['vcs_url'] + '/issues',
-                    'pr_url': metadata['vcs_url'] + '/pulls',
-                })
-
-            if StrictVersion('0.2.0') <= \
-                    StrictVersion(metadata['role_format_version']):
-
-                if self._docs_url_pattern:
-                    additonal_metadata['docs_url'] = (
-                            self._docs_url_pattern.format(
-                                role_owner=role_owner,
-                                role_name=role_name,
-                                normalized_role_name=(
-                                    self._get_normalized_role_name(role_name)),
-                            )
-                        )
-
-                if self._changelog_url_pattern:
-                    additonal_metadata['changelog_url'] = (
-                            self._changelog_url_pattern.format(
-                                role_owner=role_owner,
-                                role_name=role_name,
-                                normalized_role_name=(
-                                    self._get_normalized_role_name(role_name)),
-                            )
-                        )
-
-            self._metadata[role_full_name].update(additonal_metadata)
-
-    def read_role_metadata(self, role_path):
-        """
-        Read metadata from each role available in role_path.
-        """
-
-        for role_dir_name in os.listdir(role_path):
-            role_dir_info = self._interpret_role_dir_name(role_dir_name)
-
-            # Ignore roles with old docs format for now since it would be
-            # required to get the meta data from external servers (and to
-            # encourage conversion to the new docs format).
-            if role_dir_info:
-                if StrictVersion('0.2.0') <= StrictVersion(
-                        role_dir_info['role_format_version']):
-                    role_name = role_dir_info['role_name']
-                    role_metadata = self._get_role_metadata(
-                            os.path.join(role_path, role_dir_name))
-                    role_vcs_url = role_metadata['ansigenome']['github_url']
-                    role_owner = self._get_owner_from_vcs_url(role_vcs_url)
-                    role_full_name = self._get_role_full_name(
-                            role_owner, role_name)
-
-                    metadata = {
-                        'vcs_url': role_vcs_url,
-                        'role_format_version':
-                            role_metadata['role_format_version']
-                            if 'role_format_version' in role_metadata
-                            else role_dir_info['role_format_version'],
-                        'role_owner': role_owner,
-                        'role_name': role_name,
-                    }
-
-                    metadata.update(
-                        self._get_vcs_info(os.path.join(
-                            role_path, role_dir_name))
-                    )
-
-                    if 'meta' in role_metadata:
-                        metadata.update(
-                            self._get_normalized_meta_main(
-                                role_metadata['meta'])
-                        )
-                    if 'ansigenome' in role_metadata:
-                        metadata.update(
-                            self._get_normalized_meta_ansigenome(
-                                role_metadata['ansigenome'])
-                        )
-                    if 'maintainer_nicks' in role_metadata:
-                        nicks = role_metadata['maintainer_nicks']
-                        metadata.setdefault('authors', [])
-
-                        author_present = set([])
-                        for author_item in metadata['authors']:
-                            if author_item['nick'] in nicks:
-                                author_present.add(author_item['nick'])
-                                author_item['maintainer'] = True
-                        if not author_present:
-                            if self._strict:
-                                raise Exception(
-                                    "Nick(s) {nicks} are maintainers but"
-                                    " no other meta information for them"
-                                    " could be found in the repository."
-                                    " Affected role: {role_full_name}".format(
-                                        role_full_name=role_full_name,
-                                        nicks=set(nicks).difference(
-                                            author_present),
-                                    )
-                                )
-
-                else:
-                    # Legacy stuff.
-                    role_name = role_dir_info['role_name']
-                    role_owner = (role_dir_info['role_owner']
-                                  if role_dir_info['role_owner']
-                                  else self._role_owner)
-                    if not role_owner:
-                        raise Exception("Default role owner"
-                                        " not given but required.")
-
-                    role_vcs_url = self._get_repo_url(
-                        role_owner,
-                        role_name,
-                    )
-                    role_full_name = self._get_role_full_name(
-                        role_owner,
-                        role_name,
-                    )
-
-                    metadata = {
-                        'vcs_url': role_vcs_url,
-                        'role_format_version': '0.1.0',
-                        'role_owner': role_owner,
-                        'role_name': role_name,
-                    }
-
-                self._metadata.setdefault(role_full_name, {})
-                self._metadata[role_full_name].update(metadata)
-
-    def get_metadata(self, metadata=None):
-        """
-        Return public metadata.
-        """
-
-        if not metadata:
-            metadata = self._metadata
-
-        return metadata
-
-        if not isinstance(metadata, dict):
-            return metadata
-
-        public_metadata = {}
-
-        for k, v in metadata.items():
-            if not k.startswith('_'):
-                public_metadata[k] = self.get_metadata(v)
-
-        return public_metadata
-
-    def write_api_dir(self, api_dir):
-        """
-        Write metadata to API directory.
-        The write is done to a temp directory which is later renamed to archive
-        a atomic operation and to ensure that the API returns consistent data.
-        """
-
-        api_work_root_dir = api_dir
-        api_dir = os.path.join(api_dir, 'v0')
-        api_work_dir = api_dir + '_new'
-
-        try:
-            shutil.rmtree(api_work_dir)
-        except OSError:
-            pass
-
-        os.makedirs(os.path.join(api_work_dir, 'role'))
-        os.makedirs(os.path.join(api_work_dir, 'roles'))
-
-        # API: /
-        with open(os.path.join(api_work_dir, 'version'), 'w') as outfile:
-            outfile.write('{}\n'.format(__version__))
-
-        debops_api_base_dir = os.path.join(os.path.dirname(
-            os.path.realpath(__file__)), '..')
-        with open(os.path.join(api_work_dir, 'license'), 'w') as outfile:
-            with open(os.path.join(debops_api_base_dir,
-                                   'COPYRIGHT'), 'r') as copyright:
-                outfile.write(copyright.read())
-            outfile.write('\n\n\n')
-            with open(os.path.join(debops_api_base_dir,
-                                   'LICENSE'), 'r') as license:
-                outfile.write(license.read())
-
-        with open(os.path.join(debops_api_base_dir,
-                               'README.rst'), 'r') as license:
-            readme_html_string = reSTify(
-                    license.read()).decode('utf-8', 'strict')
-            with open(os.path.join(api_work_root_dir,
-                                   'README.html'), 'w') as outfile:
-                outfile.write(readme_html_string)
-            with open(os.path.join(api_work_dir,
-                                   'README.html'), 'w') as outfile:
-                outfile.write(readme_html_string)
-
-        # API: /role/
-        for role_full_name, metadata in self.get_metadata().items():
-            role_api_file = os.path.join(
-                api_work_dir,
-                'role',
-                role_full_name + '.json'
-            )
-            with open(role_api_file, 'w') as outfile:
-                json.dump(metadata, outfile, sort_keys=True)
-                outfile.write('\n')
-
-        # API: /roles/
-        with open(os.path.join(api_work_dir,
-                               'roles', 'count'), 'w') as outfile:
-            outfile.write('{}\n'.format(len(self.get_metadata().keys())))
-
-        metadata_per_owner = {}
-        for role_full_name, metadata in self.get_metadata().items():
-            role_owner = metadata['role_owner']
-            metadata_per_owner.setdefault(role_owner, {})
-            metadata_per_owner[role_owner][role_full_name] = metadata
-
-        for role_owner, metadata in metadata_per_owner.items():
-            with open(os.path.join(api_work_dir, 'roles',
-                                   role_owner + '.list'),
-                      'w') as outfile:
-                role_list = self.get_metadata(metadata).keys()
-                outfile.write('\n'.join(sorted(role_list)) + '\n')
-            with open(os.path.join(api_work_dir,
-                                   'roles', role_owner + '.json'),
-                      'w') as outfile:
-                json.dump(self.get_metadata(metadata), outfile, sort_keys=True)
-                outfile.write('\n')
-            with open(os.path.join(api_work_dir,
-                                   'roles', 'count:' + role_owner),
-                      'w') as outfile:
-                outfile.write('{}\n'.format(
-                    len(self.get_metadata(metadata).keys())))
-
-        try:
-            shutil.rmtree(api_dir)
-        except OSError:
-            pass
-
-        os.rename(api_work_dir, api_dir)
-
-
-if __name__ == '__main__':
-    from argparse import ArgumentParser
-
-    args_parser = ArgumentParser(
-        description=__doc__,
-    )
-    args_parser.add_argument(
-        '-V', '--version',
-        action='version',
-        version='%(prog)s {version}'.format(version=__version__)
-    )
-    args_parser.add_argument(
-        '-d', '--debug',
-        help="Print lots of debugging statements.",
-        action='store_const',
-        dest='loglevel',
-        const=logging.DEBUG,
-        default=logging.WARNING,
-    )
-    args_parser.add_argument(
-        '-v', '--verbose',
-        help="Be verbose.",
-        action='store_const',
-        dest='loglevel',
-        const=logging.INFO,
-    )
-    args_parser.add_argument(
-        '-n', '--no-strict',
-        help="Do not exit immediately when there is a inconsistency.",
-        dest='strict',
-        action='store_false',
-        default=True,
-    )
-    args_parser.add_argument(
-        '-i', '--github-api-response-file',
-        help="Responds file from a /users/:username/repos"
-        " or /orgs/:org/repos API query.",
-    )
-    args_parser.add_argument(
-        '-r', '--role-path',
-        help="Base directory where all roles are available.",
-    )
-    args_parser.add_argument(
-        '-o', '--role-owner',
-        help="Default role owner if not available from Ansible role metadata.",
-        default='debops',
-    )
-    args_parser.add_argument(
-        '-a', '--api-dir',
-        help="Write the static parts of api.debops.org"
-        " to the given directory."
-        " Note that all files in this directory are going to be"
-        " overwritten or deleted.",
-    )
-    args_parser.add_argument(
-        '-D', '--docs-url-pattern',
-        help="Documentation URL for each role.",
-        default='https://docs.debops.org/en/latest/'
-        'ansible/roles/ansible-{role_name}/docs/index.html',
-    )
-    args_parser.add_argument(
-        '-C', '--changelog-url-pattern',
-        help="Changelog URL for each role.",
-        default='https://docs.debops.org/en/latest/'
-        'ansible/roles/ansible-{role_name}/docs/changelog.html',
-    )
-    args_parser.add_argument(
-        '-t', '--test-mode',
-        help="Make the output reproducible by normalizing changing peaces like"
-        "timestamps.",
-        action='store_true',
-        default=False,
-    )
-    args = args_parser.parse_args()
-    if not args.github_api_response_file and not args.role_path:
-        args_parser.print_help()
-        sys.exit(1)
-
-    logger = logging.getLogger(__file__)
-    logging.basicConfig(
-        format='%(levelname)s: %(message)s',
-        level=args.loglevel,
-    )
-
-    debops_metadata = DebOpsAPI(
-        strict=args.strict,
-        docs_url_pattern=args.docs_url_pattern,
-        changelog_url_pattern=args.changelog_url_pattern,
-        role_owner=args.role_owner,
-        test_mode=args.test_mode,
-    )
-
-    if args.github_api_response_file:
-        debops_metadata.read_github_repos_api_file(
-            args.github_api_response_file,
-        )
-
-    if args.role_path:
-        debops_metadata.read_role_metadata(args.role_path)
-
-    debops_metadata.gen_role_metadata()
-
-    if args.api_dir:
-        debops_metadata.write_api_dir(args.api_dir)
-
-    logging.info("Metadata:\n{}".format(
-        pprint.pformat(debops_metadata.get_metadata()),
-    ))
diff --git a/lib/debops-api/hooks/pre-commit b/lib/debops-api/hooks/pre-commit
deleted file mode 100755
index cda6da91c6..0000000000
--- a/lib/debops-api/hooks/pre-commit
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-make check
diff --git a/lib/debops-api/requirements.txt b/lib/debops-api/requirements.txt
deleted file mode 100644
index 433686265a..0000000000
--- a/lib/debops-api/requirements.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-PyYAML
-GitPython
-docutils
-nose2
diff --git a/lib/debops-api/setup.py b/lib/debops-api/setup.py
deleted file mode 100755
index de54a9f79b..0000000000
--- a/lib/debops-api/setup.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python3
-
-from distutils.core import setup
-
-version = None
-with open('debops/api.py') as f:
-    for line in f:
-        if line.startswith('__version__'):
-            version = line.replace("'", '').split()[2]
-            break
-
-setup(
-    name='debops-api',
-    description='Machine readable metadata about the DebOps Project',
-    version=version,
-    author='Robin Schneider',
-    author_email='ypid@riseup.net',
-    url='https://github.com/debops/debops-api',
-    classifiers=(
-        'Development Status :: 4 - Beta',
-        'Environment :: Console',
-        'Intended Audience :: System Administrators',
-        'License :: DFSG approved'
-        'License :: OSI Approved :: GNU Affero General Public License v3',
-        'Natural Language :: English',
-        'Programming Language :: Python',
-        'Operating System :: OS Independent',
-        'Topic :: Software Development :: Documentation',
-    ),
-)


Test patch:
diff --git a/lib/debops-api/tests/api_data/README.html b/lib/debops-api/tests/api_data/README.html
deleted file mode 100644
index 0dd5ef4f4f..0000000000
--- a/lib/debops-api/tests/api_data/README.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>DebOps API</title>
-
-<div class="document" id="debops-api">
-<h1 class="title"><a class="reference external" href="https://api.debops.org/">DebOps API</a></h1>
-
-<p><a class="reference external" href="https://travis-ci.org/debops/debops-api"><img alt="Travis CI" src="https://img.shields.io/travis/debops/debops-api.svg?style=flat" /></a></p>
-<p>The public DebOps API is used internally by the DebOps Project but can also be
-used by third parties.</p>
-<p>Refer to the <a class="reference external" href="http://docs.debops.org/en/latest/debops-api/docs/index.html">DebOps API documentation</a> for more details.
-If you want to set up a DebOps API server, checkout the Ansible role <a class="reference external" href="https://github.com/debops/ansible-debops_api">debops.debops_api</a>.</p>
-</div>
diff --git a/lib/debops-api/tests/api_data/v0/README.html b/lib/debops-api/tests/api_data/v0/README.html
deleted file mode 100644
index 0dd5ef4f4f..0000000000
--- a/lib/debops-api/tests/api_data/v0/README.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>DebOps API</title>
-
-<div class="document" id="debops-api">
-<h1 class="title"><a class="reference external" href="https://api.debops.org/">DebOps API</a></h1>
-
-<p><a class="reference external" href="https://travis-ci.org/debops/debops-api"><img alt="Travis CI" src="https://img.shields.io/travis/debops/debops-api.svg?style=flat" /></a></p>
-<p>The public DebOps API is used internally by the DebOps Project but can also be
-used by third parties.</p>
-<p>Refer to the <a class="reference external" href="http://docs.debops.org/en/latest/debops-api/docs/index.html">DebOps API documentation</a> for more details.
-If you want to set up a DebOps API server, checkout the Ansible role <a class="reference external" href="https://github.com/debops/ansible-debops_api">debops.debops_api</a>.</p>
-</div>
diff --git a/lib/debops-api/tests/api_data/v0/license b/lib/debops-api/tests/api_data/v0/license
deleted file mode 100644
index 3ec0633209..0000000000
--- a/lib/debops-api/tests/api_data/v0/license
+++ /dev/null
@@ -1,697 +0,0 @@
-debops-api - Machine readable metadata about the DebOps Project
-
-Copyright (C) 2016 Robin Schneider <ypid@riseup.net>
-Copyright (C) 2016 DebOps <http://debops.org/>
-# SPDX-License-Identifier: AGPL-3.0-only
-
-debops-api is part of DebOps.
-
-debops-api is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as
-published by the Free Software Foundation, version 3 of the
-License.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <https://www.gnu.org/licenses/>.
-
-
-
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU General Public License is a free, copyleft license for
-software and other kinds of works.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-the GNU General Public License is intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.  We, the Free Software Foundation, use the
-GNU General Public License for most of our software; it applies also to
-any other work released this way by its authors.  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  To protect your rights, we need to prevent others from denying you
-these rights or asking you to surrender the rights.  Therefore, you have
-certain responsibilities if you distribute copies of the software, or if
-you modify it: responsibilities to respect the freedom of others.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must pass on to the recipients the same
-freedoms that you received.  You must make sure that they, too, receive
-or can get the source code.  And you must show them these terms so they
-know their rights.
-
-  Developers that use the GNU GPL protect your rights with two steps:
-(1) assert copyright on the software, and (2) offer you this License
-giving you legal permission to copy, distribute and/or modify it.
-
-  For the developers' and authors' protection, the GPL clearly explains
-that there is no warranty for this free software.  For both users' and
-authors' sake, the GPL requires that modified versions be marked as
-changed, so that their problems will not be attributed erroneously to
-authors of previous versions.
-
-  Some devices are designed to deny users access to install or run
-modified versions of the software inside them, although the manufacturer
-can do so.  This is fundamentally incompatible with the aim of
-protecting users' freedom to change the software.  The systematic
-pattern of such abuse occurs in the area of products for individuals to
-use, which is precisely where it is most unacceptable.  Therefore, we
-have designed this version of the GPL to prohibit the practice for those
-products.  If such problems arise substantially in other domains, we
-stand ready to extend this provision to those domains in future versions
-of the GPL, as needed to protect the freedom of users.
-
-  Finally, every program is threatened constantly by software patents.
-States should not allow patents to restrict development and use of
-software on general-purpose computers, but in those that do, we wish to
-avoid the special danger that patents applied to a free program could
-make it effectively proprietary.  To prevent this, the GPL assures that
-patents cannot be used to render the program non-free.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Use with the GNU Affero General Public License.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU Affero General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the special requirements of the GNU Affero General Public License,
-section 13, concerning interaction through a network will apply to the
-combination as such.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If the program does terminal interaction, make it output a short
-notice like this when it starts in an interactive mode:
-
-    <program>  Copyright (C) <year>  <name of author>
-    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, your program's commands
-might be different; for a GUI interface, you would use an "about box".
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU GPL, see
-<http://www.gnu.org/licenses/>.
-
-  The GNU General Public License does not permit incorporating your program
-into proprietary programs.  If your program is a subroutine library, you
-may consider it more useful to permit linking proprietary applications with
-the library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.  But first, please read
-<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/lib/debops-api/tests/api_data/v0/role/debops.ansible.json b/lib/debops-api/tests/api_data/v0/role/debops.ansible.json
deleted file mode 100644
index 69cfd2d12e..0000000000
--- a/lib/debops-api/tests/api_data/v0/role/debops.ansible.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "ci_badge_url": "https://api.travis-ci.org/debops/ansible-role-ansible.png",
-  "ci_url": "https://travis-ci.org/debops/ansible-role-ansible",
-  "clone_url": "https://github.com/debops/ansible-role-ansible.git",
-  "galaxy_url": "https://galaxy.ansible.com/debops/ansible",
-  "issue_url": "https://github.com/debops/ansible-role-ansible/issues",
-  "normalized_role_name": "role-ansible",
-  "pr_url": "https://github.com/debops/ansible-role-ansible/pulls",
-  "role_format_version": "0.1.0",
-  "role_name": "ansible",
-  "role_owner": "debops",
-  "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-role-ansible",
-  "vcs_url": "https://github.com/debops/ansible-role-ansible"
-}
diff --git a/lib/debops-api/tests/api_data/v0/role/debops.unattended_upgrades.json b/lib/debops-api/tests/api_data/v0/role/debops.unattended_upgrades.json
deleted file mode 100644
index d39437cd90..0000000000
--- a/lib/debops-api/tests/api_data/v0/role/debops.unattended_upgrades.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "authors": [
-    {
-      "maintainer": true,
-      "name": "Maciej Delmanowski",
-      "nick": "drybjed"
-    },
-    {
-      "maintainer": false,
-      "name": "Robin Schneider",
-      "nick": "ypid"
-    }
-  ],
-  "changelog_url": "https://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/changelog.html",
-  "ci_badge_url": "https://api.travis-ci.org/debops/ansible-unattended_upgrades.png",
-  "ci_url": "https://travis-ci.org/debops/ansible-unattended_upgrades",
-  "clone_url": "https://github.com/debops/ansible-unattended_upgrades.git",
-  "description": "Configure unattended upgrades on Debian-based hosts",
-  "docs_url": "https://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/index.html",
-  "galaxy_url": "https://galaxy.ansible.com/debops/unattended_upgrades",
-  "issue_url": "https://github.com/debops/ansible-unattended_upgrades/issues",
-  "license": "GPL-3.0-only",
-  "min_ansible_version": "2.0.0",
-  "normalized_role_name": "unattended_upgrades",
-  "platforms": [
-    {
-      "name": "Ubuntu",
-      "versions": [
-        "precise",
-        "quantal",
-        "raring",
-        "saucy",
-        "trusty"
-      ]
-    },
-    {
-      "name": "Debian",
-      "versions": [
-        "wheezy",
-        "jessie"
-      ]
-    }
-  ],
-  "pr_url": "https://github.com/debops/ansible-unattended_upgrades/pulls",
-  "role_format_version": "0.2.1",
-  "role_name": "unattended_upgrades",
-  "role_owner": "debops",
-  "tags": [
-    "apt",
-    "system",
-    "security"
-  ],
-  "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-unattended_upgrades",
-  "vcs_last_committer_date": "1970-01-01 00:00:00 +0000",
-  "vcs_url": "https://github.com/debops/ansible-unattended_upgrades",
-  "version": "0.0.0"
-}
diff --git a/lib/debops-api/tests/api_data/v0/role/debops.users.json b/lib/debops-api/tests/api_data/v0/role/debops.users.json
deleted file mode 100644
index d3587afd07..0000000000
--- a/lib/debops-api/tests/api_data/v0/role/debops.users.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "ci_badge_url": "https://api.travis-ci.org/debops/ansible-users.png",
-  "ci_url": "https://travis-ci.org/debops/ansible-users",
-  "clone_url": "https://github.com/debops/ansible-users.git",
-  "galaxy_url": "https://galaxy.ansible.com/debops/users",
-  "issue_url": "https://github.com/debops/ansible-users/issues",
-  "normalized_role_name": "users",
-  "pr_url": "https://github.com/debops/ansible-users/pulls",
-  "role_format_version": "0.1.0",
-  "role_name": "users",
-  "role_owner": "debops",
-  "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-users",
-  "vcs_url": "https://github.com/debops/ansible-users"
-}
diff --git a/lib/debops-api/tests/api_data/v0/roles/count b/lib/debops-api/tests/api_data/v0/roles/count
deleted file mode 100644
index 00750edc07..0000000000
--- a/lib/debops-api/tests/api_data/v0/roles/count
+++ /dev/null
@@ -1,1 +0,0 @@
-3
diff --git a/lib/debops-api/tests/api_data/v0/roles/count:debops b/lib/debops-api/tests/api_data/v0/roles/count:debops
deleted file mode 100644
index 00750edc07..0000000000
--- a/lib/debops-api/tests/api_data/v0/roles/count:debops
+++ /dev/null
@@ -1,1 +0,0 @@
-3
diff --git a/lib/debops-api/tests/api_data/v0/roles/debops.json b/lib/debops-api/tests/api_data/v0/roles/debops.json
deleted file mode 100644
index 2da83ca027..0000000000
--- a/lib/debops-api/tests/api_data/v0/roles/debops.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
-  "debops.ansible": {
-    "ci_badge_url": "https://api.travis-ci.org/debops/ansible-role-ansible.png",
-    "ci_url": "https://travis-ci.org/debops/ansible-role-ansible",
-    "clone_url": "https://github.com/debops/ansible-role-ansible.git",
-    "galaxy_url": "https://galaxy.ansible.com/debops/ansible",
-    "issue_url": "https://github.com/debops/ansible-role-ansible/issues",
-    "normalized_role_name": "role-ansible",
-    "pr_url": "https://github.com/debops/ansible-role-ansible/pulls",
-    "role_format_version": "0.1.0",
-    "role_name": "ansible",
-    "role_owner": "debops",
-    "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-role-ansible",
-    "vcs_url": "https://github.com/debops/ansible-role-ansible"
-  },
-  "debops.unattended_upgrades": {
-    "authors": [
-      {
-        "maintainer": true,
-        "name": "Maciej Delmanowski",
-        "nick": "drybjed"
-      },
-      {
-        "maintainer": false,
-        "name": "Robin Schneider",
-        "nick": "ypid"
-      }
-    ],
-    "changelog_url": "https://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/changelog.html",
-    "ci_badge_url": "https://api.travis-ci.org/debops/ansible-unattended_upgrades.png",
-    "ci_url": "https://travis-ci.org/debops/ansible-unattended_upgrades",
-    "clone_url": "https://github.com/debops/ansible-unattended_upgrades.git",
-    "description": "Configure unattended upgrades on Debian-based hosts",
-    "docs_url": "https://docs.debops.org/en/latest/ansible/roles/ansible-unattended_upgrades/docs/index.html",
-    "galaxy_url": "https://galaxy.ansible.com/debops/unattended_upgrades",
-    "issue_url": "https://github.com/debops/ansible-unattended_upgrades/issues",
-    "license": "GPL-3.0-only",
-    "min_ansible_version": "2.0.0",
-    "normalized_role_name": "unattended_upgrades",
-    "platforms": [
-      {
-        "name": "Ubuntu",
-        "versions": [
-          "precise",
-          "quantal",
-          "raring",
-          "saucy",
-          "trusty"
-        ]
-      },
-      {
-        "name": "Debian",
-        "versions": [
-          "wheezy",
-          "jessie"
-        ]
-      }
-    ],
-    "pr_url": "https://github.com/debops/ansible-unattended_upgrades/pulls",
-    "role_format_version": "0.2.1",
-    "role_name": "unattended_upgrades",
-    "role_owner": "debops",
-    "tags": [
-      "apt",
-      "system",
-      "security"
-    ],
-    "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-unattended_upgrades",
-    "vcs_last_committer_date": "1970-01-01 00:00:00 +0000",
-    "vcs_url": "https://github.com/debops/ansible-unattended_upgrades",
-    "version": "0.0.0"
-  },
-  "debops.users": {
-    "ci_badge_url": "https://api.travis-ci.org/debops/ansible-users.png",
-    "ci_url": "https://travis-ci.org/debops/ansible-users",
-    "clone_url": "https://github.com/debops/ansible-users.git",
-    "galaxy_url": "https://galaxy.ansible.com/debops/users",
-    "issue_url": "https://github.com/debops/ansible-users/issues",
-    "normalized_role_name": "users",
-    "pr_url": "https://github.com/debops/ansible-users/pulls",
-    "role_format_version": "0.1.0",
-    "role_name": "users",
-    "role_owner": "debops",
-    "test_suite_url": "https://github.com/debops/test-suite/tree/master/ansible-users",
-    "vcs_url": "https://github.com/debops/ansible-users"
-  }
-}
diff --git a/lib/debops-api/tests/api_data/v0/roles/debops.list b/lib/debops-api/tests/api_data/v0/roles/debops.list
deleted file mode 100644
index ef7990279d..0000000000
--- a/lib/debops-api/tests/api_data/v0/roles/debops.list
+++ /dev/null
@@ -1,3 +0,0 @@
-debops.ansible
-debops.unattended_upgrades
-debops.users
diff --git a/lib/debops-api/tests/api_data/v0/version b/lib/debops-api/tests/api_data/v0/version
deleted file mode 100644
index 6e8bf73aa5..0000000000
--- a/lib/debops-api/tests/api_data/v0/version
+++ /dev/null
@@ -1,1 +0,0 @@
-0.1.0
diff --git a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/CHANGES.rst b/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/CHANGES.rst
deleted file mode 100644
index 85eb9e9fc0..0000000000
--- a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/CHANGES.rst
+++ /dev/null
@@ -1,127 +0,0 @@
-Changelog
-=========
-
-.. include:: includes/all.rst
-
-**debops.unattended_upgrades**
-
-This project adheres to `Semantic Versioning <http://semver.org/spec/v2.0.0.html>`__
-and `human-readable changelog <http://keepachangelog.com/>`_.
-
-The current role maintainer_ is drybjed_.
-
-`debops.unattended_upgrades master`_ - unreleased
--------------------------------------------------
-
-.. _debops.unattended_upgrades master: https://github.com/debops/ansible-unattended_upgrades/compare/v0.2.0...master
-
-Added
-~~~~~
-
-- Support nested lists for :envvar:`unattended_upgrades__blacklist` and
-  :envvar:`unattended_upgrades__origins`. [ypid_]
-
-Fixed
-~~~~~
-
-- Fixed :envvar:`unattended_upgrades__release_origins` for Debian Jessie and
-  potentially newer versions. [ypid_]
-
-`debops.unattended_upgrades v0.2.0`_ - 2016-07-09
--------------------------------------------------
-
-.. _debops.unattended_upgrades v0.2.0: https://github.com/debops/ansible-unattended_upgrades/compare/v0.1.4...v0.2.0
-
-Added
-~~~~~
-
-- ``state`` option for :envvar:`unattended_upgrades__blacklist` and similar
-  lists when using the dictionary notation. This replaces the removed
-  ``when`` option. The ``state`` allows to remove entries from the blacklist
-  which ``when`` did not. [ypid_]
-
-- Support dictionary notation for :envvar:`unattended_upgrades__origins` and
-  :envvar:`unattended_upgrades__dependent_origins` lists. [ypid_]
-
-- Documentation for :envvar:`unattended_upgrades__origins`.
-
-- Add ``vim`` fold markers in :file:`defaults/main.yml` file. [drybjed_]
-
-Changed
-~~~~~~~
-
-- Reworked role to meet the latest DebOps standards. [ypid_]
-
-Fixed
-~~~~~
-
-- Fixed example for :envvar:`unattended_upgrades__blacklist` which is expected
-  to be a regular expression and a mix between glob and regular expression.
-  The previous given example also works for some reason so this fix is merely
-  to follow the upstream documentation more strictly.
-  [ypid_]
-
-Removed
-~~~~~~~
-
-- ``when`` option from :envvar:`unattended_upgrades__blacklist` and similar
-  lists when using the dictionary notation. It has been superseded by the
-  ``state`` option to allow to remove entries from the blacklist. [ypid_]
-
-- Remove the automatic blacklisting of the ``vim`` and ``libc6`` packages.
-  Nothing is blacklisted by default. [ypid_]
-
-
-`debops.unattended_upgrades v0.1.4`_ - 2016-03-02
--------------------------------------------------
-
-.. _debops.unattended_upgrades v0.1.4: https://github.com/debops/ansible-unattended_upgrades/compare/v0.1.3...v0.1.4
-
-Fixed
-~~~~~
-
-- Fix issue with role import on Ansible Galaxy. [drybjed_]
-
-`debops.unattended_upgrades v0.1.3`_ - 2016-03-02
--------------------------------------------------
-
-.. _debops.unattended_upgrades v0.1.3: https://github.com/debops/ansible-unattended_upgrades/compare/v0.1.2...v0.1.3
-
-Added
-~~~~~
-
-- Add support for conditional package blacklisting. [drybjed_]
-
-`debops.unattended_upgrades v0.1.2`_ - 2016-02-22
--------------------------------------------------
-
-.. _debops.unattended_upgrades v0.1.2: https://github.com/debops/ansible-unattended_upgrades/compare/v0.1.1...v0.1.2
-
-Changed
-~~~~~~~
-
-- Use more granular lookup for security and release origins.
-
-  Due to the ``unattended-upgrades`` `Debian Bug #704087 <https://bugs.debian.org/704087>`_
-  on Debian Wheezy which stops the upgrades from being performed,
-  debops.unattended_upgrades_ role will now use more granular lookup strings
-  to select security and release origin patterns for current OS release.
-  [drybjed_]
-
-`debops.unattended_upgrades v0.1.1`_ - 2016-02-10
--------------------------------------------------
-
-.. _debops.unattended_upgrades v0.1.1: https://github.com/debops/ansible-unattended_upgrades/compare/v0.1.0...v0.1.1
-
-Removed
-~~~~~~~
-
-- Rename all variables to create a virtual namespace. [drybjed_]
-
-debops.unattended_upgrades v0.1.0 - 2016-02-09
-----------------------------------------------
-
-Added
-~~~~~
-
-- Initial release. [drybjed_]
diff --git a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/ansigenome.yml b/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/ansigenome.yml
deleted file mode 100644
index a7e2b3d08b..0000000000
--- a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/ansigenome.yml
+++ /dev/null
@@ -1,29 +0,0 @@
----
-
-ansigenome_info:
-  galaxy_url: 'https://galaxy.ansible.com/debops/unattended_upgrades/'
-  github_url: 'https://github.com/debops/ansible-unattended_upgrades'
-  git_branch: 'master'
-
-  travis: True
-
-  license_url: 'https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)'
-
-  authors:
-    - name:  'Maciej Delmanowski'
-      url: ''
-      email: 'drybjed@gmail.com'
-      twitter: 'drybjed'
-      github: 'drybjed'
-
-    - name:  'Robin Schneider'
-      url: 'http://ypid.de/'
-      email: 'ypid@riseup.net'
-      twitter: 'ypid'
-      github: 'ypid'
-
-  synopsis: |
-    The `unattended-upgrades` package manages [automatic, unattended upgrades](https://wiki.debian.org/UnattendedUpgrades)
-    of the Debian-based hosts. You can specify what package origins are
-    included in the unattended upgrades, as well as specify what packages
-    should be exempt from the upgrades, among other things.
diff --git a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/main.yml b/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/main.yml
deleted file mode 100644
index 509d507f3b..0000000000
--- a/lib/debops-api/tests/example_roles/ansible-unattended_upgrades/meta/main.yml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-
-dependencies: []
-
-galaxy_info:
-  author: 'Maciej Delmanowski, Robin Schneider'
-  description: 'Configure unattended upgrades on Debian-based hosts'
-  company: 'DebOps'
-  license: 'GNU General Public License v3'
-  min_ansible_version: '2.0.0'
-
-  platforms:
-
-    - name: 'Ubuntu'
-      versions:
-        - 'precise'
-        - 'quantal'
-        - 'raring'
-        - 'saucy'
-        - 'trusty'
-
-    - name: 'Debian'
-      versions:
-        - 'wheezy'
-        - 'jessie'
-
-  galaxy_tags:
-    - 'apt'
-    - 'system'
-    - 'security'
diff --git a/lib/debops-api/tests/example_roles/debops.ansible.rst b/lib/debops-api/tests/example_roles/debops.ansible.rst
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/lib/debops-api/tests/example_roles/debops.users.rst b/lib/debops-api/tests/example_roles/debops.users.rst
deleted file mode 100644
index ae6890ce12..0000000000
--- a/lib/debops-api/tests/example_roles/debops.users.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-.. Nothing to see here.
-   The file content is not parsed.
diff --git a/lib/debops-api/tests/test_debops_api.py b/lib/debops-api/tests/test_debops_api.py
deleted file mode 100644
index cc01cb10f0..0000000000
--- a/lib/debops-api/tests/test_debops_api.py
+++ /dev/null
@@ -1,25 +0,0 @@
-from nose.tools import assert_equals
-
-from debops.api import DebOpsAPI
-
-
-def test__get_maintainer_from_changelog():
-    debops_api = DebOpsAPI()
-    expected = {
-        'The current role maintainer_ is drybjed_.': ['drybjed'],
-        'The current role maintainers_ are drybjed_ and ypid_.': (
-            ['drybjed', 'ypid']),
-        'The current role maintainers_ are drybjed_, foo_ and ypid_.': (
-            ['drybjed', 'foo', 'ypid']),
-        'The current role maintainer is drybjed_.': ['drybjed'],
-        'The current role maintainer is drybjed.': ['drybjed'],
-        'The current role maintainer is drybjed': ['drybjed'],
-        'The current maintainer is drybjed': ['drybjed'],
-        'The maintainer is drybjed': ['drybjed'],
-        '.. include:: includes/all.rst': None,
-    }
-    for line, expected_result in expected.items():
-        assert_equals(
-            expected_result,
-            debops_api._get_maintainers_from_line(line)
-        )