bosh_cli 0.19.6 → 1.0.rc1

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.
Files changed (64) hide show
  1. data/bin/bosh +3 -0
  2. data/lib/cli.rb +15 -5
  3. data/lib/cli/{commands/base.rb → base_command.rb} +38 -44
  4. data/lib/cli/command_discovery.rb +40 -0
  5. data/lib/cli/command_handler.rb +135 -0
  6. data/lib/cli/commands/biff.rb +16 -12
  7. data/lib/cli/commands/blob_management.rb +10 -3
  8. data/lib/cli/commands/cloudcheck.rb +13 -11
  9. data/lib/cli/commands/complete.rb +29 -0
  10. data/lib/cli/commands/deployment.rb +137 -28
  11. data/lib/cli/commands/help.rb +96 -0
  12. data/lib/cli/commands/job.rb +4 -1
  13. data/lib/cli/commands/job_management.rb +36 -23
  14. data/lib/cli/commands/job_rename.rb +11 -12
  15. data/lib/cli/commands/log_management.rb +28 -32
  16. data/lib/cli/commands/maintenance.rb +6 -1
  17. data/lib/cli/commands/misc.rb +129 -87
  18. data/lib/cli/commands/package.rb +6 -65
  19. data/lib/cli/commands/property_management.rb +20 -8
  20. data/lib/cli/commands/release.rb +211 -206
  21. data/lib/cli/commands/ssh.rb +178 -188
  22. data/lib/cli/commands/stemcell.rb +114 -51
  23. data/lib/cli/commands/task.rb +74 -56
  24. data/lib/cli/commands/user.rb +6 -3
  25. data/lib/cli/commands/vms.rb +17 -15
  26. data/lib/cli/config.rb +27 -1
  27. data/lib/cli/core_ext.rb +27 -1
  28. data/lib/cli/deployment_helper.rb +47 -0
  29. data/lib/cli/director.rb +18 -9
  30. data/lib/cli/errors.rb +6 -0
  31. data/lib/cli/job_builder.rb +75 -23
  32. data/lib/cli/job_property_collection.rb +87 -0
  33. data/lib/cli/job_property_validator.rb +130 -0
  34. data/lib/cli/package_builder.rb +32 -5
  35. data/lib/cli/release.rb +2 -0
  36. data/lib/cli/release_builder.rb +9 -13
  37. data/lib/cli/release_compiler.rb +5 -34
  38. data/lib/cli/release_tarball.rb +4 -19
  39. data/lib/cli/runner.rb +118 -694
  40. data/lib/cli/version.rb +1 -1
  41. data/spec/assets/config/swift-hp/config/final.yml +6 -0
  42. data/spec/assets/config/swift-hp/config/private.yml +7 -0
  43. data/spec/assets/config/swift-rackspace/config/final.yml +6 -0
  44. data/spec/assets/config/swift-rackspace/config/private.yml +6 -0
  45. data/spec/spec_helper.rb +0 -5
  46. data/spec/unit/base_command_spec.rb +32 -37
  47. data/spec/unit/biff_spec.rb +11 -10
  48. data/spec/unit/cli_commands_spec.rb +96 -88
  49. data/spec/unit/core_ext_spec.rb +1 -1
  50. data/spec/unit/deployment_manifest_spec.rb +36 -0
  51. data/spec/unit/director_spec.rb +17 -3
  52. data/spec/unit/job_builder_spec.rb +2 -2
  53. data/spec/unit/job_property_collection_spec.rb +111 -0
  54. data/spec/unit/job_property_validator_spec.rb +7 -0
  55. data/spec/unit/job_rename_spec.rb +7 -6
  56. data/spec/unit/package_builder_spec.rb +2 -2
  57. data/spec/unit/release_builder_spec.rb +33 -0
  58. data/spec/unit/release_spec.rb +54 -0
  59. data/spec/unit/release_tarball_spec.rb +2 -7
  60. data/spec/unit/runner_spec.rb +1 -151
  61. data/spec/unit/ssh_spec.rb +15 -9
  62. metadata +41 -12
  63. data/lib/cli/command_definition.rb +0 -52
  64. data/lib/cli/templates/help_message.erb +0 -80
