From 0ace7c353a8f0a20daaab822417244841674a91c Mon Sep 17 00:00:00 2001 From: Tobias Urdin Date: Fri, 27 Apr 2018 15:59:09 +0200 Subject: [PATCH] Add support to install dashboards The horizon module does today not support installing additional packages such as the heat-dashboard which is not included in the horizon packages so it must be installed separately. This patch adds the ability to install these additional dashboards using a resource: horizon::dashboard { 'heat': } This would: - install python3-heat-dashboard on Debian - install python-heat-dashboard on Ubuntu - install openstack-heat-ui on RedHat based Change-Id: I2c67c90213b5cc3042f0d2eedd0cb97e7f50f9d2 --- manifests/dashboard.pp | 51 +++++++++++ manifests/deps.pp | 3 + ...dd-dashboard-support-0d14ebc190c01070.yaml | 6 ++ spec/acceptance/horizon_with_apache_spec.rb | 2 + spec/defines/horizon_dashboard_spec.rb | 89 +++++++++++++++++++ 5 files changed, 151 insertions(+) create mode 100644 manifests/dashboard.pp create mode 100644 releasenotes/notes/horizon-add-dashboard-support-0d14ebc190c01070.yaml create mode 100644 spec/defines/horizon_dashboard_spec.rb diff --git a/manifests/dashboard.pp b/manifests/dashboard.pp new file mode 100644 index 00000000..7a7bcaf6 --- /dev/null +++ b/manifests/dashboard.pp @@ -0,0 +1,51 @@ +# +# Copyright (C) 2018 Binero +# +# Author: Tobias Urdin +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# == Define: horizon::dashboard +# +# This resource installs additional horizon dashboard which is not +# shipped with the horizon packages, but as additional packages. +# +# == Example: +# +# This will install the correct heat-dashboard package for your deployment. +# horizon::dashboard { 'heat': } +# +define horizon::dashboard { + + $dashboard = downcase($name) + + case $::osfamily { + 'Debian': { + $dashboard_package_name = $::os_package_type ? { + 'debian' => "python3-${dashboard}-dashboard", + default => "python-${dashboard}-dashboard" + } + } + 'RedHat': { + $dashboard_package_name = "openstack-${dashboard}-ui" + } + default: { + fail("Unsupported OS family: ${::osfamily}") + } + } + + ensure_packages($dashboard_package_name, { + 'ensure' => present, + 'tag' => ['horizon-dashboard-package'] + }) +} diff --git a/manifests/deps.pp b/manifests/deps.pp index e73e4537..aff0526a 100644 --- a/manifests/deps.pp +++ b/manifests/deps.pp @@ -29,6 +29,9 @@ class horizon::deps { -> anchor { 'horizon::compress::begin': } -> Exec<| tag == 'horizon-compress' |> ~> anchor { 'horizon::compress::end': } + -> anchor { 'horizon::dashboard::begin': } + -> Package<| tag == 'horizon-dashboard-package' |> + ~> anchor { 'horizon::dashboard::end': } -> anchor { 'horizon::service::begin': } -> Service<| title == 'httpd' |> ~> anchor { 'horizon::service::end': } diff --git a/releasenotes/notes/horizon-add-dashboard-support-0d14ebc190c01070.yaml b/releasenotes/notes/horizon-add-dashboard-support-0d14ebc190c01070.yaml new file mode 100644 index 00000000..1bb4c249 --- /dev/null +++ b/releasenotes/notes/horizon-add-dashboard-support-0d14ebc190c01070.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Added new resource horizon::dashboard which can be used to install + additional dashboards that is not shipped with the horizon packages. + Example would be install the heat-dashboard using horizon::dashboard { 'heat': } diff --git a/spec/acceptance/horizon_with_apache_spec.rb b/spec/acceptance/horizon_with_apache_spec.rb index d6ab88ed..6eb79e08 100644 --- a/spec/acceptance/horizon_with_apache_spec.rb +++ b/spec/acceptance/horizon_with_apache_spec.rb @@ -17,6 +17,8 @@ describe 'horizon class' do allowed_hosts => [$::fqdn, 'localhost'], server_aliases => [$::fqdn, 'localhost'], } + + horizon::dashboard { 'heat': } EOS # Run it twice and test for idempotency diff --git a/spec/defines/horizon_dashboard_spec.rb b/spec/defines/horizon_dashboard_spec.rb new file mode 100644 index 00000000..96623717 --- /dev/null +++ b/spec/defines/horizon_dashboard_spec.rb @@ -0,0 +1,89 @@ +# +# Copyright (C) 2018 Binero +# +# Author: Tobias Urdin +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +require 'spec_helper' + +describe 'horizon::dashboard' do + # NOTE(tobasco): Intentionally set to uppercase to make sure + # it's corrected to lowercase in the code. + let (:title) { 'HeAt' } + + shared_examples 'horizon::dashboard' do + context 'with default' do + it { + is_expected.to contain_package(platform_params[:heat_dashboard_package_name]).with( + :ensure => 'present', + :tag => ['horizon-dashboard-package']) + } + end + end + + shared_examples 'horizon::dashboard on Debian' do + before do + facts.merge!({:os_package_type => 'debian'}) + end + + context 'with default' do + it { + is_expected.to contain_package('python3-heat-dashboard').with( + :ensure => 'present', + :tag => ['horizon-dashboard-package']) + } + end + end + + shared_examples 'horizon::dashboard on Ubuntu' do + context 'with default' do + it { + is_expected.to contain_package('python-heat-dashboard').with( + :ensure => 'present', + :tag => ['horizon-dashboard-package']) + } + end + end + + on_supported_os({ + :supported_os => OSDefaults.get_supported_os + }).each do |os,facts| + context "on #{os}" do + let (:facts) do + facts.merge!(OSDefaults.get_facts()) + end + + let(:platform_params) do + case facts[:osfamily] + when 'Debian' + if facts[:os_package_type] == 'debian' + pkg = 'python3-heat-dashboard' + else + pkg = 'python-heat-dashboard' + end + { :heat_dashboard_package_name => pkg } + when 'RedHat' + { :heat_dashboard_package_name => 'openstack-heat-ui' } + end + end + + it_behaves_like 'horizon::dashboard' + + if facts[:osfamily] == 'Debian' + it_behaves_like "horizon::dashboard on #{facts[:operatingsystem]}" + end + end + end + +end