manifests-vmc-plugin 0.3.1 → 0.4.0
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/Rakefile +47 -1
- data/lib/manifests-vmc-plugin/plugin.rb +24 -13
- data/lib/manifests-vmc-plugin/version.rb +1 -1
- data/lib/manifests-vmc-plugin.rb +118 -32
- metadata +22 -7
    
        data/Rakefile
    CHANGED
    
    | @@ -1 +1,47 @@ | |
| 1 | 
            -
            require " | 
| 1 | 
            +
            require "rake"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
         | 
| 4 | 
            +
            require "manifests-vmc-plugin/version"
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            task :default => :spec
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            desc "Run specs"
         | 
| 9 | 
            +
            task :spec => ["bundler:install", "test:spec"]
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            desc "Run integration tests"
         | 
| 12 | 
            +
            task :test => ["bundler:install", "test:integration"]
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            task :build do
         | 
| 15 | 
            +
              sh "gem build manifests-vmc-plugin.gemspec"
         | 
| 16 | 
            +
            end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            task :install => :build do
         | 
| 19 | 
            +
              sh "gem install --local manifests-vmc-plugin-#{VMCManifests::VERSION}"
         | 
| 20 | 
            +
            end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            task :uninstall do
         | 
| 23 | 
            +
              sh "gem uninstall manifests-vmc-plugin"
         | 
| 24 | 
            +
            end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            task :reinstall => [:uninstall, :install]
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            task :release => :build do
         | 
| 29 | 
            +
              sh "gem push manifests-vmc-plugin-#{VMCManifests::VERSION}.gem"
         | 
| 30 | 
            +
            end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            namespace "bundler" do
         | 
| 33 | 
            +
              desc "Install gems"
         | 
| 34 | 
            +
              task "install" do
         | 
| 35 | 
            +
                sh("bundle install")
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            namespace "test" do
         | 
| 40 | 
            +
              task "spec" do |t|
         | 
| 41 | 
            +
                # nothing
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              task "integration" do |t|
         | 
| 45 | 
            +
                sh("cd spec && bundle exec rake spec")
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| @@ -19,18 +19,20 @@ class Manifests < VMC::CLI | |
| 19 19 | 
             
              [ :start, :instances, :logs, :file, :files, :env,
         | 
| 20 20 | 
             
                :health, :stats, :scale
         | 
| 21 21 | 
             
              ].each do |wrap|
         | 