@@ -67,7 +67,7 @@ describe Object do
67
67
  it "raises a special exception to signal a premature exit" do
68
68
  lambda {
69
69
  err("Done")
70
- }.should raise_error(Bosh::Cli::CliExit, "Done")
70
+ }.should raise_error(Bosh::Cli::CliError, "Done")
71
71
  end
72
72
 
73
73
  it "can tell if object is blank" do
@@ -114,4 +114,40 @@ describe Bosh::Cli::DeploymentHelper do
114
114
  }.to raise_error(/manifest has both `release' and `releases'/i)
115
115
  end
116
116
 
117
+ it "resolves 'latest' release alias for multiple stemcells" do
118
+ cmd = make_cmd
119
+ manifest = {
120
+ "name" => "mycloud",
121
+ "director_uuid" => "deadbeef",
122
+ "release" => {"name" => "appcloud", "version" => 42},
123
+ "resource_pools" => [
124
+ {"stemcell" => {"name" => "foo", "version" => "latest"}},
125
+ {"stemcell" => {"name" => "foo", "version" => 22}},
126
+ {"stemcell" => {"name" => "bar", "version" => "latest"}},
127
+ ]
128
+ }
129
+
130
+ manifest_file = Tempfile.new("manifest")
131
+ YAML.dump(manifest, manifest_file)
132
+ manifest_file.close
133
+ director = mock(Bosh::Cli::Director, :uuid => "deadbeef")
134
+
135
+ cmd.stub!(:deployment).and_return(manifest_file.path)
136
+ cmd.stub!(:director).and_return(director)
137
+
138
+ stemcells = [
139
+ {"name" => "foo", "version" => "22.6.4"},
140
+ {"name" => "foo", "version" => "22"},
141
+ {"name" => "bar", "version" => "4.0.8"},
142
+ {"name" => "bar", "version" => "4.1"}
143
+ ]
144
+
145
+ director.should_receive(:list_stemcells).and_return(stemcells)
146
+
147
+ manifest = cmd.prepare_deployment_manifest
148
+ manifest["resource_pools"][0]["stemcell"]["version"].should == "22.6.4"
149
+ manifest["resource_pools"][1]["stemcell"]["version"].should == 22
150
+ manifest["resource_pools"][2]["stemcell"]["version"].should == 4.1
151
+ end
152
+
117
153
  end
@@ -99,21 +99,27 @@ describe Bosh::Cli::Director do
99
99
  with("/info", "application/json").
100
100
  and_return([200, JSON.generate({ :version => "0.3.5"})])
101
101
  @director.should_receive(:get).
102
- with("/tasks?state=processing,cancelling,queued", "application/json").
102
+ with("/tasks?state=processing,cancelling,queued&verbose=1",
103
+ "application/json").
103
104
  and_return([200, JSON.generate([]), {}])
104
105
  @director.list_running_tasks
105
106
  end
106
107
 
107
108
  it "lists recent tasks" do
108
109
  @director.should_receive(:get).
109
- with("/tasks?limit=30", "application/json").
110
+ with("/tasks?limit=30&verbose=1", "application/json").
110
111
  and_return([200, JSON.generate([]), {}])
111
112
  @director.list_recent_tasks
112
113
 
113
114
  @director.should_receive(:get).
114
- with("/tasks?limit=100", "application/json").
115
+ with("/tasks?limit=100&verbose=1", "application/json").
115
116
  and_return([200, JSON.generate([]), {}])
116
117
  @director.list_recent_tasks(100000)
118
+
119
+ @director.should_receive(:get).
120
+ with("/tasks?limit=50&verbose=2", "application/json").
121
+ and_return([200, JSON.generate([]), {}])
122
+ @director.list_recent_tasks(50, 2)
117
123
  end
118
124
 
119
125
  it "uploads release" do
@@ -124,6 +130,14 @@ describe Bosh::Cli::Director do
124
130
  @director.upload_release("/path")
125
131
  end
126
132
 
133
+ it "uploads release (with rebase)" do
134
+ @director.should_receive(:upload_and_track).
135
+ with(:post, "/releases?rebase=true", "/path",
136
+ {:content_type => "application/x-compressed"}).
137
+ and_return(true)
138
+ @director.rebase_release("/path")
139
+ end
140
+
127
141
  it "gets release info" do
128
142
  @director.should_receive(:get).
129
143
  with("/releases/foo", "application/json").
@@ -375,7 +375,7 @@ describe Bosh::Cli::JobBuilder do
375
375
  [], true, true, blobstore)
