vagrant-openstack-provider 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/lib/vagrant-openstack-provider/action/connect_openstack.rb +0 -1
- data/lib/vagrant-openstack-provider/action/create_server.rb +3 -2
- data/lib/vagrant-openstack-provider/action/create_stack.rb +3 -2
- data/lib/vagrant-openstack-provider/action/delete_server.rb +3 -2
- data/lib/vagrant-openstack-provider/action/delete_stack.rb +3 -2
- data/lib/vagrant-openstack-provider/action/wait_active.rb +3 -3
- data/lib/vagrant-openstack-provider/action/wait_stop.rb +3 -3
- data/lib/vagrant-openstack-provider/catalog/openstack_catalog.rb +6 -5
- data/lib/vagrant-openstack-provider/client/cinder.rb +0 -1
- data/lib/vagrant-openstack-provider/client/domain.rb +0 -1
- data/lib/vagrant-openstack-provider/client/glance.rb +5 -3
- data/lib/vagrant-openstack-provider/client/heat.rb +0 -1
- data/lib/vagrant-openstack-provider/client/http_utils.rb +7 -6
- data/lib/vagrant-openstack-provider/client/keystone.rb +5 -4
- data/lib/vagrant-openstack-provider/client/neutron.rb +0 -1
- data/lib/vagrant-openstack-provider/client/nova.rb +0 -1
- data/lib/vagrant-openstack-provider/client/openstack.rb +0 -1
- data/lib/vagrant-openstack-provider/client/request_logger.rb +0 -1
- data/lib/vagrant-openstack-provider/client/rest_utils.rb +25 -0
- data/lib/vagrant-openstack-provider/command/abstract_command.rb +4 -1
- data/lib/vagrant-openstack-provider/command/flavor_list.rb +3 -5
- data/lib/vagrant-openstack-provider/command/floatingip_list.rb +3 -5
- data/lib/vagrant-openstack-provider/command/image_list.rb +3 -5
- data/lib/vagrant-openstack-provider/command/network_list.rb +3 -5
- data/lib/vagrant-openstack-provider/command/openstack_command.rb +16 -0
- data/lib/vagrant-openstack-provider/command/reset.rb +1 -2
- data/lib/vagrant-openstack-provider/command/subnet_list.rb +2 -5
- data/lib/vagrant-openstack-provider/command/volume_list.rb +3 -5
- data/lib/vagrant-openstack-provider/config.rb +59 -2
- data/lib/vagrant-openstack-provider/config/http.rb +39 -0
- data/lib/vagrant-openstack-provider/config_resolver.rb +13 -9
- data/lib/vagrant-openstack-provider/utils.rb +11 -6
- data/lib/vagrant-openstack-provider/version.rb +1 -1
- data/locales/en.yml +4 -0
- data/spec/vagrant-openstack-provider/action/connect_openstack_spec.rb +226 -4
- data/spec/vagrant-openstack-provider/action/create_server_spec.rb +6 -3
- data/spec/vagrant-openstack-provider/action/create_stack_spec.rb +7 -3
- data/spec/vagrant-openstack-provider/action/delete_server_spec.rb +13 -4
- data/spec/vagrant-openstack-provider/action/read_ssh_info_spec.rb +24 -3
- data/spec/vagrant-openstack-provider/action/wait_active_spec.rb +9 -2
- data/spec/vagrant-openstack-provider/action/wait_stop_spec.rb +9 -2
- data/spec/vagrant-openstack-provider/client/cinder_spec.rb +17 -1
- data/spec/vagrant-openstack-provider/client/glance_spec.rb +18 -2
- data/spec/vagrant-openstack-provider/client/heat_spec.rb +8 -0
- data/spec/vagrant-openstack-provider/client/keystone_spec.rb +8 -0
- data/spec/vagrant-openstack-provider/client/neutron_spec.rb +18 -2
- data/spec/vagrant-openstack-provider/client/nova_spec.rb +8 -0
- data/spec/vagrant-openstack-provider/config_resolver_spec.rb +10 -0
- data/spec/vagrant-openstack-provider/config_spec.rb +39 -4
- data/spec/vagrant-openstack-provider/utils_spec.rb +17 -17
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79d085018733ba06b31b2f7fb8f904a29db8040b
|
4
|
+
data.tar.gz: 263505f7c34eb0c3456f00794fe5158076cc6654
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c544a9afd69438fe6a0d4b63e3d283c241c890fab6a334ba0ef4d95bb9411516f715af9494313bc3b811e32371e8624b378ec0dece4060448fd8d2c90b759837
|
7
|
+
data.tar.gz: 670e6af16eeb1b62312518ef589bf12eb6b38ee8d4f44147a47b3c4eecdfd997f76e813459b39c5f1be722286c495cdb61ab516b18ae3ef682230faa0b82cb0a
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# 0.6.1 (January 30, 2015)
|
2
|
+
|
3
|
+
IMPROVEMENTS:
|
4
|
+
|
5
|
+
- Straightforward syntax to define single networks [#193](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/193)
|
6
|
+
- Network preference for SSH [#194](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/194)
|
7
|
+
- Allow lists in flavor values [#189](https://github.com/ggiamarchi/vagrant-openstack-provider/pull/189)
|
8
|
+
- Allow "wait active" timeout to be configurable [#185](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/185)
|
9
|
+
- Allow setting timeout value for REST calls [#183](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/183)
|
10
|
+
|
11
|
+
BUG FIXES:
|
12
|
+
|
13
|
+
- Vagrant openstack reset fails when the instance is not found [#195](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/195)
|
14
|
+
- Show explicit error when tenant is missing in credentials [#186](https://github.com/ggiamarchi/vagrant-openstack-provider/issues/186)
|
15
|
+
|
1
16
|
# 0.6.0 (November 28, 2014)
|
2
17
|
|
3
18
|
FEATURES:
|
@@ -127,10 +127,11 @@ module VagrantPlugins
|
|
127
127
|
nova.create_server(env, create_opts)
|
128
128
|
end
|
129
129
|
|
130
|
-
def waiting_for_server_to_be_built(env, server_id, retry_interval = 3
|
130
|
+
def waiting_for_server_to_be_built(env, server_id, retry_interval = 3)
|
131
131
|
@logger.info "Waiting for the server with id #{server_id} to be built..."
|
132
132
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_build'))
|
133
|
-
|
133
|
+
config = env[:machine].provider_config
|
134
|
+
timeout(config.server_create_timeout, Errors::Timeout) do
|
134
135
|
server_status = 'WAITING'
|
135
136
|
until server_status == 'ACTIVE'
|
136
137
|
@logger.debug('Waiting for server to be ACTIVE')
|
@@ -48,10 +48,11 @@ module VagrantPlugins
|
|
48
48
|
|
49
49
|
private
|
50
50
|
|
51
|
-
def waiting_for_stack_to_be_created(env, stack_name, stack_id, retry_interval = 3
|
51
|
+
def waiting_for_stack_to_be_created(env, stack_name, stack_id, retry_interval = 3)
|
52
52
|
@logger.info "Waiting for the stack with id #{stack_id} to be built..."
|
53
53
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack'))
|
54
|
-
|
54
|
+
config = env[:machine].provider_config
|
55
|
+
timeout(config.stack_create_timeout, Errors::Timeout) do
|
55
56
|
stack_status = 'CREATE_IN_PROGRESS'
|
56
57
|
until stack_status == 'CREATE_COMPLETE'
|
57
58
|
@logger.debug('Waiting for stack to be CREATED')
|
@@ -28,10 +28,11 @@ module VagrantPlugins
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
-
def waiting_for_instance_to_be_deleted(env, instance_id, retry_interval = 3
|
31
|
+
def waiting_for_instance_to_be_deleted(env, instance_id, retry_interval = 3)
|
32
32
|
@logger.info "Waiting for the instance with id #{instance_id} to be deleted..."
|
33
33
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_deleted'))
|
34
|
-
|
34
|
+
config = env[:machine].provider_config
|
35
|
+
timeout(config.server_delete_timeout, Errors::Timeout) do
|
35
36
|
delete_ok = false
|
36
37
|
until delete_ok
|
37
38
|
begin
|
@@ -53,10 +53,11 @@ module VagrantPlugins
|
|
53
53
|
stack_files
|
54
54
|
end
|
55
55
|
|
56
|
-
def waiting_for_stack_to_be_deleted(env, stack_name, stack_id, retry_interval = 3
|
56
|
+
def waiting_for_stack_to_be_deleted(env, stack_name, stack_id, retry_interval = 3)
|
57
57
|
@logger.info "Waiting for the stack with id #{stack_id} to be deleted..."
|
58
58
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_for_stack_deleted'))
|
59
|
-
|
59
|
+
config = env[:machine].provider_config
|
60
|
+
timeout(config.stack_delete_timeout, Errors::Timeout) do
|
60
61
|
stack_status = 'DELETE_IN_PROGRESS'
|
61
62
|
until stack_status == 'DELETE_COMPLETE'
|
62
63
|
@logger.debug('Waiting for stack to be DELETED')
|
@@ -7,18 +7,18 @@ module VagrantPlugins
|
|
7
7
|
module Openstack
|
8
8
|
module Action
|
9
9
|
class WaitForServerToBeActive < AbstractAction
|
10
|
-
def initialize(app, _env, retry_interval = 3
|
10
|
+
def initialize(app, _env, retry_interval = 3)
|
11
11
|
@app = app
|
12
12
|
@logger = Log4r::Logger.new('vagrant_openstack::action::start_server')
|
13
13
|
@retry_interval = retry_interval
|
14
|
-
@timeout = timeout
|
15
14
|
end
|
16
15
|
|
17
16
|
def execute(env)
|
18
17
|
if env[:machine].id
|
19
18
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_start'))
|
20
19
|
client = env[:openstack_client].nova
|
21
|
-
|
20
|
+
config = env[:machine].provider_config
|
21
|
+
timeout(config.server_active_timeout, Errors::Timeout) do
|
22
22
|
while client.get_server_details(env, env[:machine].id)['status'] != 'ACTIVE'
|
23
23
|
sleep @retry_interval
|
24
24
|
@logger.info('Waiting for server to be active')
|
@@ -7,18 +7,18 @@ module VagrantPlugins
|
|
7
7
|
module Openstack
|
8
8
|
module Action
|
9
9
|
class WaitForServerToStop < AbstractAction
|
10
|
-
def initialize(app, _env, retry_interval = 3
|
10
|
+
def initialize(app, _env, retry_interval = 3)
|
11
11
|
@app = app
|
12
12
|
@logger = Log4r::Logger.new('vagrant_openstack::action::stop_server')
|
13
13
|
@retry_interval = retry_interval
|
14
|
-
@timeout = timeout
|
15
14
|
end
|
16
15
|
|
17
16
|
def execute(env)
|
18
17
|
if env[:machine].id
|
19
18
|
env[:ui].info(I18n.t('vagrant_openstack.waiting_stop'))
|
20
19
|
client = env[:openstack_client].nova
|
21
|
-
|
20
|
+
config = env[:machine].provider_config
|
21
|
+
timeout(config.server_stop_timeout, Errors::Timeout) do
|
22
22
|
while client.get_server_details(env, env[:machine].id)['status'] != 'SHUTOFF'
|
23
23
|
sleep @retry_interval
|
24
24
|
@logger.info('Waiting for server to stop')
|
@@ -10,6 +10,7 @@ module VagrantPlugins
|
|
10
10
|
config = env[:machine].provider_config
|
11
11
|
client = env[:openstack_client]
|
12
12
|
endpoints = client.session.endpoints
|
13
|
+
endpoint_type = config.endpoint_type
|
13
14
|
@logger.info(I18n.t('vagrant_openstack.client.looking_for_available_endpoints'))
|
14
15
|
@logger.info("Selecting endpoints matching region '#{config.region}'") unless config.region.nil?
|
15
16
|
|
@@ -18,23 +19,23 @@ module VagrantPlugins
|
|
18
19
|
if config.region.nil?
|
19
20
|
if se.size > 1
|
20
21
|
env[:ui].warn I18n.t('vagrant_openstack.client.multiple_endpoint', size: se.size, type: service['type'])
|
21
|
-
env[:ui].warn " => #{service['endpoints'][0][
|
22
|
+
env[:ui].warn " => #{service['endpoints'][0][endpoint_type]}"
|
22
23
|
end
|
23
|
-
url = se[0][
|
24
|
+
url = se[0][endpoint_type].strip
|
24
25
|
else
|
25
26
|
se.each do |endpoint|
|
26
|
-
url = endpoint[
|
27
|
+
url = endpoint[endpoint_type].strip if endpoint['region'].eql? config.region
|
27
28
|
end
|
28
29
|
end
|
29
30
|
endpoints[service['type'].to_sym] = url unless url.nil? || url.empty?
|
30
31
|
end
|
31
32
|
|
32
33
|
endpoints[:network] = choose_api_version('Neutron', 'openstack_network_url', 'v2') do
|
33
|
-
client.neutron.get_api_version_list(:network)
|
34
|
+
client.neutron.get_api_version_list(env, :network)
|
34
35
|
end if config.openstack_network_url.nil? && !endpoints[:network].nil?
|
35
36
|
|
36
37
|
endpoints[:image] = choose_api_version('Glance', 'openstack_image_url', nil, false) do
|
37
|
-
client.glance.get_api_version_list(
|
38
|
+
client.glance.get_api_version_list(env)
|
38
39
|
end if config.openstack_image_url.nil? && !endpoints[:image].nil?
|
39
40
|
end
|
40
41
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'restclient'
|
3
2
|
require 'json'
|
4
3
|
|
5
4
|
require 'vagrant-openstack-provider/client/http_utils'
|
5
|
+
require 'vagrant-openstack-provider/client/rest_utils'
|
6
6
|
require 'vagrant-openstack-provider/client/domain'
|
7
7
|
|
8
8
|
module VagrantPlugins
|
@@ -17,8 +17,10 @@ module VagrantPlugins
|
|
17
17
|
@session = VagrantPlugins::Openstack.session
|
18
18
|
end
|
19
19
|
|
20
|
-
def get_api_version_list(
|
21
|
-
json =
|
20
|
+
def get_api_version_list(env)
|
21
|
+
json = RestUtils.get(env, @session.endpoints[:image],
|
22
|
+
'X-Auth-Token' => @session.token,
|
23
|
+
:accept => :json) do |response|
|
22
24
|
log_response(response)
|
23
25
|
case response.code
|
24
26
|
when 200, 300
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'restclient'
|
3
2
|
require 'json'
|
4
3
|
|
5
4
|
require 'vagrant-openstack-provider/client/keystone'
|
6
5
|
require 'vagrant-openstack-provider/client/request_logger'
|
6
|
+
require 'vagrant-openstack-provider/client/rest_utils'
|
7
7
|
|
8
8
|
module VagrantPlugins
|
9
9
|
module Openstack
|
@@ -19,7 +19,7 @@ module VagrantPlugins
|
|
19
19
|
log_request(:GET, url, headers)
|
20
20
|
|
21
21
|
authenticated(env) do
|
22
|
-
|
22
|
+
RestUtils.get(env, url, headers) { |res| handle_response(res) }.tap do
|
23
23
|
@logger.debug("#{calling_method} - end")
|
24
24
|
end
|
25
25
|
end
|
@@ -34,7 +34,7 @@ module VagrantPlugins
|
|
34
34
|
log_request(:POST, url, body, headers)
|
35
35
|
|
36
36
|
authenticated(env) do
|
37
|
-
|
37
|
+
RestUtils.post(env, url, body, headers) { |res| handle_response(res) }.tap do
|
38
38
|
@logger.debug("#{calling_method} - end")
|
39
39
|
end
|
40
40
|
end
|
@@ -49,17 +49,18 @@ module VagrantPlugins
|
|
49
49
|
log_request(:DELETE, url, headers)
|
50
50
|
|
51
51
|
authenticated(env) do
|
52
|
-
|
52
|
+
RestUtils.delete(env, url, headers) { |res| handle_response(res) }.tap do
|
53
53
|
@logger.debug("#{calling_method} - end")
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
def get_api_version_list(service_type)
|
58
|
+
def get_api_version_list(env, service_type)
|
59
59
|
url = @session.endpoints[service_type]
|
60
60
|
headers = { 'X-Auth-Token' => @session.token, :accept => :json }
|
61
61
|
log_request(:GET, url, headers)
|
62
|
-
|
62
|
+
|
63
|
+
json = RestUtils.get(env, url, headers) do |response|
|
63
64
|
log_response(response)
|
64
65
|
case response.code
|
65
66
|
when 200, 300
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'log4r'
|
2
|
-
require 'restclient'
|
3
2
|
require 'json'
|
4
3
|
|
5
4
|
require 'vagrant-openstack-provider/client/request_logger'
|
@@ -37,9 +36,11 @@ module VagrantPlugins
|
|
37
36
|
|
38
37
|
post_body[:auth][:passwordCredentials][:password] = config.password
|
39
38
|
|
40
|
-
authentication =
|
41
|
-
|
42
|
-
|
39
|
+
authentication = RestUtils.post(env, config.openstack_auth_url, post_body.to_json,
|
40
|
+
content_type: :json,
|
41
|
+
accept: :json,
|
42
|
+
timeout: config.http.read_timeout,
|
43
|
+
open_timeout: config.http.open_timeout) do |response|
|
43
44
|
log_response(response)
|
44
45
|
case response.code
|
45
46
|
when 200
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'restclient'
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module Openstack
|
5
|
+
module RestUtils
|
6
|
+
def self.get(env, url, headers = {}, &block)
|
7
|
+
config = env[:machine].provider_config
|
8
|
+
RestClient::Request.execute(method: :get, url: url, headers: headers,
|
9
|
+
timeout: config.http.read_timeout, open_timeout: config.http.open_timeout, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.post(env, url, payload, headers = {}, &block)
|
13
|
+
config = env[:machine].provider_config
|
14
|
+
RestClient::Request.execute(method: :post, url: url, payload: payload, headers: headers,
|
15
|
+
timeout: config.http.read_timeout, open_timeout: config.http.open_timeout, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.delete(env, url, headers = {}, &block)
|
19
|
+
config = env[:machine].provider_config
|
20
|
+
RestClient::Request.execute(method: :delete, url: url, headers: headers,
|
21
|
+
timeout: config.http.read_timeout, open_timeout: config.http.open_timeout, &block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -16,7 +16,7 @@ module VagrantPlugins
|
|
16
16
|
env[:ui] = @env.ui
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
before_cmd(name, @argv, env)
|
20
20
|
|
21
21
|
cmd(name, @argv, env)
|
22
22
|
@env.ui.info('')
|
@@ -38,6 +38,9 @@ module VagrantPlugins
|
|
38
38
|
args
|
39
39
|
end
|
40
40
|
|
41
|
+
def before_cmd(_name, _argv, _env)
|
42
|
+
end
|
43
|
+
|
41
44
|
def cmd(_name, _argv, _env)
|
42
45
|
fail 'Command not implemented. \'cmd\' method must be overridden in all subclasses'
|
43
46
|
end
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require 'vagrant-openstack-provider/command/
|
2
|
-
require 'vagrant-openstack-provider/command/abstract_command'
|
1
|
+
require 'vagrant-openstack-provider/command/openstack_command'
|
3
2
|
|
4
3
|
module VagrantPlugins
|
5
4
|
module Openstack
|
6
5
|
module Command
|
7
|
-
class FlavorList <
|
8
|
-
include VagrantPlugins::Openstack::Command::Utils
|
9
|
-
|
6
|
+
class FlavorList < OpenstackCommand
|
10
7
|
def self.synopsis
|
11
8
|
I18n.t('vagrant_openstack.command.flavor_list_synopsis')
|
12
9
|
end
|
10
|
+
|
13
11
|
def cmd(name, argv, env)
|
14
12
|
fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
|
15
13
|
flavors = env[:openstack_client].nova.get_all_flavors(env)
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require 'vagrant-openstack-provider/command/
|
2
|
-
require 'vagrant-openstack-provider/command/abstract_command'
|
1
|
+
require 'vagrant-openstack-provider/command/openstack_command'
|
3
2
|
|
4
3
|
module VagrantPlugins
|
5
4
|
module Openstack
|
6
5
|
module Command
|
7
|
-
class FloatingIpList <
|
8
|
-
include VagrantPlugins::Openstack::Command::Utils
|
9
|
-
|
6
|
+
class FloatingIpList < OpenstackCommand
|
10
7
|
def self.synopsis
|
11
8
|
I18n.t('vagrant_openstack.command.flaotingip_list_synopsis')
|
12
9
|
end
|
10
|
+
|
13
11
|
def cmd(name, argv, env)
|
14
12
|
fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
|
15
13
|
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require 'vagrant-openstack-provider/command/
|
2
|
-
require 'vagrant-openstack-provider/command/abstract_command'
|
1
|
+
require 'vagrant-openstack-provider/command/openstack_command'
|
3
2
|
|
4
3
|
module VagrantPlugins
|
5
4
|
module Openstack
|
6
5
|
module Command
|
7
|
-
class ImageList <
|
8
|
-
include VagrantPlugins::Openstack::Command::Utils
|
9
|
-
|
6
|
+
class ImageList < OpenstackCommand
|
10
7
|
def self.synopsis
|
11
8
|
I18n.t('vagrant_openstack.command.image_list_synopsis')
|
12
9
|
end
|
10
|
+
|
13
11
|
def cmd(name, argv, env)
|
14
12
|
fail Errors::NoArgRequiredForCommand, cmd: name unless argv.size == 0
|
15
13
|
rows = []
|
@@ -1,15 +1,13 @@
|
|
1
|
-
require 'vagrant-openstack-provider/command/
|
2
|
-
require 'vagrant-openstack-provider/command/abstract_command'
|
1
|
+
require 'vagrant-openstack-provider/command/openstack_command'
|
3
2
|
|
4
3
|
module VagrantPlugins
|
5
4
|
module Openstack
|
6
5
|
module Command
|
7
|
-
class NetworkList <
|
8
|
-
include VagrantPlugins::Openstack::Command::Utils
|
9
|
-
|
6
|
+
class NetworkList < OpenstackCommand
|
10
7
|
def self.synopsis
|
11
8
|
I18n.t('vagrant_openstack.command.network_list_synopsis')
|
12
9
|
end
|
10
|
+
|
13
11
|
def cmd(name, argv, env)
|
14
12
|
fail Errors::UnrecognizedArgForCommand, cmd: name, arg: argv[1] if argv.size > 1
|
15
13
|
if argv.size == 0
|