diff --git a/README.rst b/README.rst
index b462534bf7094c0732dc49971fc312860d3df9a2..6740272f28d43c11bde5c7907c0be9e32659442c 100644
--- a/README.rst
+++ b/README.rst
@@ -66,7 +66,6 @@ Kolla-Ansible deploys containers for the following OpenStack projects:
 - `Nova <https://docs.openstack.org/nova/latest/>`__
 - `Octavia <https://docs.openstack.org/octavia/latest/>`__
 - `Panko <https://docs.openstack.org/panko/latest/>`__
-- `Qinling <https://docs.openstack.org/qinling/latest/>`__
 - `Rally <https://docs.openstack.org/rally/latest/>`__
 - `Sahara <https://docs.openstack.org/sahara/latest/>`__
 - `Searchlight <https://docs.openstack.org/searchlight/latest/>`__
diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index e0eb0d0efce8adca68a9faf0a3b10e27a0ee2f0a..40e114df9cadcd9fefa9075415fb4fba6fbbe6d3 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -446,8 +446,6 @@ prometheus_blackbox_exporter_port: "9115"
 
 qdrouterd_port: "31459"
 
-qinling_api_port: "7070"
-
 rabbitmq_port: "{{ '5671' if rabbitmq_enable_tls | bool else '5672' }}"
 rabbitmq_management_port: "15672"
 rabbitmq_cluster_port: "25672"
@@ -617,7 +615,6 @@ enable_horizon_monasca: "{{ enable_monasca | bool }}"
 enable_horizon_murano: "{{ enable_murano | bool }}"
 enable_horizon_neutron_vpnaas: "{{ enable_neutron_vpnaas | bool }}"
 enable_horizon_octavia: "{{ enable_octavia | bool }}"
-enable_horizon_qinling: "{{ enable_qinling | bool }}"
 enable_horizon_sahara: "{{ enable_sahara | bool }}"
 enable_horizon_searchlight: "{{ enable_searchlight | bool }}"
 enable_horizon_senlin: "{{ enable_senlin | bool }}"
@@ -674,7 +671,6 @@ enable_panko: "no"
 enable_placement: "{{ enable_nova | bool or enable_zun | bool }}"
 enable_prometheus: "no"
 enable_qdrouterd: "{{ 'yes' if om_rpc_transport == 'amqp' else 'no' }}"
-enable_qinling: "no"
 enable_rally: "no"
 enable_redis: "no"
 enable_sahara: "no"
@@ -1022,12 +1018,6 @@ enable_nova_horizon_policy_file: "{{ enable_nova }}"
 
 horizon_internal_endpoint: "{{ internal_protocol }}://{{ kolla_internal_fqdn | put_address_in_context('url') }}:{{ horizon_tls_port if kolla_enable_tls_internal | bool else horizon_port }}"
 
-#################
-# Qinling options
-#################
-# Configure qinling-engine certificates to authenticate with Kubernetes cluster.
-qinling_kubernetes_certificates: "no"
-
 ###################
 # External Ceph options
 ###################
diff --git a/ansible/inventory/all-in-one b/ansible/inventory/all-in-one
index 28dd2fda4eed4857f2c0a6948c73db16de2061b2..abdccf20e71c461137cf932d98ef04faeea1e4c8 100644
--- a/ansible/inventory/all-in-one
+++ b/ansible/inventory/all-in-one
@@ -156,9 +156,6 @@ monitoring
 [magnum:children]
 control
 
-[qinling:children]
-control
-
 [sahara:children]
 control
 
@@ -496,13 +493,6 @@ magnum
 [magnum-conductor:children]
 magnum
 
-# Qinling
-[qinling-api:children]
-qinling
-
-[qinling-engine:children]
-qinling
-
 # Solum
 [solum-api:children]
 solum
diff --git a/ansible/inventory/multinode b/ansible/inventory/multinode
index d2e11d909143f65a25b23fba00a171000a213859..ca3f148f8ead30e37baa29638275a436ae7cd6c9 100644
--- a/ansible/inventory/multinode
+++ b/ansible/inventory/multinode
@@ -177,9 +177,6 @@ control
 [magnum:children]
 control
 
-[qinling:children]
-control
-
 [sahara:children]
 control
 
@@ -504,13 +501,6 @@ magnum
 [magnum-conductor:children]
 magnum
 
-# Qinling
-[qinling-api:children]
-qinling
-
-[qinling-engine:children]
-qinling
-
 # Sahara
 [sahara-api:children]
 sahara
diff --git a/ansible/roles/common/defaults/main.yml b/ansible/roles/common/defaults/main.yml
index f59c78a5864b6910b5b7b983547e6bb142501ef1..662eedff4bc54054123dc0063951c5d32801f0cc 100644
--- a/ansible/roles/common/defaults/main.yml
+++ b/ansible/roles/common/defaults/main.yml
@@ -162,8 +162,6 @@ fluentd_input_openstack_services:
     enabled: "{{ enable_octavia | bool }}"
   - name: panko
     enabled: "{{ enable_panko | bool }}"
-  - name: qinling
-    enabled: "{{ enable_qinling | bool }}"
   - name: rally
     enabled: "{{ enable_rally | bool }}"
   - name: sahara
diff --git a/ansible/roles/common/tasks/config.yml b/ansible/roles/common/tasks/config.yml
index 1d98c74ef5762ab591b248c19bd07e6facec624d..659806b3ccf40028fb1c062d12c48f6207cadc42 100644
--- a/ansible/roles/common/tasks/config.yml
+++ b/ansible/roles/common/tasks/config.yml
@@ -209,7 +209,6 @@
       - { name: "octavia", enabled: "{{ enable_octavia | bool }}" }
       - { name: "outward-rabbitmq", enabled: "{{ enable_outward_rabbitmq | bool }}" }
       - { name: "panko", enabled: "{{ enable_panko | bool }}" }
-      - { name: "qinling", enabled: "{{ enable_qinling | bool }}" }
       - { name: "rabbitmq", enabled: "{{ enable_rabbitmq | bool }}" }
       - { name: "rally", enabled: "{{ enable_rally | bool }}" }
       - { name: "sahara", enabled: "{{ enable_sahara | bool }}" }
