cloudfoundry/cfoundry

View on GitHub
lib/cfoundry/v2/base.rb

Summary

Maintainability
A
1 hr
Test Coverage
require "multi_json"

require "cfoundry/baseclient"
require "cfoundry/uaaclient"

require "cfoundry/errors"

module CFoundry::V2
  class Base < CFoundry::BaseClient
    include BaseClientMethods

    def resource_match(fingerprints)
      put("v2", "resource_match", :content => :json, :accept => :json, :payload => fingerprints)
    end

    def upload_app(guid, zipfile = nil, resources = [])
      payload = {}
      payload[:resources] = MultiJson.dump(resources)

      if zipfile
        payload[:application] =
          UploadIO.new(
            if zipfile.is_a? File
              zipfile
            elsif zipfile.is_a? String
              File.new(zipfile, "rb")
            end,
            "application/zip")
      end

      response = put("v2", "apps", guid, "bits",
        :payload => payload,
        :params => {"async" => "true"})

      if response.present?
        response_json = JSON.parse(response)
        poll_upload_until_finished(response_json['metadata']['guid'])
      end
    rescue EOFError
      retry
    end

    def poll_upload_until_finished(guid)
      while true
        response = get("v2", "jobs", guid, :accept => :json)
        break if response[:entity][:status] == "finished"

        if response[:entity][:status] == "failed"
          raise CFoundry::BadResponse
        end
        sleep 0.2
      end
    end

    def files(guid, instance, *path)
      get("v2", "apps", guid, "instances", instance, "files", *path)
    end

    alias :file :files

    def stream_file(guid, instance, *path, &blk)
      path_and_options = path + [{:return_response => true, :follow_redirects => false}]
      redirect = get("v2", "apps", guid, "instances", instance, "files", *path_and_options)

      if location = redirect[:headers]["location"]
        stream_url(location + "&tail", &blk)
      else
        yield redirect[:body]
      end
    end

    def instances(guid)
      get("v2", "apps", guid, "instances", :accept => :json)
    end

    def crashes(guid)
      get("v2", "apps", guid, "crashes", :accept => :json)
    end

    def stats(guid)
      get("v2", "apps", guid, "stats", :accept => :json)
    end

    def update_app(guid, diff)
      put("v2", "apps", guid,
          :content => :json,
          :payload => diff,
          :return_response => true)
    end

    def for_each(paginated, &block)
      paginated[:resources].each &block

      while (next_page = paginated[:next_url])
        paginated = get(next_page, :accept => :json)
        paginated[:resources].each &block
      end
    end

    def all_pages(paginated)
      payload = []
      for_each(paginated) do |resource|
        payload << resource
      end
      payload
    end
  end
end