vmfloaty 0.11.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 248dd5c9a8890b8990a7dad8dd7a21f52c8a8c2b65112c55449a5b5d3ac818af
4
- data.tar.gz: 22cf2070b571a0feded3967308e6b11d42b5ea296d94be7c434a73454611f6df
3
+ metadata.gz: 3250656d33ed86eadaeded7da8f91b1c320f38ee9e8637d657273b43dab897f4
4
+ data.tar.gz: 1b78092a62379ee36ce7c78dc52a0f7920366dc15e3795edc4c2be3a33a53f15
5
5
  SHA512:
6
- metadata.gz: 8cd836baeb4a37720024616f1ce113046fc6291cc73694edbaf74ee727648c1339ada9e004ba0d630822a315948d69bb9e6c67da1ec04df3ae079bf207a432c7
7
- data.tar.gz: 46e15ff3d3d1cecd68cb92ed3fcd5d8240f68f45f704dff9fbf1e87007cae7b95b2d6f9d4b08753979b2c82fa6f412534a93e3bb17b96fb052003e821b31cf94
6
+ metadata.gz: 3f0bab1c9aeda1ecc76b0246faac85267528ae2cc9708bf9ca430134e1535af701d565be9a1a4f32566d4d07d21d6a02e73d4d9f3188183206a6bbcb1274796d
7
+ data.tar.gz: 020e1ffbc61da0d7784e453229e82c737939ff864d0c9a7a36d4ed563827a01a2328681d5832a808f0dd0613e26fd4f07b81f9769df3be72a5dd85111cd4505f
data/README.md CHANGED
@@ -14,9 +14,8 @@ A CLI helper tool for [Puppet's vmpooler](https://github.com/puppetlabs/vmpooler
14
14
  - [Example workflow](#example-workflow)
15
15
  - [vmfloaty dotfile](#vmfloaty-dotfile)
16
16
  - [Basic configuration](#basic-configuration)
17
- - [Default to Puppet's ABS instead of vmpooler](#default-to-puppets-abs-instead-of-vmpooler)
18
- - [Configuring multiple services](#configuring-multiple-services)
19
- - [Using a Nonstandard Pooler service](#using-a-nonstandard-pooler-service)
17
+ - [Using multiple services](#using-multiple-services)
18
+ - [Using backends besides VMPooler](#using-backends-besides-vmpooler)
20
19
  - [Valid config keys](#valid-config-keys)
21
20
  - [Tab Completion](#tab-completion)
22
21
  - [vmpooler API](#vmpooler-api)
@@ -54,6 +53,7 @@ $ floaty --help
54
53
  modify Modify a VM's tags, time to live, disk space, or reservation reason
55
54
  query Get information about a given vm
56
55
  revert Reverts a vm to a specified snapshot
56
+ service Display information about floaty services and their configuration
57
57
  snapshot Takes a snapshot of a given vm
58
58
  ssh Grabs a single vm and sshs into it
59
59
  status Prints the status of pools in the pooler service
@@ -90,95 +90,32 @@ floaty get centos-7-x86_64=2 debian-7-x86_64 windows-10=3 --token mytokenstring
90
90
 
91
91
  ### vmfloaty dotfile
92
92
 
93
- If you do not wish to continually specify various config options with the cli, you can have a dotfile in your home directory for some defaults. For example:
93
+ If you do not wish to continually specify various config options with the cli, you can `~/.vmfloaty.yml` for some defaults. You can get a list of valid service types and example configuration files via `floaty service types` and `floaty service examples`, respectively.
94
94
 
95
95
  #### Basic configuration
96
96
 
97
- ```yaml
98
- # file at ~/.vmfloaty.yml
99
- url: 'https://vmpooler.example.net/api/v1'
100
- user: 'brian'
101
- token: 'tokenstring'
102
- ```
103
-
104
- Now vmfloaty will use those config files if no flag was specified.
105
-
106
- #### Default to Puppet's ABS instead of vmpooler
97
+ This is the simplest type of configuration where you only need a single service:
107
98
 
108
99
  ```yaml
109
100
  # file at ~/.vmfloaty.yml
110
- url: 'https://abs.example.net'
101
+ url: 'https://vmpooler.example.net/api/v1'
111
102
  user: 'brian'
112
103
  token: 'tokenstring'
113
- type: 'abs'
114
104
  ```
115
105
 
116
- #### Configuring multiple services
106
+ Run `floaty service examples` to see additional configuration options
117
107
 
118
- Most commands allow you to specify a `--service <servicename>` option to allow the use of multiple vmpooler instances. This can be useful when you'd rather not specify a `--url` or `--token` by hand for alternate services.
108
+ #### Using multiple services
119
109
 
120
- To configure multiple services, you can set up your `~/.vmfloaty.yml` config file like this:
121
-
122
- ```yaml
123
- # file at /Users/me/.vmfloaty.yml
124
- user: 'brian'
125
- services:
126
- main:
127
- url: 'https://vmpooler.example.net/api/v1'
128
- token: 'tokenstring'
129
- alternate:
130
- url: 'https://vmpooler.example.com/api/v1'
131
- token: 'alternate-tokenstring'
132
- ```
110
+ Most commands allow you to specify a `--service <servicename>` option to allow the use of multiple pooler instances. This can be useful when you'd rather not specify a `--url` or `--token` by hand for alternate services.
133
111
 
134
112
  - If you run `floaty` without a `--service <name>` option, vmfloaty will use the first configured service by default.
135
- With the config file above, the default would be to use the 'main' vmpooler instance.
136
113
  - If keys are missing for a configured service, vmfloaty will attempt to fall back to the top-level values.
137
- With the config file above, 'brian' will be used as the username for both configured services, since neither specifies a username.
138
-
139
- Examples using the above configuration:
140
-
141
- List available vm types from our main vmpooler instance:
142
-
143
- ```bash
144
- floaty list --service main
145
- # or, since the first configured service is used by default:
146
- floaty list
147
- ```
148
-
149
- List available vm types from our alternate vmpooler instance:
150
-
151
- ```bash
152
- floaty list --service alternate
153
- ```
114
+ This makes it so you can specify things like `user` once at the top of your `~/.vmfloaty.yml`.
154
115
 
155
- #### Using a Nonstandard Pooler service
116
+ #### Using backends besides VMPooler
156
117
 
157
- vmfloaty is capable of working with Puppet's [nonstandard pooler](https://github.com/puppetlabs/nspooler) in addition to the default vmpooler API. To add a nonstandard pooler service, specify an API `type` value in your service configuration, like this:
158
-
159
- ```yaml
160
- # file at /Users/me/.vmfloaty.yml
161
- user: 'brian'
162
- services:
163
- vm:
164
- url: 'https://vmpooler.example.net/api/v1'
165
- token: 'tokenstring'
166
- ns:
167
- url: 'https://nspooler.example.net/api/v1'
168
- token: 'nspooler-tokenstring'
169
- type: 'nonstandard' # <-- 'type' is necessary for any non-vmpooler service
170
- abs:
171
- url: 'https://abs.example.net/'
172
- token: 'abs-tokenstring'
173
- type: 'abs' # <-- 'type' is necessary for any non-vmpooler service
174
-
175
- ```
176
-
177
- With this configuration, you could list available OS types from nspooler like this:
178
-
179
- ```bash
180
- floaty list --service ns
181
- ```
118
+ vmfloaty supports additional backends besides VMPooler. To see a complete list, run `floaty service types`. The output of `floaty service examples` will show you how to configure each of the supported backends.
182
119
 
183
120
  #### Valid config keys
184
121
 
@@ -190,6 +127,7 @@ Here are the keys that vmfloaty currently supports:
190
127
  - url (String)
191
128
  - services (String)
192
129
  - type (String)
130
+ - vmpooler_fallback (String)
193
131
 
194
132
  ### Tab Completion
195
133
 
@@ -207,6 +145,12 @@ If you are running on macOS and use Homebrew's `bash-completion` formula, you ca
207
145
  ln -s $(floaty completion --shell bash) /usr/local/etc/bash_completion.d/floaty
208
146
  ```
209
147
 
148
+ There is also tab completion for zsh:
149
+
150
+ ```zsh
151
+ source $(floaty completion --shell zsh)
152
+ ```
153
+
210
154
  ## vmpooler API
211
155
 
212
156
  This cli tool uses the [vmpooler API](https://github.com/puppetlabs/vmpooler/blob/master/API.md).
@@ -2,29 +2,37 @@
2
2
 
3
3
  _vmfloaty()
4
4
  {
5
- local cur prev subcommands template_subcommands hostname_subcommands
5
+ local cur prev commands template_arg_commands hostname_arg_commands service_subcommands
6
+
6
7
  COMPREPLY=()
7
8
  cur="${COMP_WORDS[COMP_CWORD]}"
8
9
  prev="${COMP_WORDS[COMP_CWORD-1]}"
9
10
 
10
- subcommands="delete get help list modify query revert snapshot ssh status summary token"
11
- template_subcommands="get ssh"
12
- hostname_subcommands="delete modify query revert snapshot"
11
+ commands="delete get help list modify query revert service snapshot ssh status summary token"
12
+ template_arg_commands="get ssh"
13
+ hostname_arg_commands="delete modify query revert snapshot"
14
+ service_subcommands="types examples"
13
15
 
14
16
  if [[ $cur == -* ]] ; then
15
17
  # TODO: option completion
16
18
  COMPREPLY=()
17
- elif [[ $template_subcommands =~ (^| )$prev($| ) ]] ; then
19
+ elif [[ $template_arg_commands =~ (^| )$prev($| ) ]] ; then
18
20
  if [[ -z "$_vmfloaty_avail_templates" ]] ; then
21
+ # TODO: need a --hostnameonly equivalent here because the section headers of
22
+ # `floaty list` are adding some spurious entries (including files in current
23
+ # directory because part of the headers is `**` which is getting expanded)
19
24
  _vmfloaty_avail_templates=$(floaty list 2>/dev/null)
20
25
  fi
21
26
 
22
27
  COMPREPLY=( $(compgen -W "${_vmfloaty_avail_templates}" -- "${cur}") )
23
- elif [[ $hostname_subcommands =~ (^| )$prev($| ) ]] ; then
24
- _vmfloaty_active_hostnames=$(floaty list --active 2>/dev/null | grep '^-' | cut -d' ' -f2)
28
+ elif [[ $hostname_arg_commands =~ (^| )$prev($| ) ]] ; then
29
+ _vmfloaty_active_hostnames=$(floaty list --active --hostnameonly 2>/dev/null)
25
30
  COMPREPLY=( $(compgen -W "${_vmfloaty_active_hostnames}" -- "${cur}") )
26
- else
27
- COMPREPLY=( $(compgen -W "${subcommands}" -- "${cur}") )
31
+ elif [[ "service" == $prev ]] ; then
32
+ COMPREPLY=( $(compgen -W "${service_subcommands}" -- "${cur}") )
33
+ elif [[ $1 == $prev ]] ; then
34
+ # only show top level commands we are at root
35
+ COMPREPLY=( $(compgen -W "${commands}" -- "${cur}") )
28
36
  fi
29
37
  }
30
38
  complete -F _vmfloaty floaty
@@ -0,0 +1,43 @@
1
+ _floaty()
2
+ {
3
+ local line commands template_arg_commands hostname_arg_commands service_subcommands
4
+
5
+ commands="delete get help list modify query revert service snapshot ssh status summary token"
6
+
7
+ template_arg_commands=("get" "ssh")
8
+ hostname_arg_commands=("delete" "modify" "query" "revert" "snapshot")
9
+ service_subcommands=("types" "examples")
10
+
11
+ _arguments -C \
12
+ "1: :(${commands})" \
13
+ "*::arg:->args"
14
+
15
+ if ((template_arg_commands[(Ie)$line[1]])); then
16
+ _floaty_template_sub
17
+ elif ((hostname_arg_commands[(Ie)$line[1]])); then
18
+ _floaty_hostname_sub
19
+ elif [[ "service" == $line[1] ]]; then
20
+ _arguments "1: :(${service_subcommands})"
21
+ fi
22
+ }
23
+
24
+ _floaty_template_sub()
25
+ {
26
+ if [[ -z "$_vmfloaty_avail_templates" ]] ; then
27
+ # TODO: need a --hostnameonly equivalent here because the section headers of
28
+ # `floaty list` are adding some spurious entries (including files in current
29
+ # directory because part of the headers is `**` which is getting expanded)
30
+ _vmfloaty_avail_templates=$(floaty list 2>/dev/null)
31
+ fi
32
+
33
+ _arguments "1: :(${_vmfloaty_avail_templates})"
34
+ }
35
+
36
+ _floaty_hostname_sub()
37
+ {
38
+ _vmfloaty_active_hostnames=$(floaty list --active --hostnameonly 2>/dev/null)
39
+
40
+ _arguments "1: :(${_vmfloaty_active_hostnames})"
41
+ }
42
+
43
+ compdef _floaty floaty
data/lib/vmfloaty.rb CHANGED
@@ -20,7 +20,7 @@ class Vmfloaty
20
20
 
21
21
  def run # rubocop:disable Metrics/AbcSize
22
22
  program :version, Vmfloaty::VERSION
23
- program :description, "A CLI helper tool for Puppet's vmpooler to help you stay afloat"
23
+ program :description, "A CLI helper tool for Puppet's vmpooler to help you stay afloat.\n\nConfiguration may be placed in a ~/.vmfloaty.yml file."
24
24
 
25
25
  config = Conf.read_config
26
26
 
@@ -39,8 +39,13 @@ class Vmfloaty
39
39
  c.option '--force', 'Forces vmfloaty to get requested vms'
40
40
  c.option '--json', 'Prints retrieved vms in JSON format'
41
41
  c.option '--ondemand', 'Requested vms are provisioned upon receival of the request, tracked by a request ID'
42
+ c.option '--continue STRING', String, 'resume polling ABS for job_id, for use when the cli was interrupted'
43
+ c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
42
44
  c.action do |args, options|
43
45
  verbose = options.verbose || config['verbose']
46
+ if options.loglevel
47
+ FloatyLogger.setlevel = options.loglevel
48
+ end
44
49
  service = Service.new(options, config)
45
50
  use_token = !options.notoken
46
51
  force = options.force
@@ -52,6 +57,11 @@ class Vmfloaty
52
57
 
53
58
  os_types = Utils.generate_os_hash(args)
54
59
 
60
+ if os_types.empty?
61
+ FloatyLogger.error 'No operating systems provided to obtain. See `floaty get --help` for more information on how to get VMs.'
62
+ exit 1
63
+ end
64
+
55
65
  max_pool_request = 5
56
66
  large_pool_requests = os_types.select { |_, v| v > max_pool_request }
57
67
  if !large_pool_requests.empty? && !force
@@ -60,12 +70,7 @@ class Vmfloaty
60
70
  exit 1
61
71
  end
62
72
 
63
- if os_types.empty?
64
- FloatyLogger.error 'No operating systems provided to obtain. See `floaty get --help` for more information on how to get VMs.'
65
- exit 1
66
- end
67
-
68
- response = service.retrieve(verbose, os_types, use_token, options.ondemand)
73
+ response = service.retrieve(verbose, os_types, use_token, options.ondemand, options.continue)
69
74
  request_id = response['request_id'] if options.ondemand
70
75
  response = service.wait_for_request(verbose, request_id) if options.ondemand
71
76
 
@@ -87,23 +92,47 @@ class Vmfloaty
87
92
  c.option '--verbose', 'Enables verbose output'
88
93
  c.option '--service STRING', String, 'Configured pooler service name'
89
94
  c.option '--active', 'Prints information about active vms for a given token'
95
+ c.option '--json', 'Prints information as JSON'
96
+ c.option '--hostnameonly', 'When listing active vms, prints only hostnames, one per line'
90
97
  c.option '--token STRING', String, 'Token for pooler service'
91
98
  c.option '--url STRING', String, 'URL of pooler service'
99
+ c.option '--user STRING', String, 'User to authenticate with'
100
+ c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
92
101
  c.action do |args, options|
93
102
  verbose = options.verbose || config['verbose']
103
+ if options.loglevel
104
+ FloatyLogger.setlevel = options.loglevel
105
+ end
94
106
 
95
107
  service = Service.new(options, config)
96
108
  filter = args[0]
97
109
 
98
110
  if options.active
99
111
  # list active vms
100
- running_vms = service.list_active(verbose)
112
+ if service.type == "ABS"
113
+ # this is actually job_ids
114
+ running_vms = service.list_active_job_ids(verbose, service.url, service.user)
115
+ else
116
+ running_vms = service.list_active(verbose)
117
+ end
101
118
  host = URI.parse(service.url).host
102
119
  if running_vms.empty?
103
- puts "You have no running VMs on #{host}"
120
+ if options.json
121
+ puts {}.to_json
122
+ else
123
+ FloatyLogger.info "You have no running VMs on #{host}"
124
+ end
104
125
  else
105
- puts "Your VMs on #{host}:"
106
- Utils.pretty_print_hosts(verbose, service, running_vms)
126
+ if options.json
127
+ puts Utils.get_host_data(verbose, service, running_vms).to_json
128
+ elsif options.hostnameonly
129
+ Utils.get_host_data(verbose, service, running_vms).each do |hostname, host_data|
130
+ Utils.print_fqdn_for_host(service, hostname, host_data)
131
+ end
132
+ else
133
+ puts "Your VMs on #{host}:"
134
+ Utils.pretty_print_hosts(verbose, service, running_vms)
135
+ end
107
136
  end
108
137
  else
109
138
  # list available vms from pooler
@@ -116,7 +145,7 @@ class Vmfloaty
116
145
  command :query do |c|
117
146
  c.syntax = 'floaty query hostname [options]'
118
147
  c.summary = 'Get information about a given vm'
119
- c.description = 'Given a hostname from the pooler service, vmfloaty with query the service to get various details about the vm.'
148
+ c.description = 'Given a hostname from the pooler service, vmfloaty with query the service to get various details about the vm. If using ABS, you can query a job_id'
120
149
  c.example 'Get information about a sample host', 'floaty query hostname --url http://vmpooler.example.com'
121
150
  c.option '--verbose', 'Enables verbose output'
122
151
  c.option '--service STRING', String, 'Configured pooler service name'
@@ -155,7 +184,12 @@ class Vmfloaty
155
184
  FloatyLogger.error 'ERROR: Provide a hostname or specify --all.'
156
185
  exit 1
157
186
  end
158
- running_vms = modify_all ? service.list_active(verbose) : hostname.split(',')
187
+ running_vms =
188
+ if modify_all
189
+ service.list_active(verbose)
190
+ else
191
+ hostname.split(',')
192
+ end
159
193
 
160
194
  tags = options.tags ? JSON.parse(options.tags) : nil
161
195
  modify_hash = {
@@ -179,7 +213,7 @@ class Vmfloaty
179
213
  end
180
214
  if ok
181
215
  if modify_all
182
- puts 'Successfully modified all VMs.'
216
+ puts "Successfully modified all #{running_vms.count} VMs."
183
217
  else
184
218
  puts "Successfully modified VM #{hostname}."
185
219
  end
@@ -200,10 +234,17 @@ class Vmfloaty
200
234
  c.option '--service STRING', String, 'Configured pooler service name'
201
235
  c.option '--all', 'Deletes all vms acquired by a token'
202
236
  c.option '-f', 'Does not prompt user when deleting all vms'
237
+ c.option '--json', 'Outputs hosts scheduled for deletion as JSON'
203
238
  c.option '--token STRING', String, 'Token for pooler service'
204
239
  c.option '--url STRING', String, 'URL of pooler service'
240
+ c.option '--user STRING', String, 'User to authenticate with'
241
+ c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
205
242
  c.action do |args, options|
206
243
  verbose = options.verbose || config['verbose']
244
+ if options.loglevel
245
+ FloatyLogger.setlevel = options.loglevel
246
+ end
247
+
207
248
  service = Service.new(options, config)
208
249
  hostnames = args[0]
209
250
  delete_all = options.all
@@ -213,14 +254,25 @@ class Vmfloaty
213
254
  successes = []
214
255
 
215
256
  if delete_all
216
- running_vms = service.list_active(verbose)
257
+ if service.type == "ABS"
258
+ # this is actually job_ids
259
+ running_vms = service.list_active_job_ids(verbose, service.url, service.user)
260
+ else
261
+ running_vms = service.list_active(verbose)
262
+ end
217
263
  if running_vms.empty?
218
- puts 'You have no running VMs.'
264
+ if options.json
265
+ puts {}.to_json
266
+ else
267
+ FloatyLogger.info "You have no running VMs."
268
+ end
219
269
  else
220
- Utils.pretty_print_hosts(verbose, service, running_vms, true)
221
- # Confirm deletion
222
270
  confirmed = true
223
- confirmed = agree('Delete all these VMs? [y/N]') unless force
271
+ unless force
272
+ Utils.pretty_print_hosts(verbose, service, running_vms, true)
273
+ # Confirm deletion
274
+ confirmed = agree('Delete all these VMs? [y/N]')
275
+ end
224
276
  if confirmed
225
277
  response = service.delete(verbose, running_vms)
226
278
  response.each do |hostname, result|
@@ -256,10 +308,15 @@ class Vmfloaty
256
308
  end
257
309
 
258
310
  unless successes.empty?
259
- FloatyLogger.info unless failures.empty?
260
- puts 'Scheduled the following VMs for deletion:'
261
- successes.each do |hostname|
262
- puts "- #{hostname}"
311
+ if options.json
312
+ puts successes.to_json
313
+ else
314
+ puts 'Scheduled the following VMs for deletion:'
315
+ output = ''
316
+ successes.each do |hostname|
317
+ output += "- #{hostname}\n"
318
+ end
319
+ puts output
263
320
  end
264
321
  end
265
322
 
@@ -331,8 +388,12 @@ class Vmfloaty
331
388
  c.option '--service STRING', String, 'Configured pooler service name'
332
389
  c.option '--url STRING', String, 'URL of pooler service'
333
390
  c.option '--json', 'Prints status in JSON format'
391
+ c.option '--loglevel STRING', String, 'the log level to use (debug, info, error)'
334
392
  c.action do |_, options|
335
393
  verbose = options.verbose || config['verbose']
394
+ if options.loglevel
395
+ FloatyLogger.setlevel = options.loglevel
396
+ end
336
397
  service = Service.new(options, config)
337
398
  if options.json
338
399
  pp service.status(verbose)
@@ -459,6 +520,70 @@ class Vmfloaty
459
520
  end
460
521
  end
461
522
 
523
+ command :service do |c|
524
+ c.syntax = 'floaty service <types examples>'
525
+ c.summary = 'Display information about floaty services and their configuration'
526
+ c.description = 'Display information about floaty services to aid in setting up a configuration file.'
527
+ c.example 'Print a list of the valid service types', 'floaty service types'
528
+ c.example 'Print a sample config file with multiple services', 'floaty service examples'
529
+ c.example 'list vms from the service named "nspooler-prod"', 'floaty list --service nspooler-prod'
530
+ c.action do |args, options|
531
+ action = args.first
532
+
533
+ example_config = Utils.strip_heredoc(<<-CONFIG)
534
+ # Sample ~/.vmfloaty.yml with just vmpooler
535
+ user: 'jdoe'
536
+ url: 'https://vmpooler.example.net'
537
+ token: '456def789'
538
+
539
+ # Sample ~/.vmfloaty.yml with multiple services
540
+ # Note: when the --service is not specified on the command line,
541
+ # the first service listed here is selected automatically
542
+ user: 'jdoe'
543
+ services:
544
+ abs-prod:
545
+ type: 'abs'
546
+ url: 'https://abs.example.net/api/v2'
547
+ token: '123abc456'
548
+ vmpooler_fallback: 'vmpooler-prod'
549
+ nspooler-prod:
550
+ type: 'nspooler'
551
+ url: 'https://nspooler.example.net'
552
+ token: '789ghi012'
553
+ vmpooler-dev:
554
+ type: 'vmpooler'
555
+ url: 'https://vmpooler-dev.example.net'
556
+ token: '987dsa654'
557
+ vmpooler-prod:
558
+ type: 'vmpooler'
559
+ url: 'https://vmpooler.example.net'
560
+ token: '456def789'
561
+
562
+ CONFIG
563
+
564
+ types_output = Utils.strip_heredoc(<<-TYPES)
565
+ The values on the left below can be used in ~/.vmfloaty.yml as the value of type:
566
+
567
+ abs: Puppet's Always Be Scheduling
568
+ nspooler: Puppet's Non-standard Pooler, aka NSPooler
569
+ vmpooler: Puppet's VMPooler
570
+ TYPES
571
+
572
+ case action
573
+ when 'examples'
574
+ FloatyLogger.info example_config
575
+ when 'types'
576
+ FloatyLogger.info types_output
577
+ when nil
578
+ FloatyLogger.error 'No action provided'
579
+ exit 1
580
+ else
581
+ FloatyLogger.error "Unknown action: #{action}"
582
+ exit 1
583
+ end
584
+ end
585
+ end
586
+
462
587
  run!
463
588
  end
464
589
  end