hawkular-client 3.0.2 → 4.0.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.
- checksums.yaml +4 -4
- data/CHANGES.rdoc +5 -0
- data/README.rdoc +1 -1
- data/lib/hawkular/base_client.rb +14 -23
- data/lib/hawkular/client_utils.rb +18 -0
- data/lib/hawkular/hawkular_client.rb +4 -2
- data/lib/hawkular/inventory/entities.rb +4 -2
- data/lib/hawkular/inventory/inventory_api.rb +43 -21
- data/lib/hawkular/metrics/metrics_client.rb +3 -2
- data/lib/hawkular/operations/operations_api.rb +41 -26
- data/lib/hawkular/version.rb +1 -1
- metadata +4 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 29d98c76e5262c54b3c0949ebfd998051e3abb81
         | 
| 4 | 
            +
              data.tar.gz: b7c63829113d7bd814d5a300f3e6d8da36b48195
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5e3c7e6e3ccc5bdd7357dfa435046bf428f7f5a88800222d4dedddcd6e525a28a348a6af6d725096c49b71b8c724ceed0263948b2ec85b9a963b31f2761dd92a
         | 
| 7 | 
            +
              data.tar.gz: 50aa5323c03caf2704e1d5848c7311ef7d9c640a7c73583aa911da9d8976262f75bc6139a385a8f541f58cdf1c1b5dd843e642ce4d9367523c5062370d2d214b
         | 
    
        data/CHANGES.rdoc
    CHANGED
    
    | @@ -4,6 +4,11 @@ This document describes the relevant changes between releases of the | |
| 4 4 | 
             
            _hawkular-client_ project.
         | 
| 5 5 |  | 
| 6 6 |  | 
| 7 | 
            +
            === v 4.0.0
         | 
| 8 | 
            +
            * Standardized Exceptions under the Hawkular namespace, and the old names were deprecated, here is the list:
         | 
| 9 | 
            +
              1. <code>Hawkular::BaseClient::HawkularException</code> -> <code>Hawkular::Exception</code>
         | 
| 10 | 
            +
              2. <code>Hawkular::BaseClient::HawkularConnectionException</code> -> <code>Hawkular::ConnectionException</code>
         | 
| 11 | 
            +
             | 
| 7 12 | 
             
            === v 3.0.2
         | 
| 8 13 | 
             
            * Adding <code>URI.unescape</code> in the <code>list_metrics_for_resource</code> method to fix the behavior of the method
         | 
| 9 14 |  | 
    
        data/README.rdoc
    CHANGED
    
    
    
        data/lib/hawkular/base_client.rb
    CHANGED
    
    | @@ -9,6 +9,9 @@ module Hawkular | |
| 9 9 | 
             
              # that inherit from it. You should not directly use it,
         | 
| 10 10 | 
             
              # but through the more specialized clients.
         | 
| 11 11 | 
             
              class BaseClient
         | 
| 12 | 
            +
                HawkularException = Hawkular::Exception
         | 
| 13 | 
            +
                HawkularConnectionException = Hawkular::ConnectionException
         | 
| 14 | 
            +
             | 
| 12 15 | 
             
                include ClientUtils
         | 
| 13 16 |  | 
| 14 17 | 
             
                # @!visibility private
         | 
| @@ -34,7 +37,7 @@ module Hawkular | |
| 34 37 |  | 
| 35 38 | 
             
                  @logger = Hawkular::Logger.new
         | 
| 36 39 |  | 
| 37 | 
            -
                  fail 'You need to provide an entrypoint' if entrypoint.nil?
         | 
| 40 | 
            +
                  fail Hawkular::ArgumentError, 'You need to provide an entrypoint' if entrypoint.nil?
         | 
| 38 41 | 
             
                end
         | 
| 39 42 |  | 
| 40 43 | 
             
                def http_get(suburl, headers = {})
         | 
| @@ -141,7 +144,8 @@ module Hawkular | |
| 141 144 | 
             
                # @param suffix_path [String] sufix path to be added if it doesn't exist
         | 
| 142 145 | 
             
                # @return [String] URL with path attached to it at the end
         | 
| 143 146 | 
             
                def normalize_entrypoint_url(entrypoint, suffix_path)
         | 
| 144 | 
            -
                  fail ArgumentError, 'suffix_path must not be empty' if suffix_path.empty?
         | 
| 147 | 
            +
                  fail Hawkular::ArgumentError, 'suffix_path must not be empty' if suffix_path.empty?
         | 
| 148 | 
            +
             | 
| 145 149 | 
             
                  strip_path = suffix_path.gsub(%r{/$}, '')
         | 
| 146 150 | 
             
                  strip_path.nil? || suffix_path = strip_path
         | 
| 147 151 | 
             
                  strip_path = suffix_path.gsub(%r{^/}, '')
         | 
