vmc 0.0.8 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/LICENSE +8 -3
  2. data/README.md +83 -0
  3. data/Rakefile +11 -65
  4. data/bin/vmc +3 -2
  5. data/lib/cli/commands/admin.rb +57 -0
  6. data/lib/cli/commands/apps.rb +828 -0
  7. data/lib/cli/commands/base.rb +56 -0
  8. data/lib/cli/commands/misc.rb +99 -0
  9. data/lib/cli/commands/services.rb +84 -0
  10. data/lib/cli/commands/user.rb +60 -0
  11. data/lib/cli/config.rb +109 -0
  12. data/lib/cli/core_ext.rb +119 -0
  13. data/lib/cli/errors.rb +19 -0
  14. data/lib/cli/frameworks.rb +97 -0
  15. data/lib/cli/runner.rb +437 -0
  16. data/lib/cli/services_helper.rb +74 -0
  17. data/lib/cli/usage.rb +94 -0
  18. data/lib/cli/version.rb +5 -0
  19. data/lib/cli/zip_util.rb +61 -0
  20. data/lib/cli.rb +30 -0
  21. data/lib/vmc/client.rb +415 -0
  22. data/lib/vmc/const.rb +19 -0
  23. data/lib/vmc.rb +2 -1589
  24. data/spec/assets/app_info.txt +9 -0
  25. data/spec/assets/app_listings.txt +9 -0
  26. data/spec/assets/bad_create_app.txt +9 -0
  27. data/spec/assets/delete_app.txt +9 -0
  28. data/spec/assets/global_service_listings.txt +9 -0
  29. data/spec/assets/good_create_app.txt +9 -0
  30. data/spec/assets/good_create_service.txt +9 -0
  31. data/spec/assets/info_authenticated.txt +27 -0
  32. data/spec/assets/info_return.txt +15 -0
  33. data/spec/assets/info_return_bad.txt +16 -0
  34. data/spec/assets/login_fail.txt +9 -0
  35. data/spec/assets/login_success.txt +9 -0
  36. data/spec/assets/sample_token.txt +1 -0
  37. data/spec/assets/service_already_exists.txt +9 -0
  38. data/spec/assets/service_listings.txt +9 -0
  39. data/spec/assets/service_not_found.txt +9 -0
  40. data/spec/assets/user_info.txt +9 -0
  41. data/spec/spec_helper.rb +11 -0
  42. data/spec/unit/cli_opts_spec.rb +73 -0
  43. data/spec/unit/client_spec.rb +284 -0
  44. metadata +114 -71
  45. data/README +0 -58
  46. data/lib/parse.rb +0 -719
  47. data/lib/vmc_base.rb +0 -205
  48. data/vendor/gems/httpclient/VERSION +0 -1
  49. data/vendor/gems/httpclient/lib/http-access2/cookie.rb +0 -1
  50. data/vendor/gems/httpclient/lib/http-access2/http.rb +0 -1
  51. data/vendor/gems/httpclient/lib/http-access2.rb +0 -53
  52. data/vendor/gems/httpclient/lib/httpclient/auth.rb +0 -522
  53. data/vendor/gems/httpclient/lib/httpclient/cacert.p7s +0 -1579
  54. data/vendor/gems/httpclient/lib/httpclient/cacert_sha1.p7s +0 -1579
  55. data/vendor/gems/httpclient/lib/httpclient/connection.rb +0 -84
  56. data/vendor/gems/httpclient/lib/httpclient/cookie.rb +0 -562
  57. data/vendor/gems/httpclient/lib/httpclient/http.rb +0 -867
  58. data/vendor/gems/httpclient/lib/httpclient/session.rb +0 -864
  59. data/vendor/gems/httpclient/lib/httpclient/ssl_config.rb +0 -417
  60. data/vendor/gems/httpclient/lib/httpclient/timeout.rb +0 -136
  61. data/vendor/gems/httpclient/lib/httpclient/util.rb +0 -86
  62. data/vendor/gems/httpclient/lib/httpclient.rb +0 -1020
  63. data/vendor/gems/httpclient/lib/tags +0 -908
