diff --git a/README.rst b/README.rst
index 2bb935a567..52daa1a76f 100644
--- a/README.rst
+++ b/README.rst
@@ -101,6 +101,7 @@ Kolla provides images to deploy the following OpenStack projects:
- `Nova `__
- `Octavia `__
- `Panko `__
+- `Qinling `__
- `Rally `__
- `Sahara `__
- `Searchlight `__
diff --git a/docker/horizon/extend_start.sh b/docker/horizon/extend_start.sh
index 7006fafd55..f97171ee05 100644
--- a/docker/horizon/extend_start.sh
+++ b/docker/horizon/extend_start.sh
@@ -192,6 +192,14 @@ function config_octavia_dashboard {
"${SITE_PACKAGES}/openstack_dashboard/local/enabled/_1482_project_load_balancer_panel.py"
}
+function config_qinling_dashboard {
+ for file in ${SITE_PACKAGES}/qinling_dashboard/enabled/_*[^__].py; do
+ config_dashboard "${ENABLE_QINLING}" \
+ "${SITE_PACKAGES}/qinling_dashboard/enabled/${file##*/}" \
+ "${SITE_PACKAGES}/openstack_dashboard/local/enabled/${file##*/}"
+ done
+}
+
function config_sahara_dashboard {
for file in ${SITE_PACKAGES}/sahara_dashboard/enabled/_*[^__].py; do
config_dashboard "${ENABLE_SAHARA}" \
@@ -324,6 +332,7 @@ config_murano_dashboard
config_neutron_lbaas
config_neutron_vpnaas_dashboard
config_octavia_dashboard
+config_qinling_dashboard
config_sahara_dashboard
config_searchlight_ui
config_senlin_dashboard
diff --git a/docker/qinling/qinling-api/Dockerfile.j2 b/docker/qinling/qinling-api/Dockerfile.j2
new file mode 100644
index 0000000000..046805f4da
--- /dev/null
+++ b/docker/qinling/qinling-api/Dockerfile.j2
@@ -0,0 +1,19 @@
+FROM {{ namespace }}/{{ image_prefix }}qinling-base:{{ tag }}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+
+{% block qinling_api_header %}{% endblock %}
+
+{% if install_type == 'binary' %}
+
+RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
+ && /bin/false
+
+{% endif %}
+
+COPY extend_start.sh /usr/local/bin/kolla_qinling_extend_start
+RUN chmod 755 /usr/local/bin/kolla_qinling_extend_start
+
+{% block qinling_api_footer %}{% endblock %}
+{% block footer %}{% endblock %}
+
+USER qinling
diff --git a/docker/qinling/qinling-api/extend_start.sh b/docker/qinling/qinling-api/extend_start.sh
new file mode 100644
index 0000000000..d5f22dc5f7
--- /dev/null
+++ b/docker/qinling/qinling-api/extend_start.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# Bootstrap and exit if KOLLA_BOOTSTRAP variable is set. This catches all cases
+# of the KOLLA_BOOTSTRAP variable being set, including empty.
+if [[ "${!KOLLA_BOOTSTRAP[@]}" ]]; then
+ qinling-db-manage upgrade head
+ exit 0
+fi
diff --git a/docker/qinling/qinling-base/Dockerfile.j2 b/docker/qinling/qinling-base/Dockerfile.j2
new file mode 100644
index 0000000000..307fffa25c
--- /dev/null
+++ b/docker/qinling/qinling-base/Dockerfile.j2
@@ -0,0 +1,36 @@
+FROM {{ namespace }}/{{ image_prefix }}openstack-base:{{ tag }}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+
+{% block qinling_base_header %}{% endblock %}
+
+{% import "macros.j2" as macros with context %}
+
+{{ macros.configure_user(name='qinling') }}
+
+{% if install_type == 'binary' %}
+
+RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
+ && /bin/false
+
+{% elif install_type == 'source' %}
+
+ADD qinling-base-archive /qinling-base-source
+
+{% set qinling_base_pip_packages = [
+ '/qinling'
+] %}
+
+RUN ln -s qinling-base-source/* qinling \
+ && {{ macros.install_pip(qinling_base_pip_packages | customizable("pip_packages")) }} \
+ && mkdir -p /etc/qinling \
+ && cp -r /qinling/etc/* /etc/qinling/ \
+ && chown -R qinling: /etc/qinling
+
+{% endif %}
+
+COPY extend_start.sh /usr/local/bin/kolla_extend_start
+
+RUN touch /usr/local/bin/kolla_qinling_extend_start \
+ && chmod 755 /usr/local/bin/kolla_extend_start /usr/local/bin/kolla_qinling_extend_start
+
+{% block qinling_base_footer %}{% endblock %}
diff --git a/docker/qinling/qinling-base/extend_start.sh b/docker/qinling/qinling-base/extend_start.sh
new file mode 100644
index 0000000000..3802bd8785
--- /dev/null
+++ b/docker/qinling/qinling-base/extend_start.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+if [[ ! -d "/var/log/kolla/qinling" ]]; then
+ mkdir -p /var/log/kolla/qinling
+fi
+if [[ $(stat -c %a /var/log/kolla/qinling) != "755" ]]; then
+ chmod 755 /var/log/kolla/qinling
+fi
+
+. /usr/local/bin/kolla_qinling_extend_start
diff --git a/docker/qinling/qinling-engine/Dockerfile.j2 b/docker/qinling/qinling-engine/Dockerfile.j2
new file mode 100644
index 0000000000..877822e293
--- /dev/null
+++ b/docker/qinling/qinling-engine/Dockerfile.j2
@@ -0,0 +1,16 @@
+FROM {{ namespace }}/{{ image_prefix }}qinling-base:{{ tag }}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+
+{% block qinling_engine_header %}{% endblock %}
+
+{% if install_type == 'binary' %}
+
+RUN echo '{{ install_type }} not yet available for {{ base_distro }}' \
+ && /bin/false
+
+{% endif %}
+
+{% block qinling_engine_footer %}{% endblock %}
+{% block footer %}{% endblock %}
+
+USER qinling
diff --git a/kolla/common/config.py b/kolla/common/config.py
index f5b0616ff0..c0b6efcde0 100755
--- a/kolla/common/config.py
+++ b/kolla/common/config.py
@@ -115,6 +115,7 @@ _PROFILE_OPTS = [
'novajoin',
'octavia',
'panko',
+ 'qinling',
'rally',
'redis',
'sahara',
@@ -450,6 +451,10 @@ SOURCES = {
'type': 'url',
'location': ('$tarballs_base/octavia-dashboard/'
'octavia-dashboard-master.tar.gz')},
+ 'horizon-plugin-qinling-dashboard': {
+ 'type': 'url',
+ 'location': ('$tarballs_base/qinling-dashboard/'
+ 'qinling-dashboard-master.tar.gz')},
'horizon-plugin-sahara-dashboard': {
'type': 'url',
'location': ('$tarballs_base/sahara-dashboard/'
@@ -679,6 +684,10 @@ SOURCES = {
'type': 'url',
'location': ('$tarballs_base/placement/'
'placement-master.tar.gz')},
+ 'qinling-base': {
+ 'type': 'url',
+ 'location': ('$tarballs_base/qinling/'
+ 'qinling-master.tar.gz')},
'tempest-plugin-tempest-conf': {
'type': 'url',
'location': ('$tarballs_base/python-tempestconf/'
@@ -1188,6 +1197,10 @@ USERS = {
'cyborg-user': {
'uid': 42483,
'gid': 42483,
+ },
+ 'qinling-user': {
+ 'uid': 42484,
+ 'gid': 42484,
}
}
diff --git a/kolla/image/build.py b/kolla/image/build.py
index 8e7b546e37..eea835d3a2 100755
--- a/kolla/image/build.py
+++ b/kolla/image/build.py
@@ -91,6 +91,7 @@ SKIPPED_IMAGES = {
"monasca-thresh",
"nova-mksproxy",
"ovsdpdk",
+ "qinling-base",
"searchlight-base",
"solum-base",
"vmtp",
@@ -126,6 +127,7 @@ SKIPPED_IMAGES = {
"octavia-base",
# There is no qdrouterd package for ubuntu bionic
"qdrouterd",
+ "qinling-base",
"searchlight-base",
"solum-base",
"tacker-base",
@@ -167,6 +169,7 @@ SKIPPED_IMAGES = {
"nova-mksproxy",
"novajoin-base",
"octavia-base",
+ "qinling-base",
"searchlight-base",
"sensu-base",
"solum-base",
@@ -199,6 +202,7 @@ SKIPPED_IMAGES = {
"monasca-thresh",
"nova-mksproxy",
"ovsdpdk",
+ "qinling-base",
"searchlight-base",
"solum-base",
"vmtp",
diff --git a/releasenotes/notes/add-qinling-618886c3375eea4a.yaml b/releasenotes/notes/add-qinling-618886c3375eea4a.yaml
new file mode 100644
index 0000000000..926bb4ccff
--- /dev/null
+++ b/releasenotes/notes/add-qinling-618886c3375eea4a.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - Adds Qinling images. Qinling is an OpenStack project
+ to provide "Function as a Service". This project aims to
+ provide a platform to support serverless functions.