diff --git a/ansible/roles/common/templates/conf/filter/01-rewrite-0.14.conf.j2 b/ansible/roles/common/templates/conf/filter/01-rewrite-0.14.conf.j2
index c8bd0cd3a531859fcdaeb49ac07aad32a7afdc46..c6d58f39d3fbb5997ec38eac144ff12cf305eb24 100644
--- a/ansible/roles/common/templates/conf/filter/01-rewrite-0.14.conf.j2
+++ b/ansible/roles/common/templates/conf/filter/01-rewrite-0.14.conf.j2
@@ -161,11 +161,6 @@
     pattern ^(blazar-api|blazar-manager)$
     tag openstack_python
   </rule>
-  <rule>
-    key     programname
-    pattern ^(qinling-engine|qinling-api)$
-    tag openstack_python
-  </rule>
   <rule>
     key     programname
     pattern ^(monasca-api|monasca-notification|monasca-persister|agent-collector|agent-forwarder|agent-statsd)$
diff --git a/ansible/roles/common/templates/cron-logrotate-qinling.conf.j2 b/ansible/roles/common/templates/cron-logrotate-qinling.conf.j2
deleted file mode 100644
index 570dfc276097bfcd7bc0a4edd8e57293a498fe1a..0000000000000000000000000000000000000000
--- a/ansible/roles/common/templates/cron-logrotate-qinling.conf.j2
+++ /dev/null
@@ -1,3 +0,0 @@
-"/var/log/kolla/qinling/*.log"
-{
-}
diff --git a/ansible/roles/haproxy/tasks/precheck.yml b/ansible/roles/haproxy/tasks/precheck.yml
index 0e79dd44afdff96534eef5e985dac30b3f2ef771..db6dfee17ca551c78829df181e04b963907e1a3d 100644
--- a/ansible/roles/haproxy/tasks/precheck.yml
+++ b/ansible/roles/haproxy/tasks/precheck.yml
@@ -729,19 +729,6 @@
     - haproxy_stat.find('panko_api') == -1
     - haproxy_vip_prechecks
 
-- name: Checking free port for Qinling API HAProxy
-  wait_for:
-    host: "{{ kolla_internal_vip_address }}"
-    port: "{{ qinling_api_port }}"
-    connect_timeout: 1
-    timeout: 1
-    state: stopped
-  when:
-    - enable_qinling | bool
-    - inventory_hostname in groups['haproxy']
-    - haproxy_stat.find('qinling_api') == -1
-    - haproxy_vip_prechecks
-
 - name: Checking free port for RabbitMQ Management HAProxy
   wait_for:
     host: "{{ kolla_internal_vip_address }}"
diff --git a/ansible/roles/horizon/defaults/main.yml b/ansible/roles/horizon/defaults/main.yml
index 6876cc37fa9c54e6c5df95f1692b1d0ac07b3d6c..4388da50790250084a2337b84f8400f5dfff8233 100644
--- a/ansible/roles/horizon/defaults/main.yml
+++ b/ansible/roles/horizon/defaults/main.yml
@@ -23,7 +23,6 @@ horizon_services:
       ENABLE_MURANO: "{{ 'yes' if  enable_horizon_murano | bool else 'no' }}"
       ENABLE_NEUTRON_VPNAAS: "{{ 'yes' if enable_horizon_neutron_vpnaas | bool else 'no' }}"
       ENABLE_OCTAVIA: "{{ 'yes' if enable_horizon_octavia | bool else 'no' }}"
-      ENABLE_QINLING: "{{ 'yes' if enable_horizon_qinling | bool else 'no' }}"
       ENABLE_SAHARA: "{{ 'yes' if enable_horizon_sahara | bool else 'no' }}"
       ENABLE_SEARCHLIGHT: "{{ 'yes' if enable_horizon_searchlight | bool else 'no' }}"
       ENABLE_SENLIN: "{{ 'yes' if enable_horizon_senlin | bool else 'no' }}"
diff --git a/ansible/roles/horizon/tasks/config.yml b/ansible/roles/horizon/tasks/config.yml
index 1f5e8ff45fecbf28ac908518918414595cda63d8..2c551cbfea4ad23b109c1a2df730b930915d315e 100644
--- a/ansible/roles/horizon/tasks/config.yml
+++ b/ansible/roles/horizon/tasks/config.yml
@@ -40,7 +40,6 @@
     - { name: "neutron", enabled: "{{ enable_neutron_horizon_policy_file }}" }
     - { name: "nova", enabled: "{{ enable_nova_horizon_policy_file }}" }
     - { name: "octavia", enabled: "{{ enable_horizon_octavia }}" }
-    - { name: "qinling", enabled: "{{ enable_horizon_qinling }}" }
     - { name: "sahara", enabled: "{{ enable_horizon_sahara }}" }
     - { name: "searchlight", enabled: "{{ enable_horizon_searchlight }}" }
     - { name: "senlin", enabled: "{{ enable_horizon_senlin }}" }