376
376
  lambda {
377
377
  final_builder.build
378
- }.should raise_error(Bosh::Cli::CliExit)
378
+ }.should raise_error(Bosh::Cli::CliError)
379
379
 
380
380
  dev_builder = new_builder("foo", [], ["bar", "baz"],
381
381
  [], true, false, blobstore)
@@ -392,7 +392,7 @@ describe Bosh::Cli::JobBuilder do
392
392
 
393
393
  lambda {
394
394
  final_builder3.build
395
- }.should raise_error(Bosh::Cli::CliExit)
395
+ }.should raise_error(Bosh::Cli::CliError)
396
396
  end
397
397
 
398
398
  it "allows template subdirectories" do
@@ -0,0 +1,111 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ require "spec_helper"
4
+
5
+ describe Bosh::Cli::JobPropertyCollection do
6
+
7
+ def make_job(properties)
8
+ mock(Bosh::Cli::JobBuilder, :properties => properties)
9
+ end
10
+
11
+ def make(job_builder, global_properties, job_properties = {}, mappings = {})
12
+ Bosh::Cli::JobPropertyCollection.new(
13
+ job_builder, global_properties, job_properties, mappings)
14
+ end
15
+
16
+ it "copies all properties from the manifest if no properties are defined" do
17
+ manifest_properties = {
18
+ "cc" => {
19
+ "token" => "deadbeef",
20
+ "foo" => %w(bar baz zaz)
21
+ },
22
+ "router" => {
23
+ "token" => "zbb"
24
+ },
25
+ "empty" => {}
26
+ }
27
+
28
+ job_properties = {
29
+ "cc" => {
30
+ "secret" => "22"
31
+ },
32
+ "foo" => "bar"
33
+ }
34
+
35
+ pc = make(make_job({}), manifest_properties, job_properties)
36
+
37
+ pc.to_hash.should == {
38
+ "cc" => {
39
+ "token" => "deadbeef",
40
+ "foo" => %w(bar baz zaz),
41
+ "secret" => "22"
42
+ },
43
+ "router" => {
44
+ "token" => "zbb"
45
+ },
46
+ "empty" => {},
47
+ "foo" => "bar"
48
+ }
49
+ end
50
+
51
+ it "copies only needed properties if job properties are defined" do
52
+ property_defs = {
53
+ "cc.foo" => {},
54
+ "router.token" => {},
55
+ "router.user" => {"default" => "admin"}
56
+ }
57
+
58
+ manifest_properties = {
59
+ "cc" => {
60
+ "token" => "deadbeef",
61
+ "foo" => %w(bar baz zaz)
62
+ },
63
+ "router" => {
64
+ "token" => "zbb"
65
+ }
66
+ }
67
+
68
+ job_properties = {
69
+ "cc" => {"foo" => "bar"}
70
+ }
71
+
72
+ pc = make(make_job(property_defs), manifest_properties, job_properties)
73
+
74
+ pc.to_hash.should == {
75
+ "cc" => {"foo" => "bar"},
76
+ "router" => {"token" => "zbb", "user" => "admin"}
77
+ }
78
+ end
79
+
80
+ it "supports property mappings" do
81
+ property_defs = {
82
+ "db.user" => {},
83
+ "db.password" => {},
84
+ "token" => {}
85
+ }
86
+
87
+ properties = {
88
+ "ccdb" => {
89
+ "user" => "admin",
90
+ "password" => "secret"
91
+ },
92
+ "router" => {"token" => "deadbeef"}
93
+ }
94
+
95
+ mappings = {
96
+ "db" => "ccdb",
97
+ "token" => "router.token"
98
+ }
99
+
100
+ pc = make(make_job(property_defs), properties, {}, mappings)
101
+
102
+ pc.to_hash.should == {
103
+ "db" => {
104
+ "user" => "admin",
105
+ "password" => "secret"
106
+ },
107
+ "token" => "deadbeef"
108
+ }
109
+ end
110
+
111
+ end
@@ -0,0 +1,7 @@
1
+ # Copyright (c) 2009-2012 VMware, Inc.
2
+
3
+ require "spec_helper"
4
+
5
+ describe Bosh::Cli::JobPropertyValidator do
6
+
7
+ end
@@ -29,8 +29,9 @@ describe Bosh::Cli::Command::Base do
29
29
  job_rename = Bosh::Cli::Command::JobRename.new
30
30
 
31
31
  lambda {
32
- job_rename.sanity_check_job_rename(new_extra_changes_manifest, "old_job", "new_job")
33
- }.should raise_error(Bosh::Cli::CliExit, /cannot have any other changes/)
32
+ job_rename.sanity_check_job_rename(
33
+ new_extra_changes_manifest, "old_job", "new_job")
34
+ }.should raise_error(Bosh::Cli::CliError, /cannot have any other changes/)
34
35
  end
35
36
 
36
37
  it "should raise exception if new manifest removed some properties" do
@@ -42,7 +43,7 @@ describe Bosh::Cli::Command::Base do
42
43
 
43
44
  lambda {
44
45
  job_rename.sanity_check_job_rename(new_manifest_with_some_deletions, "old_job", "new_job")
45
- }.should raise_error(Bosh::Cli::CliExit, /cannot have any other changes/)
46
+ }.should raise_error(Bosh::Cli::CliError, /cannot have any other changes/)
46
47
  end
47
48
 
48
49
  it "should raise exception if deployment is not updated with new job name" do
@@ -50,7 +51,7 @@ describe Bosh::Cli::Command::Base do
50
51
 
51
52
  lambda {
52
53
  job_rename.sanity_check_job_rename(new_missing_new_job, "old_job", "new_job")
53
- }.should raise_error(Bosh::Cli::CliExit, /include the new job/)
54
+ }.should raise_error(Bosh::Cli::CliError, /include the new job/)
54
55
  end
55
56
 
56
57
  it "should raise exception if old job name does not exist in manifest" do
@@ -62,7 +63,7 @@ describe Bosh::Cli::Command::Base do
62
63
 
63
64
  lambda {
64
65
  job_rename.sanity_check_job_rename(new_extra_changes_manifest, "non_existent_job", "new_job")
65
- }.should raise_error(Bosh::Cli::CliExit, /non existent job/)
66
+ }.should raise_error(Bosh::Cli::CliError, /non existent job/)
66
67
  end
67
68
 
68
69
  it "should raise exception if 2 jobs are changed in manifest" do
@@ -74,7 +75,7 @@ describe Bosh::Cli::Command::Base do
74
75
 
75
76
  lambda {
76
77
  job_rename.sanity_check_job_rename(new_extra_job_rename_manifest, "old_job", "new_job")
77
- }.should raise_error(Bosh::Cli::CliExit, /Cannot rename more than one job/)
78
+ }.should raise_error(Bosh::Cli::CliError, /Cannot rename more than one job/)
78
79
  end
79
80
 
80
81
  def old_manifest_yaml
@@ -410,7 +410,7 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
410
410
  { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
411
411
  lambda {
412
412
  final_builder.build
413
- }.should raise_error(Bosh::Cli::CliExit)
413
+ }.should raise_error(Bosh::Cli::CliError)
414
414
 
415
415
  builder = make_builder("bar", globs)
416
416
  builder.build
@@ -427,7 +427,7 @@ describe Bosh::Cli::PackageBuilder, "dev build" do
427
427
  { "name" => "bar", "files" => globs }, @release_dir, true, blobstore)
428
428
  lambda {
429
429
  final_builder3.build
430
- }.should raise_error(Bosh::Cli::CliExit)
430
+ }.should raise_error(Bosh::Cli::CliError)
431
431
  end
432
432
 
433
433
  it "includes dotfiles in a fingerprint" do
@@ -80,4 +80,37 @@ describe Bosh::Cli::ReleaseBuilder do
80
80
  builder.version.should == "7.1-dev"
81
81
  end
82
82
 
83
+ it "has packages and jobs fingerprints in spec" do
84
+ job = mock(
85
+ Bosh::Cli::JobBuilder,
86
+ :name => "job1",
87
+ :version => "1.1",
88
+ :new_version? => true,
89
+ :packages => %w(foo),
90
+ :fingerprint => "deadbeef",
91
+ :checksum => "cafebad"
92
+ )
93
+
94
+ package = mock(
95
+ Bosh::Cli::PackageBuilder,
96
+ :name => "foo",
97
+ :version => "42",
98
+ :new_version? => true,
99
+ :fingerprint => "deadcafe",
100
+ :checksum => "baddeed",
101
+ :dependencies => []
102
+ )
103
+
104
+ builder = Bosh::Cli::ReleaseBuilder.new(@release, [package], [job])
105
+ builder.should_receive(:copy_jobs)
106
+ builder.should_receive(:copy_packages)
107
+
108
+ builder.build
109
+
110
+ manifest = YAML.load_file(builder.manifest_path)
111
+
112
+ manifest["jobs"][0]["fingerprint"].should == "deadbeef"
113
+ manifest["packages"][0]["fingerprint"].should == "deadcafe"
114
+ end
115
+
83
116
  end
@@ -77,6 +77,11 @@ describe Bosh::Cli::Release do
77
77
  r.blobstore
78
78
  end
79
79
 
80
+ it "should detect blobstore secrets for deprecated options" do
81
+ r = Bosh::Cli::Release.new(spec_asset("config/deprecation"))
82
+ r.has_blobstore_secret?.should be_true
83
+ end
84
+
80
85
  it "should merge s3 secrets into options" do
81
86
  r = Bosh::Cli::Release.new(spec_asset("config/s3"))
