diff --git a/README.rst b/README.rst
index 46c46159d1..9f7d4c9af3 100644
--- a/README.rst
+++ b/README.rst
@@ -95,6 +95,7 @@ Kolla provides images to deploy the following OpenStack projects:
- `Octavia `__
- `Sahara `__
- `Senlin `__
+- Skyline (`APIServer `__ and `Console `__)
- `Solum `__
- `Swift `__
- `Tacker `__
diff --git a/doc/source/matrix_aarch64.csv b/doc/source/matrix_aarch64.csv
index fbd5fd1364..406fc2854d 100644
--- a/doc/source/matrix_aarch64.csv
+++ b/doc/source/matrix_aarch64.csv
@@ -51,6 +51,7 @@ rabbitmq,C,C,C
redis,C,C,C
sahara,C,C,C
senlin,C,C,C
+skyline,C,C,C
solum,C,C,C
swift,C,C,C
tacker,C,C,C
diff --git a/doc/source/matrix_x86.csv b/doc/source/matrix_x86.csv
index 6b9df633c7..8be1e55676 100644
--- a/doc/source/matrix_x86.csv
+++ b/doc/source/matrix_x86.csv
@@ -52,6 +52,7 @@ rabbitmq,T,T,T
redis,T,C,C
sahara,C,C,C
senlin,C,C,C
+skyline,C,C,C
solum,C,C,C
swift,T,T,C
tacker,T,C,C
diff --git a/docker/skyline/skyline-apiserver/Dockerfile.j2 b/docker/skyline/skyline-apiserver/Dockerfile.j2
new file mode 100644
index 0000000000..eb59d59de4
--- /dev/null
+++ b/docker/skyline/skyline-apiserver/Dockerfile.j2
@@ -0,0 +1,25 @@
+FROM {{ namespace }}/{{ image_prefix }}skyline-base:{{ tag }}
+{% block labels %}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+{% endblock %}
+
+{% block skyline_apiserver_header %}{% endblock %}
+
+{% import "macros.j2" as macros with context %}
+
+ADD skyline-apiserver-archive /skyline-apiserver-source
+
+{% set skyline_apiserver_pip_packages = [
+ '/skyline-apiserver'
+] %}
+
+COPY extend_start.sh /usr/local/bin/kolla_skyline_extend_start
+
+RUN ln -s skyline-apiserver-source/* skyline-apiserver \
+ && {{ macros.install_pip(skyline_apiserver_pip_packages | customizable("pip_packages")) }} \
+ && chmod 644 /usr/local/bin/kolla_skyline_extend_start
+
+{% block skyline_apiserver_footer %}{% endblock %}
+{% block footer %}{% endblock %}
+
+USER skyline
diff --git a/docker/skyline/skyline-apiserver/extend_start.sh b/docker/skyline/skyline-apiserver/extend_start.sh
new file mode 100644
index 0000000000..e762106c02
--- /dev/null
+++ b/docker/skyline/skyline-apiserver/extend_start.sh
@@ -0,0 +1,11 @@
+#!/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
+ SITE_PACKAGES="/var/lib/kolla/venv/lib/python${KOLLA_DISTRO_PYTHON_VERSION}/site-packages"
+ pushd ${SITE_PACKAGES}/skyline_apiserver/db/alembic
+ alembic upgrade head
+ popd
+ exit 0
+fi
diff --git a/docker/skyline/skyline-base/Dockerfile.j2 b/docker/skyline/skyline-base/Dockerfile.j2
new file mode 100644
index 0000000000..23ae132235
--- /dev/null
+++ b/docker/skyline/skyline-base/Dockerfile.j2
@@ -0,0 +1,17 @@
+FROM {{ namespace }}/{{ image_prefix }}openstack-base:{{ tag }}
+{% block labels %}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+{% endblock %}
+
+{% block skyline_base_header %}{% endblock %}
+
+{% import "macros.j2" as macros with context %}
+
+{{ macros.configure_user(name='skyline') }}
+
+COPY extend_start.sh /usr/local/bin/kolla_extend_start
+
+RUN touch /usr/local/bin/kolla_skyline_extend_start \
+ && chmod 644 /usr/local/bin/kolla_extend_start /usr/local/bin/kolla_skyline_extend_start
+
+{% block skyline_base_footer %}{% endblock %}
diff --git a/docker/skyline/skyline-base/extend_start.sh b/docker/skyline/skyline-base/extend_start.sh
new file mode 100644
index 0000000000..34362ad044
--- /dev/null
+++ b/docker/skyline/skyline-base/extend_start.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+if [[ ! -d "/var/log/kolla/skyline" ]]; then
+ mkdir -p /var/log/kolla/skyline
+fi
+if [[ $(stat -c %U:%G /var/log/kolla/skyline) != "skyline:kolla" ]]; then
+ chown skyline:kolla /var/log/kolla/skyline
+fi
+if [[ $(stat -c %a /var/log/kolla/skyline) != "755" ]]; then
+ chmod 755 /var/log/kolla/skyline
+fi
+
+if [[ ! -d "/var/lib/skyline" ]]; then
+ mkdir -p /var/lib/skyline
+fi
+if [[ $(stat -c %U:%G /var/lib/skyline) != "skyline:kolla" ]]; then
+ chown skyline:kolla /var/lib/skyline
+fi
+if [[ $(stat -c %a /var/lib/skyline) != "755" ]]; then
+ chmod 755 /var/lib/skyline
+fi
+
+. /usr/local/bin/kolla_skyline_extend_start
diff --git a/docker/skyline/skyline-console/Dockerfile.j2 b/docker/skyline/skyline-console/Dockerfile.j2
new file mode 100644
index 0000000000..0af0f4b245
--- /dev/null
+++ b/docker/skyline/skyline-console/Dockerfile.j2
@@ -0,0 +1,28 @@
+FROM {{ namespace }}/{{ image_prefix }}skyline-base:{{ tag }}
+{% block labels %}
+LABEL maintainer="{{ maintainer }}" name="{{ image_name }}" build-date="{{ build_date }}"
+{% endblock %}
+
+{% block skyline_console_header %}{% endblock %}
+
+{% import "macros.j2" as macros with context %}
+
+{% set skyline_console_packages = [
+ 'nginx'
+] %}
+
+{{ macros.install_packages(skyline_console_packages | customizable("packages")) }}
+
+ADD skyline-console-archive /skyline-console-source
+
+{% set skyline_console_pip_packages = [
+ '/skyline-console'
+] %}
+
+RUN ln -s skyline-console-source/* skyline-console \
+ && {{ macros.install_pip(skyline_console_pip_packages | customizable("pip_packages")) }}
+
+{% block skyline_console_footer %}{% endblock %}
+{% block footer %}{% endblock %}
+
+USER root
diff --git a/kolla/common/sources.py b/kolla/common/sources.py
index c8a3648e0a..e4397a200b 100644
--- a/kolla/common/sources.py
+++ b/kolla/common/sources.py
@@ -296,6 +296,14 @@ SOURCES = {
'type': 'url',
'location': ('$tarballs_base/openstack/senlin/'
'senlin-${openstack_branch}.tar.gz')},
+ 'skyline-apiserver': {
+ 'type': 'url',
+ 'location': ('$tarballs_base/openstack/skyline-apiserver/'
+ 'skyline-apiserver-${openstack_branch}.tar.gz')},
+ 'skyline-console': {
+ 'type': 'url',
+ 'location': ('$tarballs_base/openstack/skyline-console/'
+ 'skyline-console-${openstack_branch}.tar.gz')},
'solum-base': {
'type': 'url',
'location': ('$tarballs_base/openstack/solum/'
diff --git a/kolla/common/users.py b/kolla/common/users.py
index fea97743de..3f7686ef81 100644
--- a/kolla/common/users.py
+++ b/kolla/common/users.py
@@ -333,5 +333,9 @@ USERS = {
'opensearch-user': {
'uid': 42490,
'gid': 42490,
+ },
+ 'skyline-user': {
+ 'uid': 42491,
+ 'gid': 42491,
}
}
diff --git a/releasenotes/notes/add-skyline-200d1bca7907b00c.yaml b/releasenotes/notes/add-skyline-200d1bca7907b00c.yaml
new file mode 100644
index 0000000000..91147eb8fe
--- /dev/null
+++ b/releasenotes/notes/add-skyline-200d1bca7907b00c.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - Add skyline(base, apiserver and console) Dockerfile.
+ Skyline is an OpenStack dashboard optimized by UI and UX.
diff --git a/roles/kolla-build-config/defaults/main.yml b/roles/kolla-build-config/defaults/main.yml
index 5f8cdb0611..bbfc0bae81 100644
--- a/roles/kolla-build-config/defaults/main.yml
+++ b/roles/kolla-build-config/defaults/main.yml
@@ -59,6 +59,7 @@ kolla_build_sources:
openstack/octavia: octavia-base
openstack/sahara: sahara-base
openstack/senlin: senlin-base
+ openstack/skyline: skyline-base
openstack/solum: solum-base
swift-base: openstack/swift
openstack/tacker: