imperium 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 040c01db1f3d464524d6b66f0b0e52f7c8fc3553
4
- data.tar.gz: 65991cbb6b16acce1c2b3d408eaa6ae3e6ec67be
3
+ metadata.gz: 707891835377b95b0bbfad486145b8c3ab3394a6
4
+ data.tar.gz: b076560dd3acaa8327cc96459db5dcb63fecca03
5
5
  SHA512:
6
- metadata.gz: 897ac12a4b8a4616dfe37e3175c69a1ffa3d76d6dff7e7ab0c5beb6370fd39fbb02c32a817dde2e6c87a5fa420c6f5202113e1172fd79821be1d00797cfd062e
7
- data.tar.gz: 01d52982aab2dbb960229c7cf2b90b85f577054a894de8c58aa478de1cb0477d7b8038ecc7b573ed94070e02b02cb6f15a0083171785d09d929c0df47bd516a5
6
+ metadata.gz: 509f7e2d9d6b888c3de92acc1a4472bb4df0c8032a060236db73bf169804553525ab94a2e9a3741f092cb0f4b53039eee236ecca2e2a704bfb5e0cfc64001d18
7
+ data.tar.gz: d0f25997c35f608f545a9470067cc4a8679799fa01683a2a52b0ec483f9ccc9792b60948da83be88cf552351b82826e56891f2c4c3bafb3d38a176caa757b65f
@@ -10,5 +10,11 @@ require "imperium"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
+ Imperium.configure do |conf|
14
+ conf.host = ENV.fetch('IMPERIUM_CONSUL_HOST', 'localhost')
15
+ conf.port = Integer(ENV.fetch('IMPERIUM_CONSUL_PORT', 8500))
16
+ conf.ssl = ENV.fetch('IMPERIUM_CONSUL_SSL', 'false') == 'true'
17
+ end
18
+
13
19
  require "irb"
14
20
  IRB.start
@@ -1,15 +1,21 @@
1
1
  require 'imperium/error'
2
2
 
3
- require 'imperium/configuration'
3
+ require 'imperium/agent'
4
+ require 'imperium/agent_list_checks_response'
5
+ require 'imperium/agent_list_services_response'
6
+ require 'imperium/catalog'
4
7
  require 'imperium/client'
5
- require 'imperium/http_client'
8
+ require 'imperium/configuration'
6
9
  require 'imperium/event_fire_response'
7
10
  require 'imperium/events'
11
+ require 'imperium/http_client'
8
12
  require 'imperium/kv'
9
13
  require 'imperium/kv_pair'
10
14
  require 'imperium/kv_get_response'
11
15
  require 'imperium/kv_put_response'
12
16
  require 'imperium/response'
17
+ require 'imperium/service'
18
+ require 'imperium/service_check'
13
19
  require 'imperium/version'
14
20
 
15
21
  module Imperium
@@ -0,0 +1,48 @@
1
+ require 'imperium/client'
2
+
3
+ module Imperium
4
+ # A client for the Agent API.
5
+ class Agent < Client
6
+ self.path_prefix = 'v1/agent'.freeze
7
+
8
+ # Deregister a service with the agent.
9
+ #
10
+ # @see https://www.consul.io/api/agent/service.html#deregister-service Consul's Documentation
11
+ #
12
+ # @param service_or_id [Service, String] The object or id representing the
13
+ # service to be removed from the services registry.
14
+ def deregister_service(service_or_id)
15
+ id = (service_or_id.is_a?(Service) ? service_or_id.id : service_or_id)
16
+ Response.new(@http_client.put(prefix_path("service/deregister/#{id}"), ''))
17
+ end
18
+
19
+ # Retreive a list of all checks registered to the local agent.
20
+ #
21
+ # @see https://www.consul.io/api/agent/check.html#list-checks Consul's Documentation
22
+ # @return [AgentListChecksResponse]
23
+ def list_checks
24
+ response = @http_client.get(prefix_path('checks'))
25
+ AgentListChecksResponse.new(response)
26
+ end
27
+
28
+ # Retreive a list of all services registered to the local agent.
29
+ #
30
+ # @see https://www.consul.io/api/agent/service.html#list-services Consul's Documentation
31
+ # @return [AgentListServicesResponse]
32
+ def list_services
33
+ response = @http_client.get(prefix_path('services'))
34
+ AgentListServicesResponse.new(response)
35
+ end
36
+
37
+ # Register a new service with the agent.
38
+ #
39
+ # @see https://www.consul.io/api/agent/service.html#register-service Consul's Documentation
40
+ #
41
+ # @param service [Serivce] A {Service} object containing the data to use
42
+ # for registration
43
+ def register_service(service)
44
+ Response.new(@http_client.put(prefix_path('service/register'), service.registration_data))
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,24 @@
1
+ require_relative 'response'
2
+ require_relative 'service_check'
3
+
4
+ module Imperium
5
+ class AgentListChecksResponse < Response
6
+ self.default_response_object_class = ServiceCheck
7
+
8
+ def checks
9
+ @checks ||= checks_hash.values
10
+ end
11
+
12
+ def checks_hash
13
+ @checks_hash ||= (ok? ? coerced_body : {})
14
+ end
15
+
16
+ def [](key)
17
+ checks_hash[key]
18
+ end
19
+
20
+ def each(&block)
21
+ checks.each(&block)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'response'
2
+ require_relative 'service'
3
+
4
+ module Imperium
5
+ # AgentListServiceResponse is a wrapper for the raw HTTP::Message response
6
+ # from the API
7
+ #
8
+ # @note This class doesn't really make sense to be instantiated outside of
9
+ # {Agent#list_services}
10
+ #
11
+ # We've included Enumerable and implemented #each so it can be treated as an
12
+ # array of {Service} objects.
13
+ class AgentListServicesResponse < Response
14
+ self.default_response_object_class = Service
15
+
16
+ def each(&block)
17
+ services.each(&block)
18
+ end
19
+
20
+ # Build an array of {Service} objects from the response
21
+ #
22
+ # @return [Array<Service>] This array will be empty when the response is not
23
+ # a success
24
+ def services
25
+ @services ||= services_hash.values
26
+ end
27
+
28
+ # Build a hash of {Service} object from the response
29
+ #
30
+ # The keys are the service's id from the API response.
31
+ # @return [Hash<String => Service>]
32
+ def services_hash
33
+ @services_hash ||= (ok? ? coerced_body : {})
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,83 @@
1
+ require_relative 'refinements/hash_compact'
2
+ module Imperium
3
+ # Base class for handling data coming from the Consul API
4
+ class APIObject
5
+ using HashCompact
6
+
7
+ class << self
8
+ # The mapping of attribute names coming from Consul to names that are more
9
+ # Ruby friendly
10
+ # @return [Hash<String => Symbol>]
11
+ attr_reader :attribute_map
12
+
13
+ # The Ruby friendly names from {attribute_map}
14
+ # @return [Array<Symbol>]
15
+ attr_reader :ruby_attribute_names
16
+
17
+ def attribute_map=(val)
18
+ @attribute_map = val
19
+ @ruby_attribute_names = val.values.map(&:to_sym)
20
+ attr_accessor *@ruby_attribute_names
21
+ end
22
+ end
23
+
24
+ # Initialize a new object extracting attributes from the supplied hash
25
+ def initialize(attributes = {})
26
+ self.class.attribute_map.each do |key, attribute_name|
27
+ value = attributes[attribute_name] || attributes[key]
28
+ send("#{attribute_name}=", value) if value
29
+ end
30
+ end
31
+
32
+ def ==(other)
33
+ return false unless self.class == other.class
34
+ ruby_attribute_names.all? { |attr| self.send(attr) == other.send(attr) }
35
+ end
36
+
37
+ def attribute_map
38
+ self.class.attribute_map
39
+ end
40
+
41
+ # Shortcut method to access the class level attribute
42
+ # @return [Array<Symbol>]
43
+ def ruby_attribute_names
44
+ self.class.ruby_attribute_names
45
+ end
46
+
47
+ # Convert the object and any sub-objects into a hash
48
+ #
49
+ # @param consul_names_as_keys [Boolean] Use the Consul object attribute names
50
+ # as the keys when true (default) otherwise use the ruby attribute names.
51
+ def to_h(consul_names_as_keys: true)
52
+ if consul_names_as_keys
53
+ attribute_map.each_with_object({}) do |(consul, ruby), h|
54
+ h[consul] = maybe_hashified_attribute(ruby, true)
55
+ end.compact
56
+ else
57
+ ruby_attribute_names.each_with_object({}) do |attr, h|
58
+ h[attr] = maybe_hashified_attribute(attr, false)
59
+ end.compact
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def maybe_hashified_attribute(attr_name, consul_names)
66
+ val = send(attr_name)
67
+
68
+ if val.nil?
69
+ nil
70
+ elsif val.is_a?(Array)
71
+ val.map { |elem| elem.respond_to?(:to_h) ? fancy_send_to_h(elem, consul_names) : elem }
72
+ elsif val.respond_to?(:to_h)
73
+ fancy_send_to_h(val, consul_names)
74
+ else
75
+ val
76
+ end
77
+ end
78
+
79
+ def fancy_send_to_h(obj, consul_names)
80
+ (obj.is_a?(APIObject) ? obj.to_h(consul_names_as_keys: consul_names) : obj.to_h)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'client'
2
+
3
+ module Imperium
4
+ # A client for the Catalog API.
5
+ class Catalog < Client
6
+ self.path_prefix = 'v1/catalog'.freeze
7
+
8
+ # List services in the global catalog
9
+ #
10
+ # @return [Response]
11
+ def list_services
12
+ response = @http_client.get(prefix_path('services'))
13
+ Response.new(response)
14
+ end
15
+
16
+ # List the known nodes for the given service in the global catalog
17
+ #
18
+ # Returns a {Response} object that coerces the returned data into {Service}
19
+ # objects
20
+ #
21
+ # @param [String] :service
22
+ # @return [Array<Service>]
23
+ def list_nodes_for_service(service)
24
+ response = @http_client.get(prefix_path("service/#{service}"))
25
+ Response.new(response, response_object_class: Service)
26
+ end
27
+ end
28
+ end
29
+ require_relative 'catalog/service'
@@ -0,0 +1,76 @@
1
+ require_relative '../api_object'
2
+
3
+ module Imperium
4
+ class Catalog
5
+ # Service is a container for data being received from and sent to the
6
+ # catalog APIs.
7
+ #
8
+ # @see https://www.consul.io/api/catalog.html#list-nodes-for-service The Consul Catalog Documentation
9
+ #
10
+ # @!attribute [rw] id
11
+ # @return [String]
12
+ # @!attribute [rw] node
13
+ # @return [String]
14
+ # @!attribute [rw] address
15
+ # @return [String]
16
+ # @!attribute [rw] datacenter
17
+ # @return [String]
18
+ # @!attribute [rw] tagged_addresses
19
+ # @return [Hash<String => String>]
20
+ # @!attribute [rw] node_meta
21
+ # @return [Hash<String => String>]
22
+ # @!attribute [rw] service_id
23
+ # @return [String]
24
+ # @!attribute [rw] service_name
25
+ # @return [String]
26
+ # @!attribute [rw] service_address
27
+ # @return [String]
28
+ # @!attribute [rw] service_tags
29
+ # @return [Array<String>]
30
+ # @!attribute [rw] service_port
31
+ # @return [String]
32
+ # @!attribute [rw] service_enable_tag_override
33
+ # @return [Boolean]
34
+ # @!attribute [rw] create_index
35
+ # @return [Integer]
36
+ # @!attribute [rw] modify_index
37
+ # @return [Integer]
38
+ class Service < APIObject
39
+ self.attribute_map = {
40
+ 'ID' => :id,
41
+ 'Node' => :node,
42
+ 'Address' => :address,
43
+ 'Datacenter' => :datacenter,
44
+ 'TaggedAddresses' => :tagged_addresses,
45
+ 'NodeMeta' => :node_meta,
46
+ 'ServiceID' => :service_id,
47
+ 'ServiceName' => :service_name,
48
+ 'ServiceAddress' => :service_address,
49
+ 'ServiceTags' => :service_tags,
50
+ 'ServicePort' => :service_port,
51
+ 'ServiceEnableTagOverride' => :service_enable_tag_override,
52
+ 'CreateIndex' => :create_index,
53
+ 'ModifyIndex' => :modify_index,
54
+ }
55
+
56
+ def initialize(*args)
57
+ @tagged_addresses = {}
58
+ @node_meta = {}
59
+ @service_tags = []
60
+ super
61
+ end
62
+
63
+ def tagged_addresses=(val)
64
+ @tagged_addresses = (val.nil? ? {} : val)
65
+ end
66
+
67
+ def node_meta=(val)
68
+ @node_meta = (val.nil? ? {} : val)
69
+ end
70
+
71
+ def service_tags=(val)
72
+ @service_tags = (val.nil? ? [] : val)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -31,7 +31,11 @@ module Imperium
31
31
  wrapping_exceptions do
