collins_client 0.2.9 → 0.2.10
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/.rbenv-version +1 -0
- data/VERSION +1 -1
- data/collins_client.gemspec +5 -2
- data/lib/collins/api/asset.rb +4 -27
- data/lib/collins/api/attributes.rb +26 -3
- data/lib/collins/api/logging.rb +2 -2
- data/lib/collins/api/util/requests.rb +4 -2
- data/lib/collins/asset.rb +4 -27
- data/lib/collins/asset_find.rb +29 -0
- data/lib/collins/asset_update.rb +69 -0
- metadata +6 -3
    
        data/.rbenv-version
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            1.9.2-p290
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.2. | 
| 1 | 
            +
            0.2.10
         | 
    
        data/collins_client.gemspec
    CHANGED
    
    | @@ -5,17 +5,18 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = "collins_client"
         | 
| 8 | 
            -
              s.version = "0.2. | 
| 8 | 
            +
              s.version = "0.2.10"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Blake Matheny"]
         | 
| 12 | 
            -
              s.date = "2012- | 
| 12 | 
            +
              s.date = "2012-12-17"
         | 
| 13 13 | 
             
              s.description = "Provides ruby support for interacting with the Collins API"
         | 
| 14 14 | 
             
              s.email = "bmatheny@tumblr.com"
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| 16 16 | 
             
                "README.md"
         | 
| 17 17 | 
             
              ]
         | 
