conjur-cli 4.8.0 → 4.9.3
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.
- data/.gitignore +1 -0
- data/Gemfile +1 -8
- data/bin/conjur +1 -0
- data/conjur.gemspec +4 -2
- data/lib/conjur/authn.rb +2 -0
- data/lib/conjur/command/assets.rb +4 -0
- data/lib/conjur/command/dsl_command.rb +1 -0
- data/lib/conjur/command/env.rb +170 -0
- data/lib/conjur/command/field.rb +2 -0
- data/lib/conjur/command/hosts.rb +9 -0
- data/lib/conjur/command/init.rb +31 -12
- data/lib/conjur/command/policy.rb +6 -3
- data/lib/conjur/command/roles.rb +1 -1
- data/lib/conjur/command/secrets.rb +3 -0
- data/lib/conjur/command/variables.rb +1 -0
- data/lib/conjur/config.rb +1 -1
- data/lib/conjur/conjurenv.rb +121 -0
- data/lib/conjur/dsl/runner.rb +5 -0
- data/lib/conjur/version.rb +1 -1
- data/spec/command/env_spec.rb +152 -0
- data/spec/command/init_spec.rb +65 -11
- data/spec/command/policy_spec.rb +24 -5
- data/spec/command/roles_spec.rb +4 -4
- data/spec/command/variables_spec.rb +0 -1
- data/spec/config_spec.rb +21 -0
- data/spec/dsl/runner_spec.rb +13 -4
- data/spec/env_spec.rb +180 -0
- metadata +32 -4
data/spec/command/roles_spec.rb
CHANGED
|
@@ -28,20 +28,20 @@ describe Conjur::Command::Roles, logged_in: true do
|
|
|
28
28
|
describe_command "role:create --as-role test:foo test:the-role" do
|
|
29
29
|
it "creates the role with acting_as option" do
|
|
30
30
|
api.should_receive(:role).with("test:foo").and_return double("test:foo", exists?: true, roleid: "test:test:foo")
|
|
31
|
-
api.should_receive(:role).with("test:the-role").and_return role = double("new-role")
|
|
31
|
+
api.should_receive(:role).with("test:the-role").and_return role = double("new-role", roleid: "test:the-role")
|
|
32
32
|
role.should_receive(:create).with({acting_as: "test:test:foo"})
|
|
33
33
|
|
|
34
|
-
invoke
|
|
34
|
+
expect { invoke }.to write("Created role test:the-role")
|
|
35
35
|
end
|
|
36
36
|
end
|
|
37
37
|
describe_command "role:create --as-group the-group test:the-role" do
|
|
38
38
|
it "creates the role with with acting_as option" do
|
|
39
39
|
api.should_receive(:group).with("the-group").and_return group = double("the-group", roleid: "test:group:the-group")
|
|
40
40
|
api.should_receive(:role).with(group.roleid).and_return double("group:the-group", exists?: true, roleid: "test:group:the-group")
|
|
41
|
-
api.should_receive(:role).with("test:the-role").and_return role = double("new-role")
|
|
41
|
+
api.should_receive(:role).with("test:the-role").and_return role = double("new-role", roleid: "test:the-role")
|
|
42
42
|
role.should_receive(:create).with({acting_as: "test:group:the-group"})
|
|
43
43
|
|
|
44
|
-
invoke
|
|
44
|
+
expect { invoke }.to write("Created role test:the-role")
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
data/spec/config_spec.rb
CHANGED
|
@@ -5,6 +5,27 @@ describe Conjur::Config do
|
|
|
5
5
|
after {
|
|
6
6
|
Conjur::Config.clear
|
|
7
7
|
}
|
|
8
|
+
|
|
9
|
+
describe ".default_config_files" do
|
|
10
|
+
subject { Conjur::Config.default_config_files }
|
|
11
|
+
around do |example|
|
|
12
|
+
realhome = ENV.delete 'HOME'
|
|
13
|
+
ENV['HOME'] = '/home/isfake'
|
|
14
|
+
example.run
|
|
15
|
+
ENV['HOME'] = realhome
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
context "when CONJURRC is not set" do
|
|
19
|
+
around do |example|
|
|
20
|
+
oldrc = ENV.delete 'CONJURRC'
|
|
21
|
+
example.run
|
|
22
|
+
ENV['CONJURRC'] = oldrc
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it { should include('/home/isfake/.conjurrc') }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
8
29
|
describe "#load" do
|
|
9
30
|
it "resolves the cert_file" do
|
|
10
31
|
Conjur::Config.load([ File.expand_path('conjurrc', File.dirname(__FILE__)) ])
|
data/spec/dsl/runner_spec.rb
CHANGED
|
@@ -5,16 +5,25 @@ describe Conjur::DSL::Runner, logged_in: true do
|
|
|
5
5
|
let(:filename) { nil }
|
|
6
6
|
let(:runner) { Conjur::DSL::Runner.new script, filename }
|
|
7
7
|
let(:script) { "user 'alice'" }
|
|
8
|
+
let(:alice) {
|
|
9
|
+
Conjur::User.new("alice").tap do |user|
|
|
10
|
+
user.attributes = { "api_key" => "the-api-key" }
|
|
11
|
+
end
|
|
12
|
+
}
|
|
8
13
|
before {
|
|
9
14
|
Conjur.stub(:account).and_return "the-account"
|
|
10
15
|
runner.stub(:api).and_return api
|
|
11
16
|
}
|
|
12
|
-
it "should
|
|
13
|
-
user
|
|
14
|
-
|
|
17
|
+
it "should populate the root ownerid" do
|
|
18
|
+
api.should_receive(:user).with("alice").and_return double("alice-exists", exists?: false)
|
|
19
|
+
api.should_receive(:create_user).with(id: "alice", ownerid: "user:bob").and_return alice
|
|
15
20
|
|
|
21
|
+
runner.owner = "user:bob"
|
|
22
|
+
runner.execute
|
|
23
|
+
end
|
|
24
|
+
it "should store the api_key in the context keyed by roleid" do
|
|
16
25
|
api.should_receive(:user).with("alice").and_return double("alice-exists", exists?: false)
|
|
17
|
-
api.should_receive(:create_user).with(id: "alice").and_return
|
|
26
|
+
api.should_receive(:create_user).with(id: "alice").and_return alice
|
|
18
27
|
|
|
19
28
|
runner.execute
|
|
20
29
|
|
data/spec/env_spec.rb
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'conjur/conjurenv'
|
|
3
|
+
|
|
4
|
+
describe Conjur::Env do
|
|
5
|
+
|
|
6
|
+
describe "#initialize" do
|
|
7
|
+
|
|
8
|
+
describe "requires either :file or :yaml parameter" do
|
|
9
|
+
before {
|
|
10
|
+
Conjur::Env.any_instance.should_not_receive(:parse)
|
|
11
|
+
}
|
|
12
|
+
it "fails if both options are provided" do
|
|
13
|
+
expect { Conjur::Env.new(file: 'f', yaml: 'y') }.to raise_error ":file and :yaml options can not be provided together"
|
|
14
|
+
end
|
|
15
|
+
it "fails if neither option is provided" do
|
|
16
|
+
expect { Conjur::Env.new() }.to raise_error "either :file or :yaml option is mandatory"
|
|
17
|
+
end
|
|
18
|
+
it "fails if :yaml option is empty or is not a string" do
|
|
19
|
+
expect { Conjur::Env.new(yaml: "") }.to raise_error ":yaml option should be non-empty string"
|
|
20
|
+
expect { Conjur::Env.new(yaml: nil) }.to raise_error ":yaml option should be non-empty string"
|
|
21
|
+
expect { Conjur::Env.new(yaml: 2) }.to raise_error ":yaml option should be non-empty string"
|
|
22
|
+
end
|
|
23
|
+
it "fails if :file option is empty or is not a string"do
|
|
24
|
+
expect { Conjur::Env.new(file: "") }.to raise_error ":file option should be non-empty string"
|
|
25
|
+
expect { Conjur::Env.new(file: nil) }.to raise_error ":file option should be non-empty string"
|
|
26
|
+
expect { Conjur::Env.new(file: 2) }.to raise_error ":file option should be non-empty string"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "with correct parameters" do
|
|
31
|
+
|
|
32
|
+
let(:parsed) { :parsed_structure_stub }
|
|
33
|
+
|
|
34
|
+
describe "if :file parameter provided" do
|
|
35
|
+
it "does not catch any errors from File.read" do
|
|
36
|
+
Conjur::Env.any_instance.should_not_receive(:parse)
|
|
37
|
+
File.stub(:read).with('unexisting').and_return { raise "Custom error" }
|
|
38
|
+
expect { Conjur::Env.new(file: 'unexisting') }.to raise_error "Custom error"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "if file is readable, passes contents to #parse and stores result in @definition attribute" do
|
|
42
|
+
File.should_receive(:read).with("somefile").and_return(:file_contents)
|
|
43
|
+
Conjur::Env.any_instance.should_receive(:parse).with(:file_contents).and_return(:stub_parsed)
|
|
44
|
+
Conjur::Env.new(file:"somefile").instance_variable_get("@definition").should == :stub_parsed
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
it "if :yaml parameter provided, passes it to #parse and stores result in @definition attribute" do
|
|
48
|
+
Conjur::Env.any_instance.should_receive(:parse).with("custom yaml").and_return(:stub_parsed)
|
|
49
|
+
Conjur::Env.new(yaml:"custom yaml").instance_variable_get("@definition").should == :stub_parsed
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe "#parse (called from 'initialize')" do
|
|
55
|
+
|
|
56
|
+
it 'parses input as YAML and does not hide YAML errors' do
|
|
57
|
+
YAML.should_receive(:load).with("custom yaml").and_return { raise "Custom error" }
|
|
58
|
+
expect { Conjur::Env.new(yaml: "custom yaml") }.to raise_error "Custom error"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "fails unless YAML represents a Hash" do
|
|
62
|
+
expect { Conjur::Env.new(yaml: "[ 1,2,3 ]") }.to raise_error "Definition should be a Hash"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "fails if values are not literal, !tmp or !var" do
|
|
66
|
+
expect { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile, c: !var conjurvar, d: { x: another literal }}") }.to raise_error /^Definition can not include values of types/
|
|
67
|
+
expect { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile, c: !var conjurvar}") }.to_not raise_error
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'does not allow empty values for !tmp and !var' do
|
|
71
|
+
expect { Conjur::Env.new(yaml: "{a: literal, b: !tmp , c: !var conjurvar }") }.to raise_error "ConjurTempfile requires a parameter"
|
|
72
|
+
expect { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile, c: !var }") }.to raise_error "ConjurVariable requires a parameter"
|
|
73
|
+
expect { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile, c: !var conjurvar}") }.to_not raise_error
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "Returns hash consisting of literals, ConjurTempfile and ConjurVariable objects" do
|
|
77
|
+
result = Conjur::Env.new(yaml: "{a: literal, b: !tmp 'sometmp', c: !var 'somevar'}").instance_variable_get("@definition")
|
|
78
|
+
result.keys.sort.should == ["a","b","c"]
|
|
79
|
+
result["a"].should == 'literal'
|
|
80
|
+
result["b"].should be_a_kind_of(Conjur::Env::ConjurTempfile)
|
|
81
|
+
result["c"].should be_a_kind_of(Conjur::Env::ConjurVariable)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
describe "#obtain", logged_in: true do
|
|
86
|
+
let(:subject) { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile, c: !var conjurvar}") }
|
|
87
|
+
before {
|
|
88
|
+
api.stub(:variable_values).with(["tempfile","conjurvar"]).and_return({"tempfile" => "stubtemp", "conjurvar" => "stubvar" })
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
it "requests variable_values with list of !var and !tmp values" do
|
|
92
|
+
Conjur::Env::ConjurTempfile.any_instance.stub(:evaluate).and_return(:stub_value) # avoid tempfiles creation
|
|
93
|
+
api.should_receive(:variable_values).with(["tempfile","conjurvar"]).and_return({"tempfile" => "stub1", "conjurvar" => "stub2" })
|
|
94
|
+
subject.obtain(api)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'does not suppress api errors' do
|
|
98
|
+
api.stub(:variable_values).and_return { raise "Custom API error" }
|
|
99
|
+
expect { subject.obtain(api) }.to raise_error "Custom API error"
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe "for !tmp creates temporary files with Conjur variable value" do
|
|
103
|
+
it "in /dev/shm if it exists" do
|
|
104
|
+
tempfile = double(path: '/dev/shm/newfile', close: true)
|
|
105
|
+
File.should_receive(:directory?).with("/dev/shm").and_return(true)
|
|
106
|
+
File.should_receive(:writable?).with("/dev/shm").and_return(true)
|
|
107
|
+
Tempfile.should_receive(:new).with("conjur","/dev/shm").and_return(tempfile)
|
|
108
|
+
tempfile.should_receive(:write).with("stubtemp")
|
|
109
|
+
subject.obtain(api)
|
|
110
|
+
end
|
|
111
|
+
it "otherwise uses Tempfile defaults" do
|
|
112
|
+
tempfile = double(path: '/tmp/newfile', close: true)
|
|
113
|
+
File.should_receive(:directory?).with("/dev/shm").and_return(false)
|
|
114
|
+
Tempfile.should_receive(:new).with("conjur").and_return(tempfile)
|
|
115
|
+
tempfile.should_receive(:write).with("stubtemp")
|
|
116
|
+
subject.obtain(api)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "returns hash consisting of original keys and following values" do
|
|
121
|
+
before {
|
|
122
|
+
tempfile=double(path:"/stub/tempfile",write: true, close: true)
|
|
123
|
+
File.stub(:directory?).with("/dev/shm").and_return(true)
|
|
124
|
+
File.stub(:writable?).with("/dev/shm").and_return(true)
|
|
125
|
+
Tempfile.stub(:new).with("conjur","/dev/shm").and_return(tempfile)
|
|
126
|
+
}
|
|
127
|
+
let(:result) { subject.obtain(api) }
|
|
128
|
+
|
|
129
|
+
it 'literals' do
|
|
130
|
+
result.should include("a"=>"literal")
|
|
131
|
+
end
|
|
132
|
+
it '!tmp: names of temp files' do
|
|
133
|
+
result.should include("b"=>"/stub/tempfile")
|
|
134
|
+
end
|
|
135
|
+
it '!var: variable values' do
|
|
136
|
+
result.should include("c"=>"stubvar")
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
describe "#check", logged_in: true do
|
|
142
|
+
|
|
143
|
+
let(:subject) { Conjur::Env.new(yaml: "{a: literal, b: !tmp tempfile_b, c: !var conjurvar_c, d: !tmp tempfile_d, e: !var conjurvar_e }") }
|
|
144
|
+
before {
|
|
145
|
+
api.should_not_receive(:variable_values)
|
|
146
|
+
Tempfile.should_not_receive(:new)
|
|
147
|
+
}
|
|
148
|
+
let(:permitted) { double(permitted?:true) }
|
|
149
|
+
let(:restricted) { double(permitted?:false) }
|
|
150
|
+
|
|
151
|
+
it "requests resource 'execute' permission for each !var and !tmp value" do
|
|
152
|
+
api.should_receive(:resource).with("variable:tempfile_b").and_return(permitted)
|
|
153
|
+
api.should_receive(:resource).with("variable:conjurvar_c").and_return(permitted)
|
|
154
|
+
api.should_receive(:resource).with("variable:tempfile_d").and_return(permitted)
|
|
155
|
+
api.should_receive(:resource).with("variable:conjurvar_e").and_return(permitted)
|
|
156
|
+
permitted.should_receive(:permitted?).exactly(4).times.with(:execute).and_return(true)
|
|
157
|
+
subject.check(api)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'does not rescue from unexpected api errors' do
|
|
161
|
+
api.should_receive(:resource).with("variable:tempfile_b").and_return { raise "Custom error" }
|
|
162
|
+
expect { subject.check(api) }.to raise_error "Custom error"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it "returns Hash consisting of original keys and following statuses: :literal, :available, :unavailable" do
|
|
166
|
+
api.should_receive(:resource).with("variable:tempfile_b").and_return(permitted)
|
|
167
|
+
api.should_receive(:resource).with("variable:conjurvar_c").and_return(restricted)
|
|
168
|
+
api.should_receive(:resource).with("variable:tempfile_d").and_return(restricted)
|
|
169
|
+
api.should_receive(:resource).with("variable:conjurvar_e").and_return(permitted)
|
|
170
|
+
|
|
171
|
+
result = subject.check(api).should == { "a" => :literal,
|
|
172
|
+
"b" => :available,
|
|
173
|
+
"c" => :unavailable,
|
|
174
|
+
"d" => :unavailable,
|
|
175
|
+
"e" => :available
|
|
176
|
+
}
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: conjur-cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.9.3
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -10,8 +10,24 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2014-
|
|
13
|
+
date: 2014-05-23 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
|
+
- !ruby/object:Gem::Dependency
|
|
16
|
+
name: activesupport
|
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
|
+
none: false
|
|
19
|
+
requirements:
|
|
20
|
+
- - ! '>='
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '0'
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
none: false
|
|
27
|
+
requirements:
|
|
28
|
+
- - ! '>='
|
|
29
|
+
- !ruby/object:Gem::Version
|
|
30
|
+
version: '0'
|
|
15
31
|
- !ruby/object:Gem::Dependency
|
|
16
32
|
name: conjur-api
|
|
17
33
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -19,7 +35,7 @@ dependencies:
|
|
|
19
35
|
requirements:
|
|
20
36
|
- - ! '>='
|
|
21
37
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: 4.
|
|
38
|
+
version: '4.8'
|
|
23
39
|
type: :runtime
|
|
24
40
|
prerelease: false
|
|
25
41
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -27,7 +43,7 @@ dependencies:
|
|
|
27
43
|
requirements:
|
|
28
44
|
- - ! '>='
|
|
29
45
|
- !ruby/object:Gem::Version
|
|
30
|
-
version: 4.
|
|
46
|
+
version: '4.8'
|
|
31
47
|
- !ruby/object:Gem::Dependency
|
|
32
48
|
name: gli
|
|
33
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -245,6 +261,7 @@ files:
|
|
|
245
261
|
- lib/conjur/command/audit.rb
|
|
246
262
|
- lib/conjur/command/authn.rb
|
|
247
263
|
- lib/conjur/command/dsl_command.rb
|
|
264
|
+
- lib/conjur/command/env.rb
|
|
248
265
|
- lib/conjur/command/field.rb
|
|
249
266
|
- lib/conjur/command/groups.rb
|
|
250
267
|
- lib/conjur/command/hosts.rb
|
|
@@ -262,6 +279,7 @@ files:
|
|
|
262
279
|
- lib/conjur/command/users.rb
|
|
263
280
|
- lib/conjur/command/variables.rb
|
|
264
281
|
- lib/conjur/config.rb
|
|
282
|
+
- lib/conjur/conjurenv.rb
|
|
265
283
|
- lib/conjur/dsl/runner.rb
|
|
266
284
|
- lib/conjur/identifier_manipulation.rb
|
|
267
285
|
- lib/conjur/version.rb
|
|
@@ -270,6 +288,7 @@ files:
|
|
|
270
288
|
- spec/command/assets_spec.rb
|
|
271
289
|
- spec/command/audit_spec.rb
|
|
272
290
|
- spec/command/authn_spec.rb
|
|
291
|
+
- spec/command/env_spec.rb
|
|
273
292
|
- spec/command/groups_spec.rb
|
|
274
293
|
- spec/command/hosts_spec.rb
|
|
275
294
|
- spec/command/init_spec.rb
|
|
@@ -282,6 +301,7 @@ files:
|
|
|
282
301
|
- spec/config_spec.rb
|
|
283
302
|
- spec/conjurrc
|
|
284
303
|
- spec/dsl/runner_spec.rb
|
|
304
|
+
- spec/env_spec.rb
|
|
285
305
|
- spec/spec_helper.rb
|
|
286
306
|
homepage: https://github.com/conjurinc/cli-ruby
|
|
287
307
|
licenses:
|
|
@@ -296,12 +316,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
296
316
|
- - ! '>='
|
|
297
317
|
- !ruby/object:Gem::Version
|
|
298
318
|
version: '0'
|
|
319
|
+
segments:
|
|
320
|
+
- 0
|
|
321
|
+
hash: 4419990204005105741
|
|
299
322
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
300
323
|
none: false
|
|
301
324
|
requirements:
|
|
302
325
|
- - ! '>='
|
|
303
326
|
- !ruby/object:Gem::Version
|
|
304
327
|
version: '0'
|
|
328
|
+
segments:
|
|
329
|
+
- 0
|
|
330
|
+
hash: 4419990204005105741
|
|
305
331
|
requirements: []
|
|
306
332
|
rubyforge_project:
|
|
307
333
|
rubygems_version: 1.8.25
|
|
@@ -325,6 +351,7 @@ test_files:
|
|
|
325
351
|
- spec/command/assets_spec.rb
|
|
326
352
|
- spec/command/audit_spec.rb
|
|
327
353
|
- spec/command/authn_spec.rb
|
|
354
|
+
- spec/command/env_spec.rb
|
|
328
355
|
- spec/command/groups_spec.rb
|
|
329
356
|
- spec/command/hosts_spec.rb
|
|
330
357
|
- spec/command/init_spec.rb
|
|
@@ -337,4 +364,5 @@ test_files:
|
|
|
337
364
|
- spec/config_spec.rb
|
|
338
365
|
- spec/conjurrc
|
|
339
366
|
- spec/dsl/runner_spec.rb
|
|
367
|
+
- spec/env_spec.rb
|
|
340
368
|
- spec/spec_helper.rb
|