diff --git a/ansible/roles/qinling/defaults/main.yml b/ansible/roles/qinling/defaults/main.yml
deleted file mode 100644
index 0f113116095bb525146be8aa82bf61bd5b022a47..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/defaults/main.yml
+++ /dev/null
@@ -1,113 +0,0 @@
----
-project_name: "qinling"
-
-qinling_services:
-  qinling-api:
-    container_name: qinling_api
-    group: qinling-api
-    enabled: true
-    image: "{{ qinling_api_image_full }}"
-    volumes: "{{ qinling_api_default_volumes + qinling_api_extra_volumes }}"
-    dimensions: "{{ qinling_api_dimensions }}"
-    haproxy:
-      qinling_api:
-        enabled: "{{ enable_qinling }}"
-        mode: "http"
-        external: false
-        port: "{{ qinling_api_port }}"
-      qinling_api_external:
-        enabled: "{{ enable_qinling }}"
-        mode: "http"
-        external: true
-        port: "{{ qinling_api_port }}"
-  qinling-engine:
-    container_name: qinling_engine
-    group: qinling-engine
-    enabled: true
-    image: "{{ qinling_engine_image_full }}"
-    volumes: "{{ qinling_engine_default_volumes + qinling_engine_extra_volumes }}"
-    dimensions: "{{ qinling_engine_dimensions }}"
-
-
-####################
-# Database
-####################
-qinling_database_name: "qinling"
-qinling_database_user: "{% if use_preconfigured_databases | bool and use_common_mariadb_user | bool %}{{ database_user }}{% else %}qinling{% endif %}"
-qinling_database_address: "{{ database_address | put_address_in_context('url') }}:{{ database_port }}"
-
-
-####################
-# Docker
-####################
-qinling_install_type: "{{ kolla_install_type }}"
-qinling_tag: "{{ openstack_tag }}"
-
-qinling_api_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ qinling_install_type }}-qinling-api"
-qinling_api_tag: "{{ qinling_tag }}"
-qinling_api_image_full: "{{ qinling_api_image }}:{{ qinling_api_tag }}"
-
-qinling_engine_image: "{{ docker_registry ~ '/' if docker_registry else '' }}{{ docker_namespace }}/{{ kolla_base_distro }}-{{ qinling_install_type }}-qinling-engine"
-qinling_engine_tag: "{{ qinling_tag }}"
-qinling_engine_image_full: "{{ qinling_engine_image }}:{{ qinling_engine_tag }}"
-
-qinling_api_dimensions: "{{ default_container_dimensions }}"
-qinling_engine_dimensions: "{{ default_container_dimensions }}"
-
-qinling_api_default_volumes:
-  - "{{ node_config_directory }}/qinling-api/:{{ container_config_directory }}/:ro"
-  - "/etc/localtime:/etc/localtime:ro"
-  - "{{ '/etc/timezone:/etc/timezone:ro' if ansible_os_family == 'Debian' else '' }}"
-  - "{{ kolla_dev_repos_directory ~ '/qinling/qinling:/var/lib/kolla/venv/lib/python' ~ distro_python_version ~ '/site-packages/qinling' if qinling_dev_mode | bool else '' }}"
-  - "kolla_logs:/var/log/kolla/"
-qinling_engine_default_volumes:
-  - "{{ node_config_directory }}/qinling-engine/:{{ container_config_directory }}/:ro"
-  - "/etc/localtime:/etc/localtime:ro"
-  - "{{ '/etc/timezone:/etc/timezone:ro' if ansible_os_family == 'Debian' else '' }}"
-  - "qinling:/var/lib/qinling/"
-  - "{{ kolla_dev_repos_directory ~ '/qinling/qinling:/var/lib/kolla/venv/lib/python' ~ distro_python_version ~ '/site-packages/qinling' if qinling_dev_mode | bool else '' }}"
-  - "kolla_logs:/var/log/kolla/"
-
-qinling_extra_volumes: "{{ default_extra_volumes }}"
-qinling_api_extra_volumes: "{{ qinling_extra_volumes }}"
-qinling_engine_extra_volumes: "{{ qinling_extra_volumes }}"
-
-####################
-# OpenStack
-####################
-qinling_admin_endpoint: "{{ admin_protocol }}://{{ kolla_internal_fqdn | put_address_in_context('url') }}:{{ qinling_api_port }}"
-qinling_internal_endpoint: "{{ internal_protocol }}://{{ kolla_internal_fqdn | put_address_in_context('url') }}:{{ qinling_api_port }}"
-qinling_public_endpoint: "{{ public_protocol }}://{{ kolla_external_fqdn | put_address_in_context('url') }}:{{ qinling_api_port }}"
-
-qinling_logging_debug: "{{ openstack_logging_debug }}"
-
-qinling_keystone_user: "qinling"
-
-openstack_qinling_auth: "{{ openstack_auth }}"
-
-
-####################
-# Kolla
-####################
-qinling_git_repository: "{{ kolla_dev_repos_git }}/{{ project_name }}"
-qinling_dev_repos_pull: "{{ kolla_dev_repos_pull }}"
-qinling_dev_mode: "{{ kolla_dev_mode }}"
-qinling_source_version: "{{ kolla_source_version }}"
-
-####################
-# Keystone
-####################
-qinling_ks_services:
-  - name: "qinling"
-    type: "function-engine"
-    description: "Function Service"
-    endpoints:
-      - {'interface': 'admin', 'url': '{{ qinling_admin_endpoint }}'}
-      - {'interface': 'internal', 'url': '{{ qinling_internal_endpoint }}'}
-      - {'interface': 'public', 'url': '{{ qinling_public_endpoint }}'}
-
-qinling_ks_users:
-  - project: "service"
-    user: "{{ qinling_keystone_user }}"
-    password: "{{ qinling_keystone_password }}"
-    role: "admin"
diff --git a/ansible/roles/qinling/handlers/main.yml b/ansible/roles/qinling/handlers/main.yml
deleted file mode 100644
index 9b5e5263dd419e3af36462f0222325d72e0fd7c6..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/handlers/main.yml
+++ /dev/null
@@ -1,30 +0,0 @@
----
-- name: Restart qinling-api container
-  vars:
-    service_name: "qinling-api"
-    service: "{{ qinling_services[service_name] }}"
-  become: true
-  kolla_docker:
-    action: "recreate_or_restart_container"
-    common_options: "{{ docker_common_options }}"
-    name: "{{ service.container_name }}"
-    image: "{{ service.image }}"
-    volumes: "{{ service.volumes|reject('equalto', '')|list }}"
-    dimensions: "{{ service.dimensions }}"
-  when:
-    - kolla_action != "config"
-
-- name: Restart qinling-engine container
-  vars:
-    service_name: "qinling-engine"
-    service: "{{ qinling_services[service_name] }}"
-  become: true
-  kolla_docker:
-    action: "recreate_or_restart_container"
-    common_options: "{{ docker_common_options }}"
-    name: "{{ service.container_name }}"
-    image: "{{ service.image }}"
-    volumes: "{{ service.volumes|reject('equalto', '')|list }}"
-    dimensions: "{{ service.dimensions }}"
-  when:
-    - kolla_action != "config"
diff --git a/ansible/roles/qinling/tasks/bootstrap.yml b/ansible/roles/qinling/tasks/bootstrap.yml
deleted file mode 100644
index f5b0ed9ad7a324b6e3dad8088443510de3c6f719..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/bootstrap.yml
+++ /dev/null
@@ -1,36 +0,0 @@
----
-- name: Creating Qinling database
-  become: true
-  kolla_toolbox:
-    module_name: mysql_db
-    module_args:
-      login_host: "{{ database_address }}"
-      login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
-      login_password: "{{ database_password }}"
-      name: "{{ qinling_database_name }}"
-  run_once: True
-  delegate_to: "{{ groups['qinling-api'][0] }}"
-  when:
-    - not use_preconfigured_databases | bool
-
-- name: Creating Qinling database user and setting permissions
-  become: true
-  kolla_toolbox:
-    module_name: mysql_user
-    module_args:
-      login_host: "{{ database_address }}"
-      login_port: "{{ database_port }}"
-      login_user: "{{ database_user }}"
-      login_password: "{{ database_password }}"
-      name: "{{ qinling_database_user }}"
-      password: "{{ qinling_database_password }}"
-      host: "%"
-      priv: "{{ qinling_database_name }}.*:ALL"
-      append_privs: "yes"
-  run_once: True
-  delegate_to: "{{ groups['qinling-api'][0] }}"
-  when:
-    - not use_preconfigured_databases | bool
-
-- import_tasks: bootstrap_service.yml
diff --git a/ansible/roles/qinling/tasks/bootstrap_service.yml b/ansible/roles/qinling/tasks/bootstrap_service.yml
deleted file mode 100644
index 6c95ebd5a9874ffd2aec2111a9cb3b4f6abf7a40..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/bootstrap_service.yml
+++ /dev/null
@@ -1,20 +0,0 @@
----
-- name: Running Qinling bootstrap container
-  vars:
-    qinling_api: "{{ qinling_services['qinling-api'] }}"
-  become: true
-  kolla_docker:
-    action: "start_container"
-    common_options: "{{ docker_common_options }}"
-    detach: False
-    environment:
-      KOLLA_BOOTSTRAP:
-      KOLLA_CONFIG_STRATEGY: "{{ config_strategy }}"
-    image: "{{ qinling_api.image }}"
-    labels:
-      BOOTSTRAP:
-    name: "bootstrap_qinling"
-    restart_policy: no
-    volumes: "{{ qinling_api.volumes|reject('equalto', '')|list }}"
-  run_once: True
-  delegate_to: "{{ groups[qinling_api.group][0] }}"
diff --git a/ansible/roles/qinling/tasks/check-containers.yml b/ansible/roles/qinling/tasks/check-containers.yml
deleted file mode 100644
index 852e78a596a2f70e0c99a3fad77b2c118a176420..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/check-containers.yml
+++ /dev/null
@@ -1,16 +0,0 @@
----
-- name: Check qinling containers
-  become: true
-  kolla_docker:
-    action: "compare_container"
-    common_options: "{{ docker_common_options }}"
-    name: "{{ item.value.container_name }}"
-    image: "{{ item.value.image }}"
-    volumes: "{{ item.value.volumes|reject('equalto', '')|list }}"
-    dimensions: "{{ item.value.dimensions }}"
-  when:
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
-  notify:
-    - Restart {{ item.key }} container
diff --git a/ansible/roles/qinling/tasks/check.yml b/ansible/roles/qinling/tasks/check.yml
deleted file mode 100644
index ed97d539c095cf1413af30cc23dea272095b97dd..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/check.yml
+++ /dev/null
@@ -1 +0,0 @@
----
diff --git a/ansible/roles/qinling/tasks/clone.yml b/ansible/roles/qinling/tasks/clone.yml
deleted file mode 100644
index b003d4855fb0efa790dbd1ba664db3906d819cec..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/clone.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-- name: Cloning qinling source repository for development
-  become: true
-  git:
-    repo: "{{ qinling_git_repository }}"
-    dest: "{{ kolla_dev_repos_directory }}/{{ project_name }}"
-    update: "{{ qinling_dev_repos_pull }}"
-    version: "{{ qinling_source_version }}"
diff --git a/ansible/roles/qinling/tasks/config.yml b/ansible/roles/qinling/tasks/config.yml
deleted file mode 100644
index 625f9aa68a2ca4413c8a8e7626c4a3d671d4908c..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/config.yml
+++ /dev/null
@@ -1,102 +0,0 @@
----
-- name: Ensuring config directories exist
-  file:
-    path: "{{ node_config_directory }}/{{ item.key }}"
-    state: "directory"
-    owner: "{{ config_owner_user }}"
-    group: "{{ config_owner_group }}"
-    mode: "0770"
-  become: true
-  when:
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
-
-- include_tasks: external_kubernetes.yml
-  when:
-    - (enable_qinling | bool) and (qinling_kubernetes_certificates | bool)
-    - inventory_hostname in groups['qinling-engine']
-
-- name: Check if policies shall be overwritten
-  stat:
-    path: "{{ item }}"
-  delegate_to: localhost
-  run_once: True
-  register: qinling_policy
-  with_first_found:
-    - files: "{{ supported_policy_format_list }}"
-      paths:
-        - "{{ node_custom_config }}/qinling/"
-      skip: true
-
-- name: Set qinling policy file
-  set_fact:
-    qinling_policy_file: "{{ qinling_policy.results.0.stat.path | basename }}"
-    qinling_policy_file_path: "{{ qinling_policy.results.0.stat.path }}"
-  when:
-    - qinling_policy.results
-
-- include_tasks: copy-certs.yml
-  when:
-    - kolla_copy_ca_into_containers | bool
-
-- name: Copying over config.json files for services
-  template:
-    src: "{{ item.key }}.json.j2"
-    dest: "{{ node_config_directory }}/{{ item.key }}/config.json"
-    mode: "0660"
-  become: true
-  when:
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
-  notify:
-    - Restart {{ item.key }} container
-
-- name: Copying over qinling.conf
-  vars:
-    service_name: "{{ item.key }}"
-  merge_configs:
-    sources:
-      - "{{ role_path }}/templates/qinling.conf.j2"
-      - "{{ node_custom_config }}/global.conf"
-      - "{{ node_custom_config }}/qinling.conf"
-      - "{{ node_custom_config }}/qinling/{{ item.key }}.conf"
-      - "{{ node_custom_config }}/qinling/{{ inventory_hostname }}/qinling.conf"
-    dest: "{{ node_config_directory }}/{{ item.key }}/qinling.conf"
-    mode: "0660"
-  become: true
-  when:
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
-  notify:
-    - Restart {{ item.key }} container
-
-- name: Copying over wsgi-qinling files for services
-  vars:
-    service: "{{ qinling_services['qinling-api'] }}"
-  template:
-    src: "wsgi-qinling.conf.j2"
-    dest: "{{ node_config_directory }}/qinling-api/wsgi-qinling.conf"
-    mode: "0660"
-  become: true
-  when:
-    - inventory_hostname in groups[service.group]
-    - service.enabled | bool
-  notify:
-    - Restart qinling-api container
-
-- name: Copying over existing policy file
-  template:
-    src: "{{ qinling_policy_file_path }}"
-    dest: "{{ node_config_directory }}/{{ item.key }}/{{ qinling_policy_file }}"
-    mode: "0660"
-  become: true
-  when:
-    - qinling_policy_file is defined
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
-  notify:
-    - Restart {{ item.key }} container
diff --git a/ansible/roles/qinling/tasks/copy-certs.yml b/ansible/roles/qinling/tasks/copy-certs.yml
deleted file mode 100644
index ee25f1d2659afe3a98f5286ee4b72351d4e5e1d5..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/copy-certs.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-- name: "Copy certificates and keys for {{ project_name }}"
-  import_role:
-    role: service-cert-copy
-  vars:
-    project_services: "{{ qinling_services }}"
diff --git a/ansible/roles/qinling/tasks/deploy-containers.yml b/ansible/roles/qinling/tasks/deploy-containers.yml
deleted file mode 100644
index eb24ab5c7a7bfaf98f711ffe96f0b76120874b14..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/deploy-containers.yml
+++ /dev/null
@@ -1,2 +0,0 @@
----
-- import_tasks: check-containers.yml
diff --git a/ansible/roles/qinling/tasks/deploy.yml b/ansible/roles/qinling/tasks/deploy.yml
deleted file mode 100644
index de9d81428fb2b0a80bbd6720af8c0992c1575660..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/deploy.yml
+++ /dev/null
@@ -1,14 +0,0 @@
----
-- import_tasks: register.yml
-
-- import_tasks: config.yml
-
-- import_tasks: check-containers.yml
-
-- include_tasks: clone.yml
-  when: qinling_dev_mode | bool
-
-- import_tasks: bootstrap.yml
-
-- name: Flush handlers
-  meta: flush_handlers
diff --git a/ansible/roles/qinling/tasks/external_kubernetes.yml b/ansible/roles/qinling/tasks/external_kubernetes.yml
deleted file mode 100644
index 0dee19b692552796a4c16c9d4646aa673fde2be1..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/external_kubernetes.yml
+++ /dev/null
@@ -1,19 +0,0 @@
----
-- name: Copy over Kubernetes certificates files for qinling-engine
-  copy:
-    src: "{{ item }}"
-    dest: "{{ node_config_directory }}/qinling-engine/"
-    mode: "0660"
-    owner: "{{ config_owner_user }}"
-    group: "{{ config_owner_group }}"
-  become: true
-  register: qinling_engine_kubernetes_files
-  with_items:
-    - "{{ node_custom_config }}/qinling/qinling-engine/kubernetes_ca.crt"
-    - "{{ node_custom_config }}/qinling/qinling-engine/kubernetes.crt"
-    - "{{ node_custom_config }}/qinling/qinling-engine/kubernetes.key"
-  when:
-    - qinling_kubernetes_certificates | bool
-    - inventory_hostname in groups['qinling-engine']
-  notify:
-    - Restart qinling-engine container
diff --git a/ansible/roles/qinling/tasks/loadbalancer.yml b/ansible/roles/qinling/tasks/loadbalancer.yml
deleted file mode 100644
index 5d33b5d658fa24d8884345acf30da71b24c95d8c..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/loadbalancer.yml
+++ /dev/null
@@ -1,7 +0,0 @@
----
-- name: "Configure haproxy for {{ project_name }}"
-  import_role:
-    name: haproxy-config
-  vars:
-    project_services: "{{ qinling_services }}"
-  tags: always
diff --git a/ansible/roles/qinling/tasks/main.yml b/ansible/roles/qinling/tasks/main.yml
deleted file mode 100644
index bc5d1e62576375cb42a2a0d62540aa54d212db7c..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/main.yml
+++ /dev/null
@@ -1,2 +0,0 @@
----
-- include_tasks: "{{ kolla_action }}.yml"
diff --git a/ansible/roles/qinling/tasks/precheck.yml b/ansible/roles/qinling/tasks/precheck.yml
deleted file mode 100644
index b548f598000fd6a604063716a71f27296cfece13..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/precheck.yml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-- import_role:
-    name: service-precheck
-  vars:
-    service_precheck_services: "{{ qinling_services }}"
-    service_name: "{{ project_name }}"
-
-- name: Get container facts
-  become: true
-  kolla_container_facts:
-    name:
-      - qinling_api
-  register: container_facts
-
-- name: Checking free port for Qinling API
-  wait_for:
-    host: "{{ api_interface_address }}"
-    port: "{{ qinling_api_port }}"
-    connect_timeout: 1
-    timeout: 1
-    state: stopped
-  when:
-    - container_facts['qinling_api'] is not defined
-    - inventory_hostname in groups['qinling-api']
diff --git a/ansible/roles/qinling/tasks/pull.yml b/ansible/roles/qinling/tasks/pull.yml
deleted file mode 100644
index 8cd89824e5a543c6324d0bfb92db6f56a72867f6..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/pull.yml
+++ /dev/null
@@ -1,11 +0,0 @@
----
-- name: Pulling qinling images
-  become: true
-  kolla_docker:
-    action: "pull_image"
-    common_options: "{{ docker_common_options }}"
-    image: "{{ item.value.image }}"
-  when:
-    - inventory_hostname in groups[item.value.group]
-    - item.value.enabled | bool
-  with_dict: "{{ qinling_services }}"
diff --git a/ansible/roles/qinling/tasks/reconfigure.yml b/ansible/roles/qinling/tasks/reconfigure.yml
deleted file mode 100644
index 5b10a7e111766fff1f9dd187cdcb8fea97dcadd1..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/reconfigure.yml
+++ /dev/null
@@ -1,2 +0,0 @@
----
-- import_tasks: deploy.yml
diff --git a/ansible/roles/qinling/tasks/register.yml b/ansible/roles/qinling/tasks/register.yml
deleted file mode 100644
index 02d055b33fdc2e0d68032b47459a71ebae31c8a7..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/register.yml
+++ /dev/null
@@ -1,7 +0,0 @@
----
-- import_role:
-    name: service-ks-register
-  vars:
-    service_ks_register_auth: "{{ openstack_qinling_auth }}"
-    service_ks_register_services: "{{ qinling_ks_services }}"
-    service_ks_register_users: "{{ qinling_ks_users }}"
diff --git a/ansible/roles/qinling/tasks/stop.yml b/ansible/roles/qinling/tasks/stop.yml
deleted file mode 100644
index 2402dfe382e15b614a94627840282b88f2284361..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/stop.yml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-- import_role:
-    name: service-stop
-  vars:
-    project_services: "{{ qinling_services }}"
-    service_name: "{{ project_name }}"
diff --git a/ansible/roles/qinling/tasks/upgrade.yml b/ansible/roles/qinling/tasks/upgrade.yml
deleted file mode 100644
index 6ba9f997992dcffee8153fbefd1b385d9ccdc694..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/tasks/upgrade.yml
+++ /dev/null
@@ -1,9 +0,0 @@
----
-- import_tasks: config.yml
-
-- import_tasks: check-containers.yml
-
-- import_tasks: bootstrap_service.yml
-
-- name: Flush handlers
-  meta: flush_handlers
diff --git a/ansible/roles/qinling/templates/qinling-api.json.j2 b/ansible/roles/qinling/templates/qinling-api.json.j2
deleted file mode 100644
index ad9b4f39ceda7b3faf04cb146a97fc51071fae49..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/templates/qinling-api.json.j2
+++ /dev/null
@@ -1,32 +0,0 @@
-{% set qinling_cmd = 'apache2' if kolla_base_distro in ['ubuntu', 'debian'] else 'httpd' %}
-{% set qinling_dir = 'apache2/conf-enabled' if kolla_base_distro in ['ubuntu', 'debian'] else 'httpd/conf.d' %}
-{
-    "command": "{{ qinling_cmd }} -DFOREGROUND",
-    "config_files": [
-        {
-            "source": "{{ container_config_directory }}/qinling.conf",
-            "dest": "/etc/qinling/qinling.conf",
-            "owner": "qinling",
-            "perm": "0600"
-        },
-        {
-            "source": "{{ container_config_directory }}/wsgi-qinling.conf",
-            "dest": "/etc/{{ qinling_dir }}/wsgi-qinling.conf",
-            "owner": "qinling",
-            "perm": "0600"
-        }{% if qinling_policy_file is defined %},
-        {
-            "source": "{{ container_config_directory }}/{{ qinling_policy_file }}",
-            "dest": "/etc/qinling/{{ qinling_policy_file }}",
-            "owner": "qinling",
-            "perm": "0600"
-        }{% endif %}
-    ],
-    "permissions": [
-        {
-            "path": "/var/log/kolla/qinling",
-            "owner": "qinling:qinling",
-            "recurse": true
-        }
-    ]
-}
diff --git a/ansible/roles/qinling/templates/qinling-engine.json.j2 b/ansible/roles/qinling/templates/qinling-engine.json.j2
deleted file mode 100644
index b1f8bd4c416a3853c97bd3ba2e561980fcf29ddc..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/templates/qinling-engine.json.j2
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-    "command": "qinling-engine --config-file /etc/qinling/qinling.conf",
-    "config_files": [
-        {
-            "source": "{{ container_config_directory }}/qinling.conf",
-            "dest": "/etc/qinling/qinling.conf",
-            "owner": "qinling",
-            "perm": "0600"
-        }{% if qinling_policy_file is defined %},
-        {
-            "source": "{{ container_config_directory }}/{{ qinling_policy_file }}",
-            "dest": "/etc/qinling/{{ qinling_policy_file }}",
-            "owner": "qinling",
-            "perm": "0600"
-        }{% endif %}{% if qinling_kubernetes_certificates is defined and qinling_kubernetes_certificates | bool %},
-        {
-            "source": "{{ container_config_directory }}/kubernetes_ca.crt",
-            "dest": "/etc/qinling/pki/kubernetes/ca.crt",
-            "owner": "qinling",
-            "perm": "0600"
-        },
-        {
-            "source": "{{ container_config_directory }}/kubernetes.crt",
-            "dest": "/etc/qinling/pki/kubernetes/qinling.crt",
-            "owner": "qinling",
-            "perm": "0600"
-        },
-        {
-            "source": "{{ container_config_directory }}/kubernetes.key",
-            "dest": "/etc/qinling/pki/kubernetes/qinling.key",
-            "owner": "qinling",
-            "perm": "0600"
-        }{% endif %}
-    ],
-    "permissions": [
-        {
-            "path": "/var/lib/qinling",
-            "owner": "qinling:qinling",
-            "recurse": true
-        },
-        {
-            "path": "/var/log/kolla/qinling",
-            "owner": "qinling:qinling",
-            "recurse": true
-        }
-    ]
-}
diff --git a/ansible/roles/qinling/templates/qinling.conf.j2 b/ansible/roles/qinling/templates/qinling.conf.j2
deleted file mode 100644
index ee9f8702c96ff36d9608649f279dd1288b6430d7..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/templates/qinling.conf.j2
+++ /dev/null
@@ -1,70 +0,0 @@
-[DEFAULT]
-debug = {{ qinling_logging_debug }}
-log_dir = /var/log/kolla/qinling
-transport_url = {{ rpc_transport_url }}
-
-{% if service_name == 'qinling-api' %}
-[api]
-port = {{ qinling_api_port }}
-host = {{ api_interface_address }}
-{% endif %}
-
-{% if service_name == 'qinling-engine' %}
-[engine]
-host = {{ api_interface_address }}
-{% endif %}
-
-[database]
-connection = mysql+pymysql://{{ qinling_database_user }}:{{ qinling_database_password }}@{{ qinling_database_address }}/{{ qinling_database_name }}
-connection_recycle_time = {{ database_connection_recycle_time }}
-max_pool_size = {{ database_max_pool_size }}
-max_retries = -1
-
-[keystone_authtoken]
-www_authenticate_uri = {{ keystone_internal_url }}/v3
-auth_url = {{ keystone_admin_url }}
-auth_type = password
-project_domain_name = {{ default_project_domain_name }}
-user_domain_name = {{ default_user_domain_name }}
-project_name = service
-username = {{ qinling_keystone_user }}
-password = {{ qinling_keystone_password }}
-region_name = {{ openstack_region_name }}
-cafile = {{ openstack_cacert }}
-
-memcache_security_strategy = ENCRYPT
-memcache_secret_key = {{ memcache_secret_key }}
-memcached_servers = {% for host in groups['memcached'] %}{{ 'api' | kolla_address(host) | put_address_in_context('memcache') }}:{{ memcached_port }}{% if not loop.last %},{% endif %}{% endfor %}
-
-[storage]
-file_system_dir = /var/lib/qinling/package
-
-[etcd]
-{% if enable_etcd | bool %}
-host = {{ api_interface_address }}
-port = {{ etcd_client_port }}
-protocol = {{ etcd_protocol }}
-{% endif %}
-
-[oslo_messaging_notifications]
-transport_url = {{ notify_transport_url }}
-{% if enable_ceilometer | bool %}
-driver = messagingv2
-topics = notifications
-{% else %}
-driver = noop
-{% endif %}
-
-{% if om_enable_rabbitmq_tls | bool %}
-[oslo_messaging_rabbit]
-ssl = true
-ssl_ca_file = {{ om_rabbitmq_cacert }}
-{% endif %}
-
-{% if qinling_policy_file is defined %}
-[oslo_policy]
-policy_file = {{ qinling_policy_file }}
-{% endif %}
-
-[oslo_middleware]
-enable_proxy_headers_parsing = True
diff --git a/ansible/roles/qinling/templates/wsgi-qinling.conf.j2 b/ansible/roles/qinling/templates/wsgi-qinling.conf.j2
deleted file mode 100644
index 26aabe9a8bfaf0f191cfeed0ebeb89bb1d324230..0000000000000000000000000000000000000000
--- a/ansible/roles/qinling/templates/wsgi-qinling.conf.j2
+++ /dev/null
@@ -1,39 +0,0 @@
-{% set qinling_log_dir = '/var/log/kolla/qinling' %}
-
-Listen {{ api_interface_address | put_address_in_context('url') }}:{{ qinling_api_port }}
-
-ServerSignature Off
-ServerTokens Prod
-TraceEnable off
-KeepAliveTimeout {{ kolla_httpd_keep_alive }}
-
-ErrorLog "{{ qinling_log_dir }}/apache-error.log"
-<IfModule log_config_module>
-    CustomLog "{{ qinling_log_dir }}/apache-access.log" common
-</IfModule>
-
-{% if qinling_logging_debug | bool %}
-LogLevel info
-{% endif %}
-
-<VirtualHost *:{{ qinling_api_port }}>
-
-  ## Vhost docroot
-  DocumentRoot "/var/www/cgi-bin/qinling"
-
-  ## Directories, there should at least be a declaration for /var/www/cgi-bin/qinling
-
-  <Directory "/var/www/cgi-bin/qinling">
-    Options Indexes FollowSymLinks MultiViews
-    Require all granted
-  </Directory>
-
-  ## Logging
-  ErrorLog "{{ qinling_log_dir }}/qinling_api_wsgi_error.log"
-  LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %D \"%{Referer}i\" \"%{User-Agent}i\"" logformat
-  CustomLog "{{ qinling_log_dir }}/qinling_api_wsgi_access.log" logformat
-  WSGIApplicationGroup %{GLOBAL}
-  WSGIDaemonProcess qinling group=qinling processes={{ openstack_service_workers }} threads=1 user=qinling
-  WSGIProcessGroup qinling
-  WSGIScriptAlias / "/var/www/cgi-bin/qinling/wsgi.py"
-</VirtualHost>
diff --git a/ansible/site.yml b/ansible/site.yml
index 6b5745a9cc91589cd4d9e5ef88c254ac5657f689..c7cde2313c9eb86bdd652fed823fd876e8318b28 100644
--- a/ansible/site.yml
+++ b/ansible/site.yml
@@ -62,7 +62,6 @@
         - enable_placement_{{ enable_placement | bool }}
         - enable_prometheus_{{ enable_prometheus | bool }}
         - enable_qdrouterd_{{ enable_qdrouterd | bool }}