| @@ -165,21 +169,6 @@ module Hawkular | |
| 165 169 | 
             
                  url.to_s.sub(/^http(s?)/, 'ws\1')
         | 
| 166 170 | 
             
                end
         | 
| 167 171 |  | 
| 168 | 
            -
                # Specialized exception to be thrown
         | 
| 169 | 
            -
                # when the interaction with Hawkular fails
         | 
| 170 | 
            -
                class HawkularException < StandardError
         | 
| 171 | 
            -
                  def initialize(message, status_code = 0)
         | 
| 172 | 
            -
                    @message = message
         | 
| 173 | 
            -
                    @status_code = status_code
         | 
| 174 | 
            -
                    super(message)
         | 
| 175 | 
            -
                  end
         | 
| 176 | 
            -
             | 
| 177 | 
            -
                  attr_reader :message, :status_code
         | 
| 178 | 
            -
                end
         | 
| 179 | 
            -
             | 
| 180 | 
            -
                class HawkularConnectionException < HawkularException
         | 
| 181 | 
            -
                end
         | 
| 182 | 
            -
             | 
| 183 172 | 
             
                def admin_header
         | 
| 184 173 | 
             
                  headers = {}
         | 
| 185 174 | 
             
                  headers[:'Hawkular-Admin-Token'] = @admin_token unless @admin_token.nil?
         | 
| @@ -201,17 +190,18 @@ module Hawkular | |
| 201 190 | 
             
                # @!visibility private
         | 
| 202 191 | 
             
                def connect_error(fault)
         | 
| 203 192 | 
             
                  if fault.is_a?(SocketError)
         | 
| 204 | 
            -
                     | 
| 193 | 
            +
                    Hawkular::ConnectionException.new(fault.to_s)
         | 
| 205 194 | 
             
                  elsif [Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH,
         | 
| 206 195 | 
             
                         Errno::EADDRNOTAVAIL, Errno::ENETDOWN, Errno::ENETUNREACH,
         | 
| 207 196 | 
             
                         Errno::ETIMEDOUT].include?(fault.class)
         | 
| 208 | 
            -
                     | 
| 197 | 
            +
                    Hawkular::ConnectionException.new(fault.to_s, fault.class::Errno)
         | 
| 209 198 | 
             
                  end
         | 
| 210 199 | 
             
                end
         | 
| 211 200 |  | 
| 212 201 | 
             
                def handle_fault(f)
         | 
| 213 202 | 
             
                  http_code = (f.respond_to?(:http_code) ? f.http_code : 0)
         | 
| 214 | 
            -
                  fail  | 
| 203 | 
            +
                  fail Hawkular::Exception.new('Unauthorized', http_code) if f.instance_of? RestClient::Unauthorized
         | 
| 204 | 
            +
             | 
| 215 205 | 
             
                  if f.respond_to?(:http_body) && !f.http_body.nil?
         | 
| 216 206 | 
             
                    begin
         | 
| 217 207 | 
             
                      json_body = JSON.parse(f.http_body)
         | 
| @@ -219,11 +209,12 @@ module Hawkular | |
| 219 209 | 
             
                    rescue JSON::ParserError
         | 
| 220 210 | 
             
                      fault_message = f.http_body
         | 
| 221 211 | 
             
                    end
         | 
| 222 | 
            -
             | 
| 212 | 
            +
             | 
| 213 | 
            +
                    fail Hawkular::Exception.new(fault_message, http_code)
         | 
| 223 214 | 
             
                  elsif (connect_error_exception = connect_error(f))
         | 
| 224 | 
            -
                    fail connect_error_exception
         | 
| 215 | 
            +
                    fail Hawkular::ConnectionException, connect_error_exception
         | 
| 225 216 | 
             
                  else
         | 
| 226 | 
            -
                    fail f
         | 
| 217 | 
            +
                    fail Hawkular::Exception, f
         | 
| 227 218 | 
             
                  end
         | 
| 228 219 | 
             
                end
         | 
| 229 220 | 
             
              end
         | 
| @@ -1,4 +1,22 @@ | |
| 1 1 | 
             
            module Hawkular
         | 
| 2 | 
            +
              # Specialized exception to be thrown
         | 
| 3 | 
            +
              # when the interaction with Hawkular fails
         | 
| 4 | 
            +
              class Exception < StandardError
         | 
| 5 | 
            +
                def initialize(message, status_code = 0)
         | 
| 6 | 
            +
                  @message = message
         | 
| 7 | 
            +
                  @status_code = status_code
         | 
| 8 | 
            +
                  super(message)
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                attr_reader :message, :status_code
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              class ConnectionException < Hawkular::Exception
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              class ArgumentError < Hawkular::Exception
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 2 20 | 
             
              module ClientUtils
         | 