82
87
  opts = {
@@ -88,6 +93,11 @@ describe Bosh::Cli::Release do
88
93
  r.blobstore
89
94
  end
90
95
 
96
+ it "should detect blobstore secrets for s3 options" do
97
+ r = Bosh::Cli::Release.new(spec_asset("config/s3"))
98
+ r.has_blobstore_secret?.should be_true
99
+ end
100
+
91
101
  it "should merge atmos secrets into options" do
92
102
  r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
93
103
  opts = {
@@ -97,5 +107,49 @@ describe Bosh::Cli::Release do
97
107
  Bosh::Blobstore::Client.should_receive(:create).with("atmos", opts)
98
108
  r.blobstore
99
109
  end
110
+
111
+ it "should detect blobstore secrets for atmos options" do
112
+ r = Bosh::Cli::Release.new(spec_asset("config/atmos"))
113
+ r.has_blobstore_secret?.should be_true
114
+ end
115
+
116
+ it "should merge swift (HP) secrets into options" do
117
+ r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
118
+ opts = {
119
+ :container_name => "test",
120
+ :swift_provider => "hp",
121
+ :hp => {
122
+ :hp_account_id => "foo",
123
+ :hp_secret_key => "bar",
124
+ :hp_tenant_id => "foo"
125
+ }
126
+ }
127
+ Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
128
+ r.blobstore
129
+ end
130
+
131
+ it "should detect blobstore secrets for swift (HP) options" do
132
+ r = Bosh::Cli::Release.new(spec_asset("config/swift-hp"))
133
+ r.has_blobstore_secret?.should be_true
134
+ end
135
+
136
+ it "should merge swift (Rackspace) secrets into options" do
137
+ r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
138
+ opts = {
139
+ :container_name => "test",
140
+ :swift_provider => "rackspace",
141
+ :rackspace => {
142
+ :rackspace_username => "foo",
143
+ :rackspace_api_key => "bar"
144
+ }
145
+ }
146
+ Bosh::Blobstore::Client.should_receive(:create).with("swift", opts)
147
+ r.blobstore
148
+ end
149
+
150
+ it "should detect blobstore secrets for swift (Rackspace) options" do
151
+ r = Bosh::Cli::Release.new(spec_asset("config/swift-rackspace"))
152
+ r.has_blobstore_secret?.should be_true
153
+ end
100
154
  end
101
155
  end
@@ -12,15 +12,10 @@ describe Bosh::Cli::ReleaseTarball do
12
12
 
13
13
  it "verifies repacked release if appropriate option is set" do
14
14
  tarball = Bosh::Cli::ReleaseTarball.new(spec_asset("valid_release.tgz"))
15
- remote_release = {
16
- "packages" => [{ "name" => "mutator", "version" => "2.99.7" }],
17
- "jobs" => [{ "name" => "cacher", "version" => "1" },
18
- { "name" => "sweeper", "version" => "1" }]
19
- }
20
15
  package_matches = ["86bd8b15562cde007f030a303fa64779af5fa4e7"]
21
- repacked_tarball_path = tarball.repack(remote_release, package_matches)
16
+ repacked_tarball_path = tarball.repack(package_matches)
22
17
 
23
- tarball.skipped.should == 2
18
+ tarball.skipped.should == 1
24
19
 
25
20
  repacked_tarball = Bosh::Cli::ReleaseTarball.new(repacked_tarball_path)
26
21
  repacked_tarball.valid?.should be_false
@@ -3,155 +3,5 @@
3
3
  require "spec_helper"
4
4
 
5
5
  describe Bosh::Cli::Runner do
6
-
7
- before(:all) do
8
- @out = StringIO.new
9
- Bosh::Cli::Config.output = @out
10
- end
11
-
12
- def test_cmd(args, namespace, action, cmd_args = [])
13
- runner = Bosh::Cli::Runner.new(args)
14
- runner.prepare
15
- runner.dispatch
16
-
17
- runner.namespace.should == namespace
18
- runner.action.should == action
19
- runner.args.should == cmd_args
20
- end
21
-
22
- it "has a set of default global options" do
23
- runner = Bosh::Cli::Runner.new(["do", "some", "stuff"])
24
- runner.parse_options!
25
- runner.options[:verbose].should == nil
26
- runner.options[:colorize].should == true
27
- runner.options[:director_checks].should == true
28
- runner.options[:quiet].should == nil
29
- runner.options[:non_interactive].should == nil
30
- end
31
-
32
- it "allows overriding global options" do
33
- runner = Bosh::Cli::Runner.new(["--verbose", "--no-color",
34
- "--skip-director-checks", "--quiet",
35
- "--non-interactive", "release",
36
- "upload", "/path"])
37
- runner.parse_options!
38
- runner.options[:verbose].should == true
39
- runner.options[:colorize].should == false
40
- runner.options[:director_checks].should == false
41
- runner.options[:quiet].should == true
42
- runner.options[:non_interactive].should == true
43
- end
44
-
45
- it "allows specifying target, deployment and credentials via command line" do
46
- runner = Bosh::Cli::Runner.new([
47
- "--target", "foo",
48
- "--deployment", "bar",
49
- "--user", "baz",
50
- "--password", "deadbeef"
51
- ])
52
- runner.parse_options!
53
- runner.options[:target].should == "foo"
54
- runner.options[:deployment].should == "bar"
55
- runner.options[:username].should == "baz"
56
- runner.options[:password].should == "deadbeef"
57
- end
58
-
59
- it "dispatches commands to appropriate methods (nu school)" do
60
- test_cmd(["version"], :misc, :version)
61
- test_cmd(["status"], :misc, :status)
62
- test_cmd(["alias", "test", "alias"], :misc, :set_alias, ["test", "alias"])
63
- test_cmd(["aliases"], :misc, :list_aliases)
64
- test_cmd(["target"], :misc, :show_target)
65
- test_cmd(["target", "test"], :misc, :set_target, ["test"])
66
- test_cmd(["target", "test", "alias"], :misc, :set_target, ["test", "alias"])
67
- test_cmd(["targets"], :misc, :list_targets)
68
- test_cmd(["deploy"], :deployment, :perform)
69
- test_cmd(["deployment"], :deployment, :show_current)
70
- test_cmd(["deployment", "test"], :deployment, :set_current, ["test"])
71
-
72
- test_cmd(["delete", "deployment", "foo"], :deployment, :delete, ["foo"])
73
- test_cmd(["delete", "stemcell", "a", "1"], :stemcell, :delete, ["a", "1"])
74
- test_cmd(["delete", "release", "a"], :release, :delete, ["a"])
75
- test_cmd(["delete", "release", "a", "--force"],
76
- :release, :delete, ["a", "--force"])
77
- test_cmd(["delete", "release", "a", "2.2.1", "--force"],
78
- :release, :delete, ["a", "2.2.1", "--force"])
79
-
80
- test_cmd(["create", "user", "admin"], :user, :create, ["admin"])
81
- test_cmd(["create", "user", "admin", "12321"],
82
- :user, :create, ["admin", "12321"])
83
- test_cmd(["create", "release"], :release, :create)
84
- test_cmd(["reset", "release"], :release, :reset)
85
- test_cmd(["create", "package", "bla"], :package, :create, ["bla"])
86
-
87
- test_cmd(["login", "admin", "12321"], :misc, :login, ["admin", "12321"])
88
- test_cmd(["logout"], :misc, :logout)
89
- test_cmd(["purge"], :misc, :purge_cache)
90
-
91
- test_cmd(["init", "release"], :release, :init)
92
- test_cmd(["init", "release", "/path"], :release, :init, ["/path"])
93
-
94
- test_cmd(["upload", "release", "/path"], :release, :upload, ["/path"])
95
- test_cmd(["upload", "release"], :release, :upload)
96
- test_cmd(["upload", "stemcell", "/path"], :stemcell, :upload, ["/path"])
97
-
98
- test_cmd(["generate", "package", "foo"], :package, :generate, ["foo"])
99
- test_cmd(["generate", "job", "baz"], :job, :generate, ["baz"])
100
-
101
- test_cmd(["verify", "release", "/path"], :release, :verify, ["/path"])
102
- test_cmd(["verify", "stemcell", "/path"], :stemcell, :verify, ["/path"])
103
-
104
- test_cmd(["stemcells"], :stemcell, :list)
105
- test_cmd(["releases"], :release, :list)
106
- test_cmd(["deployments"], :deployment, :list)
107
-
108
- test_cmd(["tasks"], :task, :list_running)
109
- test_cmd(["task", "500"], :task, :track, ["500"])
110
- test_cmd(["tasks"], :task, :list_running)
111
- test_cmd(["tasks", "recent"], :task, :list_recent)
112
- test_cmd(["tasks", "recent", "42"], :task, :list_recent, ["42"])
113
-
114
- test_cmd(%w(blobs), :blob_management, :status)
115
- test_cmd(%w(add blob foo bar), :blob_management, :add, %w(foo bar))
116
- test_cmd(%w(upload blobs), :blob_management, :upload)
117
- test_cmd(%w(sync blobs), :blob_management, :sync)
118
- end
119
-
120
- it "loads custom plugins" do
121
- plugin_path = spec_asset("plugins")
122
- $:.unshift(plugin_path)
123
-
124
- begin
125
- test_cmd(["banner", "foo"], :echo, :banner, ["foo"])
126
- test_cmd(["say", "bar"], :echo, :say_color, ["bar"])
127
- test_cmd(["say", "baz", "--color", "red"],
128
- :echo, :say_color, ["baz", "--color", "red"])
129
-
130
- test_cmd(["ruby", "version"], :ruby, :ruby_version)
131
- test_cmd(["ruby", "config", "arch"], :ruby, :ruby_config, ["arch"])
132
- ensure
133
- $:.shift.should == plugin_path
134
- end
135
- end
136
-
137
- describe "command completion" do
138
- let(:runner) { r = Bosh::Cli::Runner.new([]); r.prepare; r }
139
-
140
- it "should complete 'cr' to 'create'" do
141
- runner.complete("cr").should == %w[create]
142
- end
143
-
144
- it "should complete 'create' to 'package, release & user'" do
145
- completion = runner.complete("create")
146
- completion.should include("package")
147
- completion.should include("release")
148
- completion.should include("user")
149
- end
150
-
151
- it "should complete 'cr' to 'create'" do
152
- runner.complete("create u").should == %w[user]
153
- end
154
-
155
- end
156
-
6
+ pending "needs tests"
157
7
  end