Skip to content
Snippets Groups Projects
Commit 4616c870 authored by Zuul's avatar Zuul Committed by Gerrit Code Review
Browse files

Merge "Add support for Rocky Linux 8"

parents 994af643 8e55ea08
No related branches found
No related tags found
No related merge requests found
Showing
with 173 additions and 69 deletions
......@@ -7,12 +7,18 @@ dnf_config: {}
# Whether or not to use a local Yum mirror. Default value is 'false'.
dnf_use_local_mirror: false
# Mirror FQDN for Yum repos. Default value is 'mirror.centos.org'.
# Mirror FQDN for Yum CentOS repos. Default value is 'mirror.centos.org'.
dnf_centos_mirror_host: 'mirror.centos.org'
# Mirror directory for Yum CentOS repos. Default value is 'centos'.
dnf_centos_mirror_directory: 'centos'
# Mirror FQDN for Yum Rocky repos. Default value is 'dl.rockylinux.org'.
dnf_rocky_mirror_host: 'dl.rockylinux.org'
# Mirror directory for Yum Rocky repos. Default value is 'pub/rocky'.
dnf_rocky_mirror_directory: 'pub/rocky'
# Mirror FQDN for Yum EPEL repos. Default value is
# 'download.fedoraproject.org'.
dnf_epel_mirror_host: 'download.fedoraproject.org'
......
......@@ -44,13 +44,17 @@ kayobe_ansible_user: "stack"
###############################################################################
# OS distribution.
# OS distribution name. Valid options are "centos", "ubuntu". Default is
# "centos".
# OS distribution name. Valid options are "centos", "rocky", "ubuntu". Default
# is "centos".
os_distribution: "centos"
# OS release. Valid options are "8-stream" when os_distribution is "centos", or
# "focal" when os_distribution is "ubuntu".
os_release: "{{ '8-stream' if os_distribution == 'centos' else 'focal' }}"
# "8" when os_distribution is "rocky", or "focal" when os_distribution is
# "ubuntu".
os_release: >-
{{ '8-stream' if os_distribution == 'centos'
else '8' if os_distribution == 'rocky'
else 'focal' }}
###############################################################################
# Ansible configuration.
......
......@@ -43,11 +43,16 @@ infra_vm_root_format: qcow2
# Base image for the infra VM root volume. Default is
# "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
# when os_distribution is "ubuntu", or
# http://dl.rockylinux.org/pub/rocky/8.5/images/Rocky-8-GenericCloud-8.5-20211114.2.x86_64.qcow2
# when os_distribution is "rocky",
# or
# "https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"
# otherwise.
infra_vm_root_image: >-
{%- if os_distribution == 'ubuntu' %}
https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
{%- elif os_distribution == 'rocky' %}
http://dl.rockylinux.org/pub/rocky/8.5/images/Rocky-8-GenericCloud-8.5-20211114.2.x86_64.qcow2
{%- else -%}
https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2
{%- endif %}
......
......@@ -53,8 +53,9 @@ kolla_node_custom_config_path: "{{ kolla_config_path }}/config"
# Kolla configuration.
# Kolla base container image distribution. Options are "centos", "debian",
# "ubuntu". Default is {{ os_distribution }}.
kolla_base_distro: "{{ os_distribution }}"
# "ubuntu". Default is
# {{ 'centos' if os_distribution == 'rocky' else os_distribution }}.
kolla_base_distro: "{{ 'centos' if os_distribution == 'rocky' else os_distribution }}"
# Kolla container image type: binary or source.
kolla_install_type: "source"
......
......@@ -7,8 +7,8 @@
# Whether to build host disk images with DIB directly instead of through
# Bifrost. Setting it to true disables Bifrost image build and allows images to
# be built with the `kayobe overcloud host image build` command. Default value
# is False. This will change in a future release.
overcloud_dib_build_host_images: False
# is {{ os_distribution == 'rocky' }}. This will change in a future release.
overcloud_dib_build_host_images: "{{ os_distribution == 'rocky' }}"
# List of overcloud host disk images to build. Each element is a dict defining
# an image in a format accepted by the stackhpc.os-images role. Default is to
......@@ -22,20 +22,24 @@ overcloud_dib_host_images:
env: "{{ overcloud_dib_env_vars }}"
packages: "{{ overcloud_dib_packages }}"
# DIB base OS element. Default is {{ os_distribution }}.
overcloud_dib_os_element: "{{ os_distribution }}"
# DIB base OS element. Default is {{ 'rocky-container' if os_distribution ==
# 'rocky' else os_distribution }}.
overcloud_dib_os_element: "{{ 'rocky-container' if os_distribution == 'rocky' else os_distribution }}"
# DIB image OS release. Default is {{ os_release }}.
overcloud_dib_os_release: "{{ os_release }}"
# List of default DIB elements. Default is ["centos", "cloud-init-datasources",
# "disable-selinux", "enable-serial-console", "vm"] when
# overcloud_dib_os_element is "centos", or ["ubuntu", "cloud-init-datasources",
# "enable-serial-console", "vm"] when overcloud_dib_os_element is "ubuntu".
# overcloud_dib_os_element is "centos", or ["rocky-container",
# "cloud-init-datasources", "disable-selinux", "enable-serial-console", "vm"]
# when overcloud_dib_os_element is "rocky" or
# ["ubuntu", "cloud-init-datasources", "enable-serial-console", "vm"]
# when overcloud_dib_os_element is "ubuntu".
overcloud_dib_elements_default:
- "{{ overcloud_dib_os_element }}"
- "cloud-init-datasources"
- "{% if overcloud_dib_os_element == 'centos' %}disable-selinux{% endif %}"
- "{% if overcloud_dib_os_element in ['centos', 'rocky'] %}disable-selinux{% endif %}"
- "enable-serial-console"
- "vm"
......@@ -48,11 +52,14 @@ overcloud_dib_elements: "{{ overcloud_dib_elements_default | select | list + ove
# DIB default environment variables. Default is
# {"DIB_BOOTLOADER_DEFAULT_CMDLINE": "nofb nomodeset gfxpayload=text
# net.ifnames=1", "DIB_CLOUD_INIT_DATASOURCES": "ConfigDrive", "DIB_RELEASE":
# "{{ overcloud_dib_os_release }}"}.
# net.ifnames=1", "DIB_CLOUD_INIT_DATASOURCES": "ConfigDrive",
# "DIB_CONTAINERFILE_RUNTIME": "docker", "DIB_CONTAINERFILE_NETWORK_DRIVER":
# "host", "DIB_RELEASE": "{{ overcloud_dib_os_release }}"}.
overcloud_dib_env_vars_default:
DIB_BOOTLOADER_DEFAULT_CMDLINE: "nofb nomodeset gfxpayload=text net.ifnames=1"
DIB_CLOUD_INIT_DATASOURCES: "ConfigDrive"
DIB_CONTAINERFILE_RUNTIME: "docker"
DIB_CONTAINERFILE_NETWORK_DRIVER: "host"
DIB_RELEASE: "{{ overcloud_dib_os_release }}"
# DIB additional environment variables. Default is none.
......
......@@ -42,12 +42,17 @@ seed_vm_root_format: qcow2
# Base image for the seed VM root volume. Default is
# "https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img"
# when os_distribution is "ubuntu", or
# when os_distribution is "ubuntu",
# http://dl.rockylinux.org/pub/rocky/8.5/images/Rocky-8-GenericCloud-8.5-20211114.2.x86_64.qcow2
# when os_distribution is "rocky",
# or
# "https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2"
# otherwise.
seed_vm_root_image: >-
{%- if os_distribution == 'ubuntu' %}
https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
{%- elif os_distribution == 'rocky' %}
http://dl.rockylinux.org/pub/rocky/8.5/images/Rocky-8-GenericCloud-8.5-20211114.2.x86_64.qcow2
{%- else -%}
https://cloud.centos.org/centos/8-stream/x86_64/images/CentOS-Stream-GenericCloud-8-20210603.0.x86_64.qcow2
{%- endif %}
......
---
- name: Copy CentOS repo templates
vars:
repo_file_prefix: "{{ 'CentOS-Stream' if ansible_facts.distribution == 'CentOS' else 'Rocky' }}"
template:
src: "{{ item }}.j2"
dest: /etc/yum.repos.d/{{ item }}
......@@ -8,9 +10,9 @@
mode: 0664
become: True
loop:
- CentOS-Stream-AppStream.repo
- CentOS-Stream-BaseOS.repo
- CentOS-Stream-Extras.repo
- "{{ repo_file_prefix }}-AppStream.repo"
- "{{ repo_file_prefix }}-BaseOS.repo"
- "{{ repo_file_prefix }}-Extras.repo"
- name: Remove old (pre CentOS 8.3) repo files
file:
......@@ -21,6 +23,7 @@
- CentOS-AppStream.repo
- CentOS-Base.repo
- CentOS-Extras.repo
when: ansible_facts.distribution == 'CentOS'
- name: Update cache
dnf:
......
# Rocky-AppStream.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[appstream]
name=Rocky Linux $releasever - AppStream
baseurl=http://{{ dnf_rocky_mirror_host }}/{{ dnf_rocky_mirror_directory }}/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
# Rocky-BaseOS.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[baseos]
name=Rocky Linux $releasever - BaseOS
baseurl=http://{{ dnf_rocky_mirror_host }}/{{ dnf_rocky_mirror_directory }}/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
# Rocky-Extras.repo
#
# The mirrorlist system uses the connecting IP address of the client and the
# update status of each mirror to pick current mirrors that are geographically
# close to the client. You should use this for Rocky updates unless you are
# manually picking other mirrors.
#
# If the mirrorlist does not work for you, you can try the commented out
# baseurl line instead.
[extras]
name=Rocky Linux $releasever - Extras
baseurl=http://{{ dnf_rocky_mirror_host }}/{{ dnf_rocky_mirror_directory }}/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
......@@ -130,7 +130,7 @@ function config_init {
# Installation
function is_dnf {
if [[ -e /etc/centos-release ]]; then
if [[ -e /etc/centos-release || -e /etc/rocky-release ]]; then
/usr/bin/which dnf >/dev/null 2>&1
else
return 1
......@@ -138,7 +138,7 @@ function is_dnf {
}
function is_yum {
if [[ -e /etc/centos-release ]]; then
if [[ -e /etc/centos-release || -e /etc/rocky-release ]]; then
/usr/bin/which yum >/dev/null 2>&1
else
return 1
......
......@@ -26,9 +26,9 @@ It is possible to update packages on the infrastructure VMs.
Package Repositories
--------------------
If using custom DNF package repositories on CentOS, it may be necessary to
update these prior to running a package update. To do this, update the
configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
If using custom DNF package repositories on CentOS or Rocky, it may be
necessary to update these prior to running a package update. To do this, update
the configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
command::
(kayobe) $ kayobe infra vm host configure --tags dnf
......
......@@ -10,9 +10,9 @@ It is possible to update packages on the overcloud hosts.
Package Repositories
--------------------
If using custom DNF package repositories on CentOS, it may be necessary to
update these prior to running a package update. To do this, update the
configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
If using custom DNF package repositories on CentOS or Rocky, it may be
necessary to update these prior to running a package update. To do this, update
the configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
command::
(kayobe) $ kayobe overcloud host configure --tags dnf --kolla-tags none
......
......@@ -21,9 +21,9 @@ It is possible to update packages on the seed host.
Package Repositories
--------------------
If using custom DNF package repositories on CentOS, it may be necessary to
update these prior to running a package update. To do this, update the
configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
If using custom DNF package repositories on CentOS or Rocky, it may be
necessary to update these prior to running a package update. To do this, update
the configuration in ``${KAYOBE_CONFIG_PATH}/dnf.yml`` and run the following
command::
(kayobe) $ kayobe seed host configure --tags dnf --kolla-tags none
......
......@@ -79,8 +79,8 @@ is ``stack``.
Typically, the image used to provision these hosts will not include this user
account, so Kayobe performs a bootstrapping step to create it, as a different
user. In cloud images, there is often a user named after the OS distro, e.g.
``centos`` or ``ubuntu``. This user defaults to the ``os_distribution``
variable, but may be set via the following variables:
``centos``, ``rocky`` or ``ubuntu``. This user defaults to the
``os_distribution`` variable, but may be set via the following variables:
* ``seed_hypervisor_bootstrap_user``
* ``seed_bootstrap_user``
......@@ -211,8 +211,8 @@ DNF Package Repositories
*tags:*
| ``dnf``
On CentOS, Kayobe supports configuration of package repositories via DNF, via
variables in ``${KAYOBE_CONFIG_PATH}/dnf.yml``.
On CentOS and Rocky, Kayobe supports configuration of package repositories via
DNF, via variables in ``${KAYOBE_CONFIG_PATH}/dnf.yml``.
Configuration of dnf.conf
-------------------------
......@@ -227,18 +227,25 @@ section of the file. For example, to configure DNF to use a proxy server:
dnf_config:
proxy: https://proxy.example.com
CentOS and EPEL Mirrors
-----------------------
CentOS/Rocky and EPEL Mirrors
-----------------------------
CentOS and EPEL mirrors can be enabled by setting ``dnf_use_local_mirror`` to
``true``. CentOS repository mirrors are configured via the following
variables:
CentOS/Rocky and EPEL mirrors can be enabled by setting
``dnf_use_local_mirror`` to ``true``. CentOS repository mirrors are configured
via the following variables:
* ``dnf_centos_mirror_host`` (default ``mirror.centos.org``) is the mirror
hostname.
* ``dnf_centos_mirror_directory`` (default ``centos``) is a directory on the
mirror in which repositories may be accessed.
Rocky repository mirrors are configured via the following variables:
* ``dnf_rocky_mirror_host`` (default ``dl.rockylinux.org``) is the mirror
hostname
* ``dnf_rocky_mirror_directory`` (default ``pub/rocky``) is a directory on the
mirror in which repositories may be accessed.
EPEL repository mirrors are configured via the following variables:
* ``dnf_epel_mirror_host`` (default ``download.fedoraproject.org``) is the
......@@ -327,7 +334,7 @@ SELinux
*tags:*
| ``disable-selinux``
.. note:: SELinux applies to CentOS systems only.
.. note:: SELinux applies to CentOS and Rocky systems only.
SELinux is not supported by Kolla Ansible currently, so it is disabled by
Kayobe. If necessary, Kayobe will reboot systems in order to apply a change to
......@@ -348,12 +355,12 @@ Firewalld
*tags:*
| ``firewall``
.. note:: Firewalld is supported on CentOS systems only. Currently no
.. note:: Firewalld is supported on CentOS and Rocky systems only. Currently no
firewall is supported on Ubuntu.
Firewalld can be used to provide a firewall on CentOS systems. Since the Xena
release, Kayobe provides support for enabling or disabling firewalld, as well
as defining zones and rules.
Firewalld can be used to provide a firewall on CentOS/Rocky systems. Since the
Xena release, Kayobe provides support for enabling or disabling firewalld, as
well as defining zones and rules.
The following variables can be used to set whether to enable firewalld:
......@@ -446,7 +453,7 @@ Tuned
*tags:*
| ``tuned``
.. note:: Tuned configuration only supports CentOS systems for now.
.. note:: Tuned configuration only supports CentOS/Rocky systems for now.
Built-in ``tuned`` profiles can be applied to hosts. The following variables
can be used to set a ``tuned`` profile to specific types of hosts:
......
......@@ -69,8 +69,8 @@ supported:
``rules``
List of IP routing rules.
On CentOS, each item should be a string describing an ``iproute2`` IP
routing rule.
On CentOS or Rocky, each item should be a string describing an ``iproute2``
IP routing rule.
On Ubuntu, each item should be a dict containing optional items ``from``,
``to``, ``priority`` and ``table``. ``from`` is the source address prefix
......@@ -272,10 +272,10 @@ Configuring IP Routing Policy Rules
IP routing policy rules may be configured by setting the ``rules`` attribute
for a network to a list of rules. The format of each rule currently differs
between CentOS and Ubuntu.
between CentOS/Rocky and Ubuntu.
CentOS
""""""
CentOS/Rocky
""""""""""""
The format of a rule is the string which would be appended to ``ip rule
<add|del>`` to create or delete the rule.
......
......@@ -11,12 +11,14 @@ used throughout the system.
The ``os_distribution`` variable in ``etc/kayobe/globals.yml`` can be used to
set the OS distribution to use. It may be set to either ``centos`` or
``ubuntu``, and defaults to ``centos``.
or ``rocky`` or ``ubuntu``, and defaults to ``centos``.
The ``os_release`` variable in ``etc/kayobe/globals.yml`` can be used to set
the release of the OS. When ``os_distribution`` is set to ``centos`` it may be
set to ``8-stream``, and this is its default value. When ``os_distribution`` is
set to ``ubuntu`` it may be set to ``focal``, and this is its default value.
When ``os_distribution`` is set to ``rocky`` it may be set to ``8``, and this
is its default value.
These variables are used to set various defaults, including:
......@@ -34,3 +36,13 @@ In the following example, we set the OS distribution to ``ubuntu``:
:caption: ``globals.yml``
os_distribution: "ubuntu"
Example: using Rocky
====================
In the following example, we set the OS distribution to ``rocky``:
.. code-block:: yaml
:caption: ``globals.yml``
os_distribution: "rocky"
......@@ -19,7 +19,8 @@ following option:
Whether to build host disk images with DIB directly instead of through
Bifrost. Setting it to true disables Bifrost image build and allows images
to be built with the ``kayobe overcloud host image build`` command. Default
value is false. This will change in a future release.
value is false, except on Rocky where it is true. This will change in a
future release.
With this option enabled, Bifrost will be configured to stop building a root
disk image. This will become the default behaviour in a future release.
......@@ -35,7 +36,8 @@ information on building disk images.
The default configuration builds a whole disk (partitioned) image using the
selected :ref:`OS distribution <os-distribution>` (CentOS Stream 8 by default)
with serial console enabled, and SELinux disabled if CentOS Stream is used.
with serial console enabled, and SELinux disabled if CentOS Stream or Rocky
Linux is used.
`Cloud-init <https://cloudinit.readthedocs.io/en/latest/>`__ is used to process
the configuration drive built by Bifrost during provisioning.
......@@ -48,17 +50,19 @@ the configuration drive built by Bifrost during provisioning.
"elements": "{{ overcloud_dib_elements }}", "env": "{{
overcloud_dib_env_vars }}", "packages": "{{ overcloud_dib_packages }}"}``.
``overcloud_dib_os_element``
DIB base OS element. Default is ``{{ os_distribution }}``.
DIB base OS element. Default is ``{{ 'rocky-container' if os_distribution == 'rocky' else os_distribution }}``.
``overcloud_dib_os_release``
DIB image OS release. Default is ``{{ os_release }}``.
``overcloud_dib_elements_default``
List of default DIB elements. Default is ``["centos",
"cloud-init-datasources", "disable-selinux", "enable-serial-console",
"vm"]`` when ``overcloud_dib_os_element`` is ``centos``, or ``["ubuntu",
"cloud-init-datasources", "enable-serial-console", "vm"]`` when
``overcloud_dib_os_element`` is ``ubuntu``. The ``vm`` element is poorly
named, and causes DIB to build a whole disk image rather than a single
partition.
"vm"]`` when ``overcloud_dib_os_element`` is ``centos``, or
``["rocky-container", "cloud-init-datasources", "disable-selinux",
"enable-serial-console", "vm"]`` when overcloud_dib_os_element is ``rocky``
or ``["ubuntu", "cloud-init-datasources", "enable-serial-console", "vm"]``
when ``overcloud_dib_os_element`` is ``ubuntu``. The ``vm`` element is
poorly named, and causes DIB to build a whole disk image rather than a
single partition.
``overcloud_dib_elements_extra``
List of additional DIB elements. Default is none.
``overcloud_dib_elements``
......@@ -67,8 +71,9 @@ the configuration drive built by Bifrost during provisioning.
``overcloud_dib_env_vars_default``
DIB default environment variables. Default is
``{"DIB_BOOTLOADER_DEFAULT_CMDLINE": "nofb nomodeset gfxpayload=text
net.ifnames=1", "DIB_CLOUD_INIT_DATASOURCES": "ConfigDrive", "DIB_RELEASE":
"{{ overcloud_dib_os_release }}"}``.
net.ifnames=1", "DIB_CLOUD_INIT_DATASOURCES": "ConfigDrive",
"DIB_CONTAINERFILE_RUNTIME": "docker", "DIB_CONTAINERFILE_NETWORK_DRIVER":
"host", DIB_RELEASE": "{{ overcloud_dib_os_release }}"}``.
``overcloud_dib_env_vars_extra``
DIB additional environment variables. Default is none.
``overcloud_dib_env_vars``
......
......@@ -30,9 +30,9 @@ It also requires a single host running a :ref:`supported operating system
* at least one network interface that has Internet access
You will need access to a user account with passwordless sudo. The default user
in a cloud image (e.g. ``centos`` or ``ubuntu``) is typically sufficient. This
user will be used to run Kayobe commands. It will also be used by Kayobe to
bootstrap other user accounts.
in a cloud image (e.g. ``centos`` or ``rocky`` or ``ubuntu``) is typically
sufficient. This user will be used to run Kayobe commands. It will also be used
by Kayobe to bootstrap other user accounts.
.. _configuration-scenario-aio-overview:
......
......@@ -210,7 +210,8 @@ Use the correct hostname and IP address for your environment.
controller0: 192.168.33.3
The default OS distribution in Kayobe is CentOS. If using an Ubuntu host, set
the ``os_distribution`` variable in ``etc/kayobe/globals.yml`` to ``ubuntu``.
the ``os_distribution`` variable in ``etc/kayobe/globals.yml`` to ``ubuntu``
or ``rocky`` if using Rocky Linux..
.. code-block:: yaml
:caption: ``etc/kayobe/globals.yml``
......@@ -218,9 +219,9 @@ the ``os_distribution`` variable in ``etc/kayobe/globals.yml`` to ``ubuntu``.
os_distribution: "ubuntu"
Kayobe uses a bootstrap user to create a ``stack`` user account. By default,
this user is ``centos`` on CentOS, and ``ubuntu`` on Ubuntu, in line with the
default user in the official cloud images. If you are using a different
bootstrap user, set the ``controller_bootstrap_user`` variable in
this user is ``centos`` on CentOS, ``rocky`` on Rocky and ``ubuntu`` on Ubuntu,
in line with the default user in the official cloud images. If you are using
a different bootstrap user, set the ``controller_bootstrap_user`` variable in
``etc/kayobe/controllers.yml``. For example, to set it to ``cloud-user`` (as
seen in MAAS):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment