%{!?upstream_version: %global upstream_version %{version}%{?milestone}}
Name:       openstack-dashboard
Version:    16.2.2
Release:    1
Summary:    OpenStack Dashboard (Horizon)
License:    Apache-2.0 and BSD
URL:        http://horizon.openstack.org/
Source0:    https://tarballs.openstack.org/horizon/horizon-%{upstream_version}.tar.gz
Source1:    openstack-dashboard-httpd-2.4.conf
Source2:    openstack-dashboard-systemd.conf
Source3:    openstack-dashboard-logrotate.conf
BuildArch:  noarch
BuildRequires:   python3-devel
BuildRequires:   python3-setuptools
BuildRequires:   python3-pbr
BuildRequires:   git-core
BuildRequires:   gettext
# for checks:
BuildRequires:   python3-nose
BuildRequires:   python3-osprofiler
BuildRequires:   python3-iso8601
BuildRequires:   python3-pycodestyle
BuildRequires:   python3-mock
BuildRequires:   python3-netaddr
BuildRequires:   python3-anyjson

Requires:       python3-horizon
Requires:       python3-openstack_auth
Provides:       openstack-horizon
%description
The OpenStack dashboard provides administrators and users a graphical
interface to access, provision and automate cloud-based resources. The
extensible design makes it easy to plug in and expose third party
products and services, such as billing, monitoring and additional
management tools.

%package -n python3-openstack_auth
Summary:        OpenStack Auth (Horizon) - Python Module
Provides:      python-openstack_auth
%description -n python3-openstack_auth
The Python module OpenStack Auth provides Authentication mechanism
for the OpenStack Dashboard (Horizon).

%package -n python3-horizon
Summary:    Openstack web user interface reference implementation

BuildRequires: python3-django-debreach
BuildRequires: python3-django-compressor
BuildRequires: python3-django-pyscss
BuildRequires: python3-XStatic
BuildRequires: python3-XStatic-Angular
BuildRequires: python3-XStatic-Angular-Bootstrap
BuildRequires: python3-XStatic-Angular-Schema-Form
BuildRequires: python3-XStatic-D3
BuildRequires: python3-XStatic-Font-Awesome
BuildRequires: python3-XStatic-JSEncrypt
BuildRequires: python3-XStatic-Jasmine
BuildRequires: python3-XStatic-Bootstrap-SCSS
BuildRequires: python3-XStatic-termjs
BuildRequires: python3-XStatic-smart-table
BuildRequires: python3-XStatic-Angular-FileUpload
BuildRequires: python3-XStatic-Angular-Gettext
BuildRequires: python3-XStatic-bootswatch
BuildRequires: python3-XStatic-roboto-fontface
BuildRequires: python3-XStatic-mdi
BuildRequires: python3-XStatic-objectpath
BuildRequires: python3-XStatic-tv4
# bootstrap-scss requires at least python-scss
BuildRequires: python3-scss
BuildRequires: fontawesome-fonts-web
BuildRequires: python3-oslo-concurrency
BuildRequires: python3-oslo-config
BuildRequires: python3-oslo-i18n
BuildRequires: python3-oslo-serialization
BuildRequires: python3-oslo-utils
BuildRequires: python3-oslo-policy
BuildRequires: python3-babel
BuildRequires: python3-pytz
BuildRequires: systemd
BuildRequires: python3-django-appconf
BuildRequires: python3-semantic_version
BuildRequires: python3-XStatic-jQuery
BuildRequires: python3-XStatic-Hogan
BuildRequires: python3-XStatic-JQuery-Migrate
BuildRequires: python3-XStatic-JQuery-TableSorter
BuildRequires: python3-XStatic-JQuery-quicksearch
BuildRequires: python3-XStatic-Rickshaw
BuildRequires: python3-XStatic-Spin
BuildRequires: python3-XStatic-jquery-ui
BuildRequires: python3-XStatic-Bootstrap-Datepicker
BuildRequires: python3-XStatic-Angular-lrdragndrop
BuildRequires: python3-pint
BuildRequires: python3-memcached
BuildRequires: python3-glanceclient
BuildRequires: python3-keystoneclient
BuildRequires: python3-novaclient
BuildRequires: python3-neutronclient
BuildRequires: python3-cinderclient
BuildRequires: python3-swiftclient
BuildRequires: python3-pytest

Requires:   python3-iso8601
Requires:   python3-glanceclient
Requires:   python3-keystoneclient
Requires:   python3-keystoneauth1
Requires:   python3-novaclient
Requires:   python3-neutronclient
Requires:   python3-cinderclient
Requires:   python3-swiftclient
Requires:   python3-netaddr
Requires:   python3-osprofiler
Requires:   python3-django-pyscss
Requires:   python3-XStatic
Requires:   python3-XStatic-Angular
Requires:   python3-XStatic-Angular-Bootstrap
Requires:   python3-XStatic-Angular-Schema-Form
Requires:   python3-XStatic-D3
Requires:   python3-XStatic-Font-Awesome
Requires:   python3-XStatic-JSEncrypt
Requires:   python3-XStatic-Jasmine
Requires:   python3-XStatic-Bootstrap-SCSS
Requires:   python3-XStatic-termjs
Requires:   python3-XStatic-smart-table
Requires:   python3-XStatic-Angular-Gettext
Requires:   python3-XStatic-Angular-FileUpload
Requires:   python3-XStatic-bootswatch
Requires:   python3-XStatic-roboto-fontface
Requires:   python3-XStatic-mdi
Requires:   python3-XStatic-objectpath
Requires:   python3-XStatic-tv4
Requires:   python3-django-debreach
Requires:   python3-scss
Requires:   fontawesome-fonts-web
Requires:   python3-oslo-concurrency
Requires:   python3-oslo-config
Requires:   python3-oslo-i18n
Requires:   python3-oslo-serialization
Requires:   python3-oslo-utils
Requires:   python3-oslo-upgradecheck
Requires:   python3-requests
Requires:   python3-oslo-policy
Requires:   python3-babel
Requires:   python3-futurist
Requires:   openssl
Requires:   logrotate
Requires:   python3-mod_wsgi
Requires:   python3-django-appconf
Requires:   python3-pymongo
Requires:   python3-semantic_version
Requires:   python3-XStatic-jQuery
Requires:   python3-XStatic-Hogan
Requires:   python3-XStatic-JQuery-Migrate
Requires:   python3-XStatic-JQuery-TableSorter
Requires:   python3-XStatic-JQuery-quicksearch
Requires:   python3-XStatic-Rickshaw
Requires:   python3-XStatic-Spin
Requires:   python3-XStatic-jquery-ui
Requires:   python3-XStatic-Bootstrap-Datepicker
Requires:   python3-XStatic-Angular-lrdragndrop
Requires:   python3-yaml
Requires:   python3-memcached
Requires:   python3-debtcollector

Provides:   python-horizon
%description -n python3-horizon
Openstack Dashboard is a web user interface for Openstack. The package
provides a reference implementation using the Django Horizon project,
mostly consisting of JavaScript and CSS to tie it altogether as a standalone
site.
This package contains the python library.

%prep
%autosetup -n horizon-%{upstream_version} -S git

# customize default settings
# WAS [PATCH] disable debug, move web root
sed -i "/^DEBUG =.*/c\DEBUG = False" openstack_dashboard/local/local_settings.py.example
sed -i "/^WEBROOT =.*/c\WEBROOT = '/dashboard/'" openstack_dashboard/local/local_settings.py.example
sed -i "/^.*ALLOWED_HOSTS =.*/c\ALLOWED_HOSTS = ['horizon.example.com', 'localhost']" openstack_dashboard/local/local_settings.py.example
sed -i "/^.*LOCAL_PATH =.*/c\LOCAL_PATH = '/tmp'" openstack_dashboard/local/local_settings.py.example
sed -i "/^.*POLICY_FILES_PATH =.*/c\POLICY_FILES_PATH = '/etc/openstack-dashboard'" openstack_dashboard/local/local_settings.py.example

sed -i "/^BIN_DIR = .*/c\BIN_DIR = '/usr/bin'" openstack_dashboard/settings.py
sed -i "/^COMPRESS_PARSER = .*/a COMPRESS_OFFLINE = True" openstack_dashboard/settings.py