| 18 18 | 
             
              s.files = [
         | 
| 19 | 
            +
                ".rbenv-version",
         | 
| 19 20 | 
             
                "Gemfile",
         | 
| 20 21 | 
             
                "Gemfile.lock",
         | 
| 21 22 | 
             
                "README.md",
         | 
| @@ -39,6 +40,8 @@ Gem::Specification.new do |s| | |
| 39 40 | 
             
                "lib/collins/api/util/responses.rb",
         | 
| 40 41 | 
             
                "lib/collins/asset.rb",
         | 
| 41 42 | 
             
                "lib/collins/asset_client.rb",
         | 
| 43 | 
            +
                "lib/collins/asset_find.rb",
         | 
| 44 | 
            +
                "lib/collins/asset_update.rb",
         | 
| 42 45 | 
             
                "lib/collins/client.rb",
         | 
| 43 46 | 
             
                "lib/collins/errors.rb",
         | 
| 44 47 | 
             
                "lib/collins/ipmi.rb",
         | 
    
        data/lib/collins/api/asset.rb
    CHANGED
    
    | @@ -79,11 +79,6 @@ module Collins; module Api | |
| 79 79 | 
             
                # @return [Array<Collins::Asset>] An array of assets matching the query
         | 
| 80 80 | 
             
                # @raise [UnexpectedResponseError] If the HTTP response code is not a 200
         | 
| 81 81 | 
             
                def find options = {}
         | 
| 82 | 
            -
                  solrquery = options.delete(:query)
         | 
| 83 | 
            -
                  if solrquery != nil then
         | 
| 84 | 
            -
                    return search solrquery, (options[:size] || 50), (options[:sort] || "ASC"), "tag", options
         | 
| 85 | 
            -
                  end
         | 
| 86 | 
            -
                  use_api_version "1.1"
         | 
| 87 82 | 
             
                  query = asset_hash_to_find_query options
         | 
| 88 83 | 
             
                  params = query.to_a.map do |param|
         | 
| 89 84 | 
             
                    key, val = param
         | 
| @@ -102,32 +97,14 @@ module Collins; module Api | |
| 102 97 | 
             
                end
         | 
| 103 98 |  | 
| 104 99 | 
             
                def search query, size = 50, sort = "ASC", sort_field = "tag", options = {}
         | 
| 105 | 
            -
                   | 
| 106 | 
            -
                  if query.start_with? "\"" and query.end_with? "\"" then
         | 
| 107 | 
            -
                    query = query[1..-2]
         | 
| 108 | 
            -
                  end
         | 
| 100 | 
            +
                  logger.warn("client method \"search\" is deprecated, please use find instead")
         | 
| 109 101 | 
             
                  params = {
         | 
| 110 102 | 
             
                    :query => query,
         | 
| 111 103 | 
             
                    :size => size,
         | 
| 112 104 | 
             
                    :sort => sort,
         | 
| 113 | 
            -
                    : | 
| 105 | 
            +
                    :sortField => sort_field
         | 
| 114 106 | 
             
                  }
         | 
| 115 | 
            -
                   | 
| 116 | 
            -
                  params = query.to_a.map do |(key,val)|
         | 
| 117 | 
            -
                    if val.is_a?(Array) then
         | 
| 118 | 
            -
                      val.map{|v| "#{key}=#{asset_escape_attribute(v)}"}.join("&")
         | 
| 119 | 
            -
                    elsif val.nil? then
         | 
| 120 | 
            -
                      ""
         | 
| 121 | 
            -
                    else
         | 
| 122 | 
            -
                      "#{key}=#{asset_escape_attribute(val)}"
         | 
| 123 | 
            -
                    end
         | 
| 124 | 
            -
                  end.reject{|s| s.empty?}
         | 
| 125 | 
            -
                  logger.debug("perform asset search using query #{query} - #{params.inspect}")
         | 
| 126 | 
            -
                  http_get("/api/assets",params) do |response|
         | 
| 127 | 
            -
                    parse_response response, :expects => 200, :as => :paginated do |json|
         | 
| 128 | 
            -
                      json.map { |j| Collins::Asset.from_json(j) }
         | 
| 129 | 
            -
                    end
         | 
| 130 | 
            -
                  end
         | 
| 107 | 
            +
                  find params
         | 
| 131 108 | 
             
                end
         | 
| 132 109 |  | 
| 133 110 | 
             
                def find_similar asset_or_tag, size = 50, sort = "ASC", sort_type = "distance", only_unallocated = true
         | 
| @@ -152,7 +129,7 @@ module Collins; module Api | |
| 152 129 | 
             
                end
         | 
| 153 130 |  | 
| 154 131 | 
             
                def asset_hash_to_find_query opts = {}
         | 
| 155 | 
            -
                  options = opts | 
| 132 | 
            +
                  options = deep_copy_hash opts
         | 
| 156 133 | 
             
                  hash = {:attribute => []}
         | 
| 157 134 | 
             
                  okeys = options.keys
         | 
| 158 135 | 
             
                  Collins::Asset::Find::DATE_PARAMS.each do |query_key|
         | 
| @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            module Collins; module Api
         | 
| 2 2 |  | 
| 3 3 | 
             
              module Attributes
         | 
| 4 | 
            +
             | 
| 4 5 | 
             
                def delete_attribute! asset_or_tag, attribute, group_id = nil
         | 
| 5 6 | 
             
                  asset = get_asset_or_tag asset_or_tag
         | 
| 6 7 | 
             
                  parameters = {
         | 
| @@ -12,14 +13,36 @@ module Collins; module Api | |
| 12 13 | 
             
                    parse_response response, :expects => 202, :as => :status, :raise => strict?, :default => false
         | 
| 13 14 | 
             
                  end
         | 
| 14 15 | 
             
                end
         | 
| 16 | 
            +
             | 
| 15 17 | 
             
                def set_attribute! asset_or_tag, key, value, group_id = nil
         | 
| 18 | 
            +
                  set_multi_attribute! asset_or_tag, {key => value}, group_id
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def set_multi_attribute! asset_or_tag, kv_hash, group_id = nil
         | 
| 16 22 | 
             
                  asset = get_asset_or_tag asset_or_tag
         | 
| 23 | 
            +
                  http_overrides = {}
         | 
| 17 24 | 
             
                  parameters = {
         | 
| 18 | 
            -
                    : | 
| 19 | 
            -
                    : | 
| 25 | 
            +
                    :groupId => group_id,
         | 
| 26 | 
            +
                    :attribute => []
         | 
| 20 27 | 
             
                  }
         | 
| 28 | 
            +
                  kv_hash.each do |key,value|
         | 
| 29 | 
            +
                    if ::Collins::Asset::Update.is_attribute?(key) then
         | 
| 30 | 
            +
                      parameters[:attribute] << "#{key};#{value}"
         | 
| 31 | 
            +
                    else
         | 
| 32 | 
            +
                      p = ::Collins::Asset::Update.get_param(key)
         | 
| 33 | 
            +
                      parameters[p.to_sym] = ::Collins::Asset::Update.get_param_value(key, value)
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  if parameters[:attribute].empty? then
         | 
| 37 | 
            +
                    parameters[:attribute] = nil
         | 
| 38 | 
            +
                  elsif parameters[:attribute].size == 1 then
         | 
| 39 | 
            +
                    parameters[:attribute] = parameters[:attribute].first
         | 
| 40 | 
            +
                  else
         | 
| 41 | 
            +
                    http_overrides[:query_string_normalizer] = HTTParty::Request::NON_RAILS_QUERY_STRING_NORMALIZER
         | 
| 42 | 
            +
                  end
         | 
| 21 43 | 
             
                  parameters = select_non_empty_parameters parameters
         | 
| 22 | 
            -
                  logger.debug("Setting  | 
| 44 | 
            +
                  logger.debug("Setting attributes #{parameters.inspect} on #{asset.tag}")
         | 
| 45 | 
            +
                  parameters[:http_options] = http_overrides unless http_overrides.empty?
         | 
| 23 46 | 
             
                  http_post("/api/asset/#{asset.tag}", parameters, asset.location) do |response|
         | 
| 24 47 | 
             
                    parse_response response, :expects => 200, :as => :status, :raise => strict?, :default => false
         | 
| 25 48 | 
             
                  end
         | 
    
        data/lib/collins/api/logging.rb
    CHANGED
    
    | @@ -109,7 +109,8 @@ module Collins; module Api | |
| 109 109 | 
             
                # new solr interface
         | 
| 110 110 | 
             
                def search_logs options = {}
         | 
| 111 111 | 
             
                  parameters = get_page_options(options).merge(
         | 
| 112 | 
            -
                    :query => get_option(:query, options, nil)
         | 
| 112 | 
            +
                    :query => get_option(:query, options, nil),
         | 
| 113 | 
            +
                    :sortField => get_option(:sortField, options, 'ID')
         | 
| 113 114 | 
             
                  )
         | 
| 114 115 | 
             
                  parameters = select_non_empty_parameters parameters
         | 
| 115 116 | 
             
                  logger.debug("Fetching logs for all assets with parameters #{parameters.inspect}")
         | 
| @@ -118,7 +119,6 @@ module Collins; module Api | |
| 118 119 | 
             
                      json.map{|j| OpenStruct.new(symbolize_hash(j))}
         | 
| 119 120 | 
             
                    end
         | 
| 120 121 | 
             
                  end
         | 
| 121 | 
            -
             | 
| 122 122 | 
             
                end
         | 
| 123 123 |  | 
| 124 124 | 
             
                # Same as logs but for all assets
         | 
| @@ -37,8 +37,9 @@ module Collins; module Api; module Util | |
| 37 37 |  | 
| 38 38 | 
             
                def http_post uri, parameters = {}, remote = nil
         | 
| 39 39 | 
             
                  http_call(uri) {
         | 
| 40 | 
            +
                    http_overrides = parameters.delete(:http_options) || {}
         | 
| 40 41 | 
             
                    params = strip_request :body, :body => parameters
         | 
| 41 | 
            -
                    result = self.class.post(uri, http_options(params, remote))
         | 
| 42 | 
            +
                    result = self.class.post(uri, http_options(params, remote, http_overrides))
         | 
| 42 43 | 
             
                    if block_given? then
         | 
| 43 44 | 
             
                      yield(result)
         | 
| 44 45 | 
             
                    else
         | 
| @@ -59,7 +60,7 @@ module Collins; module Api; module Util | |
| 59 60 | 
             
                  }
         | 
| 60 61 | 
             
                end
         | 
| 61 62 |  | 
| 62 | 
            -
                def http_options opts = {}, remote = nil
         | 
| 63 | 
            +
                def http_options opts = {}, remote = nil, overrides = {}
         | 
| 63 64 | 
             
                  if remote then
         | 
| 64 65 | 
             
                    host_info = get_location_information remote
         | 
| 65 66 | 
             
                    auth = {:username => host_info.username, :password => host_info.password}
         | 
| @@ -70,6 +71,7 @@ module Collins; module Api; module Util | |
| 70 71 | 
             
                  end
         | 
| 71 72 | 
             
                  http_opts = opts.merge!({:basic_auth => auth, :base_uri => base_uri, :timeout => timeout_i})
         | 
| 72 73 | 
             
                  http_opts[:headers] = headers unless headers.empty?
         | 
| 74 | 
            +
                  http_opts.merge!(overrides)
         | 
| 73 75 | 
             
                  http_opts[:debug_output] = $stderr if (logger.level < 0 and Module.const_defined?(:HTTP_DEBUG) and HTTP_DEBUG)
         | 
| 74 76 | 
             
                  http_opts
         | 
| 75 77 | 
             
                end
         | 
    
        data/lib/collins/asset.rb
    CHANGED
    
    | @@ -1,4 +1,6 @@ | |
| 1 1 | 
             
            require 'collins/address'
         | 
| 2 | 
            +
            require 'collins/asset_find'
         | 
| 3 | 
            +
            require 'collins/asset_update'
         | 
| 2 4 | 
             
            require 'collins/ipmi'
         | 
| 3 5 | 
             
            require 'collins/power'
         | 
| 4 6 | 
             
            require 'collins/state'
         | 
| @@ -14,33 +16,8 @@ module Collins | |
| 14 16 |  | 
| 15 17 | 
             
                # Asset finder related parameter descriptions
         | 
| 16 18 | 
             
                # @note these exist here instead of the API module for convenience
         | 
| 17 | 
            -
                 | 
| 18 | 
            -
             | 
| 19 | 
            -
                  # @return [Array<String>] Date related query parameters
         | 
| 20 | 
            -
                  DATE_PARAMS = [
         | 
| 21 | 
            -
                    "createdAfter", "createdBefore", "updatedAfter", "updatedBefore"
         | 
| 22 | 
            -
                  ]
         | 
| 23 | 
            -
                  # Find API parameters that are not dates
         | 
| 24 | 
            -
                  # This list exists so that when assets are being queries, we know what keys in the find hash
         | 
| 25 | 
            -
                  # are attributes of the asset (such as hostname), and which are nort (such as sort or page).
         | 
| 26 | 
            -
                  # @return [Array,<String>] Non-date related query parameters that are 'reserved'
         | 
| 27 | 
            -
                  GENERAL_PARAMS = [
         | 
| 28 | 
            -
                    "details", "tag", "type", "status", "page", "size", "sort", "state", "operation", "remoteLookup", "query",
         | 
| 29 | 
            -
                    "sort_field"
         | 
| 30 | 
            -
                  ]
         | 
| 31 | 
            -
                  # @return [Array<String>] DATE_PARAMS plus GENERAL_PARAMS
         | 
| 32 | 
            -
                  ALL_PARAMS = DATE_PARAMS + GENERAL_PARAMS
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  class << self
         | 
| 35 | 
            -
                    def to_a
         | 
| 36 | 
            -
                      Collins::Asset::Find::ALL_PARAMS
         | 
| 37 | 
            -
                    end
         | 
| 38 | 
            -
                    def valid? key
         | 
| 39 | 
            -
                      to_a.include?(key.to_s)
         | 
| 40 | 
            -
                    end
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
             | 
| 19 | 
            +
                include Collins::Asset::Find
         | 
| 20 | 
            +
                include Collins::Asset::Update
         | 
| 44 21 | 
             
                include Collins::Util
         | 
| 45 22 |  | 
| 46 23 | 
             
                # @return [Array<CollinsAddress>] Addresses associated with asset
         | 
| @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            module Collins
         | 
| 2 | 
            +
              class Asset
         | 
| 3 | 
            +
                module Find
         | 
| 4 | 
            +
                  # Find API parameters that are dates
         | 
| 5 | 
            +
                  # @return [Array<String>] Date related query parameters
         | 
| 6 | 
            +
                  DATE_PARAMS = [
         | 
| 7 | 
            +
                    "createdAfter", "createdBefore", "updatedAfter", "updatedBefore"
         | 
| 8 | 
            +
                  ]
         | 
| 9 | 
            +
                  # Find API parameters that are not dates
         | 
| 10 | 
            +
                  # This list exists so that when assets are being queries, we know what keys in the find hash
         | 
| 11 | 
            +
                  # are attributes of the asset (such as hostname), and which are nort (such as sort or page).
         | 
| 12 | 
            +
                  # @return [Array,<String>] Non-date related query parameters that are 'reserved'
         | 
| 13 | 
            +
                  GENERAL_PARAMS = [
         | 
| 14 | 
            +
                    "details", "tag", "type", "status", "page", "size", "sort", "state", "operation", "remoteLookup", "query",
         | 
| 15 | 
            +
                    "sortField"
         | 
| 16 | 
            +
                  ]
         | 
| 17 | 
            +
                  # @return [Array<String>] DATE_PARAMS plus GENERAL_PARAMS
         | 
| 18 | 
            +
                  ALL_PARAMS = DATE_PARAMS + GENERAL_PARAMS
         | 
| 19 | 
            +
                  class << self
         | 
| 20 | 
            +
                    def to_a
         | 
| 21 | 
            +
                      Collins::Asset::Find::ALL_PARAMS
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                    def valid? key
         | 
| 24 | 
            +
                      to_a.include?(key.to_s)
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
            module Collins
         | 
| 2 | 
            +
              class Asset
         | 
| 3 | 
            +
                # Params we know about for updates, others come in via attribute hash
         | 
| 4 | 
            +
                module Update
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  NON_ATTRIBUTE_PARAMS = [
         | 
| 7 | 
            +
                    "CHASSIS_TAG", "RACK_POSITION", /^POWER_(.*)_(.*)/i
         | 
| 8 | 
            +
                  ]
         | 
| 9 | 
            +
                  FILE_PARAMS = [
         | 
| 10 | 
            +
                    "lshw", "lldp"
         | 
| 11 | 
            +
                  ]
         | 
| 12 | 
            +
                  ALL_PARAMS = NON_ATTRIBUTE_PARAMS + FILE_PARAMS
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  class << self
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    def to_a
         | 
| 17 | 
            +
                      Collins::Asset::Update::ALL_PARAMS
         | 
| 18 | 
            +
                    end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    def get_param_value key, value
         | 
| 21 | 
            +
                      if is_file_param?(key) then
         | 
| 22 | 
            +
                        if value.start_with?('@') then
         | 
| 23 | 
            +
                          filename = File.expand_path(value[1..-1])
         | 
| 24 | 
            +
                          if !File.readable?(filename) then
         | 
| 25 | 
            +
                            msg = "Could not read file '#{filename}' for key '#{key}'"
         | 
| 26 | 
            +
                            raise ::Collins::ExpectationFailedError.new msg
         | 
| 27 | 
            +
                          else
         | 
| 28 | 
            +
                            File.read(filename)
         | 
| 29 | 
            +
                          end
         | 
| 30 | 
            +
                        else
         | 
| 31 | 
            +
                          value
         | 
| 32 | 
            +
                        end
         | 
| 33 | 
            +
                      else
         | 
| 34 | 
            +
                        value
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
                    end # get_param_value
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def get_param key
         | 
| 39 | 
            +
                      to_a.each do |k|
         | 
| 40 | 
            +
                        if k.is_a?(Regexp) && !k.match(key).nil? then
         | 
| 41 | 
            +
                          # Assume it's a power setting until we have >1 regexp
         | 
| 42 | 
            +
                          return key.upcase
         | 
| 43 | 
            +
                        elsif key.to_s.downcase == k.to_s.downcase then
         | 
| 44 | 
            +
                          return k
         | 
| 45 | 
            +
                        end
         | 
| 46 | 
            +
                      end
         | 
| 47 | 
            +
                      return key
         | 
| 48 | 
            +
                    end # get_param
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    def is_file_param? key
         | 
| 51 | 
            +
                      FILE_PARAMS.map{|k|k.to_s.downcase}.include?(key.to_s.downcase)
         | 
| 52 | 
            +
                    end # is_file_param?
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    def is_attribute? key
         | 
| 55 | 
            +
                      to_a.each do |k|
         | 
| 56 | 
            +
                        if k.is_a?(Regexp) && !k.match(key).nil? then
         | 
| 57 | 
            +
                          return false
         | 
| 58 | 
            +
                        elsif key.to_s.downcase == k.to_s.downcase then
         | 
| 59 | 
            +
                          return false
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                      end
         | 
| 62 | 
            +
                      return true
         | 
| 63 | 
            +
                    end # is_attribute?
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  end # class << self
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                end # module Update
         | 
| 68 | 
            +
              end # class Asset
         | 
| 69 | 
            +
            end # module Collins
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: collins_client
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.10
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012- | 
| 12 | 
            +
            date: 2012-12-17 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: httparty
         | 
| @@ -34,6 +34,7 @@ extensions: [] | |
| 34 34 | 
             
            extra_rdoc_files:
         | 
| 35 35 | 
             
            - README.md
         | 
| 36 36 | 
             
            files:
         | 
| 37 | 
            +
            - .rbenv-version
         | 
| 37 38 | 
             
            - Gemfile
         | 
| 38 39 | 
             
            - Gemfile.lock
         | 
| 39 40 | 
             
            - README.md
         | 
| @@ -57,6 +58,8 @@ files: | |
| 57 58 | 
             
            - lib/collins/api/util/responses.rb
         | 
| 58 59 | 
             
            - lib/collins/asset.rb
         | 
| 59 60 | 
             
            - lib/collins/asset_client.rb
         | 
| 61 | 
            +
            - lib/collins/asset_find.rb
         | 
| 62 | 
            +
            - lib/collins/asset_update.rb
         | 
| 60 63 | 
             
            - lib/collins/client.rb
         | 
| 61 64 | 
             
            - lib/collins/errors.rb
         | 
| 62 65 | 
             
            - lib/collins/ipmi.rb
         | 
| @@ -84,7 +87,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 84 87 | 
             
                  version: '0'
         | 
| 85 88 | 
             
                  segments:
         | 
| 86 89 | 
             
                  - 0
         | 
| 87 | 
            -
                  hash: - | 
| 90 | 
            +
                  hash: -2685565510305324275
         | 
| 88 91 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 89 92 | 
             
              none: false
         | 
| 90 93 | 
             
              requirements:
         |