| 3 21 | 
             
                # Escapes the passed url part. This is necessary,
         | 
| 4 22 | 
             
                # as many ids inside Hawkular can contain characters
         | 
| @@ -12,7 +12,9 @@ module Hawkular | |
| 12 12 | 
             
                def initialize(hash)
         | 
| 13 13 | 
             
                  hash[:credentials] ||= {}
         | 
| 14 14 | 
             
                  hash[:options] ||= {}
         | 
| 15 | 
            -
             | 
| 15 | 
            +
             | 
| 16 | 
            +
                  fail Hawkular::ArgumentError, 'no parameter ":entrypoint" given' if hash[:entrypoint].nil?
         | 
| 17 | 
            +
             | 
| 16 18 | 
             
                  @state = hash
         | 
| 17 19 | 
             
                end
         | 
| 18 20 |  | 
| @@ -24,7 +26,7 @@ module Hawkular | |
| 24 26 | 
             
                                    when /^operations_/ then operations
         | 
| 25 27 | 
             
                                    when /^tokens_/ then tokens
         | 
| 26 28 | 
             
                                    else
         | 
| 27 | 
            -
                                      fail "unknown method prefix `#{name}`, allowed prefixes:"\
         | 
| 29 | 
            +
                                      fail Hawkular::ArgumentError, "unknown method prefix `#{name}`, allowed prefixes:"\
         | 
| 28 30 | 
             
                  '`inventory_`, `metrics_`,`alerts_`,`operations_`, `tokens_`'
         | 
| 29 31 | 
             
                                    end
         | 
| 30 32 | 
             
                  method = name.to_s.sub(/^[^_]+_/, '')
         | 
| @@ -181,7 +181,8 @@ module Hawkular::Inventory | |
| 181 181 | 
             
                end
         | 
| 182 182 |  | 
| 183 183 | 
             
                def self.parse(path)
         | 
| 184 | 
            -
                  fail 'CanonicalPath must not be nil or empty' if path.to_s.strip.length == 0
         | 
| 184 | 
            +
                  fail Hawkular::ArgumentError, 'CanonicalPath must not be nil or empty' if path.to_s.strip.length == 0
         | 
| 185 | 
            +
             | 
| 185 186 | 
             
                  CanonicalPath.new(path_to_h path)
         | 
| 186 187 | 
             
                end
         | 
| 187 188 |  | 
| @@ -257,7 +258,8 @@ module Hawkular::Inventory | |
| 257 258 | 
             
                end
         | 
| 258 259 |  | 
| 259 260 | 
             
                def to_tags
         | 
| 260 | 
            -
                  fail 'Missing feed_id' if @feed_id.nil?
         | 
| 261 | 
            +
                  fail Hawkular::ArgumentError, 'Missing feed_id' if @feed_id.nil?
         | 
| 262 | 
            +
             | 
| 261 263 | 
             
                  tags = "module:inventory,feed:#{Regexp.quote(@feed_id)}"
         | 
| 262 264 | 
             
                  tags += ",type:rt,id:#{Regexp.quote(@resource_type_id)}" if @resource_type_id
         | 
| 263 265 | 
             
                  tags += ",type:mt,id:#{Regexp.quote(@metric_type_id)}" if @metric_type_id
         | 
| @@ -34,7 +34,8 @@ module Hawkular::Inventory | |
| 34 34 | 
             
                #   entrypoint: http://localhost:8080/hawkular/inventory
         | 
| 35 35 | 
             
                # and another sub-hash containing the hash with username[String], password[String], token(optional)
         | 
| 36 36 | 
             
                def self.create(hash)
         | 
| 37 | 
            -
                  fail 'no parameter ":entrypoint" given' unless hash[:entrypoint]
         | 
| 37 | 
            +
                  fail Hawkular::ArgumentError, 'no parameter ":entrypoint" given' unless hash[:entrypoint]
         | 
| 38 | 
            +
             | 
| 38 39 | 
             
                  hash[:credentials] ||= {}
         | 
| 39 40 | 
             
                  hash[:options] ||= {}
         | 
| 40 41 | 
             
                  Client.new(hash[:entrypoint], hash[:credentials], hash[:options])
         | 
| @@ -52,7 +53,8 @@ module Hawkular::Inventory | |
| 52 53 | 
             
                # @param [String] feed_id The id of the feed the type lives under
         | 
| 53 54 | 
             
                # @return [Array<ResourceType>] List of types, that can be empty
         | 
| 54 55 | 
             
                def list_resource_types(feed_id)
         | 
| 55 | 
            -
                  fail 'Feed id must be given' unless feed_id
         | 
| 56 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless feed_id
         | 
| 57 | 
            +
             | 
| 56 58 | 
             
                  feed_path = feed_cp(feed_id)
         | 