# set COMPRESS_OFFLINE=True
sed -i 's:COMPRESS_OFFLINE.=.False:COMPRESS_OFFLINE = True:' openstack_dashboard/settings.py

# Fix manage.py shebang
sed -i 's/\/usr\/bin\/env python/\/usr\/bin\/env python3/' manage.py

%build
# compile message strings
cd horizon && django-admin compilemessages && cd ..
cd openstack_dashboard && django-admin compilemessages && cd ..
# Dist tarball is missing .mo files so they're not listed in distributed egg metadata.
# Removing egg-info and letting PBR regenerate it was working around that issue
# but PBR cannot regenerate complete SOURCES.txt so some other files wont't get installed.
# Further reading why not remove upstream egg metadata:
# https://github.com/emonty/python-oslo-messaging/commit/f632684eb2d582253601e8da7ffdb8e55396e924
# https://fedorahosted.org/fpc/ticket/488
echo >> horizon.egg-info/SOURCES.txt
ls */locale/*/LC_MESSAGES/django*mo >> horizon.egg-info/SOURCES.txt
%{py3_build}

# compress css, js etc.
cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py
# get it ready for compressing later in puppet-horizon
%{__python3} manage.py collectstatic --noinput --clear
%{__python3} manage.py compress --force

# undo hack
cp openstack_dashboard/local/local_settings.py.example openstack_dashboard/local/local_settings.py

%install
%{py3_install}
# drop httpd-conf snippet
install -m 0644 -D -p %{SOURCE1} %{buildroot}%{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf
install -d -m 755 %{buildroot}%{_datadir}/openstack-dashboard
install -d -m 755 %{buildroot}%{_sharedstatedir}/openstack-dashboard
install -d -m 755 %{buildroot}%{_sysconfdir}/openstack-dashboard

# create directory for systemd snippet
mkdir -p %{buildroot}%{_unitdir}/httpd.service.d/
cp %{SOURCE2} %{buildroot}%{_unitdir}/httpd.service.d/openstack-dashboard.conf


# Copy everything to /usr/share
mv %{buildroot}%{python3_sitelib}/openstack_dashboard \
   %{buildroot}%{_datadir}/openstack-dashboard
cp manage.py %{buildroot}%{_datadir}/openstack-dashboard
rm -rf %{buildroot}%{python3_sitelib}/openstack_dashboard

# remove unnecessary .po files
find %{buildroot} -name django.po -exec rm '{}' \;
find %{buildroot} -name djangojs.po -exec rm '{}' \;

# Move config to /etc, symlink it back to /usr/share
mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/local/local_settings.py.example %{buildroot}%{_sysconfdir}/openstack-dashboard/local_settings
ln -s ../../../../..%{_sysconfdir}/openstack-dashboard/local_settings %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/local/local_settings.py

mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/conf/default_policies %{buildroot}%{_sysconfdir}/openstack-dashboard
mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/conf/*.yaml %{buildroot}%{_sysconfdir}/openstack-dashboard
mv %{buildroot}%{_datadir}/openstack-dashboard/openstack_dashboard/conf/nova_policy.d %{buildroot}%{_sysconfdir}/openstack-dashboard

%find_lang django --all-name

grep "\/usr\/share\/openstack-dashboard" django.lang > dashboard.lang
grep "\/site-packages\/horizon" django.lang > horizon.lang

# copy static files to %{_datadir}/openstack-dashboard/static
mkdir -p %{buildroot}%{_datadir}/openstack-dashboard/static
cp -a openstack_dashboard/static/* %{buildroot}%{_datadir}/openstack-dashboard/static
cp -a horizon/static/* %{buildroot}%{_datadir}/openstack-dashboard/static
cp -a static/* %{buildroot}%{_datadir}/openstack-dashboard/static

# create /var/run/openstack-dashboard/ and own it
mkdir -p %{buildroot}%{_sharedstatedir}/openstack-dashboard

# create /var/log/horizon and own it
mkdir -p %{buildroot}%{_var}/log/horizon

# place logrotate config:
mkdir -p %{buildroot}%{_sysconfdir}/logrotate.d
cp -a %{SOURCE3} %{buildroot}%{_sysconfdir}/logrotate.d/openstack-dashboard

%check
# NOTE(jpena): we do not want to run hacking tests in check
rm horizon/test/unit/hacking/test_checks.py
%{__python3} manage.py test horizon --settings=horizon.test.settings

%post -n openstack-dashboard
# ugly hack to set a unique SECRET_KEY
sed -i "/^from horizon.utils import secret_key$/d" /etc/openstack-dashboard/local_settings
sed -i "/^SECRET_KEY.*$/{N;s/^.*$/SECRET_KEY='`openssl rand -hex 10`'/}" /etc/openstack-dashboard/local_settings
# reload systemd unit files
systemctl daemon-reload >/dev/null 2>&1 || :

%postun
# update systemd unit files
systemctl daemon-reload >/dev/null 2>&1 || :


%files -f dashboard.lang
%license LICENSE
%dir %{_datadir}/openstack-dashboard/
%{_datadir}/openstack-dashboard/*.py*
%{_datadir}/openstack-dashboard/static
%{_datadir}/openstack-dashboard/openstack_dashboard/*.py*
%{_datadir}/openstack-dashboard/openstack_dashboard/api
%{_datadir}/openstack-dashboard/openstack_dashboard/contrib
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/admin
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/identity
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/project
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/settings
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/__init__.py*
%{_datadir}/openstack-dashboard/openstack_dashboard/django_pyscss_fix
%{_datadir}/openstack-dashboard/openstack_dashboard/enabled
%{_datadir}/openstack-dashboard/openstack_dashboard/karma.conf.js
%{_datadir}/openstack-dashboard/openstack_dashboard/local
%{_datadir}/openstack-dashboard/openstack_dashboard/management
%{_datadir}/openstack-dashboard/openstack_dashboard/static
%{_datadir}/openstack-dashboard/openstack_dashboard/templates
%{_datadir}/openstack-dashboard/openstack_dashboard/templatetags
%{_datadir}/openstack-dashboard/openstack_dashboard/themes
%{_datadir}/openstack-dashboard/openstack_dashboard/test
%{_datadir}/openstack-dashboard/openstack_dashboard/usage
%{_datadir}/openstack-dashboard/openstack_dashboard/utils
%dir %{_datadir}/openstack-dashboard/openstack_dashboard
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??_??
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??/LC_MESSAGES
%dir %{_datadir}/openstack-dashboard/openstack_dashboard/locale/??_??/LC_MESSAGES

%{_datadir}/openstack-dashboard/openstack_dashboard/.eslintrc
%{_datadir}/openstack-dashboard/openstack_dashboard/__pycache__
%{_datadir}/openstack-dashboard/openstack_dashboard/dashboards/__pycache__

%dir %attr(0750, root, apache) %{_sysconfdir}/openstack-dashboard
%dir %attr(0750, apache, apache) %{_sharedstatedir}/openstack-dashboard
%dir %attr(0750, apache, apache) %{_var}/log/horizon
%config(noreplace) %{_sysconfdir}/httpd/conf.d/openstack-dashboard.conf
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/local_settings
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/default_policies/*.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/default_policies/README.txt
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/cinder_policy.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/keystone_policy.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/nova_policy.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/glance_policy.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/neutron_policy.yaml
%config(noreplace) %attr(0640, root, apache) %{_sysconfdir}/openstack-dashboard/nova_policy.d/api-extensions.yaml
%config(noreplace) %attr(0644, root, root) %{_sysconfdir}/logrotate.d/openstack-dashboard
%attr(755,root,root) %dir %{_unitdir}/httpd.service.d
%config(noreplace) %{_unitdir}/httpd.service.d/openstack-dashboard.conf

%files -n python3-horizon
%license LICENSE
%{python3_sitelib}/horizon
%{python3_sitelib}/horizon-*.egg-info

%files -n python3-openstack_auth
%license LICENSE
%{python3_sitelib}/openstack_auth

%changelog
* Fri Nov 05 2021 lijiawei <ljw1101.vip@gmail.com> - 16.2.2-1
- Support OpenStack Train release