| 22 | 
            -
                optional_name = change_argument(wrap, : | 
| 22 | 
            +
                optional_name = change_argument(wrap, :app, :optional)
         | 
| 23 23 |  | 
| 24 24 | 
             
                around(wrap) do |cmd, input|
         | 
| 25 | 
            +
                  num = 0
         | 
| 25 26 | 
             
                  rest =
         | 
| 26 | 
            -
                    specific_apps_or_all(input) do | | 
| 27 | 
            -
                       | 
| 28 | 
            -
                       | 
| 27 | 
            +
                    specific_apps_or_all(input) do |info|
         | 
| 28 | 
            +
                      puts "" unless quiet? || num == 0
         | 
| 29 | 
            +
                      cmd.call(input.without(:apps).merge_given(:app => info[:name]))
         | 
| 30 | 
            +
                      num += 1
         | 
| 29 31 | 
             
                    end
         | 
| 30 32 |  | 
| 31 33 | 
             
                  if rest
         | 
| 32 | 
            -
                    rest.each do | | 
| 33 | 
            -
                      cmd.call(input. | 
| 34 | 
            +
                    rest.each do |name|
         | 
| 35 | 
            +
                      cmd.call(input.without(:apps).merge_given(:app => name))
         | 
| 34 36 | 
             
                    end
         | 
| 35 37 |  | 
| 36 38 | 
             
                  # fail manually for commands whose name we made optional
         | 
| @@ -48,18 +50,20 @@ class Manifests < VMC::CLI | |
| 48 50 |  | 
| 49 51 | 
             
                  reversed = []
         | 
| 50 52 | 
             
                  rest =
         | 
| 51 | 
            -
                    specific_apps_or_all(input) do | | 
| 52 | 
            -
                      reversed.unshift  | 
| 53 | 
            +
                    specific_apps_or_all(input) do |info|
         | 
| 54 | 
            +
                      reversed.unshift info[:name]
         | 
| 53 55 | 
             
                    end
         | 
| 54 56 |  | 
| 55 57 | 
             
                  unless reversed.empty?
         | 
| 56 | 
            -
                    cmd.call(input. | 
| 58 | 
            +
                    cmd.call(input.without(:apps).merge_given(:apps => reversed))
         | 
| 57 59 | 
             
                  end
         | 
| 58 60 |  | 
| 59 61 | 
             
                  if rest
         | 
| 60 | 
            -
                     | 
| 62 | 
            +
                    unless rest.empty?
         | 
| 63 | 
            +
                      cmd.call(input.without(:apps).merge_given(:apps => rest))
         | 
| 64 | 
            +
                    end
         | 
| 61 65 | 
             
                  else
         | 
| 62 | 
            -
                    cmd.call(input.without(: | 
| 66 | 
            +
                    cmd.call(input.without(:apps))
         | 
| 63 67 | 
             
                  end
         | 
| 64 68 | 
             
                end
         | 
| 65 69 | 
             
              end
         | 
| @@ -88,9 +92,16 @@ class Manifests < VMC::CLI | |
| 88 92 |  | 
| 89 93 | 
             
                  with_filters(
         | 
| 90 94 | 
             
                      :push => {
         | 
| 91 | 
            -
                        : | 
| 95 | 
            +
                        :create_app => proc { |a|
         | 
| 96 | 
            +
                          setup_env(a, app)
         | 
| 97 | 
            +
                          a
         | 
| 98 | 
            +
                        },
         | 
| 99 | 
            +
                        :push_app => proc { |a|
         | 
| 100 | 
            +
                          setup_services(a, app)
         | 
| 101 | 
            +
                          a
         | 
| 102 | 
            +
                        }
         | 
| 92 103 | 
             
                      }) do
         | 
| 93 | 
            -
                    push.call(input. | 
| 104 | 
            +
                    push.call(input.merge_given(app).merge(
         | 
| 94 105 | 
             
                      :bind_services => false,
         | 
| 95 106 | 
             
                      :create_services => false))
         | 
| 96 107 | 
             
                  end
         | 
    
        data/lib/manifests-vmc-plugin.rb
    CHANGED
    
    | @@ -281,12 +281,12 @@ module VMCManifests | |
| 281 281 | 
             
              # returns the names that were not paths
         | 
| 282 282 | 
             
              def specific_apps_or_all(input = nil, use_name = true, &blk)
         | 
| 283 283 | 
             
                names_or_paths =
         | 
| 284 | 
            -
                  if input.given?(: | 
| 284 | 
            +
                  if input.given?(:apps)
         | 
| 285 285 | 
             
                    # names may be given but be [], which will still cause
         | 
| 286 286 | 
             
                    # interaction, so use #given instead of #[] here
         | 
| 287 | 
            -
                    input.given(: | 
| 288 | 
            -
                  elsif input.given?(: | 
| 289 | 
            -
                    [input[: | 
| 287 | 
            +
                    input.given(:apps)
         | 
| 288 | 
            +
                  elsif input.given?(:app)
         | 
| 289 | 
            +
                    [input[:app]]
         | 
| 290 290 | 
             
                  else
         | 
| 291 291 | 
             
                    []
         | 
| 292 292 | 
             
                  end
         | 
| @@ -304,7 +304,7 @@ module VMCManifests | |
| 304 304 | 
             
                  return []
         | 
| 305 305 | 
             
                end
         | 
| 306 306 |  | 
| 307 | 
            -
                input = input.without(: | 
| 307 | 
            +
                input = input.without(:app, :apps)
         | 
| 308 308 |  | 
| 309 309 | 
             
                in_manifest = []
         | 
| 310 310 | 
             
                external = []
         | 
| @@ -373,8 +373,8 @@ module VMCManifests | |
| 373 373 | 
             
              # redeploys the app if necessary (after prompting the user), e.g. for
         | 
| 374 374 | 
             
              # runtime/framework change
         | 
| 375 375 | 
             
              def sync_changes(info)
         | 
| 376 | 
            -
                app = client. | 
| 377 | 
            -
                return unless app | 
| 376 | 
            +
                app = client.app_by_name(info[:name])
         | 
| 377 | 
            +
                return unless app
         | 
| 378 378 |  | 
| 379 379 | 
             
                diff = {}
         | 
| 380 380 | 
             
                need_restage = []
         | 
| @@ -393,8 +393,19 @@ module VMCManifests | |
| 393 393 | 
             
                      diff[k] = [old.inspect, v.inspect]
         | 
| 394 394 | 
             
                      app.env = v
         | 
| 395 395 | 
             
                    end
         | 
| 396 | 
            -
                  when "framework", "runtime" | 
| 396 | 
            +
                  when "framework", "runtime"
         | 
| 397 397 | 
             
                    old = app.send(k)
         | 
| 398 | 
            +
                    new = client.send("#{k}s").find do |x|
         | 
| 399 | 
            +
                      x.name == v
         | 
| 400 | 
            +
                    end
         | 
| 401 | 
            +
             | 
| 402 | 
            +
                    if old != new
         | 
| 403 | 
            +
                      diff[k] = [old.name, new.name]
         | 
| 404 | 
            +
                      app.send(:"#{k}=", new)
         | 
| 405 | 
            +
                      need_restage << k
         | 
| 406 | 
            +
                    end
         | 
| 407 | 
            +
                  when "command"
         | 
| 408 | 
            +
                    old = app.command
         | 
| 398 409 | 
             
                    if old != v
         | 
| 399 410 | 
             
                      diff[k] = [old, v]
         | 
| 400 411 | 
             
                      app.send(:"#{k}=", v)
         | 
| @@ -444,12 +455,15 @@ module VMCManifests | |
| 444 455 | 
             
                  end
         | 
| 445 456 |  | 
| 446 457 | 
             
                  if force? || ask("Redeploy?", :default => false)
         | 
| 458 | 
            +
                    bindings = app.services
         | 
| 459 | 
            +
             | 
| 447 460 | 
             
                    with_progress("Deleting #{c(app.name, :name)}") do
         | 
| 448 461 | 
             
                      app.delete!
         | 
| 449 462 | 
             
                    end
         | 
| 450 463 |  | 
| 451 464 | 
             
                    with_progress("Recreating #{c(app.name, :name)}") do
         | 
| 452 465 | 
             
                      app.create!
         | 
| 466 | 
            +
                      app.bind(*bindings)
         | 
| 453 467 | 
             
                    end
         | 
| 454 468 | 
             
                  end
         | 
| 455 469 | 
             
                end
         | 
| @@ -458,24 +472,29 @@ module VMCManifests | |
| 458 472 | 
             
              def ask_to_save(input, app)
         | 
| 459 473 | 
             
                return if manifest_file
         | 
| 460 474 |  | 
| 461 | 
            -
                 | 
| 475 | 
            +
                service_instances = app.services
         | 
| 462 476 |  | 
| 463 477 | 
             
                meta = {
         | 
| 464 478 | 
             
                  "name" => app.name,
         | 
| 465 | 
            -
                  "framework" => app.framework,
         | 
| 466 | 
            -
                  "runtime" => app.runtime,
         | 
| 467 | 
            -
                  "memory" => human_size(app.memory, 0),
         | 
| 479 | 
            +
                  "framework" => app.framework.name,
         | 
| 480 | 
            +
                  "runtime" => app.runtime.name,
         | 
| 481 | 
            +
                  "memory" => human_size(app.memory * 1024 * 1024, 0),
         | 
| 468 482 | 
             
                  "instances" => app.total_instances,
         | 
| 469 483 | 
             
                  "url" => app.url
         | 
| 470 484 | 
             
                }
         | 
| 471 485 |  | 
| 472 | 
            -
                unless  | 
| 486 | 
            +
                unless service_instances.empty?
         | 
| 473 487 | 
             
                  meta["services"] = {}
         | 
| 474 488 |  | 
| 475 | 
            -
                   | 
| 476 | 
            -
                     | 
| 477 | 
            -
             | 
| 478 | 
            -
             | 
| 489 | 
            +
                  service_instances.each do |i|
         | 
| 490 | 
            +
                    p = i.service_plan
         | 
| 491 | 
            +
                    s = p.service
         | 
| 492 | 
            +
             | 
| 493 | 
            +
                    meta["services"][i.name] = {
         | 
| 494 | 
            +
                      "label" => s.label,
         | 
| 495 | 
            +
                      "provider" => s.provider,
         | 
| 496 | 
            +
                      "version" => s.version,
         | 
| 497 | 
            +
                      "plan" => p.name
         | 
| 479 498 | 
             
                    }
         | 
| 480 499 | 
             
                  end
         | 
| 481 500 | 
             
                end
         | 
| @@ -485,9 +504,16 @@ module VMCManifests | |
| 485 504 | 
             
                end
         | 
| 486 505 |  | 
| 487 506 | 
             
                if ask("Save configuration?", :default => false)
         | 
| 507 | 
            +
                  if input[:path] =~ /\.[[:alnum:]]+$/
         | 
| 508 | 
            +
                    root = ask("Application root", :default => ".")
         | 
| 509 | 
            +
                    meta["path"] = input[:path]
         | 
| 510 | 
            +
                  else
         | 
| 511 | 
            +
                    root = input[:path]
         | 
| 512 | 
            +
                  end
         | 
| 513 | 
            +
             | 
| 488 514 | 
             
                  File.open("manifest.yml", "w") do |io|
         | 
| 489 515 | 
             
                    YAML.dump(
         | 
| 490 | 
            -
                      {"applications" => { | 
| 516 | 
            +
                      { "applications" => { root => meta } },
         | 
| 491 517 | 
             
                      io)
         | 
| 492 518 | 
             
                  end
         | 
| 493 519 |  | 
| @@ -495,31 +521,91 @@ module VMCManifests | |
| 495 521 | 
             
                end
         | 
| 496 522 | 
             
              end
         | 
| 497 523 |  | 
| 498 | 
            -
              def  | 
| 499 | 
            -
                 | 
| 524 | 
            +
              def env_hash(val)
         | 
| 525 | 
            +
                if val.is_a?(Hash)
         | 
| 526 | 
            +
                  val
         | 
| 527 | 
            +
                else
         | 
| 528 | 
            +
                  hash = {}
         | 
| 529 | 
            +
             | 
| 530 | 
            +
                  val.each do |pair|
         | 
| 531 | 
            +
                    name, val = pair.split("=", 2)
         | 
| 532 | 
            +
                    hash[name] = val
         | 
| 533 | 
            +
                  end
         | 
| 534 | 
            +
             | 
| 535 | 
            +
                  hash
         | 
| 536 | 
            +
                end
         | 
| 537 | 
            +
              end
         | 
| 538 | 
            +
             | 
| 539 | 
            +
              def setup_env(app, info)
         | 
| 540 | 
            +
                return unless info[:env]
         | 
| 541 | 
            +
                app.env = env_hash(info[:env])
         | 
| 542 | 
            +
              end
         | 
| 500 543 |  | 
| 544 | 
            +
              def setup_services(app, info)
         | 
| 501 545 | 
             
                return if !info[:services] || info[:services].empty?
         | 
| 502 546 |  | 
| 503 | 
            -
                services = client. | 
| 547 | 
            +
                services = client.services
         | 
| 548 | 
            +
             | 
| 549 | 
            +
                to_bind = []
         | 
| 504 550 |  | 
| 505 551 | 
             
                info[:services].each do |name, svc|
         | 
| 506 | 
            -
                   | 
| 552 | 
            +
                  if instance = client.service_instance_by_name(name)
         | 
| 553 | 
            +
                    to_bind << instance
         | 
| 554 | 
            +
                  else
         | 
| 555 | 
            +
                    service = services.find { |s|
         | 
| 556 | 
            +
                      s.label == (svc["label"] || svc["type"] || svc["vendor"]) &&
         | 
| 557 | 
            +
                        (!svc["version"] || s.version == svc["version"]) &&
         | 
| 558 | 
            +
                        (s.provider == (svc["provider"] || "core"))
         | 
| 559 | 
            +
                    }
         | 
| 507 560 |  | 
| 508 | 
            -
             | 
| 509 | 
            -
                    service.vendor = svc["vendor"] || svc["type"]
         | 
| 561 | 
            +
                    fail "Unknown service." unless service
         | 
| 510 562 |  | 
| 511 | 
            -
                     | 
| 563 | 
            +
                    plan = service.service_plans.find { |p|
         | 
| 564 | 
            +
                      p.name == svc["plan"] || "D100"
         | 
| 565 | 
            +
                    }
         | 
| 512 566 |  | 
| 513 | 
            -
                    service. | 
| 514 | 
            -
                    service.version = svc["version"] || service_meta[:versions].first
         | 
| 515 | 
            -
                    service.tier = "free"
         | 
| 567 | 
            +
                    fail "Unknown service plan." unless plan
         | 
| 516 568 |  | 
| 517 | 
            -
                     | 
| 518 | 
            -
                       | 
| 519 | 
            -
             | 
| 569 | 
            +
                    invoke :create_service,
         | 
| 570 | 
            +
                      :name => name,
         | 
| 571 | 
            +
                      :service => service,
         | 
| 572 | 
            +
                      :plan => plan,
         | 
| 573 | 
            +
                      :app => app
         | 
| 574 | 
            +
                  end
         | 
| 575 | 
            +
                end
         | 
| 576 | 
            +
             | 
| 577 | 
            +
                to_bind.each do |i|
         | 
| 578 | 
            +
                  # TODO: splat
         | 
| 579 | 
            +
                  invoke :bind_service,
         | 
| 580 | 
            +
                    :app => app,
         | 
| 581 | 
            +
                    :instance => i
         | 
| 582 | 
            +
                end
         | 
| 583 | 
            +
              end
         | 
| 584 | 
            +
             | 
| 585 | 
            +
              def megabytes(str)
         | 
| 586 | 
            +
                if str =~ /T$/i
         | 
| 587 | 
            +
                  str.to_i * 1024 * 1024
         | 
| 588 | 
            +
                elsif str =~ /G$/i
         | 
| 589 | 
            +
                  str.to_i * 1024
         | 
| 590 | 
            +
                elsif str =~ /M$/i
         | 
| 591 | 
            +
                  str.to_i
         | 
| 592 | 
            +
                elsif str =~ /K$/i
         | 
| 593 | 
            +
                  str.to_i / 1024
         | 
| 594 | 
            +
                else # assume megabytes
         | 
| 595 | 
            +
                  str.to_i
         | 
| 596 | 
            +
                end
         | 
| 597 | 
            +
              end
         | 
| 598 | 
            +
             | 
| 599 | 
            +
              def human_size(num, precision = 1)
         | 
| 600 | 
            +
                sizes = ["G", "M", "K"]
         | 
| 601 | 
            +
                sizes.each.with_index do |suf, i|
         | 
| 602 | 
            +
                  pow = sizes.size - i
         | 
| 603 | 
            +
                  unit = 1024 ** pow
         | 
| 604 | 
            +
                  if num >= unit
         | 
| 605 | 
            +
                    return format("%.#{precision}f%s", num / unit, suf)
         | 
| 520 606 | 
             
                  end
         | 
| 521 607 | 
             
                end
         | 
| 522 608 |  | 
| 523 | 
            -
                 | 
| 609 | 
            +
                format("%.#{precision}fB", num)
         | 
| 524 610 | 
             
              end
         | 
| 525 611 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: manifests-vmc-plugin
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 15
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 | 
            -
              -  | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0. | 
| 8 | 
            +
              - 4
         | 
| 9 | 
            +
              - 0
         | 
| 10 | 
            +
              version: 0.4.0
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - Alex Suraci
         | 
| @@ -15,9 +15,24 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2012-07- | 
| 19 | 
            -
            dependencies:  | 
| 20 | 
            -
             | 
| 18 | 
            +
            date: 2012-07-23 00:00:00 Z
         | 
| 19 | 
            +
            dependencies: 
         | 
| 20 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 21 | 
            +
              name: cfoundry
         | 
| 22 | 
            +
              prerelease: false
         | 
| 23 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 24 | 
            +
                none: false
         | 
| 25 | 
            +
                requirements: 
         | 
| 26 | 
            +
                - - ~>
         | 
| 27 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 28 | 
            +
                    hash: 1
         | 
| 29 | 
            +
                    segments: 
         | 
| 30 | 
            +
                    - 0
         | 
| 31 | 
            +
                    - 3
         | 
| 32 | 
            +
                    - 9
         | 
| 33 | 
            +
                    version: 0.3.9
         | 
| 34 | 
            +
              type: :runtime
         | 
| 35 | 
            +
              version_requirements: *id001
         | 
| 21 36 | 
             
            description: 
         | 
| 22 37 | 
             
            email: 
         | 
| 23 38 | 
             
            - asuraci@vmware.com
         |