| 57 59 | 
             
                  response = http_post(
         | 
| 58 60 | 
             
                    '/strings/raw/query',
         | 
| @@ -70,7 +72,8 @@ module Hawkular::Inventory | |
| 70 72 | 
             
                # @param [String] feed_id The id of the feed the type lives under
         | 
| 71 73 | 
             
                # @return [Array<MetricType>] List of types, that can be empty
         | 
| 72 74 | 
             
                def list_metric_types(feed_id)
         | 
| 73 | 
            -
                  fail 'Feed id must be given' unless feed_id
         | 
| 75 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless feed_id
         | 
| 76 | 
            +
             | 
| 74 77 | 
             
                  feed_path = feed_cp(feed_id)
         | 
| 75 78 | 
             
                  response = http_post(
         | 
| 76 79 | 
             
                    '/strings/raw/query',
         | 
| @@ -89,7 +92,8 @@ module Hawkular::Inventory | |
| 89 92 | 
             
                # @param [Boolean] fetch_properties Should the config data be fetched too
         | 
| 90 93 | 
             
                # @return [Array<Resource>] List of resources, which can be empty.
         | 
| 91 94 | 
             
                def list_resources_for_feed(feed_id, fetch_properties = false, filter = {})
         | 
| 92 | 
            -
                  fail 'Feed id must be given' unless feed_id
         | 
| 95 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless feed_id
         | 
| 96 | 
            +
             | 
| 93 97 | 
             
                  feed_path = feed_cp(feed_id)
         | 
| 94 98 | 
             
                  response = http_post(
         | 
| 95 99 | 
             
                    '/strings/raw/query',
         | 
| @@ -113,8 +117,9 @@ module Hawkular::Inventory | |
| 113 117 | 
             
                # @return [Array<Resource>] List of resources. Can be empty
         | 
| 114 118 | 
             
                def list_resources_for_type(resource_type_path, fetch_properties = false)
         | 
| 115 119 | 
             
                  path = CanonicalPath.parse_if_string(resource_type_path)
         | 
| 116 | 
            -
             | 
| 117 | 
            -
                  fail ' | 
| 120 | 
            +
             | 
| 121 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless path.feed_id
         | 
| 122 | 
            +
                  fail Hawkular::ArgumentError, 'Resource type must be given' unless path.resource_type_id
         | 
| 118 123 |  | 
| 119 124 | 
             
                  # Fetch metrics by tag
         | 
| 120 125 | 
             
                  feed_path = feed_cp(URI.unescape(path.feed_id))
         | 
| @@ -151,7 +156,9 @@ module Hawkular::Inventory | |
| 151 156 | 
             
                def list_child_resources(parent_res_path, recursive = false)
         | 
| 152 157 | 
             
                  path = CanonicalPath.parse_if_string(parent_res_path)
         | 
| 153 158 | 
             
                  feed_id = path.feed_id
         | 
| 154 | 
            -
             | 
| 159 | 
            +
             | 
| 160 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless feed_id
         | 
| 161 | 
            +
             | 
| 155 162 | 
             
                  entity_hash = get_raw_entity_hash(path)
         | 
| 156 163 | 
             
                  extract_child_resources([], path.to_s, entity_hash, recursive) if entity_hash
         | 
| 157 164 | 
             
                end
         | 
| @@ -163,8 +170,10 @@ module Hawkular::Inventory | |
| 163 170 | 
             
                # @return [Array<Metric>] List of metrics. Can be empty
         | 
| 164 171 | 
             
                def list_metrics_for_metric_type(metric_type_path)
         | 
| 165 172 | 
             
                  path = CanonicalPath.parse_if_string(metric_type_path)
         | 
| 166 | 
            -
             | 
| 167 | 
            -
                  fail ' | 
| 173 | 
            +
             | 
| 174 | 
            +
                  fail Hawkular::ArgumentError, 'Feed id must be given' unless path.feed_id
         | 
| 175 | 
            +
                  fail Hawkular::ArgumentError, 'Metric type id must be given' unless path.metric_type_id
         | 
| 176 | 
            +
             | 
| 168 177 | 
             
                  feed_id = URI.unescape(path.feed_id)
         | 
| 169 178 | 
             
                  metric_type_id = URI.unescape(path.metric_type_id)
         | 
| 170 179 |  | 
| @@ -224,10 +233,11 @@ module Hawkular::Inventory | |
| 224 233 | 
             
                def get_resource(resource_path, fetch_properties = true)
         | 
| 225 234 | 
             
                  path = CanonicalPath.parse_if_string(resource_path)
         | 
| 226 235 | 
             
                  raw_hash = get_raw_entity_hash(path)
         | 
| 236 | 
            +
             | 
| 227 237 | 
             
                  unless raw_hash
         | 
| 228 | 
            -
                     | 
| 229 | 
            -
                    fail exception
         | 
| 238 | 
            +
                    fail Hawkular::Exception, "Resource not found: #{resource_path}"
         | 
| 230 239 | 
             
                  end
         | 
| 240 | 
            +
             | 
| 231 241 | 
             
                  entity_hash = entity_json_to_hash(-> (_) { path }, raw_hash, fetch_properties)
         | 
| 232 242 | 
             
                  Resource.new(entity_hash)
         | 
| 233 243 | 
             
                end
         | 
| @@ -237,10 +247,11 @@ module Hawkular::Inventory | |
| 237 247 | 
             
                def get_resource_type(resource_type_path)
         | 
| 238 248 | 
             
                  path = CanonicalPath.parse_if_string(resource_type_path)
         | 
| 239 249 | 
             
                  raw_hash = get_raw_entity_hash(path)
         | 
| 250 | 
            +
             | 
| 240 251 | 
             
                  unless raw_hash
         | 
| 241 | 
            -
                     | 
| 242 | 
            -
                    fail exception
         | 
| 252 | 
            +
                    fail Hawkular::Exception, "Resource type not found: #{resource_type_path}"
         | 
| 243 253 | 
             
                  end
         | 
| 254 | 
            +
             | 
| 244 255 | 
             
                  entity_hash = entity_json_to_hash(-> (_) { path }, raw_hash, false)
         | 
| 245 256 | 
             
                  ResourceType.new(entity_hash)
         | 
| 246 257 | 
             
                end
         | 
| @@ -250,10 +261,11 @@ module Hawkular::Inventory | |
| 250 261 | 
             
                def get_metric_type(metric_type_path)
         | 
| 251 262 | 
             
                  path = CanonicalPath.parse_if_string(metric_type_path)
         | 
| 252 263 | 
             
                  raw_hash = get_raw_entity_hash(path)
         | 
| 264 | 
            +
             | 
| 253 265 | 
             
                  unless raw_hash
         | 
| 254 | 
            -
                     | 
| 255 | 
            -
                    fail exception
         | 
| 266 | 
            +
                    fail Hawkular::Exception, "Metric type not found: #{metric_type_path}"
         | 
| 256 267 | 
             
                  end
         | 
| 268 | 
            +
             | 
| 257 269 | 
             
                  entity_hash = entity_json_to_hash(-> (_) { path }, raw_hash, false)
         | 
| 258 270 | 
             
                  MetricType.new(entity_hash)
         | 
| 259 271 | 
             
                end
         | 
| @@ -263,8 +275,10 @@ module Hawkular::Inventory | |
| 263 275 | 
             
                # @return [Array<String>] List of operation type ids
         | 
| 264 276 | 
             
                def list_operation_definitions(resource_type_path)
         | 
| 265 277 | 
             
                  path = CanonicalPath.parse_if_string(resource_type_path)
         | 
| 266 | 
            -
             | 
| 267 | 
            -
                  fail 'Missing  | 
| 278 | 
            +
             | 
| 279 | 
            +
                  fail Hawkular::ArgumentError, 'Missing feed_id in resource_type_path' unless path.feed_id
         | 
| 280 | 
            +
                  fail Hawkular::ArgumentError, 'Missing resource_type_id in resource_type_path' unless path.resource_type_id
         | 
| 281 | 
            +
             | 
| 268 282 | 
             
                  response = http_post(
         | 
| 269 283 | 
             
                    '/strings/raw/query',
         | 
| 270 284 | 
             
                    fromEarliest: true,
         | 
| @@ -445,26 +459,34 @@ module Hawkular::Inventory | |
| 445 459 | 
             
                end
         | 
| 446 460 |  | 
| 447 461 | 
             
                def extract_structures_from_body(response_body_array)
         | 
| 448 | 
            -
                  response_body_array.map { |element| rebuild_from_chunks(element['data']) }
         | 
| 462 | 
            +
                  response_body_array.map { |element| Client.rebuild_from_chunks(element['data']) }
         | 
| 449 463 | 
             
                    .select { |full| full } # evict nil
         | 
| 450 | 
            -
                    .map { |full| decompress(full) }
         | 
| 464 | 
            +
                    .map { |full| Client.decompress(full) }
         | 
| 451 465 | 
             
                end
         | 
| 452 466 |  | 
| 453 | 
            -
                def rebuild_from_chunks(data_node)
         | 
| 467 | 
            +
                def self.rebuild_from_chunks(data_node)
         | 
| 454 468 | 
             
                  return if data_node.empty?
         | 
| 455 469 | 
             
                  master_data = data_node[0]
         | 
| 456 470 | 
             
                  return Base64.decode64(master_data['value']) unless (master_data.key? 'tags') &&
         | 
| 457 471 | 
             
                                                                      (master_data['tags'].key? 'chunks')
         | 
| 472 | 
            +
                  master_timestamp = master_data['timestamp']
         | 
| 458 473 | 
             
                  last_chunk = master_data['tags']['chunks'].to_i - 1
         | 
| 459 474 | 
             
                  all = Base64.decode64(master_data['value'])
         | 
| 460 475 | 
             
                  return if all.empty?
         | 
| 461 476 | 
             
                  (1..last_chunk).inject(all) do |full, chunk_id|
         | 
| 462 477 | 
             
                    slave_data = data_node[chunk_id]
         | 
| 478 | 
            +
                    # Race condition: slave_data might be nil if not all chunks have been written yet on DB
         | 
| 479 | 
            +
                    # Consider the object is not there yet
         | 
| 480 | 
            +
                    return nil unless slave_data
         | 
| 481 | 
            +
                    # The same race condition could give us an expirated slave_data; do sanity check to cover that
         | 
| 482 | 
            +
                    # Timestamps are useful here, they're in consecutive, decreasing order
         | 
| 483 | 
            +
                    slave_timestamp = slave_data['timestamp']
         | 
| 484 | 
            +
                    return nil unless slave_timestamp == master_timestamp - chunk_id
         | 
| 463 485 | 
             
                    full.concat(Base64.decode64(slave_data['value']))
         | 
| 464 486 | 
             
                  end
         | 
| 465 487 | 
             
                end
         | 
| 466 488 |  | 
| 467 | 
            -
                def decompress(raw)
         | 
| 489 | 
            +
                def self.decompress(raw)
         | 
| 468 490 | 
             
                  gz = Zlib::GzipReader.new(StringIO.new(raw))
         | 
| 469 491 | 
             
                  JSON.parse(gz.read)
         | 
| 470 492 | 
             
                end
         | 
| @@ -35,11 +35,12 @@ module Hawkular::Metrics | |
| 35 35 |  | 
| 36 36 | 
             
                def check_version
         | 
| 37 37 | 
             
                  version_status_hash = fetch_version_and_status
         | 
| 38 | 
            +
             | 
| 38 39 | 
             
                  fail_version_msg = 'Unable to determine implementation version for metrics'
         | 
| 39 | 
            -
                  fail fail_version_msg if version_status_hash['Implementation-Version'].nil?
         | 
| 40 | 
            +
                  fail Hawkular::Exception, fail_version_msg if version_status_hash['Implementation-Version'].nil?
         | 
| 40 41 | 
             
                  version = version_status_hash['Implementation-Version']
         | 
| 41 42 | 
             
                  major, minor = version.scan(/\d+/).map(&:to_i)
         | 
| 42 | 
            -
                  fail fail_version_msg if major.nil? || minor.nil?
         | 
| 43 | 
            +
                  fail Hawkular::Exception, fail_version_msg if major.nil? || minor.nil?
         | 
| 43 44 | 
             
                  @legacy_api = (major == 0 && minor < 16)
         | 
| 44 45 | 
             
                end
         | 
| 45 46 |  | 
| @@ -1,3 +1,6 @@ | |
| 1 | 
            +
            require 'timeout'
         | 
| 2 | 
            +
            require 'monitor'
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            require 'hawkular/base_client'
         | 
| 2 5 | 
             
            require 'websocket-client-simple'
         | 
| 3 6 | 
             
            require 'json'
         | 
| @@ -13,14 +16,7 @@ class Proc | |
| 13 16 | 
             
                  method_name = callable.to_sym
         | 
| 14 17 | 
             
                  define_method(method_name) { |&block| block.nil? ? true : block.call(result) }
         | 
| 15 18 | 
             
                  define_method("#{method_name}?") { true }
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  # method_missing is here because we are not forcing the client to provide both success and error callbacks
         | 
| 18 | 
            -
                  # rubocop:disable Lint/NestedMethodDefinition
         | 
| 19 | 
            -
                  # https://github.com/bbatsov/rubocop/issues/2704
         | 
| 20 | 
            -
                  def method_missing(_method_name, *_args, &_block)
         | 
| 21 | 
            -
                    PerformMethodMissing
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
                  # rubocop:enable Lint/NestedMethodDefinition
         | 
| 19 | 
            +
                  define_method(:method_missing) { |*| PerformMethodMissing }
         | 
| 24 20 | 
             
                end.new)
         | 
| 25 21 | 
             
              end
         | 
| 26 22 | 
             
            end
         | 
| @@ -30,6 +26,7 @@ module Hawkular::Operations | |
| 30 26 | 
             
              # Client class to interact with the agent via websockets
         | 
| 31 27 | 
             
              class Client < Hawkular::BaseClient
         | 
| 32 28 | 
             
                include WebSocket::Client
         | 
| 29 | 
            +
                include MonitorMixin
         | 
| 33 30 |  | 
| 34 31 | 
             
                attr_accessor :ws, :session_id, :logger
         | 
| 35 32 |  | 
| @@ -75,26 +72,36 @@ module Hawkular::Operations | |
| 75 72 | 
             
                    args[:use_secure_connection] = %w(https wss).include?(uri.scheme) ? true : false
         | 
| 76 73 | 
             
                  end
         | 
| 77 74 |  | 
| 78 | 
            -
                  fail 'no parameter ":host" or ":entrypoint" given' if args[:host].nil?
         | 
| 75 | 
            +
                  fail Hawkular::ArgumentError, 'no parameter ":host" or ":entrypoint" given' if args[:host].nil?
         | 
| 79 76 |  | 
| 80 77 | 
             
                  super(args[:host], args[:credentials], args[:options])
         | 
| 81 78 |  | 
| 82 | 
            -
                   | 
| 79 | 
            +
                  @logger = Hawkular::Logger.new
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  @url = "ws#{args[:use_secure_connection] ? 's' : ''}://#{args[:host]}/hawkular/command-gateway/ui/ws"
         | 
| 82 | 
            +
                  @credentials = args[:credentials]
         | 
| 83 | 
            +
                  @tenant = args[:options][:tenant]
         | 
| 84 | 
            +
                  @wait_time = args[:wait_time]
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                def base64_credentials
         | 
| 88 | 
            +
                  ["#{@credentials[:username]}:#{@credentials[:password]}"].pack('m').delete("\r\n")
         | 
| 89 | 
            +
                end
         | 
| 83 90 |  | 
| 84 | 
            -
             | 
| 85 | 
            -
                   | 
| 91 | 
            +
                def connect
         | 
| 92 | 
            +
                  return if @connecting || (@ws && @ws.open?)
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  @connecting = true
         | 
| 86 95 |  | 
| 87 96 | 
             
                  ws_options = {
         | 
| 88 97 | 
             
                    headers:  {
         | 
| 89 | 
            -
                      'Authorization' => 'Basic ' +  | 
| 90 | 
            -
                      'Hawkular-Tenant' =>  | 
| 98 | 
            +
                      'Authorization' => 'Basic ' + base64_credentials,
         | 
| 99 | 
            +
                      'Hawkular-Tenant' => @tenant,
         | 
| 91 100 | 
             
                      'Accept' => 'application/json'
         | 
| 92 101 | 
             
                    }
         | 
| 93 102 | 
             
                  }
         | 
| 94 103 |  | 
| 95 | 
            -
                  @ | 
| 96 | 
            -
             | 
| 97 | 
            -
                  @ws = Simple.connect url, ws_options do |client|
         | 
| 104 | 
            +
                  @ws = Simple.connect @url, ws_options do |client|
         | 
| 98 105 | 
             
                    client.on(:message, once: true) do |msg|
         | 
| 99 106 | 
             
                      parsed_message = msg.data.to_msg_hash
         | 
| 100 107 |  | 
| @@ -107,12 +114,14 @@ module Hawkular::Operations | |
| 107 114 | 
             
                    end
         | 
| 108 115 | 
             
                  end
         | 
| 109 116 |  | 
| 110 | 
            -
                  sleep  | 
| 117 | 
            +
                  Timeout.timeout(@wait_time) { sleep 0.1 until @ws.open? }
         | 
| 118 | 
            +
                ensure
         | 
| 119 | 
            +
                  @connecting = false
         | 
| 111 120 | 
             
                end
         | 
| 112 121 |  | 
| 113 122 | 
             
                # Closes the WebSocket connection
         | 
| 114 123 | 
             
                def close_connection!
         | 
| 115 | 
            -
                  @ws.close
         | 
| 124 | 
            +
                  @ws && @ws.close
         | 
| 116 125 | 
             
                end
         | 
| 117 126 |  | 
| 118 127 | 
             
                # Invokes a generic operation on the WildFly agent
         | 
| @@ -136,7 +145,7 @@ module Hawkular::Operations | |
| 136 145 | 
             
                # RemoveDatasource (and not RemoveDatasourceRequest)
         | 
| 137 146 | 
             
                # @param callback [Block] callback that is run after the operation is done
         | 
| 138 147 | 
             
                def invoke_specific_operation(operation_payload, operation_name, &callback)
         | 
| 139 | 
            -
                  fail 'Operation must be specified' if operation_name.nil?
         | 
| 148 | 
            +
                  fail Hawkular::ArgumentError, 'Operation must be specified' if operation_name.nil?
         | 
| 140 149 | 
             
                  required = [:resourcePath]
         | 
| 141 150 | 
             
                  check_pre_conditions operation_payload, required, &callback
         | 
| 142 151 |  | 
| @@ -297,7 +306,7 @@ module Hawkular::Operations | |
| 297 306 | 
             
                # @param [String] resource_path canonical path of the WildFly server
         | 
| 298 307 | 
             
                # @param callback [Block] callback that is run after the operation is done
         | 
| 299 308 | 
             
                def export_jdr(resource_path, &callback)
         | 
| 300 | 
            -
                  fail 'resource_path must be specified' if resource_path.nil?
         | 
| 309 | 
            +
                  fail Hawkular::ArgumentError, 'resource_path must be specified' if resource_path.nil?
         | 
| 301 310 | 
             
                  check_pre_conditions(&callback)
         | 
| 302 311 |  | 
| 303 312 | 
             
                  invoke_specific_operation({ resourcePath: resource_path }, 'ExportJdr', &callback)
         | 
| @@ -322,6 +331,8 @@ module Hawkular::Operations | |
| 322 331 | 
             
                private
         | 
| 323 332 |  | 
| 324 333 | 
             
                def invoke_operation_helper(operation_payload, operation_name = nil, binary_content = nil, &callback)
         | 
| 334 | 
            +
                  synchronize { connect }
         | 
| 335 | 
            +
             | 
| 325 336 | 
             
                  # fallback to generic 'ExecuteOperation' if nothing is specified
         | 
| 326 337 | 
             
                  operation_name ||= 'ExecuteOperation'
         | 
| 327 338 | 
             
                  add_credentials! operation_payload
         | 
| @@ -332,19 +343,23 @@ module Hawkular::Operations | |
| 332 343 | 
             
                  payload = "#{operation_name}Request=#{operation_payload.to_json}"
         | 
| 333 344 | 
             
                  payload += binary_content unless binary_content.nil?
         | 
| 334 345 | 
             
                  @ws.send payload, type: binary_content.nil? ? :text : :binary
         | 
| 346 | 
            +
                rescue => e
         | 
| 347 | 
            +
                  callback.perform(:failure, "#{e.class} - #{e.message}")
         | 
| 335 348 | 
             
                end
         | 
| 336 349 |  | 
| 337 350 | 
             
                def check_pre_conditions(hash = {}, params = [], &callback)
         | 
| 338 | 
            -
                  fail ' | 
| 339 | 
            -
                  fail ' | 
| 340 | 
            -
                  fail 'callback must have the perform method defined. include Hawkular::Operations' unless
         | 
| 351 | 
            +
                  fail Hawkular::ArgumentError, 'Hash cannot be nil.' if hash.nil?
         | 
| 352 | 
            +
                  fail Hawkular::ArgumentError, 'callback must have the perform method defined. include Hawkular::Operations' unless
         | 
| 341 353 | 
             
                      callback.nil? || callback.respond_to?('perform')
         | 
| 354 | 
            +
             | 
| 342 355 | 
             
                  params.each do |property|
         | 
| 343 356 | 
             
                    next unless hash[property].nil?
         | 
| 344 357 | 
             
                    err_callback = 'You need to specify error callback'
         | 
| 345 358 | 
             
                    err_message = "Hash property #{property} must be specified"
         | 
| 346 | 
            -
             | 
| 347 | 
            -
                     | 
| 359 | 
            +
             | 
| 360 | 
            +
                    if !callback || callback.perform(:failure, err_message) == Proc::PerformMethodMissing
         | 
| 361 | 
            +
                      fail(Hawkular::ArgumentError, err_callback)
         | 
| 362 | 
            +
                    end
         | 
| 348 363 | 
             
                  end
         | 
| 349 364 | 
             
                end
         | 
| 350 365 |  | 
    
        data/lib/hawkular/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: hawkular-client
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version:  | 
| 4 | 
            +
              version: 4.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Libor Zoubek
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2017- | 
| 14 | 
            +
            date: 2017-06-27 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies:
         | 
| 16 16 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 17 17 | 
             
              name: rest-client
         | 
| @@ -145,14 +145,14 @@ dependencies: | |
| 145 145 | 
             
                requirements:
         | 
| 146 146 | 
             
                - - "~>"
         | 
| 147 147 | 
             
                  - !ruby/object:Gem::Version
         | 
| 148 | 
            -
                    version:  | 
| 148 | 
            +
                    version: '3.0'
         | 
| 149 149 | 
             
              type: :development
         | 
| 150 150 | 
             
              prerelease: false
         | 
| 151 151 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 152 152 | 
             
                requirements:
         | 
| 153 153 | 
             
                - - "~>"
         | 
| 154 154 | 
             
                  - !ruby/object:Gem::Version
         | 
| 155 | 
            -
                    version:  | 
| 155 | 
            +
                    version: '3.0'
         | 
| 156 156 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 157 157 | 
             
              name: vcr
         | 
| 158 158 | 
             
              requirement: !ruby/object:Gem::Requirement
         |