-        - enable_qinling_{{ enable_qinling | bool }}
         - enable_rabbitmq_{{ enable_rabbitmq | bool }}
         - enable_rally_{{ enable_rally | bool }}
         - enable_redis_{{ enable_redis | bool }}
@@ -302,11 +301,6 @@
             tasks_from: loadbalancer
           tags: prometheus
           when: enable_prometheus | bool
-        - include_role:
-            name: qinling
-            tasks_from: loadbalancer
-          tags: qinling
-          when: enable_qinling | bool
         - include_role:
             name: rabbitmq
             tasks_from: loadbalancer
@@ -838,18 +832,6 @@
         tags: mistral,
         when: enable_mistral | bool }
 
-- name: Apply role qinling
-  gather_facts: false
-  hosts:
-    - qinling-api
-    - qinling-engine
-    - '&enable_qinling_True'
-  serial: '{{ kolla_serial|default("0") }}'
-  roles:
-    - { role: qinling,
-        tags: qinling,
-        when: enable_qinling | bool }
-
 - name: Apply role sahara
   gather_facts: false
   hosts:
diff --git a/doc/source/reference/compute/index.rst b/doc/source/reference/compute/index.rst
index 8ed8411b67ffec4e805abca015b09f7e4b7ac1e3..822f09b27e2926c9fcba2ab2ed8f923de8f42ee5 100644
--- a/doc/source/reference/compute/index.rst
+++ b/doc/source/reference/compute/index.rst
@@ -13,6 +13,5 @@ compute services.
    nova-cells-guide
    nova-fake-driver
    nova-guide
