beaker-abs 0.4.0 → 0.9.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 +5 -5
- data/.github/dependabot.yml +8 -0
- data/.travis.yml +4 -3
- data/CODEOWNERS +1 -0
- data/Gemfile +14 -0
- data/README.md +37 -12
- data/beaker-abs.gemspec +4 -2
- data/lib/beaker-abs/version.rb +1 -1
- data/lib/beaker/hypervisor/abs.rb +93 -3
- metadata +43 -9
- data/MAINTAINERS +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 27a203607bea7dbf86a777845e5001652eaaf84cb9e4cf68bdd363101bbd4720
|
4
|
+
data.tar.gz: 254e86cb24ad8dd8485b04d1eb051cd174e50f04cbe71a8a6a587477d6b2f5c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 076db68386151e5accabb9c2b1407b2c1ddaf43904083c58b99007b3627283a1362943190d4471d4fa2cf51412b7c1f5de8e1c97416f1ece296a0baa564b4cd1
|
7
|
+
data.tar.gz: 168fee1b01fe2266bc2cf48dffa16753ab5ae2c9645077218ca2fc85e81742abb37bd9569bc165f1452d4ab2a29191d3b7900dc7ebcd014158b35173ffacc315
|
data/.travis.yml
CHANGED
data/CODEOWNERS
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
* @puppetlabs/beaker
|
data/Gemfile
CHANGED
@@ -2,3 +2,17 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in beaker-abs.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
def location_for(place, fake_version = nil)
|
7
|
+
if place =~ /^(git:[^#]*)#(.*)/
|
8
|
+
[fake_version, { :git => $1, :branch => $2, :require => false }].compact
|
9
|
+
elsif place =~ /^file:\/\/(.*)/
|
10
|
+
['>= 0', { :path => File.expand_path($1), :require => false }]
|
11
|
+
else
|
12
|
+
[place, { :require => false }]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
group :testing do
|
17
|
+
gem "beaker", *location_for(ENV['BEAKER_VERSION'] || '~> 4.0')
|
18
|
+
end
|
data/README.md
CHANGED
@@ -1,22 +1,21 @@
|
|
1
|
-
#
|
1
|
+
# beaker-abs
|
2
2
|
|
3
3
|
Implements a Beaker hypervisor that makes hosts provisioned by the AlwaysBeScheduling service available to a Beaker run.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
|
7
|
+
Beaker will automatically load the appropriate hypervisors for any given hosts file, so as long as your project dependencies are satisfied there's nothing else to do. No need to `require` this library in your tests.
|
8
8
|
|
9
|
-
|
10
|
-
gem 'beaker-abs'
|
11
|
-
```
|
12
|
-
|
13
|
-
And then execute:
|
14
|
-
|
15
|
-
$ bundle
|
9
|
+
As of Beaker 4.0, all hypervisor and DSL extension libraries have been removed and are no longer dependencies. In order to use a specific hypervisor or DSL extension library in your project, you will need to include them alongside Beaker in your Gemfile or project.gemspec. E.g.
|
16
10
|
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
~~~ruby
|
12
|
+
# Gemfile
|
13
|
+
gem 'beaker', '~>4.0'
|
14
|
+
gem 'beaker-abs'
|
15
|
+
# project.gemspec
|
16
|
+
s.add_runtime_dependency 'beaker', '~>4.0'
|
17
|
+
s.add_runtime_dependency 'beaker-abs'
|
18
|
+
~~~
|
20
19
|
|
21
20
|
## Usage
|
22
21
|
|
@@ -42,6 +41,32 @@ env ABS_RESOURCE_HOSTS=<data> beaker --hosts hosts.yaml
|
|
42
41
|
```
|
43
42
|
|
44
43
|
Beaker will populate the `vmhostname` property for each host using information provided by the AlwaysBeScheduling service.
|
44
|
+
This is typically used in a CI scenario, where the jenkins run-me-maybe plugin is populating the ABS_RESOURCE_HOSTS variable.
|
45
|
+
|
46
|
+
### Using vmfloaty
|
47
|
+
|
48
|
+
If you do not specify a ABS_RESOURCE_HOSTS and request to provision via the beaker options, beaker-abs will fallback to using
|
49
|
+
your vmfloaty configuration. By default it will look for the service named 'abs'. The name can also be configured via
|
50
|
+
the environment variable ABS_SERVICE_NAME or the top level option in the hosts file abs_service_name. Similarly, the priority defaults to "1" which means
|
51
|
+
it will take precedence over CI tests. Be careful not to run a CI test with this option. The priority can be configured via
|
52
|
+
the environment variable ABS_SERVICE_PRIORITY or the top level option in the hosts file abs_service_priority.
|
53
|
+
|
54
|
+
#### Examples
|
55
|
+
|
56
|
+
Changing from default priority 1 to 3 via env var
|
57
|
+
```
|
58
|
+
ABS_SERVICE_PRIORITY=3 bundle exec beaker --provision --hosts=hosts.cfg --tests acceptance/tests
|
59
|
+
```
|
60
|
+
|
61
|
+
Changing the service name to look for in ~/.vmfloaty.yml via a beaker option file
|
62
|
+
```
|
63
|
+
$ cat options.rb
|
64
|
+
{
|
65
|
+
provision: 'true',
|
66
|
+
abs_service_name: "FOOBAR"
|
67
|
+
}
|
68
|
+
$ bundle exec beaker --hosts=hosts.cfg --tests acceptance/tests --options options.rb
|
69
|
+
```
|
45
70
|
|
46
71
|
## Development
|
47
72
|
|
data/beaker-abs.gemspec
CHANGED
@@ -18,8 +18,10 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.
|
22
|
-
spec.
|
21
|
+
spec.add_dependency "beaker", "~> 4.0"
|
22
|
+
spec.add_dependency "vmfloaty", ">= 1.0", "< 2"
|
23
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
24
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
23
25
|
spec.add_development_dependency "minitest", "~> 5.0"
|
24
26
|
|
25
27
|
end
|
data/lib/beaker-abs/version.rb
CHANGED
@@ -1,7 +1,22 @@
|
|
1
1
|
require 'beaker'
|
2
2
|
require 'json'
|
3
|
+
require 'pry-byebug'
|
4
|
+
require 'vmfloaty'
|
5
|
+
require 'vmfloaty/conf'
|
6
|
+
require 'vmfloaty/utils'
|
3
7
|
|
4
8
|
module Beaker
|
9
|
+
class Clifloaty
|
10
|
+
# the floaty service needs a 'cli' object that would normally represent the flags passed on the command line
|
11
|
+
# that object is then "merged" with the floaty config files to add/change options
|
12
|
+
# creating a dummy cli here
|
13
|
+
attr_reader :url, :token, :user, :service, :priority
|
14
|
+
def initialize(service, priority)
|
15
|
+
@service = service #the name of the service you want to use
|
16
|
+
@priority = priority
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
5
20
|
class Abs < Beaker::Hypervisor
|
6
21
|
def initialize(hosts, options)
|
7
22
|
@options = options
|
@@ -9,7 +24,12 @@ module Beaker
|
|
9
24
|
@hosts = hosts
|
10
25
|
|
11
26
|
resource_hosts = ENV['ABS_RESOURCE_HOSTS'] || @options[:abs_resource_hosts]
|
12
|
-
|
27
|
+
|
28
|
+
@abs_service_name = ENV['ABS_SERVICE_NAME'] || @options[:abs_service_name] || "abs"
|
29
|
+
@abs_service_priority = ENV['ABS_SERVICE_PRIORITY'] || @options[:abs_service_priority] || "1"
|
30
|
+
|
31
|
+
raise ArgumentError.new("ABS_RESOURCE_HOSTS must be specified when using the Beaker::Abs hypervisor when provisioning") if resource_hosts.nil? && !options[:provision]
|
32
|
+
resource_hosts = provision_vms(hosts).to_json if resource_hosts.nil?
|
13
33
|
@resource_hosts = JSON.parse(resource_hosts)
|
14
34
|
end
|
15
35
|
|
@@ -21,8 +41,9 @@ module Beaker
|
|
21
41
|
engine = resource_host['engine']
|
22
42
|
case engine
|
23
43
|
when /^(vmpooler|nspooler)$/
|
24
|
-
#
|
25
|
-
|
44
|
+
# ABS does not set ip, do not include
|
45
|
+
# vmpooler hostname is the platform name, nspooler hostname == vmhostname
|
46
|
+
return [:vmhostname]
|
26
47
|
else
|
27
48
|
super
|
28
49
|
end
|
@@ -50,6 +71,7 @@ module Beaker
|
|
50
71
|
type = resource_host['type']
|
51
72
|
type2hosts[type] ||= []
|
52
73
|
type2hosts[type] << resource_host['hostname']
|
74
|
+
type2hosts[type] << resource_host['ip']
|
53
75
|
end
|
54
76
|
|
55
77
|
# for each host, get a vm for that template type
|
@@ -60,6 +82,7 @@ module Beaker
|
|
60
82
|
|
61
83
|
if provisioned_hosts = type2hosts[template]
|
62
84
|
host['vmhostname'] = provisioned_hosts.shift
|
85
|
+
host['ip'] = provisioned_hosts.shift
|
63
86
|
else
|
64
87
|
raise ArgumentError.new("Failed to provision host '#{host.hostname}', no template of type '#{host['template']}' was provided.")
|
65
88
|
end
|
@@ -72,5 +95,72 @@ module Beaker
|
|
72
95
|
def cleanup
|
73
96
|
# nothing to do
|
74
97
|
end
|
98
|
+
|
99
|
+
def provision_vms(hosts)
|
100
|
+
|
101
|
+
verbose = false
|
102
|
+
config = Conf.read_config # get the vmfloaty config file in home dir
|
103
|
+
|
104
|
+
# TODO: the options object provided by the floaty cli is required in get_service_config()
|
105
|
+
cli = Clifloaty.new(@abs_service_name, @abs_service_priority)
|
106
|
+
|
107
|
+
#the service object is the interfacte to all methods
|
108
|
+
abs_service = Service.new(cli, config)
|
109
|
+
supported_vm_list = abs_service.list(verbose)
|
110
|
+
supported_vm_list = supported_vm_list.reject { |e| e.empty? }
|
111
|
+
supported_vm_list = supported_vm_list.reject { |e| e.start_with?("*") }
|
112
|
+
|
113
|
+
vm_request = generate_floaty_request_strings(hosts, supported_vm_list)
|
114
|
+
|
115
|
+
|
116
|
+
vm_beaker_abs = []
|
117
|
+
# Will return a JSON Object like this:
|
118
|
+
# {"redhat-7-x86_64"=>["rich-apparition.delivery.puppetlabs.net", "despondent-side.delivery.puppetlabs.net"], "centos-7-x86_64"=>["firmer-vamp.delivery.puppetlabs.net"]}
|
119
|
+
os_types = Utils.generate_os_hash(vm_request.split)
|
120
|
+
vm_floaty_output = abs_service.retrieve(verbose, os_types)
|
121
|
+
|
122
|
+
|
123
|
+
raise ArgumentError.new("Timed out getting the ABS resources") if vm_floaty_output.nil?
|
124
|
+
vm_floaty_output_cleaned = Utils.standardize_hostnames(vm_floaty_output)
|
125
|
+
vm_floaty_output_cleaned.each do |os_platform, value|
|
126
|
+
# filter any extra key that does not have an Array value
|
127
|
+
if !value.is_a?(Array)
|
128
|
+
next
|
129
|
+
end
|
130
|
+
value.each do | hostname |
|
131
|
+
# I don't think the engine is being used by the beaker-abs process
|
132
|
+
vm_beaker_abs.push({"hostname": hostname, "type": os_platform, "engine":"beaker-abs"})
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# to do need to figure out what the NSPooler requests are, and combine the output for that with vm_beaker_abs and return that object
|
137
|
+
# for now just returning vmpooler abs object
|
138
|
+
vm_beaker_abs
|
139
|
+
end
|
140
|
+
|
141
|
+
# Based upon the host file, this method counts the number of each template needed
|
142
|
+
# and generates the host=Xnum eg redhat-7-x86_64=2 expected by floaty
|
143
|
+
def generate_floaty_request_strings(hosts, supported_vm_list)
|
144
|
+
vm_list = {}
|
145
|
+
|
146
|
+
hosts.each do |host|
|
147
|
+
if supported_vm_list.include?(host[:template])
|
148
|
+
if vm_list.include?(host[:template])
|
149
|
+
vm_list[host[:template]] = vm_list[host[:template]] + 1
|
150
|
+
else
|
151
|
+
vm_list[host[:template]] = 1
|
152
|
+
end
|
153
|
+
else
|
154
|
+
raise ArgumentError.new("#{host.name} has a template #{host[:template]} that is not found in vmpooler or nspooler")
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
vm_request = ""
|
159
|
+
vm_list.each do |key, value|
|
160
|
+
vm_request.concat("#{key}=#{value} ")
|
161
|
+
end
|
162
|
+
|
163
|
+
vm_request
|
164
|
+
end
|
75
165
|
end
|
76
166
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beaker-abs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Cooper
|
@@ -9,36 +9,70 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: beaker
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '4.0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '4.0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: vmfloaty
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.0'
|
35
|
+
- - "<"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '2'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '1.0'
|
45
|
+
- - "<"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2'
|
14
48
|
- !ruby/object:Gem::Dependency
|
15
49
|
name: bundler
|
16
50
|
requirement: !ruby/object:Gem::Requirement
|
17
51
|
requirements:
|
18
52
|
- - "~>"
|
19
53
|
- !ruby/object:Gem::Version
|
20
|
-
version: '1
|
54
|
+
version: '2.1'
|
21
55
|
type: :development
|
22
56
|
prerelease: false
|
23
57
|
version_requirements: !ruby/object:Gem::Requirement
|
24
58
|
requirements:
|
25
59
|
- - "~>"
|
26
60
|
- !ruby/object:Gem::Version
|
27
|
-
version: '1
|
61
|
+
version: '2.1'
|
28
62
|
- !ruby/object:Gem::Dependency
|
29
63
|
name: rake
|
30
64
|
requirement: !ruby/object:Gem::Requirement
|
31
65
|
requirements:
|
32
66
|
- - "~>"
|
33
67
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
68
|
+
version: '13.0'
|
35
69
|
type: :development
|
36
70
|
prerelease: false
|
37
71
|
version_requirements: !ruby/object:Gem::Requirement
|
38
72
|
requirements:
|
39
73
|
- - "~>"
|
40
74
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
75
|
+
version: '13.0'
|
42
76
|
- !ruby/object:Gem::Dependency
|
43
77
|
name: minitest
|
44
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,12 +96,13 @@ executables: []
|
|
62
96
|
extensions: []
|
63
97
|
extra_rdoc_files: []
|
64
98
|
files:
|
99
|
+
- ".github/dependabot.yml"
|
65
100
|
- ".gitignore"
|
66
101
|
- ".travis.yml"
|
102
|
+
- CODEOWNERS
|
67
103
|
- Gemfile
|
68
104
|
- HISTORY.md
|
69
105
|
- LICENSE.txt
|
70
|
-
- MAINTAINERS
|
71
106
|
- README.md
|
72
107
|
- Rakefile
|
73
108
|
- beaker-abs.gemspec
|
@@ -93,8 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
128
|
- !ruby/object:Gem::Version
|
94
129
|
version: '0'
|
95
130
|
requirements: []
|
96
|
-
|
97
|
-
rubygems_version: 2.6.12
|
131
|
+
rubygems_version: 3.0.8
|
98
132
|
signing_key:
|
99
133
|
specification_version: 4
|
100
134
|
summary: Let's test Puppet, using hosts provisioned by Always Be Scheduling service.
|
data/MAINTAINERS
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"version": 1,
|
3
|
-
"file_format": "This MAINTAINERS file format is described at http://pup.pt/maintainers",
|
4
|
-
"issues": "https://tickets.puppetlabs.com/browse/QENG/",
|
5
|
-
"people": [
|
6
|
-
{
|
7
|
-
"github": "joshcooper",
|
8
|
-
"email": "josh@puppet.com",
|
9
|
-
"name": "Josh Cooper"
|
10
|
-
},
|
11
|
-
{
|
12
|
-
"github": "rick",
|
13
|
-
"email": "rick@puppet.com",
|
14
|
-
"name": "Rick Bradley"
|
15
|
-
}
|
16
|
-
]
|
17
|
-
}
|