From a42f130aac18e529e6553e303296c648bb2cc301 Mon Sep 17 00:00:00 2001 From: Frank Kloeker Date: Mon, 1 Feb 2016 15:45:29 +0100 Subject: [PATCH] Puppet module to provide a translation checksite Install DevStack and refresh the installation daily Sync translation files from Zanata Branches are to configure, see README.md and init.pp for details Requires puppetlabs-vcsrepo Requires zanata-cli and API-Key Working basis: https://etherpad.openstack.org/p/i18n-mitaka-virtualsprint Change-Id: I6b9a7fb2dfcdc2d7178cd149352e585ca7d3c7cc Co-Authored-By: Ying Chun Guo Co-Authored-By: KATO Tomoyuki Co-Authored-By: Ian Y. Choi Co-Authored-By: Akihiro Motoki --- Gemfile | 30 +++ LICENSE | 201 +++++++++++++++ README.md | 81 ++++++ Rakefile | 8 + files/update-lang-list.py | 45 ++++ manifests/init.pp | 240 ++++++++++++++++++ metadata.json | 21 ++ spec/acceptance/nodesets/default.yml | 11 + spec/acceptance/nodesets/nodepool-centos7.yml | 10 + spec/acceptance/nodesets/nodepool-trusty.yml | 10 + spec/spec_helper_acceptance.rb | 58 +++++ templates/local.conf.erb | 78 ++++++ templates/local.conf.minimal.erb | 6 + templates/zanata-sync.sh.erb | 25 ++ templates/zanata.xml.erb | 13 + 15 files changed, 837 insertions(+) create mode 100644 Gemfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Rakefile create mode 100644 files/update-lang-list.py create mode 100644 manifests/init.pp create mode 100644 metadata.json create mode 100644 spec/acceptance/nodesets/default.yml create mode 100644 spec/acceptance/nodesets/nodepool-centos7.yml create mode 100644 spec/acceptance/nodesets/nodepool-trusty.yml create mode 100644 spec/spec_helper_acceptance.rb create mode 100644 templates/local.conf.erb create mode 100644 templates/local.conf.minimal.erb create mode 100644 templates/zanata-sync.sh.erb create mode 100644 templates/zanata.xml.erb diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..96912da --- /dev/null +++ b/Gemfile @@ -0,0 +1,30 @@ +source 'https://rubygems.org' + +group :development, :test do + gem 'puppetlabs_spec_helper', :require => false + + gem 'metadata-json-lint' + # This is nice and all, but let's not worry about it until we've actually + # got puppet 4.x sorted + # gem 'puppet-lint-param-docs' + gem 'puppet-lint-absolute_classname-check' + gem 'puppet-lint-absolute_template_path' + gem 'puppet-lint-trailing_newline-check' + + # Puppet 4.x related lint checks + gem 'puppet-lint-unquoted_string-check' + gem 'puppet-lint-empty_string-check' + gem 'puppet-lint-leading_zero-check' + gem 'puppet-lint-variable_contains_upcase' + gem 'puppet-lint-spaceship_operator_without_tag-check' + gem 'puppet-lint-undef_in_function-check' + + if puppetversion = ENV['PUPPET_GEM_VERSION'] + gem 'puppet', puppetversion, :require => false + else + gem 'puppet', '~> 3.0', :require => false + end + +end + +# vim:ft=ruby diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a76e947 --- /dev/null +++ b/README.md @@ -0,0 +1,81 @@ +Translation_checksite for testing translations against DevStack +=============================================================== + +This puppet module provides environment for check translation in OpenStack + +Features +-------- +- Install and Configure DevStack +- Install Cron for Zanata Sync + +Requirements +------------ + +For usage devstack git repo: + +https://git.openstack.org/cgit/openstack-infra/puppet-vcsrepo/ + +For installing Zanata Client: + +https://github.com/puppetlabs/puppetlabs-java_ks.git + +https://git.openstack.org/openstack-infra/puppet-zanata/ + + +Prerequisites for installing Zanata CLI +--------------------------------------- + + class {'zanata::client': + version => '1.2.3', + user => 'stack', + group => 'stack', + server => 'openstack', + server_url => 'https://zanata.example.org:443', + server_user => 'user', + server_api_key => '12345', + homedir => '/home/stack/', + } + +Usage +----- + +Install DevStack without any plugins: + + class {'translation_checksite': + minimal => 1, # no extra plugins loaded + server_url => 'https://zanata.example.org:443', # from where to fetch translation files + revision => 'master', # used branch in DevStack Repo + project_version => 'master', # used version in Zanata Project + } + +Install DevStack with parameter: + + class {'translation_checksite': + zanata_cli => '/opt/zanata/zanata-cli-3.8.1/bin/zanata-cli', + server_url => 'https://zanata.example.org:443', + devstack_dir => '/home/stack/devstack', + stack_user => 'stack', + revision => 'master', + project_version => 'master', + admin_password => '12345678', + database_password => '12121212', + rabbit_password => '34343434', + service_password => '56565656', + service_token => '78787878787878', + swift_hash => '78787878787878', + sync_hour => 18, + sync_minute => 30, + restack => 1, # refresh DevStack installation + restack_hour => 18, + restack_minute => 00, + } + +Deinstall DevStack: + + class {'translation_checksite': + devstack_dir => '/home/stack/devstack', + stack_user => 'stack', + shutdown => 1, # this stops DevStack and deletes the installation + } + +Note: Developed for Ubuntu 14.04 LTS diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..7f22329 --- /dev/null +++ b/Rakefile @@ -0,0 +1,8 @@ +require 'rubygems' +require 'puppetlabs_spec_helper/rake_tasks' +require 'puppet-lint/tasks/puppet-lint' +PuppetLint.configuration.fail_on_warnings = true +PuppetLint.configuration.send('disable_80chars') +PuppetLint.configuration.send('disable_autoloader_layout') +PuppetLint.configuration.send('disable_class_inherits_from_params_class') +PuppetLint.configuration.send('disable_class_parameter_defaults') \ No newline at end of file diff --git a/files/update-lang-list.py b/files/update-lang-list.py new file mode 100644 index 0000000..edfd072 --- /dev/null +++ b/files/update-lang-list.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# +# 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. + +import pprint +import os + +from django.conf.locale import LANG_INFO +from django.utils import translation + + +def get_django_lang_name(code, all_codes): + code = code.lower().replace('_', '-') + code_orig = code + lang_info = LANG_INFO.get(code) + if not lang_info: + code = code.split('-', 1)[0] + if code not in all_codes: + lang_info = LANG_INFO.get(code) + if lang_info: + return code, lang_info['name'] + else: + return code_orig, code_orig + + +HORIZON_DIR = '/opt/stack/horizon' + +langs_horizon = os.listdir(os.path.join(HORIZON_DIR, 'horizon', 'locale')) +langs_dashboard = os.listdir(os.path.join(HORIZON_DIR, 'openstack_dashboard', 'locale')) +# Pick up languages with both horizon and openstack_dashboard translations +langs = set(langs_horizon) & set(langs_dashboard) + +lang_list = [get_django_lang_name(l, langs) for l in sorted(langs)] +print 'LANGUAGES = ', +pprint.pprint(tuple(lang_list)) diff --git a/manifests/init.pp b/manifests/init.pp new file mode 100644 index 0000000..ee5d8a6 --- /dev/null +++ b/manifests/init.pp @@ -0,0 +1,240 @@ +# 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. +# +# == Class: translation_checksite +# +# Maintaining environment for translation checksite +# +# === Parameters +# +# === Variables +# +# [*devstack_dir*] +# Destination of DevStack installation +# +# [*is_minimal*] +# Bolean for minimal DevStack installation with default configuration +# +# [*zanata_cli*] +# Location of Zanata Client +# +# [*stack_user*] +# Unix user of DevStack installation +# needs sudo rights without password +# +# [*revision*] +# used branch (check https://git.opentsack.org/openstack-dev/devstack.git +# for available branches ) +# +# [*project_version*] +# used project version in Zanata (check Zanata for available versions ) +# +# [*admin_password*] +# Password of admin (taking care) +# +# [*database_password*] +# Password of databse +# +# [*rabbit_password*] +# Password of RabbitMQ +# +# [*service_password*] +# Password of services +# +# [*service_token*] +# Password of service token +# +# [*swift_hash*] +# Password of swift hash +# +# [*sync_hour*] +# [*sync_minute*] +# configure cron to sync translation files from Zanata +# +# [*is_shutdown*] +# Bolean for shutdown and delete DevStack +# +# [*restack*] +# daily cron to unstack and stack +# +# [*restack_hour*] +# [*restack_minute*] +# configure cron to restack the environment +# + +class translation_checksite ( + $devstack_dir = '/home/stack/devstack', + $is_minimal = undef, + $zanata_cli = '/opt/zanata/zanata-cli-3.8.1/bin/zanata-cli', + $zanata_url = undef, + $stack_user = 'stack', + $revision = 'master', + $project_version = 'master', + $admin_password = undef, + $database_password = undef, + $rabbit_password = undef, + $service_password = undef, + $service_token = undef, + $swift_hash = undef, + $sync_hour = 1, + $sync_minute = 0, + $is_shutdown = undef, + $restack = undef, + $restack_hour = 0, + $restack_minute = 0, + $devstack_ssh_pubkey = undef, +) { + + user { $stack_user: + ensure => present, + groups => $stack_user, + comment => 'Stack User', + managehome => true, + shell => '/bin/bash', + password => '*', + require => Group[$stack_user] + } + + group { $stack_user: + ensure => present, + } + + file {"/home/${stack_user}/.config": + ensure => directory, + owner => $stack_user, + group => $stack_user, + require => User[$stack_user] + } + + ssh_authorized_key {'i18n project team': + ensure => present, + type => 'ssh-rsa', + key => $devstack_ssh_pubkey, + user => $stack_user, + require => User[$stack_user], + } + + package {'sudo': + ensure => 'present', + } + + file {'/etc/sudoers.d/10-stack-devstack': + ensure => file, + mode => '0600', + content => "${stack_user} ALL=(root) NOPASSWD:ALL\n", + require => Package['sudo'], + } + + vcsrepo { $devstack_dir: + ensure => present, + provider => git, + owner => $stack_user, + group => $stack_user, + source => 'https://git.openstack.org/openstack-dev/devstack.git', + revision => $revision, + } + + if $is_minimal { + $local_conf = 'translation_checksite/local.conf.minimal.erb' + } else { + $local_conf = 'translation_checksite/local.conf.erb' + } + + file {"${devstack_dir}/local.conf": + ensure => file, + mode => '0600', + owner => $stack_user, + group => $stack_user, + content => template($local_conf), + force => true, + require => [ Vcsrepo[$devstack_dir] ], + } + + exec { 'run_devstack': + cwd => $devstack_dir, + command => "/bin/su ${stack_user} -c ${devstack_dir}/stack.sh", + unless => ['/bin/ps aux | /usr/bin/pgrep stack 2>/dev/null', + '/usr/bin/test -d /opt/stack/'], + timeout => 3600, + require => File["${devstack_dir}/local.conf"], + logoutput => true + } + + file {"/home/${stack_user}/zanata.xml": + ensure => file, + mode => '0644', + owner => $stack_user, + group => $stack_user, + content => template('translation_checksite/zanata.xml.erb'), + force => true, + } + + file {"/home/${stack_user}/zanata-sync.sh": + ensure => file, + mode => '0755', + owner => $stack_user, + group => $stack_user, + content => template('translation_checksite/zanata-sync.sh.erb'), + force => true, + } + + file {"/home/${stack_user}/update-lang-list.py": + ensure => file, + mode => '0755', + owner => $stack_user, + group => $stack_user, + source => 'puppet:///modules/translation_checksite/update-lang-list.py', + force => true, + } + + cron { 'zanata-sync': + ensure => present, + environment => 'PATH=/bin:/usr/bin:/usr/local/bin', + command => "/home/${stack_user}/zanata-sync.sh", + user => $stack_user, + hour => $sync_hour, + minute => $sync_minute, + } + + if $is_shutdown { + exec { 'unstack_devstack': + cwd => $devstack_dir, + path => '/bin:/usr/bin:/usr/local/bin', + command => "/bin/su ${stack_user} -c ${devstack_dir}/unstack.sh", + creates => "${devstack_dir}/shutdown.puppet", + timeout => 600, + logoutput => true + } + + exec { 'clean_devstack': + cwd => $devstack_dir, + path => '/bin:/usr/bin:/usr/local/bin', + command => "/bin/su ${stack_user} -c ${devstack_dir}/clean.sh", + unless => '/bin/ps aux | /usr/bin/pgrep stack', + timeout => 300, + logoutput => true, + require => Exec['unstack_devstack'] + } + } + + if $restack { + cron { 'devstack-restack': + ensure => present, + environment => 'PATH=/bin:/usr/bin:/usr/local/bin', + command => "${devstack_dir}/unstack.sh && ${devstack_dir}/stack.sh", + user => $stack_user, + hour => $restack_hour, + minute => $restack_minute, + require => [ User[$stack_user], Vcsrepo[$devstack_dir] ] + } + } +} diff --git a/metadata.json b/metadata.json new file mode 100644 index 0000000..c084322 --- /dev/null +++ b/metadata.json @@ -0,0 +1,21 @@ +{ + "name": "openstackinfra-translation_checksite", + "version": "0.0.1", + "author": "Openstack CI", + "summary": "Puppet module for translation checksite", + "license": "Apache 2.0", + "source": "git://git.openstack.org/openstack-infra/puppet-translation_checksite.git", + "project_page": "http://docs.openstack.org/infra/system-config/", + "issues_url": "https://storyboard.openstack.org/#!/project/839", + "operatingsystem_support": [ + { "operatingsystem": "Ubuntu", "operatingsystemrelease": ["14.04"] } + ], + "requirements": [ + { "name": "pe", "version_requirement": ">= 3.2.0 < 3.4.0" }, + { "name": "puppet", "version_requirement": "3.x" } + ], + + "dependencies": [ + { "name": "openstackinfra/vcsrepo", "version_requirement": "= 0.0.8" } + ] +} diff --git a/spec/acceptance/nodesets/default.yml b/spec/acceptance/nodesets/default.yml new file mode 100644 index 0000000..3bb3e62 --- /dev/null +++ b/spec/acceptance/nodesets/default.yml @@ -0,0 +1,11 @@ +HOSTS: + ubuntu-server-1404-x64: + roles: + - master + platform: ubuntu-14.04-amd64 + box: puppetlabs/ubuntu-14.04-64-nocm + box_url: https://vagrantcloud.com/puppetlabs/ubuntu-14.04-64-nocm + hypervisor: vagrant +CONFIG: + log_level: debug + type: git diff --git a/spec/acceptance/nodesets/nodepool-centos7.yml b/spec/acceptance/nodesets/nodepool-centos7.yml new file mode 100644 index 0000000..c552874 --- /dev/null +++ b/spec/acceptance/nodesets/nodepool-centos7.yml @@ -0,0 +1,10 @@ +HOSTS: + centos-70-x64: + roles: + - master + platform: el-7-x86_64 + hypervisor: none + ip: 127.0.0.1 +CONFIG: + type: foss + set_env: false diff --git a/spec/acceptance/nodesets/nodepool-trusty.yml b/spec/acceptance/nodesets/nodepool-trusty.yml new file mode 100644 index 0000000..9fc624e --- /dev/null +++ b/spec/acceptance/nodesets/nodepool-trusty.yml @@ -0,0 +1,10 @@ +HOSTS: + ubuntu-14.04-amd64: + roles: + - master + platform: ubuntu-14.04-amd64 + hypervisor: none + ip: 127.0.0.1 +CONFIG: + type: foss + set_env: false diff --git a/spec/spec_helper_acceptance.rb b/spec/spec_helper_acceptance.rb new file mode 100644 index 0000000..7a5efa1 --- /dev/null +++ b/spec/spec_helper_acceptance.rb @@ -0,0 +1,58 @@ +require 'beaker-rspec' + +hosts.each do |host| + + install_puppet + + on host, "mkdir -p #{host['distmoduledir']}" +end + +RSpec.configure do |c| + # Project root + proj_root = File.expand_path(File.join(File.dirname(__FILE__), '..')) + modname = JSON.parse(open('metadata.json').read)['name'].split('-')[1] + + # Readable test descriptions + c.formatter = :documentation + + # Configure all nodes in nodeset + c.before :suite do + # Install module and dependencies + hosts.each do |host| + + # Clean out any module cruft + shell('rm -fr /etc/puppet/modules/*') + + # install git + install_package host, 'git' + + zuul_ref = ENV['ZUUL_REF'] + zuul_branch = ENV['ZUUL_BRANCH'] + zuul_url = ENV['ZUUL_URL'] + + # Install dependent modules via git or zuul + r = on host, "test -e /usr/zuul-env/bin/zuul-cloner", { :acceptable_exit_codes => [0,1] } + repo = 'openstack-infra/system-config' + if r.exit_code == 0 + zuul_clone_cmd = '/usr/zuul-env/bin/zuul-cloner ' + zuul_clone_cmd += '--cache-dir /opt/git ' + zuul_clone_cmd += "--zuul-ref #{zuul_ref} " + zuul_clone_cmd += "--zuul-branch #{zuul_branch} " + zuul_clone_cmd += "--zuul-url #{zuul_url} " + zuul_clone_cmd += "git://git.openstack.org #{repo}" + on host, zuul_clone_cmd + else + on host, "git clone https://git.openstack.org/#{repo} #{repo}" + end + + on host, "ZUUL_REF=#{zuul_ref} ZUUL_BRANCH=#{zuul_branch} ZUUL_URL=#{zuul_url} bash #{repo}/tools/install_modules_acceptance.sh" + on host, "rm -fr /etc/puppet/modules/#{modname}" + + # Install the module being tested + puppet_module_install(:source => proj_root, :module_name => modname) + on host, "rm -fr #{repo}" + # List modules installed to help with debugging + on hosts[0], puppet('module','list'), { :acceptable_exit_codes => 0 } + end + end +end diff --git a/templates/local.conf.erb b/templates/local.conf.erb new file mode 100644 index 0000000..1ff1132 --- /dev/null +++ b/templates/local.conf.erb @@ -0,0 +1,78 @@ +[[local|localrc]] +#----------------------------- +# Common configurations +#----------------------------- + +HOST_IP=<%= @ipaddress %> + +enable_service c-bak +disable_service tempest +enable_service heat h-api h-api-cfn h-api-cw h-eng +enable_service ceilometer-acompute ceilometer-acentral ceilometer-collector ceilometer-api +enable_service s-proxy s-object s-container s-account +enable_service trove tr-api tr-tmgr tr-cond +enable_service sahara + +enable_plugin rally https://git.openstack.org/openstack/rally + +enable_plugin murano https://git.openstack.org/openstack/murano +enable_plugin murano-dashboard https://git.openstack.org/openstack/murano-dashboard + +enable_plugin trove https://git.openstack.org/openstack/trove +enable_plugin trove-dashboard https://git.openstack.org/openstack/trove-dashboard + +enable_plugin sahara https://git.openstack.org/openstack/sahara +enable_plugin sahara-dashboard https://git.openstack.org/openstack/sahara-dashboard + +enable_plugin neutron https://git.openstack.org/openstack/neutron +enable_plugin neutron-lbaas https://git.openstack.org/openstack/neutron-lbaas +enable_plugin octavia https://git.openstack.org/openstack/octavia +enable_plugin neutron-lbaas-dashboard https://git.openstack.org/openstack/neutron-lbaas-dashboard +enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas + +ENABLED_SERVICES+=,q-lbaasv2 +ENABLED_SERVICES+=,octavia,o-cw,o-hk,o-hm,o-api + + +LIBS_FROM_GIT=django_openstack_auth + +VOLUME_BACKING_FILE_SIZE=50G + +KEYSTONE_TOKEN_FORMAT=UUID +PRIVATE_NETWORK_NAME=net1 +PUBLIC_NETWORK_NAME=ext_net + +#----------------------------- +# Neutron +#----------------------------- + disable_service n-net + enable_service neutron q-svc q-agt + enable_service q-dhcp + enable_service q-l3 + enable_service q-meta + enable_service q-fwaas + enable_service q-metering + + Q_PLUGIN=ml2 + +#----------------------------- +# Devstack configurations +#----------------------------- +LOGDIR=$DEST/logs +LOGDAYS=1 +SCREEN_LOGDIR=$LOGDIR +SCREEN_HARDSTATUS="%{= rw} %H %{= wk} %L=%-w%{= bw}%30L> %n%f %t*%{= wk}%+Lw%-17< %-=%{= gk} %y/%m /%d %c" +LOGFILE=$LOGDIR/devstack.log + + +ADMIN_PASSWORD=<%= @admin_password %> +MYSQL_PASSWORD=<%= @database_password %> +RABBIT_PASSWORD=<%= @rabbit_password %> +SERVICE_PASSWORD=<%= @service_password %> +SERVICE_TOKEN=<%= @service_token %> +SWIFT_HASH=<%= @swift_hash %> + +[[post-config|/etc/cinder/cinder.conf]] +[DEFAULT] +SYSLOG=False +quota_gigabytes=10000 diff --git a/templates/local.conf.minimal.erb b/templates/local.conf.minimal.erb new file mode 100644 index 0000000..eef585c --- /dev/null +++ b/templates/local.conf.minimal.erb @@ -0,0 +1,6 @@ +[[local|localrc]] +ADMIN_PASSWORD=<%= @admin_password %> +DATABASE_PASSWORD=<%= @database_password %> +RABBIT_PASSWORD=<%= @rabbit_password %> +SERVICE_PASSWORD=<%= @service_password %> +SERVICE_TOKEN=<%= @service_token %> diff --git a/templates/zanata-sync.sh.erb b/templates/zanata-sync.sh.erb new file mode 100644 index 0000000..3be251a --- /dev/null +++ b/templates/zanata-sync.sh.erb @@ -0,0 +1,25 @@ +#!/bin/bash +# +# Script for sync language files from zanata, compile them and reload apache +# requires zanata.xml for zanata-cli +# +LOCAL_SETTINGS=/opt/stack/horizon/openstack_dashboard/local/local_settings.py + +# fetch new po files for spezific lang +<%= @zanata_cli %> -B -q pull + +# compile mo files +for file in `find /opt/stack/horizon -name "*.po"` ; do + msgfmt -o ${file%.po}.mo $file +done + +# Update the language list to have all available languages +# see https://github.com/amotoki/horizon-i18n-tools +TOP_DIR=$(cd $(dirname "$0") && pwd) + +sed -i -e '/^LANGUAGES = /,$d' $LOCAL_SETTINGS +python $TOP_DIR/update-lang-list.py >> $LOCAL_SETTINGS + +# reload apache +ACTL=$(sudo which apache2ctl) +sudo $ACTL graceful diff --git a/templates/zanata.xml.erb b/templates/zanata.xml.erb new file mode 100644 index 0000000..beaf690 --- /dev/null +++ b/templates/zanata.xml.erb @@ -0,0 +1,13 @@ + + + <%= @zanata_url %>/ + horizon + <%= @project_version %> + gettext + . + /opt/stack/horizon/ + .*/** + + {path}/{locale_with_underscore}/LC_MESSAGES/{filename}.po + +