-   qinling-guide
    vmware-guide
    zun-guide
diff --git a/doc/source/reference/compute/qinling-guide.rst b/doc/source/reference/compute/qinling-guide.rst
deleted file mode 100644
index 2f5b81e876e132f35de52820573a25600501f516..0000000000000000000000000000000000000000
--- a/doc/source/reference/compute/qinling-guide.rst
+++ /dev/null
@@ -1,102 +0,0 @@
-.. _qinling-guide:
-
-=========================
-Qinling - Function Engine
-=========================
-
-Overview
-~~~~~~~~
-
-Qinling aims to provide a platform to support serverless functions
-(like AWS Lambda). Qinling supports different container orchestration
-platforms (Kubernetes/Swarm, etc...) and different function package storage
-backends (local/Swift/S3) by nature using plugin mechanism.
-
-Kolla deploys Qinling API and Qinling Engine containers which are the main
-Qinling components but it needs to be connected to an existing container
-orchestration platforms.
-
-Apply custom policies to Qinling API
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Custom policies could be apply by creating ``policy.json`` file under
-``/etc/kolla/config/qinling`` directory.
-
-Enable etcd role
-~~~~~~~~~~~~~~~~
-
-Qinling requires etcd for function mapping and concurrency. The etcd role
-should be enabled to configure the etcd address and port within `qinling.conf`.
-
-Look for ``enable_etcd: "no"`` and change it in ``/etc/kolla/globals.yml``:
-
-.. code-block:: yaml
-
-   enable_etcd: "yes"
-
-Connect to an existing Kubernetes cluster
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Certificates
-------------
-
-``qinling-engine`` authenticates to Kubernetes by using certificates.
-
-.. note::
-   If the cluster has not been created with OpenStack Magnum then
-   certificates need to be gathered using different methods that will not
-   be mentioned here.
-
-If the Kubernetes cluster has been deployed with OpenStack Magnum then the
-OpenStack client should be used to retrieve the certificates.
-
-.. code-block:: console
-
-   openstack coe cluster config --dir . 687f7476-5604-4b44-8b09-b7a4f3fdbd64 --output-certs
-
-Where ``687f7476-5604-4b44-8b09-b7a4f3fdbd64`` is the Kubernetes cluster ID
-created with Magnum.
-
-Four files should have been generated:
-
-* ``ca.pem``
-* ``cert.pem``
-* ``key.pem``
-* ``config``
-
-Only ``ca.pem``, ``cert.pem`` and ``key.pem`` will be used, these files have
-to be stored in ``/etc/kolla/config/qinling/qinling-engine`` directory under
-these file name:
-
-* ``ca.pem``: ``/etc/kolla/config/qinling/qinling-engine/kubernetes_ca.crt``
-* ``cert.pem``: ``/etc/kolla/config/qinling/qinling-engine/kubernetes.crt``
-* ``key.pem``: ``/etc/kolla/config/qinling/qinling-engine/kubernetes.key``
-
-
-Declare ``qinling_kubernetes_certificates`` variable in
-``/etc/kolla/globals.yml``:
-
-.. code-block:: yaml
-
-   qinling_kubernetes_certificates: "yes"
-
-Kubernetes cluster
-------------------
-
-``qinling-engine`` needs to know where to connect, the information is
-provided by options under ``[kubernetes]`` section inside ``qinling.conf``
-configuration file.
-
-As mentioned above, these settings are only required by ``qinling-engine``,
-put the content in ``/etc/kolla/config/qinling/qinling-engine.conf``.
-
-.. code-block:: ini
-
-   [kubernetes]
-   kube_host = https://192.168.1.168:6443
-   ssl_ca_cert = /etc/qinling/pki/kubernetes/ca.crt
-   cert_file = /etc/qinling/pki/kubernetes/qinling.crt
-   key_file = /etc/qinling/pki/kubernetes/qinling.key
-
-``kube_host`` is the Kubernetes cluster API address, ``https`` protocol
-has to be defined.
diff --git a/etc/kolla/globals.yml b/etc/kolla/globals.yml
index 932a1c03bf9a879333aa7a66c5a15ee9c04af697..99a514b53ccc605c7b4b9e588f9648ece302d165 100644
--- a/etc/kolla/globals.yml
+++ b/etc/kolla/globals.yml
@@ -312,7 +312,6 @@
 #enable_horizon_murano: "{{ enable_murano | bool }}"
 #enable_horizon_neutron_vpnaas: "{{ enable_neutron_vpnaas | bool }}"
 #enable_horizon_octavia: "{{ enable_octavia | bool }}"