data/lib/parse.rb DELETED
@@ -1,719 +0,0 @@
1
- # Copyright 2010, VMware, Inc. Licensed under the
2
- # MIT license, please see the LICENSE file. All rights reserved
3
-
4
- require File.join(File.dirname(__FILE__),'vmc')
5
-
6
- require 'yaml'
7
-
8
- def display(msg, nl=true)
9
- if nl
10
- puts(msg)
11
- else
12
- print(msg)
13
- STDOUT.flush
14
- end
15
- end
16
-
17
- def display_usage(msg, nl=true)
18
- display("\nUsage: vmc #{msg}\n\n", nl)
19
- end
20
-
21
- def show_help
22
- help = %Q{
23
-
24
- version # version
25
- help, -h # show usage
26
-
27
- aliases # lists current aliases
28
- alias <alias>[=]<command> # create an alias for a command
29
-
30
- target [host[:port]] # reports current target or sets the target site
31
- info # information
32
- register [--email, --passwd] # register and create an account
33
- login [email] [--email, --passwd] # login
34
- logout # logout
35
- passwd # change password for current user
36
- user # display current user
37
-
38
- services # list of services available
39
-
40
- create-service <service> [--name, --bind] # create a service instance. we will
41
- # auto-generate a name if you leave off
42
- # the --name flag, if you add the --bind
43
- # flag with an app name we will also bind
44
- # the service to that app
45
-
46
- delete-service [service] # delete the service
47
-
48
- bind-service <service> <appname> # bind service to appname
49
- unbind-service <service> <appname> # unbind service from appname
50
-
51
- apps # list your apps
52
- push <appname> [--instances --exec
53
- --noframework --url
54
- --mem --path
55
- --no-start] # push and start the application
56
- push <appname> # push and start the application
57
- start <appname> # start the application
58
- stop <appname> # stop the application
59
- restart <appname> # restart the application
60
- delete <appname || --all> [--force] # delete the application
61
- update <appname> [--canary] # update the application
62
- instances <appname> [num] # list instances, scale up or down
63
- # the number of instances
64
-
65
- mem <appname> [memsize] # update the memory reservation for this application
66
-
67
- crashes <appname> # list recent application crashes
68
- crashlogs <appname> [--instance] # dump all the logs for the crashed instance
69
- logs <appname> [--instance] # dump all the logs for the instance
70
- files <appname> [path] [--instance] # directory listing or file download
71
- stats <appname> # report resource usage for the application
72
-
73
- map <appname> <url> # register the application with the url
74
- unmap <appname> <url> # unregister the application from the url
75
-
76
- }
77
-
78
- display(help)
79
- end
80
-
81
- def setup(verb)
82
- trap("TERM") { print "\nInterupted\n\n"; exit}
83
- trap("INT") { print "\nInterupted\n\n"; exit}
84
- cli = VMC::Client.new
85
- cli.set_puser($puser)
86
- cli.setup_target_uris
87
- # Check to make sure the server is there..
88
- cli.check_target unless verb =~ /target/i
89
- cli
90
- end
91
-
92
- def get_option(options, default=true)
93
- test = [options]
94
- args = ARGV
95
- return unless opt_index = ARGV.select { |a| test.include? a }.first
96
- opt_position = args.index(opt_index) + 1
97
- if ARGV.size > opt_position && opt_value = ARGV[opt_position]
98
- if opt_value.include?('--')
99
- opt_value = nil
100
- else
101
- ARGV.delete_at(opt_position)
102
- end
103
- end
104
- ARGV.delete(opt_index)
105
- opt_value ||= default
106
- end
107
-
108
- $puser = get_option('-u')
109
-
110
- # parse command line aliases from '~/.vmc-aliases'
111
- alias_file = File.expand_path('~/.vmc-aliases')
112
- if File.exist?(alias_file)
113
- aliases = YAML.load_file(alias_file)
114
- if key = aliases.values.grep(ARGV[0]).first
115
- #display "[#{ARGV[0]} aliased to #{aliases.invert[key]}]"
116
- ARGV[0] = aliases.invert[key]
117
- end
118
- end
119
-
120
- require 'main'
121
-
122
-
123
- # hack, allows support negative deltas for instances, like vmc instances foo -2
124
- if ARGV[0] =~ /instances/i && ARGV[2] =~ /(-\d+)/
125
- ARGV[2] = '--n'
126
- ARGV[3] = $1
127
- end
128
-
129
- Main {
130
-
131
- description "VMware Cloud Command Line Tool"
132
-
133
- mode(:version) {
134
- description "Show version of this CLI"
135
- def run
136
- cli = setup(:version)
137
- cli.version
138
- end
139
- }
140
-
141
- mode(:delete) {
142
- description "delete the application"
143
- option 'delete-option'
144
- argument(:appname){
145
- optional
146
-
147
- }
148
- option('all'){
149
- cast :boolean
150
- }
151
-
152
- option('force'){
153
- cast :boolean
154
- }
155
- def run
156
- if (! params['all'].given?) && (! params['appname'].given? )
157
- display_usage "delete <appname || --all>"
158
- exit 1
159
- end
160
- cli = setup('delete')
161
- cli.delete(params['all'].given? ? '--all' : params['appname'].value, params['force'].given?)
162
- end
163
- }
164
-
165
- # vmc alias restart bounce
166
- mode(:alias) {
167
- description "create an alias for a command in our CLI namespace"
168
- argument(:_alias){
169
- required
170
- error { display_usage "alias <alias>[=]<command>" }
171
- }
172
- argument(:real){ optional }
173
- argument(:real2){ optional }
174
-
175
- def run
176
- alias_file = File.expand_path('~/.vmc-aliases')
177
- aliases = YAML.load_file(alias_file) rescue {}
178
-
179
- _alias = params['_alias'].value
180
- real = params['real'].value
181
- real2 = params['real2'].value
182
-
183
- k = v = nil
184
-
185
- if (_alias and real and not real2)
186
- k,v = _alias, real
187
- elsif (_alias and not real and not real2)
188
- k,v = _alias.split('=')
189
- elsif (_alias and real and real2 and real == '=')
190
- k,v = _alias, real2
191
- else
192
- display_usage "alias <alias>[=]<command>"
193
- exit(1)
194
- end
195
-
196
- aliases[v] = k
197
- File.open(alias_file, 'wb') {|f| f.write(aliases.to_yaml)}
198
- display("Successfully aliased #{k} to #{v}")
199
- rescue => e
200
- error("There was a problem writing to the '~/.vmc-aliases' file: #{e}")
201
- end
202
- }
203
-
204
- mode(:aliases) {
205
- description "List aliases"
206
-
207
- def run
208
- alias_file = File.expand_path('~/.vmc-aliases')
209
- aliases = YAML.load_file(alias_file) rescue {}
210
- aliases.each do |k,v|
211
- display "#{v} = #{k}"
212
- end
213
- end
214
- }
215
-
216
- mode('remove-alias') {
217
- description "Remove alias"
218
- argument(:_alias){
219
- required
220
- error { display_usage "remove-alias <alias>" }
221
- }
222
-
223
- def run
224
- alias_file = File.expand_path('~/.vmc-aliases')
225
- aliases = YAML.load_file(alias_file) rescue {}
226
- aliases.each do |k,v|
227
- aliases.delete(k) if v == params['_alias'].value
228
- end
229
- File.open(alias_file, 'wb') {|f| f.write(aliases.to_yaml)}
230
- display "Successfully removed alias: #{params['_alias'].value}\nRemaining aliases:\n"
231
- aliases.each do |k,v|
232
- display "#{v} = #{k}"
233
- end
234
-
235
- end
236
- }
237
-
238
- mode(:target) {
239
- description "Set the target Cloud for this CLI session"
240
- argument(:host){ optional }
241
- def run
242
- cli = setup('target')
243
- cli.target(params['host'].value)
244
- end
245
- }
246
-
247
- mode(:info) {
248
- description "information (optionally about services)"
249
- def run
250
- cli = setup('info')
251
- cli.info
252
- end
253
- }
254
-
255
- mode(:register) {
256
- description "register and create an account"
257
-
258
- option('email=[email]'){
259
- arity 1
260
- }
261
-
262
- option('passwd=[passwd]'){
263
- arity 1
264
- }
265
-
266
- def run
267
- cli = setup('register')
268
- cli.register(params['email'].value, params['passwd'].value)
269
- end
270
- }
271
-
272
- mode(:login) {
273
- description "login to the cloud"
274
-
275
- argument(:email_arg) { optional }
276
- argument(:passwd_arg) { optional }
277
-
278
-
279
- option('email=[email]'){
280
- arity 1
281
- }
282
-
283
- option('passwd=[passwd]'){
284
- arity 1
285
- }
286
-
287
- def run
288
- cli = setup('login')
289
-
290
- email = params['email_arg'].given? ? params['email_arg'].value : params['email'].value
291
- pass = params['passwd_arg'].given? ? params['passwd_arg'].value : params['passwd'].value
292
- cli.login(email, pass)
293
- end
294
- }
295
-
296
- mode(:logout) {
297
- description "logout"
298
- def run
299
- cli = setup('logout')
300
- cli.logout
301
- end
302
- }
303
-
304
- mode(:passwd) {
305
- description "change password for current user"
306
-
307
- option('passwd=[passwd]'){
308
- arity 1
309
- }
310
-
311
- def run
312
- cli = setup('passwd')
313
- cli.passwd(params['passwd'].value)
314
- end
315
- }
316
-
317
- mode(:user) {
318
- description "display current user"
319
- def run
320
- cli = setup('user')
321
- cli.user
322
- end
323
- }
324
-
325
- mode(:services) {
326
- description "list of services available"
327
- def run
328
- cli = setup('services')
329
- cli.services
330
- end
331
- }
332
-
333
-
334
- # vmc create-service redis --name my-redis
335
- mode('create-service') {
336
- description "provision a service"
337
- option 'add-option'
338
-
339
- argument(:servicename) {
340
- required
341
- error { display_usage "create-service <service> [--name, --bind]" }
342
- }
343
-
344
- argument(:pname) { optional }
345
- argument(:pbind) { optional }
346
-
347
- option('name=[name]'){
348
- arity 1
349
- }
350
-
351
- option('bind=[bind]'){
352
- arity 1
353
- }
354
-
355
- def run
356
- cli = setup('create_service')
357
- opts = {
358
- :bind => params['bind'].value || params['pbind'].value,
359
- :name => params['name'].value || params['pname'].value,
360
- }
361
- cli.create_service(params['servicename'].value, opts)
362
- end
363
- }
364
-
365
- mode('delete-service') {
366
- description "Delete a provisioned service"
367
- argument(:servicename) { optional }
368
-
369
- def run
370
- cli = setup('delete_service')
371
- cli.delete_service(params['servicename'].value)
372
- end
373
- }
374
-
375
- mode('bind-service') {
376
- description "Bind a provisioned service"
377
-
378
- argument(:servicename){
379
- required
380
- error { display_usage "bind-service <service> <appname>" }
381
- }
382
- argument(:appname){
383
- required
384
- error { display_usage "bind-service <service> <appname>" }
385
- }
386
-
387
- def run
388
- cli = setup('bind_service')
389
- cli.bind_service(params['servicename'].value, params['appname'].value)
390
- end
391
- }
392
-
393
- mode('unbind-service') {
394
- description "Bind a provisioned service"
395
-
396
- argument(:servicename){
397
- required
398
- error { display_usage "unbind-service <service> <appname>" }
399
- }
400
- argument(:appname){
401
- required
402
- error { display_usage "unbind-service <service> <appname>" }
403
- }
404
-
405
- def run
406
- cli = setup('unbind_service')
407
- cli.unbind_service(params['servicename'].value, params['appname'].value)
408
- end
409
- }
410
-
411
- mode(:apps) {
412
- description "list your apps"
413
- option 'apps-option'
414
-
415
- def run
416
- cli = setup('apps')
417
- cli.apps(nil)
418
- end
419
- }
420
-
421
- mode(:mem) {
422
- argument(:appname){
423
- required
424
- error { display_usage "mem <appname> [memsize]"}
425
- }
426
- argument(:memsize){ optional }
427
- def run
428
- if params['memsize'].given?
429
- unless %w(64M 128M 256M 512M 1G 2G).include?(params['memsize'].value)
430
- display_usage "mem <appname> <memsize>"
431
- display "<memsize> must be one of: (64M 128M 256M 512M)"
432
- display "you provided #{params['memsize'].value}"
433
- exit 1
434
- end
435
- end
436
-
437
- cli = setup('mem')
438
- cli.mem(params['appname'].value, params['memsize'].value)
439
- end
440
-
441
- }
442
-
443
- mode(:push) {
444
- description "push and start the application"
445
- option 'push-option'
446
- argument(:appname){ optional }
447
-
448
- option('instances=[instances]'){
449
- arity 1
450
- }
451
-
452
- option('exec=[exec]'){
453
- arity 1
454
- }
455
-
456
- option('path=[path]'){
457
- arity 1
458
- }
459
-
460
- option('noframework'){
461
- default false
462
- }
463
-
464
- option('url=[url]'){
465
- arity 1
466
- }
467
-
468
- option('mem=[mem]'){
469
- arity 1
470
- }
471
-
472
- option('no-start'){
473
-
474
- }
475
-
476
- def run
477
- cli = setup('push')
478
-
479
- if params['mem'].given?
480
- unless %w(64M 128M 256M 512M 1G 2G).include?(params['mem'].value)
481
- display_usage "push --mem <memsize>"
482
- display "<memsize> must be one of: (64M 128M 256M 512M)"
483
- display "you provided #{params['mem'].value}"
484
- exit 1
485
- end
486
- end
487
-
488
- opts = {:instances => params['instances'].value,
489
- :exec => params['exec'].value,
490
- :noframework => params['noframework'].value,
491
- :appname => params['appname'].value,
492
- :url => params['url'].value,
493
- :mem => params['mem'].value,
494
- :path => params['path'].value,
495
- :no_start => params['no-start'].given?
496
- }
497
- cli.push(opts)
498
- end
499
- }
500
-
501
- mode(:start) {
502
- description "start the application"
503
- option 'start-option'
504
- argument(:appname){
505
- required
506
- error { display_usage "start <appname>" }
507
- }
508
- def run
509
- cli = setup('start')
510
- cli.start(params['appname'].value)
511
- end
512
- }
513
-
514
- mode(:stop) {
515
- description "stop the application"
516
- option 'stop-option'
517
- argument(:appname){
518
- required
519
- error { display_usage "stop <appname>" }
520
- }
521
- def run
522
- cli = setup('stop')
523
- cli.stop(params['appname'].value)
524
- end
525
- }
526
-
527
- mode(:restart) {
528
- description "restart the application"
529
- option 'restart-option'
530
- argument(:appname){
531
- required
532
- error { display_usage "restart <appname>" }
533
- }
534
- def run
535
- cli = setup('restart')
536
- cli.restart(params['appname'].value)
537
- end
538
- }
539
-
540
- mode(:update) {
541
- description "update the application"
542
- option 'update-option'
543
- argument(:appname){
544
- required
545
- error { display_usage "update <appname> [--canary]" }
546
- }
547
- option('canary'){
548
- cast :bool
549
- default true
550
- optional
551
- }
552
- def run
553
- cli = setup('update')
554
- cli.update(params['appname'].value, params['canary'].given?)
555
- end
556
- }
557
-
558
- mode(:instances) {
559
- description "list instances, scale up or down the number of instances"
560
- option 'instances-option'
561
-
562
- argument(:appname){
563
- required
564
- error { display_usage "instances <appname> [num]" }
565
- }
566
- argument(:num){
567
- optional
568
- }
569
- option(:n) {
570
- argument_required
571
- }
572
-
573
- def run
574
- cli = setup('instances')
575
- chg = params['n'].given? ? params['n'].value : params['num'].value
576
- cli.instances(params['appname'].value, chg)
577
- end
578
- }
579
-
580
- mode(:map) {
581
- description "register the application with the url"
582
- option 'map-option'
583
- argument(:appname){
584
- required
585
- error { display_usage "map <appname> <url>"}
586
- }
587
- argument(:url){
588
- required
589
- error { display_usage "map <appname> <url>"}
590
- }
591
-
592
- def run
593
- cli = setup('map')
594
- cli.map(params['appname'].value, params['url'].value)
595
- end
596
- }
597
-
598
- mode(:unmap) {
599
- description "unregister the application from the url"
600
- option 'unmap-option'
601
- argument(:appname){
602
- required
603
- error { display_usage "unmap <appname> <url>"}
604
- }
605
- argument(:url){
606
- required
607
- error { display_usage "unmap <appname> <url>"}
608
- }
609
- def run
610
- cli = setup('unmap')
611
- cli.unmap(params['appname'].value, params['url'].value)
612
- end
613
- }
614
-
615
- mode(:crashes) {
616
- description "list recent application crashes"
617
- option 'crashes-option'
618
- argument(:appname){
619
- required
620
- error { display_usage "crashes <appname>" }
621
- }
622
- def run
623
- cli = setup('crashes')
624
- cli.crashes(params['appname'].value)
625
- end
626
- }
627
-
628
- mode(:files) {
629
- description "directory listing or file download"
630
- option 'files-option'
631
- argument(:appname){
632
- required
633
- error { display_usage "files <appname> [path]" }
634
- }
635
- argument(:dir_or_file){ optional }
636
- option('instance', 'i'){
637
- default '0'
638
- optional
639
- arity 1
640
- argument_required
641
- }
642
- def run
643
- cli = setup('files')
644
- cli.files(params['appname'].value, params['dir_or_file'].value, params['instance'].value)
645
- end
646
- }
647
-
648
- mode(:crashlogs) {
649
- description "Dump all logs from first crashed instance"
650
- argument(:appname){
651
- required
652
- error { display_usage "crashlogs <appname> [--instance]" }
653
- }
654
- option('instance', 'i'){
655
- default '0'
656
- arity 1
657
- optional
658
- argument_required
659
- }
660
-
661
- def run
662
- cli = setup('crashlogs')
663
- cli.grab_crash_logs(params['appname'].value, params['instance'].value)
664
- end
665
- }
666
-
667
- mode(:logs) {
668
- description "Dump all logs"
669
- argument(:appname){
670
- required
671
- error { display_usage "logs <appname> [--instance]" }
672
- }
673
- option('instance', 'i'){
674
- default '0'
675
- arity 1
676
- optional
677
- argument_required
678
- }
679
-
680
- def run
681
- cli = setup('logs')
682
- cli.grab_logs(params['appname'].value, params['instance'].value)
683
- end
684
- }
685
-
686
- mode(:stats) {
687
- description "report resource usage for the application"
688
- option 'stats-option'
689
- argument(:appname){
690
- required
691
- error { display_usage "stats <appname>" }
692
- }
693
- def run
694
- cli = setup('stats')
695
- cli.stats(params['appname'].value)
696
- end
697
- }
698
-
699
- mode(:help) {
700
- show_help
701
- }
702
-
703
- mode('-h') {
704
- show_help
705
- }
706
-
707
- mode('-v') {
708
- description "Show version of this CLI"
709
- def run
710
- cli = setup(:version)
711
- cli.version
712
- end
713
- }
714
-
715
- def run
716
- display "\nUsage: vmc COMMAND [OPTIONS] 'vmc -h' for more information.\n\n"
717
- end
718
-
719
- }