beaker-openstack 0.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d6633df09acdbb5609695abe943b7d8ca80d4793
4
- data.tar.gz: b121d5093ba7cb858cf96854949ada97ae53aacf
2
+ SHA256:
3
+ metadata.gz: c5432c86653f848d141b7170b2f434bdd9479268956aad4dd821bfbb4f66eed7
4
+ data.tar.gz: a3e397ec1d79f453858d00e641211feaeef426f55bc95ee99ac3e5bdfcf60151
5
5
  SHA512:
6
- metadata.gz: 6f9ad76c1b51b2ac3e190ecf931fea129b308f7bac7f6573f89b1956c4d7f7ad7237f09a22ea0619b82b9ae5662e230614700b906f334cc564d198947438543f
7
- data.tar.gz: 88e8e676509fa13b677597e773719b850691ba4eed0581748a6318edfe1c7a9ae843eefe7c5d185d623b1a58ac49f3cacbf285660a1e3db7a1552511f00d57f5
6
+ metadata.gz: 8665d145f7d23bfcbc5fdb5bf504e333570156507b94e8bbbf5c251ca0a7eff95e4924a600dcbdb96b60f569e0068c38eea240c45553fd5738f6b420228d0979
7
+ data.tar.gz: b25f60256f8687260e3ac7f690789ebeec180d4f27fb88b06e9f8b8d0731faf7a899f38ea5e5b1f8842628e27490fbec4b2838a5c782adf678f77845b81db587
@@ -0,0 +1,17 @@
1
+ version: 2
2
+ updates:
3
+ # raise PRs for gem updates
4
+ - package-ecosystem: bundler
5
+ directory: "/"
6
+ schedule:
7
+ interval: daily
8
+ time: "13:00"
9
+ open-pull-requests-limit: 10
10
+
11
+ # Maintain dependencies for GitHub Actions
12
+ - package-ecosystem: github-actions
13
+ directory: "/"
14
+ schedule:
15
+ interval: daily
16
+ time: "13:00"
17
+ open-pull-requests-limit: 10
@@ -0,0 +1,31 @@
1
+ name: Release
2
+
3
+ on:
4
+ create:
5
+ ref_type: tag
6
+
7
+ jobs:
8
+ release:
9
+ runs-on: ubuntu-latest
10
+ if: github.repository == 'voxpupuli/beaker-openstack'
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - name: Install Ruby 3.0
14
+ uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: '3.0'
17
+ env:
18
+ BUNDLE_WITHOUT: release
19
+ - name: Build gem
20
+ run: gem build *.gemspec
21
+ - name: Publish gem to rubygems.org
22
+ run: gem push *.gem
23
+ env:
24
+ GEM_HOST_API_KEY: '${{ secrets.RUBYGEMS_AUTH_TOKEN }}'
25
+ - name: Setup GitHub packages access
26
+ run: |
27
+ mkdir -p ~/.gem
28
+ echo ":github: Bearer ${{ secrets.GITHUB_TOKEN }}" >> ~/.gem/credentials
29
+ chmod 0600 ~/.gem/credentials
30
+ - name: Publish gem to GitHub packages
31
+ run: gem push --key github --host https://rubygems.pkg.github.com/voxpupuli *.gem
@@ -0,0 +1,24 @@
1
+ name: Test
2
+
3
+ on:
4
+ - pull_request
5
+ - push
6
+
7
+ jobs:
8
+ test:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ fail-fast: false
12
+ matrix:
13
+ ruby:
14
+ - "2.7"
15
+ - "3.0"
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - name: Install Ruby ${{ matrix.ruby }}
19
+ uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ bundler-cache: true
23
+ - name: Run tests
24
+ run: bundle exec rake spec
data/CHANGELOG.md ADDED
@@ -0,0 +1,64 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [2.0.0](https://github.com/voxpupuli/beaker-openstack/tree/2.0.0) (2024-02-03)
6
+
7
+ [Full Changelog](https://github.com/voxpupuli/beaker-openstack/compare/1.0.0...2.0.0)
8
+
9
+ **Breaking changes:**
10
+
11
+ - Drop EoL Ruby 2.4/2.5/2.6 support [\#22](https://github.com/voxpupuli/beaker-openstack/pull/22) ([bastelfreak](https://github.com/bastelfreak))
12
+
13
+ **Implemented enhancements:**
14
+
15
+ - Add parallel instance creation opt-in option [\#20](https://github.com/voxpupuli/beaker-openstack/pull/20) ([canihavethisone](https://github.com/canihavethisone))
16
+
17
+ **Merged pull requests:**
18
+
19
+ - gemspec: Fix typo in Apache-2.0 license name [\#27](https://github.com/voxpupuli/beaker-openstack/pull/27) ([bastelfreak](https://github.com/bastelfreak))
20
+ - Apply best practices for our changelog generator [\#26](https://github.com/voxpupuli/beaker-openstack/pull/26) ([bastelfreak](https://github.com/bastelfreak))
21
+ - Cleanup Gemfile, add beaker as runtime dependency [\#24](https://github.com/voxpupuli/beaker-openstack/pull/24) ([bastelfreak](https://github.com/bastelfreak))
22
+ - dependabot: check for github actions and bundler [\#21](https://github.com/voxpupuli/beaker-openstack/pull/21) ([bastelfreak](https://github.com/bastelfreak))
23
+ - Update fakefs requirement from ~\> 1.3 to ~\> 2.4 [\#19](https://github.com/voxpupuli/beaker-openstack/pull/19) ([dependabot[bot]](https://github.com/apps/dependabot))
24
+
25
+ ## [1.0.0](https://github.com/voxpupuli/beaker-openstack/tree/1.0.0) (2021-07-09)
26
+
27
+ [Full Changelog](https://github.com/voxpupuli/beaker-openstack/compare/0.3.0...1.0.0)
28
+
29
+ **Merged pull requests:**
30
+
31
+ - Cleanup README/gemspec/GitHub actions [\#13](https://github.com/voxpupuli/beaker-openstack/pull/13) ([bastelfreak](https://github.com/bastelfreak))
32
+ - Update fakefs requirement from ~\> 0.6 to ~\> 1.3 [\#11](https://github.com/voxpupuli/beaker-openstack/pull/11) ([dependabot[bot]](https://github.com/apps/dependabot))
33
+ - Add Vox Pupuli's CI bits [\#10](https://github.com/voxpupuli/beaker-openstack/pull/10) ([genebean](https://github.com/genebean))
34
+ - Add openstack\_project\_id logic etc, expand example nodeset in readme [\#9](https://github.com/voxpupuli/beaker-openstack/pull/9) ([canihavethisone](https://github.com/canihavethisone))
35
+
36
+ ## [0.3.0](https://github.com/voxpupuli/beaker-openstack/tree/0.3.0) (2019-06-17)
37
+
38
+ [Full Changelog](https://github.com/voxpupuli/beaker-openstack/compare/0.2.0...0.3.0)
39
+
40
+ **Merged pull requests:**
41
+
42
+ - hypervisor/openstack: fix usage with V3 API [\#5](https://github.com/voxpupuli/beaker-openstack/pull/5) ([GiedriusS](https://github.com/GiedriusS))
43
+ - \(BKR-1509\) Hypervisor usage instructions for Beaker 4.0 [\#4](https://github.com/voxpupuli/beaker-openstack/pull/4) ([Dakta](https://github.com/Dakta))
44
+
45
+ ## [0.2.0](https://github.com/voxpupuli/beaker-openstack/tree/0.2.0) (2018-01-09)
46
+
47
+ [Full Changelog](https://github.com/voxpupuli/beaker-openstack/compare/0.1.0...0.2.0)
48
+
49
+ **Merged pull requests:**
50
+
51
+ - \(BKR-1270\) Use fog-openstack instead of fog [\#3](https://github.com/voxpupuli/beaker-openstack/pull/3) ([Sharpie](https://github.com/Sharpie))
52
+
53
+ ## [0.1.0](https://github.com/voxpupuli/beaker-openstack/tree/0.1.0) (2017-07-28)
54
+
55
+ [Full Changelog](https://github.com/voxpupuli/beaker-openstack/compare/9fc506a9a93f9985fb3f36132a91805026f19d79...0.1.0)
56
+
57
+ **Merged pull requests:**
58
+
59
+ - \(MAINT\) Update docs [\#2](https://github.com/voxpupuli/beaker-openstack/pull/2) ([rishijavia](https://github.com/rishijavia))
60
+ - \(MAINT\) Update env variable to correct hypervisor [\#1](https://github.com/voxpupuli/beaker-openstack/pull/1) ([rishijavia](https://github.com/rishijavia))
61
+
62
+
63
+
64
+ \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)*
data/Gemfile CHANGED
@@ -2,24 +2,7 @@ source ENV['GEM_SOURCE'] || "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- def location_for(place, fake_version = nil)
6
- if place =~ /^git:([^#]*)#(.*)/
7
- [fake_version, { :git => $1, :branch => $2, :require => false }].compact
8
- elsif place =~ /^file:\/\/(.*)/
9
- ['>= 0', { :path => File.expand_path($1), :require => false }]
10
- else
11
- [place, { :require => false }]
12
- end
13
- end
14
-
15
-
16
- # We don't put beaker in as a test dependency because we
17
- # don't want to create a transitive dependency
18
- group :acceptance_testing do
19
- gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 3.0')
20
- end
21
-
22
-
23
- if File.exists? "#{__FILE__}.local"
24
- eval(File.read("#{__FILE__}.local"), binding)
5
+ group :release, optional: true do
6
+ gem 'faraday-retry', '~> 2.1', require: false
7
+ gem 'github_changelog_generator','~> 1.16', '>= 1.16.4', require: false
25
8
  end
data/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # beaker-openstack
2
2
 
3
+ [![License](https://img.shields.io/github/license/voxpupuli/beaker-openstack.svg)](https://github.com/voxpupuli/beaker-openstack/blob/master/LICENSE)
4
+ [![Test](https://github.com/voxpupuli/beaker-openstack/actions/workflows/test.yml/badge.svg)](https://github.com/voxpupuli/beaker-openstack/actions/workflows/test.yml)
5
+ [![Release](https://github.com/voxpupuli/beaker-openstack/actions/workflows/release.yml/badge.svg)](https://github.com/voxpupuli/beaker-openstack/actions/workflows/release.yml)
6
+ [![RubyGem Version](https://img.shields.io/gem/v/beaker-openstack.svg)](https://rubygems.org/gems/beaker-openstack)
7
+ [![RubyGem Downloads](https://img.shields.io/gem/dt/beaker-openstack.svg)](https://rubygems.org/gems/beaker-openstack)
8
+ [![Donated by Puppet Inc](https://img.shields.io/badge/donated%20by-Puppet%20Inc-fb7047.svg)](#transfer-notice)
9
+
3
10
  Beaker library to use openstack hypervisor
4
11
 
5
12
  # How to use this wizardry
@@ -40,33 +47,121 @@ We run beaker's base acceptance tests with this library to see if the hypervisor
40
47
 
41
48
  2. `OPENSTACK_KEY` - Path to private key that is used to SSH into Openstack VMs
42
49
 
43
- You will need two hosts with same platform. A template of what hosts file is below:
50
+ You will need at least two hosts defined in a nodeset file. An example comprehensive nodeset is below (note that not all parameters are required):
44
51
 
45
52
  ```yaml
53
+
46
54
  HOSTS:
47
- host-1:
55
+ master:
56
+ roles:
57
+ - agent
58
+ - master
59
+ - dashboard
60
+ - database
48
61
  hypervisor: openstack
49
62
  platform: <my_platform>
50
63
  user: <host_username>
51
64
  image: <host_image>
65
+ flavor: <host_flavor>
66
+ ssh:
67
+ user: cloud-user
68
+ password: <cloud-user_password>
69
+ auth_methods:
70
+ - password
71
+ - publickey
72
+ keys:
73
+ - <relative_path/public_key>
74
+ user_data: |
75
+ #cloud-config
76
+ output: {all: '| tee -a /var/log/cloud-init-output.log'}
77
+ disable_root: <True/False>
78
+ ssh_pwauth: <True/False>
79
+ chpasswd:
80
+ list: |
81
+ root:<root_password>
82
+ cloud-user:<cloud-user_password>
83
+ expire: False
84
+ runcmd:
85
+ - <my_optional_commands>
86
+
87
+ agent_1:
52
88
  roles:
53
89
  - agent
54
- - master
55
- - dashboard
56
- - database
57
90
  - default
58
- host-2:
59
91
  hypervisor: openstack
60
92
  platform: <my_platform>
61
93
  user: <host_username>
62
94
  image: <host_image>
63
- roles:
64
- - agent
95
+ flavor: <host_flavor>
96
+ ssh:
97
+ user: cloud-user
98
+ password: <cloud-user_password>
99
+ auth_methods:
100
+ - publickey
101
+ keys:
102
+ - <relative_path/public_key>
103
+ number_of_password_prompts: 0
104
+ keepalive: true
105
+ keepalive_interval: 5
106
+ user_data: |
107
+ #cloud-config
108
+ output: {all: '| tee -a /var/log/cloud-init-output.log'}
109
+ disable_root: <True/False>
110
+ ssh_pwauth: <True/False>
111
+ chpasswd:
112
+ list: |
113
+ root:<root_password>
114
+ cloud-user:<cloud-user_password>
115
+ expire: False
116
+ runcmd:
117
+ - <my_optional_commands>
118
+
65
119
  CONFIG:
120
+ log_level: <trace/debug/verbose/info/notify/warn>
121
+ trace_limit: 50
122
+ timesync: <true/false>
66
123
  nfs_server: none
67
124
  consoleport: 443
125
+ openstack_username: <insert_username>
126
+ openstack_api_key: <insert_password>
127
+ # openstack_project_name: <insert_project_name> # alternatively use openstack_project_id
128
+ openstack_project_id: <insert_id>
129
+ # openstack_user_domain: <insert user_domain> # alternatively use openstack_user_domain_id
130
+ openstack_user_domain_id: <insert_id>
131
+ # openstack_project_domain: <insert_project_domain> # alternatively use openstack_project_domain_id
132
+ openstack_project_domain_id: <insert_id>
133
+ openstack_auth_url: http://<keystone_ip>:5000/v3/
134
+ openstack_network: <insert_network>
135
+ openstack_keyname: <insert_key>
136
+ openstack_floating_ip: <true/false>
137
+ openstack_volume_support: <true/false>
138
+ security_group: ['default']
139
+ preserve_hosts: <always/onfail/onpass/never>
140
+ create_in_parallel: true
141
+ run_in_parallel: ['configure', 'install']
142
+ type: <foss/git/pe>
143
+ ```
144
+
145
+ Note that when using _id parameters, you must also match the parameter type across the following when domain is specified:
146
+ - openstack_project_id
147
+ - openstack_user_domain_id
148
+ - openstack_project_domain_id
149
+
150
+ Further, you can opt to use a static master by setting the master's hypervisor to none, and identifying its location thus:
151
+ ```yaml
152
+ hypervisor: none
153
+ hostname: <master_hostname>
154
+ vmhostname: <master_hostname>
155
+ ip: <master_ip>
68
156
  ```
69
157
 
158
+ Additionally, you can set instance creation to occur in parallel instead of sequentially via this CONFIG entry:
159
+ ```yaml
160
+ create_in_parallel: true
161
+ ```
162
+
163
+ Additional parameter information is available at https://github.com/voxpupuli/beaker/blob/master/docs/concepts/argument_processing_and_precedence.md
164
+
70
165
  There is a simple rake task to invoke acceptance test for the library once the two environment variables are set:
71
166
  ```bash
72
167
  bundle exec rake test:acceptance
data/Rakefile CHANGED
@@ -58,6 +58,7 @@ task 'test:acceptance' => 'test:acceptance:quick'
58
58
  # global defaults
59
59
  task :test => 'test:spec'
60
60
  task :default => :test
61
+ task :spec => 'test:spec'
61
62
 
62
63
  ###########################################################
63
64
  #
@@ -164,3 +165,18 @@ namespace :docs do
164
165
  end
165
166
  end
166
167
  end
168
+
169
+ begin
170
+ require 'rubygems'
171
+ require 'github_changelog_generator/task'
172
+ rescue LoadError
173
+ # github_changelog_generator is an optional group
174
+ else
175
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
176
+ config.header = "# Changelog\n\nAll notable changes to this project will be documented in this file."
177
+ config.exclude_labels = %w[duplicate question invalid wontfix wont-fix skip-changelog github_actions]
178
+ config.user = 'voxpupuli'
179
+ config.project = 'beaker-openstack'
180
+ config.future_release = Gem::Specification.load("#{config.project}.gemspec").version
181
+ end
182
+ end
@@ -5,28 +5,25 @@ require 'beaker-openstack/version'
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "beaker-openstack"
7
7
  s.version = BeakerOpenstack::VERSION
8
- s.authors = ["Rishi Javia, Kevin Imber, Tony Vu"]
9
- s.email = ["rishi.javia@puppet.com, kevin.imber@puppet.com, tony.vu@puppet.com"]
10
- s.homepage = "https://github.com/puppetlabs/beaker-openstack"
8
+ s.authors = 'Vox Pupuli'
9
+ s.email = 'voxpupuli@groups.io'
10
+ s.homepage = 'https://github.com/voxpupuli/beaker-openstack'
11
11
  s.summary = %q{Beaker DSL Extension Helpers!}
12
12
  s.description = %q{For use for the Beaker acceptance testing tool}
13
- s.license = 'Apache2'
13
+ s.license = 'Apache-2.0'
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
18
  s.require_paths = ["lib"]
19
19
 
20
+ s.required_ruby_version = '>= 2.7', '< 4'
21
+
20
22
  # Testing dependencies
21
23
  s.add_development_dependency 'rspec', '~> 3.0'
22
24
  s.add_development_dependency 'rspec-its'
23
- # pin fakefs for Ruby < 2.3
24
- if RUBY_VERSION < "2.3"
25
- s.add_development_dependency 'fakefs', '~> 0.6', '< 0.14'
26
- else
27
- s.add_development_dependency 'fakefs', '~> 0.6'
28
- end
29
- s.add_development_dependency 'rake', '~> 10.1'
25
+ s.add_development_dependency 'fakefs', '~> 2.4'
26
+ s.add_development_dependency 'rake', '>= 12.3.3'
30
27
  s.add_development_dependency 'simplecov'
31
28
  s.add_development_dependency 'pry', '~> 0.10'
32
29
 
@@ -38,6 +35,5 @@ Gem::Specification.new do |s|
38
35
  # Run time dependencies
39
36
  s.add_runtime_dependency 'stringify-hash', '~> 0.0.0'
40
37
  s.add_runtime_dependency 'fog-openstack', '~> 1.0.0'
41
-
38
+ s.add_runtime_dependency 'beaker', '~> 5.6'
42
39
  end
43
-
@@ -14,6 +14,11 @@ module Beaker
14
14
  #@option options [String] :openstack_auth_url The URL to access the OpenStack instance with (required)
15
15
  #@option options [String] :openstack_tenant The tenant to access the OpenStack instance with (either this or openstack_project_name is required)
16
16
  #@option options [String] :openstack_project_name The project name to access the OpenStack instance with (either this or openstack_tenant is required)
17
+ #@option options [String] :openstack_project_id The project id to access the OpenStack instance with (alternative to openstack_project_name)
18
+ #@option options [String] :openstack_user_domain The user domain name to access the OpenStack instance with
19
+ #@option options [String] :openstack_user_domain_id The user domain id to access the OpenStack instance with (alternative to openstack_user_domain)
20
+ #@option options [String] :openstack_project_domain The project domain to access the OpenStack instance with
21
+ #@option options [String] :openstack_project_domain_id The project domain id to access the OpenStack instance with (alternative to openstack_project_domain)
17
22
  #@option options [String] :openstack_region The region that each OpenStack instance should be provisioned on (optional)
18
23
  #@option options [String] :openstack_network The network that each OpenStack instance should be contacted through (required)
19
24
  #@option options [Bool] :openstack_floating_ip Whether a floating IP should be allocated (required)
@@ -38,16 +43,25 @@ module Beaker
38
43
  raise 'You must specify whether a floating IP (:openstack_floating_ip) should be used for OpenStack instances!' unless !@options[:openstack_floating_ip].nil?
39
44
 
40
45
  is_v3 = @options[:openstack_auth_url].include?('/v3/')
41
- raise 'You must specify an Openstack project name (:openstack_project_name) for OpenStack instances!' if is_v3 and !@options[:openstack_project_name]
42
46
  raise 'You must specify an Openstack tenant (:openstack_tenant) for OpenStack instances!' if !is_v3 and !@options[:openstack_tenant]
43
- raise 'Invalid option specified: v3 API expects :openstack_project_name, not :openstack_tenant for OpenStack instances!' if is_v3 and @options[:openstack_tenant]
44
- raise 'Invalid option specified: v2 API expects :openstack_tenant, not :openstack_project_name for OpenStack instances!' if !is_v3 and @options[:openstack_project_name]
47
+ raise 'You must specify an Openstack project name (:openstack_project_name) or Openstack project id (:openstack_project_id) for OpenStack instances!' if is_v3 and (!@options[:openstack_project_name] and !@options[:openstack_project_id])
48
+ raise 'You must specify either Openstack project name (:openstack_project_name) or Openstack project id (:openstack_project_id) not both!' if is_v3 and (@options[:openstack_project_name] and @options[:openstack_project_id])
49
+ raise 'You may specify either Openstack user domain (:openstack_user_domain) or Openstack user domain id (:openstack_user_domain_id) not both!' if is_v3 and (@options[:openstack_user_domain] and @options[:openstack_user_domain_id])
50
+ raise 'You may specify either Openstack project domain (:openstack_project_domain) or Openstack project domain id (:openstack_project_domain_id) not both!' if is_v3 and (@options[:openstack_project_domain] and @options[:openstack_project_domain_id])
51
+ raise 'Invalid option specified: v3 API expects :openstack_project_name or :openstack_project_id, not :openstack_tenant for OpenStack instances!' if is_v3 and @options[:openstack_tenant]
52
+ raise 'Invalid option specified: v2 API expects :openstack_tenant, not :openstack_project_name or :openstack_project_id for OpenStack instances!' if !is_v3 and (@options[:openstack_project_name] or @options[:openstack_project_id])
53
+ # Ensure that _id and non _id params are not mixed (due to bug in fog-openstack)
54
+ raise 'You must not mix _id values non _id (name) values. Please use the same type for (:openstack_project_), (:openstack_user_domain) and (:openstack_project_domain)!' if is_v3 and (@options[:openstack_project_name] or @options[:openstack_user_domain] or @options[:openstack_project_domain]) and (@options[:openstack_project_id] or @options[:openstack_user_domain_id] or @options[:openstack_project_domain_id])
45
55
 
46
56
  # Keystone version 3 changed the parameter names
47
57
  if !is_v3
48
58
  extra_credentials = {:openstack_tenant => @options[:openstack_tenant]}
49
59
  else
50
- extra_credentials = {:openstack_project_name => @options[:openstack_project_name]}
60
+ if @options[:openstack_project_id]
61
+ extra_credentials = {:openstack_project_id => @options[:openstack_project_id]}
62
+ else
63
+ extra_credentials = {:openstack_project_name => @options[:openstack_project_name]}
64
+ end
51
65
  end
52
66
 
53
67
  # Common keystone authentication credentials
@@ -62,8 +76,16 @@ module Beaker
62
76
 
63
77
  # Keystone version 3 requires users and projects to be scoped
64
78
  if is_v3
65
- @credentials[:openstack_user_domain] = @options[:openstack_user_domain] || 'Default'
66
- @credentials[:openstack_project_domain] = @options[:openstack_project_domain] || 'Default'
79
+ if @options[:openstack_user_domain_id]
80
+ @credentials[:openstack_user_domain_id] = @options[:openstack_user_domain_id]
81
+ else
82
+ @credentials[:openstack_user_domain] = @options[:openstack_user_domain] || 'Default'
83
+ end
84
+ if @options[:openstack_project_domain_id]
85
+ @credentials[:openstack_project_domain_id] = @options[:openstack_project_domain_id]
86
+ else
87
+ @credentials[:openstack_project_domain] = @options[:openstack_project_domain] || 'Default'
88
+ end
67
89
  end
68
90
 
69
91
  @compute_client ||= Fog::Compute.new(@credentials)
@@ -228,86 +250,123 @@ module Beaker
228
250
  ip
229
251
  end
230
252
 
231
- #Create new instances in OpenStack
253
+ # Create new instances in OpenStack, depending on if create_in_parallel is true or not
232
254
  def provision
233
- @logger.notify "Provisioning OpenStack"
234
-
235
- @hosts.each do |host|
236
- if @options[:openstack_floating_ip]
237
- ip = get_floating_ip
238
- hostname = ip.ip.gsub('.','-')
239
- host[:vmhostname] = hostname + '.rfc1918.puppetlabs.net'
240
- else
241
- hostname = ('a'..'z').to_a.shuffle[0, 10].join
242
- host[:vmhostname] = hostname
243
- end
244
-
245
- create_or_associate_keypair(host, hostname)
246
- @logger.debug "Provisioning #{host.name} (#{host[:vmhostname]})"
247
- options = {
248
- :flavor_ref => flavor(host[:flavor]).id,
249
- :image_ref => image(host[:image]).id,
250
- :nics => [ {'net_id' => network(@options[:openstack_network]).id } ],
251
- :name => host[:vmhostname],
252
- :hostname => host[:vmhostname],
253
- :user_data => host[:user_data] || "#cloud-config\nmanage_etc_hosts: true\n",
254
- :key_name => host[:keyname],
255
- }
256
- options[:security_groups] = security_groups(@options[:security_group]) unless @options[:security_group].nil?
257
- vm = @compute_client.servers.create(options)
258
-
259
- #wait for the new instance to start up
260
- try = 1
261
- attempts = @options[:timeout].to_i / SLEEPWAIT
262
-
263
- while try <= attempts
264
- begin
265
- vm.wait_for(5) { ready? }
266
- break
267
- rescue Fog::Errors::TimeoutError => e
268
- if try >= attempts
269
- @logger.debug "Failed to connect to new OpenStack instance #{host.name} (#{host[:vmhostname]})"
270
- raise e
271
- end
272
- @logger.debug "Timeout connecting to instance #{host.name} (#{host[:vmhostname]}), trying again..."
273
- end
274
- sleep SLEEPWAIT
275
- try += 1
276
- end
255
+ if @options[:create_in_parallel]
256
+ # Enable abort on exception for threads
257
+ Thread.abort_on_exception = true
258
+ @logger.notify "Provisioning OpenStack in parallel"
259
+ provision_parallel
260
+ else
261
+ @logger.notify "Provisioning OpenStack sequentially"
262
+ provision_sequential
263
+ end
264
+ hack_etc_hosts @hosts, @options
265
+ end
277
266
 
278
- if @options[:openstack_floating_ip]
279
- # Associate a public IP to the VM
280
- ip.server = vm
281
- host[:ip] = ip.ip
282
- else
283
- # Get the first address of the VM that was just created just like in the
284
- # OpenStack UI
285
- host[:ip] = vm.addresses.first[1][0]["addr"]
267
+ # Parallel creation wrapper
268
+ def provision_parallel
269
+ # Array to store threads
270
+ threads = @hosts.map do |host|
271
+ Thread.new do
272
+ create_instance_resources(host)
286
273
  end
274
+ end
275
+ # Wait for all threads to finish
276
+ threads.each(&:join)
277
+ end
287
278
 
288
- @logger.debug "OpenStack host #{host.name} (#{host[:vmhostname]}) assigned ip: #{host[:ip]}"
289
-
290
- #set metadata
291
- vm.metadata.update({:jenkins_build_url => @options[:jenkins_build_url].to_s,
292
- :department => @options[:department].to_s,
293
- :project => @options[:project].to_s })
294
- @vms << vm
295
-
296
- # Wait for the host to accept ssh logins
297
- host.wait_for_port(22)
279
+ # Sequential creation wrapper
280
+ def provision_sequential
281
+ @hosts.each do |host|
282
+ create_instance_resources(host)
283
+ end
284
+ end
298
285
 
299
- #enable root if user is not root
300
- enable_root(host)
286
+ # Create the actual instance resources
287
+ def create_instance_resources(host)
288
+ @logger.notify "Provisioning OpenStack"
289
+ if @options[:openstack_floating_ip]
290
+ ip = get_floating_ip
291
+ hostname = ip.ip.gsub('.', '-')
292
+ host[:vmhostname] = hostname + '.rfc1918.puppetlabs.net'
293
+ else
294
+ hostname = ('a'..'z').to_a.shuffle[0, 10].join
295
+ host[:vmhostname] = hostname
296
+ end
301
297
 
302
- provision_storage(host, vm) if @options[:openstack_volume_support]
303
- @logger.notify "OpenStack Volume Support Disabled, can't provision volumes" if not @options[:openstack_volume_support]
298
+ create_or_associate_keypair(host, hostname)
299
+ @logger.debug "Provisioning #{host.name} (#{host[:vmhostname]})"
300
+ options = {
301
+ :flavor_ref => flavor(host[:flavor]).id,
302
+ :image_ref => image(host[:image]).id,
303
+ :nics => [{'net_id' => network(@options[:openstack_network]).id}],
304
+ :name => host[:vmhostname],
305
+ :hostname => host[:vmhostname],
306
+ :user_data => host[:user_data] || "#cloud-config\nmanage_etc_hosts: true\n",
307
+ :key_name => host[:keyname],
308
+ }
309
+ options[:security_groups] = security_groups(@options[:security_group]) unless @options[:security_group].nil?
310
+ vm = @compute_client.servers.create(options)
311
+
312
+ # Wait for the new instance to start up
313
+ try = 1
314
+ attempts = @options[:timeout].to_i / SLEEPWAIT
315
+
316
+ while try <= attempts
317
+ begin
318
+ vm.wait_for(5) { ready? }
319
+ break
320
+ rescue Fog::Errors::TimeoutError => e
321
+ if try >= attempts
322
+ @logger.debug "Failed to connect to new OpenStack instance #{host.name} (#{host[:vmhostname]})"
323
+ raise e
324
+ end
325
+ @logger.debug "Timeout connecting to instance #{host.name} (#{host[:vmhostname]}), trying again..."
326
+ end
327
+ sleep SLEEPWAIT
328
+ try += 1
304
329
  end
305
330
 
306
- hack_etc_hosts @hosts, @options
331
+ if @options[:openstack_floating_ip]
332
+ # Associate a public IP to the VM
333
+ ip.server = vm
334
+ host[:ip] = ip.ip
335
+ else
336
+ # Get the first address of the VM that was just created just like in the
337
+ # OpenStack UI
338
+ host[:ip] = vm.addresses.first[1][0]["addr"]
339
+ end
307
340
 
341
+ @logger.debug "OpenStack host #{host.name} (#{host[:vmhostname]}) assigned ip: #{host[:ip]}"
342
+
343
+ # Set metadata
344
+ vm.metadata.update({:jenkins_build_url => @options[:jenkins_build_url].to_s,
345
+ :department => @options[:department].to_s,
346
+ :project => @options[:project].to_s })
347
+ @vms << vm
348
+
349
+ # Wait for the host to accept SSH logins
350
+ host.wait_for_port(22)
351
+
352
+ # Enable root if the user is not root
353
+ enable_root(host)
354
+
355
+ provision_storage(host, vm) if @options[:openstack_volume_support]
356
+ @logger.notify "OpenStack Volume Support Disabled, can't provision volumes" if not @options[:openstack_volume_support]
357
+
358
+ # Handle exceptions in the thread
359
+ rescue => e
360
+ @logger.error "Thread #{host} failed with error: #{e.message}"
361
+ # Call cleanup function to delete orphaned hosts
362
+ cleanup
363
+ # Pass the error to the main thread to terminate all threads
364
+ Thread.main.raise(e)
365
+ # Terminate the current thread (to prevent hack_etc_hosts trying to run after error raised)
366
+ Thread.kill(Thread.current)
308
367
  end
309
368
 
310
- #Destroy any OpenStack instances
369
+ # Destroy any OpenStack instances
311
370
  def cleanup
312
371
  @logger.notify "Cleaning up OpenStack"
313
372
  @vms.each do |vm|
@@ -339,7 +398,7 @@ module Beaker
339
398
  end
340
399
  end
341
400
 
342
- # enable root on a single host (the current one presumably) but only
401
+ # Enable root on a single host (the current one presumably) but only
343
402
  # if the username isn't 'root'
344
403
  def enable_root(host)
345
404
  if host['user'] != 'root'
@@ -1,3 +1,3 @@
1
1
  module BeakerOpenstack
2
- VERSION = '0.3.0'
2
+ VERSION = '2.0.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker-openstack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Rishi Javia, Kevin Imber, Tony Vu
7
+ - Vox Pupuli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-17 00:00:00.000000000 Z
11
+ date: 2024-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.6'
47
+ version: '2.4'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.6'
54
+ version: '2.4'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '10.1'
61
+ version: 12.3.3
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '10.1'
68
+ version: 12.3.3
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -164,16 +164,33 @@ dependencies:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
166
  version: 1.0.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: beaker
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '5.6'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '5.6'
167
181
  description: For use for the Beaker acceptance testing tool
168
- email:
169
- - rishi.javia@puppet.com, kevin.imber@puppet.com, tony.vu@puppet.com
182
+ email: voxpupuli@groups.io
170
183
  executables:
171
184
  - beaker-openstack
172
185
  extensions: []
173
186
  extra_rdoc_files: []
174
187
  files:
188
+ - ".github/dependabot.yml"
189
+ - ".github/workflows/release.yml"
190
+ - ".github/workflows/test.yml"
175
191
  - ".gitignore"
176
192
  - ".simplecov"
193
+ - CHANGELOG.md
177
194
  - Gemfile
178
195
  - LICENSE
179
196
  - README.md
@@ -185,9 +202,9 @@ files:
185
202
  - openstack.md
186
203
  - spec/beaker/hypervisor/openstack_spec.rb
187
204
  - spec/spec_helper.rb
188
- homepage: https://github.com/puppetlabs/beaker-openstack
205
+ homepage: https://github.com/voxpupuli/beaker-openstack
189
206
  licenses:
190
- - Apache2
207
+ - Apache-2.0
191
208
  metadata: {}
192
209
  post_install_message:
193
210
  rdoc_options: []
@@ -197,15 +214,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
197
214
  requirements:
198
215
  - - ">="
199
216
  - !ruby/object:Gem::Version
200
- version: '0'
217
+ version: '2.7'
218
+ - - "<"
219
+ - !ruby/object:Gem::Version
220
+ version: '4'
201
221
  required_rubygems_version: !ruby/object:Gem::Requirement
202
222
  requirements:
203
223
  - - ">="
204
224
  - !ruby/object:Gem::Version
205
225
  version: '0'
206
226
  requirements: []
207
- rubyforge_project:
208
- rubygems_version: 2.5.1
227
+ rubygems_version: 3.2.33
209
228
  signing_key:
210
229
  specification_version: 4
211
230
  summary: Beaker DSL Extension Helpers!