-#enable_horizon_qinling: "{{ enable_qinling | bool }}"
 #enable_horizon_sahara: "{{ enable_sahara | bool }}"
 #enable_horizon_searchlight: "{{ enable_searchlight | bool }}"
 #enable_horizon_senlin: "{{ enable_senlin | bool }}"
@@ -369,7 +368,6 @@
 #enable_placement: "{{ enable_nova | bool or enable_zun | bool }}"
 #enable_prometheus: "no"
 #enable_qdrouterd: "{{ 'yes' if om_rpc_transport == 'amqp' else 'no' }}"
-#enable_qinling: "no"
 #enable_rally: "no"
 #enable_redis: "no"
 #enable_sahara: "no"
diff --git a/etc/kolla/passwords.yml b/etc/kolla/passwords.yml
index 80fafec360258ef15d0df02eb75a1471d67fd8b0..77626405eb69f62f7c3cbf66e560781af3af4a10 100644
--- a/etc/kolla/passwords.yml
+++ b/etc/kolla/passwords.yml
@@ -188,9 +188,6 @@ masakari_keystone_password:
 
 memcache_secret_key:
 
-qinling_database_password:
-qinling_keystone_password:
-
 # HMAC secret key
 osprofiler_secret:
 
diff --git a/releasenotes/notes/remove-qinling-roles-12c1ce84d279949f.yaml b/releasenotes/notes/remove-qinling-roles-12c1ce84d279949f.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..63f0137b921fd6d7d886f10846e00852d3732dcc
--- /dev/null
+++ b/releasenotes/notes/remove-qinling-roles-12c1ce84d279949f.yaml
@@ -0,0 +1,8 @@
+---
+upgrade:
+  - |
+    The ``Qinling`` project is no longer maintained and
+    `retired since Wallaby cycle`__ . Its support and roles
+    are also removed since Wallaby cycle.
+
+    __ http://lists.openstack.org/pipermail/openstack-discuss/2020-November/018638.html
diff --git a/tests/templates/inventory.j2 b/tests/templates/inventory.j2
index 86b3213b5411e36cb0d13915e950b1d5ef918678..1417517b785b34a347b6e9e06beb95d8c98d3595 100644
--- a/tests/templates/inventory.j2
+++ b/tests/templates/inventory.j2
@@ -191,9 +191,6 @@ control
 [magnum:children]
 control
 
-[qinling:children]
-control
-
 [sahara:children]
 control
 
@@ -518,13 +515,6 @@ magnum
 [magnum-conductor:children]
 magnum
 
-# Qinling
-[qinling-api:children]
-qinling
-
-[qinling-engine:children]
-qinling
-
 # Sahara
 [sahara-api:children]
 sahara