32
32
  url = config.url.join(path)
33
33
  url.query_values = query
34
- @driver.put(url, body: value)
34
+ if value.is_a?(String)
35
+ @driver.put(url, body: value)
36
+ else
37
+ @driver.put(url, body: JSON.generate(value))
38
+ end
35
39
  end
36
40
  end
37
41
 
@@ -1,3 +1,4 @@
1
+ require_relative 'api_object'
1
2
  require 'base64'
2
3
 
3
4
  module Imperium
@@ -24,8 +25,8 @@ module Imperium
24
25
  # @!attribute [rw] modify_index
25
26
  # @return [Integer] The internal index value representing when the entry
26
27
  # was last updated.
27
- class KVPair
28
- ATTRIBUTE_MAP = {
28
+ class KVPair < APIObject
29
+ self.attribute_map = {
29
30
  'LockIndex' => :lock_index,
30
31
  'Session' => :session,
31
32
  'Key' => :key,
@@ -34,27 +35,6 @@ module Imperium
34
35
  'CreateIndex' => :create_index,
35
36
  'ModifyIndex' => :modify_index,
36
37
  }.freeze
37
- private_constant :ATTRIBUTE_MAP
38
-
39
- ATTRIBUTE_NAMES = ATTRIBUTE_MAP.values
40
- private_constant :ATTRIBUTE_NAMES
41
-
42
- attr_accessor *ATTRIBUTE_NAMES
43
-
44
- # Initialize a {KVPair}
45
- #
46
- # @param attributes [Hash] The attributes for this object as parsed from the
47
- # API response.
48
- def initialize(attributes = {})
49
- ATTRIBUTE_MAP.each do |key, attribute_name|
50
- send("#{attribute_name}=", attributes[key]) if attributes[key]
51
- end
52
- end
53
-
54
- def ==(other)
55
- return false unless self.class === other
56
- ATTRIBUTE_NAMES.all? { |attr| self.send(attr) == other.send(attr )}
57
- end
58
38
 
59
39
  # Capture and base64 decode a value from the api.
60
40
  #
@@ -0,0 +1,11 @@
1
+ module Imperium
2
+ module HashCompact
3
+ refine Hash do
4
+ unless Hash.instance_methods(false).include?(:compact)
5
+ def compact
6
+ reject { |_, v| v.nil? }
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -8,6 +8,26 @@ module Imperium
8
8
  # It exposes, through a convenient API, headers common to all interactions
9
9
  # with the Consul HTTP API
10
10
  class Response < SimpleDelegator
11
+ include Enumerable
12
+
13
+ class << self
14
+ attr_accessor :default_response_object_class
15
+ end
16
+
17
+ # Construct a new response
18
+ #
19
+ # @param response [HTTP::Message] The response as returned from the http client
20
+ # @param response_object_class [APIObject] The class to coerce values into,
21
+ # if left the default (:none) no coersion will be attempted.
22
+ def initialize(response, response_object_class: :none)
23
+ super(response)
24
+ @klass = if response_object_class == :none
25
+ self.class.default_response_object_class
26
+ else
27
+ response_object_class
28
+ end
29
+ end
30
+
11
31
  # Indicates if the contacted server has a known leader.
12
32
  #
13
33
  # @return [TrueClass] When the response indicates there is a known leader
@@ -41,6 +61,25 @@ module Imperium
41
61
  headers.key?('X-Consul-Translate-Addresses')
42
62
  end
43
63
 
64
+ # Iterate over the values contained in the structure returned from {#coerced_body}
65
+ def each(&block)
66
+ coerced_body.each(&block)
67
+ end
68
+
69
+ # Parse the response JSON and initialize objects using the class passed to the constructor.
70
+ #
71
+ # @return [Array<Hash, APIObject>, Hash<String => APIObject>]
72
+ def coerced_body
73
+ return parsed_body if @klass == :none || @klass.nil?
74
+ @coerced_body ||= if parsed_body.is_a?(Array)
75
+ parsed_body.map { |attrs| @klass.new(attrs) }
76
+ else
77
+ parsed_body.each_with_object({}) { |(k, attrs), h|
78
+ h[k] = @klass.new(attrs)
79
+ }
80
+ end
81
+ end
82
+
44
83
  private
45
84
 
46
85
  def parsed_body
@@ -0,0 +1,87 @@
1
+ module Imperium
2
+ # Service is a container for data being received from and sent to the agent
3
+ # services APIs.
4
+ #
5
+ # @see https://www.consul.io/api/agent/service.html Agent Services API documentation
6
+ #
7
+ # @!attribute [rw] id
8
+ # @return [String] The service's id, when creating a new service this will
9
+ # be automatically assigned if not supplied, must be unique.
10
+ # @!attribute [rw] name
11
+ # @return [String] The service's name in the consul UI, required for
12
+ # creation, not required to be unique.
13
+ # @!attribute [rw] tags
14
+ # @return [Arary<String>] List of tags to be used for the service, can be
15
+ # used after creation for filtering in the API.
16
+ # @!attribute [rw] address
17
+ # @return [String] The network address to find the service at for DNS
18
+ # requests, defaults to the running agent's IP if left blank.
19
+ # @!attribute [rw] port
20
+ # @return [Integer] The port the service is bound to for network services.
21
+ # @!attribute [rw] checks
22
+ # @return [Array<ServiceCheck>] Specifies a list of checks to use for monitoring
23
+ # the service's health.
24
+ # @!attribute [rw] enable_tag_override
25
+ # @return [Boolean] Specifies to disable the anti-entropy feature for this
26
+ # service's tags. If EnableTagOverride is set to true then external agents
27
+ # can update this service in the catalog and modify the tags.
28
+ # @!attribute [r] create_index
29
+ # @return [Integer]
30
+ # @!attribute [r] modify_index
31
+ # @return [Integer]
32
+ class Service < APIObject
33
+ self.attribute_map = {
34
+ 'ID' => :id,
35
+ 'Name' => :name,
36
+ 'Tags' => :tags,
37
+ 'Address' => :address,
38
+ 'Port' => :port,
39
+ 'Check' => :check,
40
+ 'Checks' => :checks,
41
+ 'EnableTagOverride' => :enable_tag_override,
42
+ 'CreateIndex' => :create_index,
43
+ 'ModifyIndex' => :modify_index
44
+ }
45
+
46
+ def initialize(*args)
47
+ # So we can << onto these w/o having to nil check everywhere first
48
+ @tags ||= []
49
+ @checks ||= []
50
+ super
51
+ end
52
+
53
+ def add_check(val)
54
+ @checks << maybe_convert_service_check(val) unless val.nil?
55
+ end
56
+ alias check= add_check
57
+
58
+
59
+ def checks=(val)
60
+ @checks = (val || []).map { |obj| maybe_convert_service_check(obj) }
61
+ end
62
+
63
+ def tags=(val)
64
+ @tags = (val.nil? ? [] : val)
65
+ end
66
+
67
+ # Generate a hash containing the data necessary for registering this service.
68
+ #
69
+ # If both Check and Checks are present in the object they're coalesced into
70
+ # a single Checks key.
71
+ #
72
+ # @return [Hash<String => String,Integer,Hash<String => String>,Array<Hash<String => String>>]
73
+ def registration_data
74
+ to_h.tap do |h|
75
+ h.delete('CreateIndex')
76
+ h.delete('ModifyIndex')
77
+ h.delete('Checks') if checks.empty?
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ def maybe_convert_service_check(attrs_or_check)
84
+ attrs_or_check.is_a?(Hash) ? ServiceCheck.new(attrs_or_check) : attrs_or_check
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,100 @@
1
+ require_relative 'api_object'
2
+ module Imperium
3
+ # ServiceCheck is a container for data being received from and sent to the
4
+ # agent services and checks apis.
5
+ #
6
+ # @see https://www.consul.io/api/agent/check.html Agent Checks API documentation
7
+ #
8
+ # @!attribute [rw] id
9
+ # @return [String] The service's id, when creating a new check this will
10
+ # be automatically assigned if not supplied, must be unique.
11
+ # @!attribute [rw] name
12
+ # @return [String] The check's name in the consul UI, required for
13
+ # creation, not required to be unique.
14
+ # @!attribute [rw] script
15
+ # @return [String] Specifies a script or path to a script to run on Interval
16
+ # to update the status of the check. If specifying a path, this path must
17
+ # exist on disk and be readable by the Consul agent.
18
+ # @!attribute [rw] docker_container_id
19
+ # @return [String] Specifies that the check is a Docker check, and Consul
20
+ # will evaluate the script every Interval in the given container using the
21
+ # specified Shell. Note that Shell is currently only supported for Docker checks.
22
+ # @!attribute [rw] shell
23
+ # @return [String] The shell to use for docker checks, only applies when
24
+ # docker_container_id is specified
25
+ # @!attribute [rw] interval
26
+ # @return [String] Specifies the frequency at which to run this check. This
27
+ # is required for HTTP and TCP checks.
28
+ # @!attribute [rw] timeout
29
+ # @return [String]
30
+ # @!attribute [rw] ttl
31
+ # @return [String] Specifies this is a TTL check, and the TTL endpoint must
32
+ # be used periodically to update the state of the check.
33
+ # @!attribute [rw] http
34
+ # @return [String] Specifies an HTTP check to perform a GET request against
35
+ # the value of HTTP (expected to be a URL) every Interval. If the response
36
+ # is any 2xx code, the check is passing. If the response is 429 Too Many
37
+ # Requests, the check is warning. Otherwise, the check is critical. HTTP
38
+ # checks also support SSL. By default, a valid SSL certificate is
39
+ # expected. Certificate verification can be controlled using the
40
+ # TLSSkipVerify.
41
+ # @!attribute [rw] headers
42
+ # @return [Hash<String => String>] Specifies a set of headers that should be
43
+ # set for HTTP checks. Each header can have multiple values.
44
+ # @!attribute [rw] method
45
+ # @return [String] Specifies a different HTTP method to be used for an HTTP
46
+ # check. When no value is specified, GET is used.
47
+ # @!attribute [rw] tcp
48
+ # @return [String] Specifies a TCP to connect against the value of TCP
49
+ # (expected to be an IP or hostname plus port combination) every Interval.
50
+ # If the connection attempt is successful, the check is passing. If the
51
+ # connection attempt is unsuccessful, the check is critical. In the case
52
+ # of a hostname that resolves to both IPv4 and IPv6 addresses, an attempt
53
+ # will be made to both addresses, and the first successful connection
54
+ # attempt will result in a successful check.
55
+ # @!attribute [rw] status
56
+ # @return [String] Specifies the initial status of the health check.
57
+ # @!attribute [rw] notes
58
+ # @return [String] Specifies arbitrary information for humans. This is not
59
+ # used by Consul internally.
60
+ # @!attribute [rw] tls_skip_verify
61
+ # @return [String] Specifies if the certificate for an HTTPS check should
62
+ # not be verified.
63
+ # @!attribute [rw] deregister_critical_service_after
64
+ # @return [String] Specifies that checks associated with a service should
65
+ # deregister after this time. This is specified as a time duration with
66
+ # suffix like "10m". If a check is in the critical state for more than
67
+ # this configured value, then its associated service (and all of its
68
+ # associated checks) will automatically be deregistered. The minimum
69
+ # timeout is 1 minute, and the process that reaps critical services runs
70
+ # every 30 seconds, so it may take slightly longer than the configured
71
+ # timeout to trigger the deregistration. This should generally be
72
+ # configured with a timeout that's much, much longer than any expected
73
+ # recoverable outage for the given service.
74
+ # @!attribute [rw] service_id
75
+ # @return [String] Specifies the ID of a service to associate the
76
+ # registered check with an existing service provided by the agent. Does
77
+ # not need to be set when registering the check at the same time as
78
+ # registering a service
79
+ class ServiceCheck < APIObject
80
+ self.attribute_map = {
81
+ 'ID' => :id,
82
+ 'Name' => :name,
83
+ 'Script' => :script,
84
+ 'DockerContainerID' => :docker_container_id,
85
+ 'Shell' => :shell,
86
+ 'Interval' => :interval,
87
+ 'Timeout' => :timeout,
88
+ 'TTL' => :ttl,
89
+ 'HTTP' => :http,
90
+ 'Header' => :headers,
91
+ 'Method' => :method,
92
+ 'TCP' => :tcp,
93
+ 'Status' => :status,
94
+ 'Notes' => :notes,
95
+ 'TLSSkipVerify' => :tls_skip_verify,
96
+ 'DeregisterCriticalServiceAfter' => :deregister_critical_service_after,
97
+ 'ServiceID' => :service_id,
98
+ }
99
+ end
100
+ end
@@ -1,3 +1,3 @@
1
1
  module Imperium
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imperium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Pickett
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-26 00:00:00.000000000 Z
11
+ date: 2017-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -157,6 +157,12 @@ files:
157
157
  - docker-compose.yml
158
158
  - imperium.gemspec
159
159
  - lib/imperium.rb
160
+ - lib/imperium/agent.rb
161
+ - lib/imperium/agent_list_checks_response.rb
162
+ - lib/imperium/agent_list_services_response.rb
163
+ - lib/imperium/api_object.rb
164
+ - lib/imperium/catalog.rb
165
+ - lib/imperium/catalog/service.rb
160
166
  - lib/imperium/client.rb
161
167
  - lib/imperium/configuration.rb
162
168
  - lib/imperium/error.rb
@@ -167,7 +173,10 @@ files:
167
173
  - lib/imperium/kv_get_response.rb
168
174
  - lib/imperium/kv_pair.rb
169
175
  - lib/imperium/kv_put_response.rb
176
+ - lib/imperium/refinements/hash_compact.rb
170
177
  - lib/imperium/response.rb
178
+ - lib/imperium/service.rb
179
+ - lib/imperium/service_check.rb
171
180
  - lib/imperium/testing.rb
172
181
  - lib/imperium/version.rb
173
182
  homepage: https://github.com/instructure/imperium