Module: Angus::Remote::ServiceDirectory

Defined in:
lib/angus/remote/service_directory.rb

Constant Summary collapse

SERVICES_CONFIGURATION_FILE =

Path to the configuration file that has the information about the doc_url and api_url

'config/services.yml'

Class Method Summary collapse

Class Method Details

.api_url(code_name, version = nil) ⇒ Object

Returns the api url from the configuration file

If no version given, it reads the version from the configuration file.

Parameters:

  • code_name (String)

    Name of the service.

  • version (String) (defaults to: nil)

    Version of the service.

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



78
79
80
81
82
83
84
# File 'lib/angus/remote/service_directory.rb', line 78

def self.api_url(code_name, version = nil)
  version ||= service_version(code_name)

  config = service_configuration(code_name)

  config["v#{version}"]['api_url']
end

.doc_url(code_name, version = nil) ⇒ Object

Returns the documentation url from the configuration file

If no version given, it reads the version from the configuration file.

Parameters:

  • code_name (String)

    Name of the service.

  • version (String) (defaults to: nil)

    Version of the service.

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



49
50
51
52
53
54
55
# File 'lib/angus/remote/service_directory.rb', line 49

def self.doc_url(code_name, version = nil)
  version ||= service_version(code_name)

  config = service_configuration(code_name)

  config["v#{version}"]['doc_url']
end

.get_service_definition(code_name, version = nil) ⇒ Angus::SDoc::Definitions::Service

Requests a service definition.

Parameters:

  • code_name (String)

    Service code name

  • version (String) (defaults to: nil)

    Service version

Returns:

  • (Angus::SDoc::Definitions::Service)

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



161
162
163
164
165
166
167
168
169
170
171
# File 'lib/angus/remote/service_directory.rb', line 161

def self.get_service_definition(code_name, version = nil)
  version ||= service_version(code_name)
  doc_url = self.doc_url(code_name, version)

  if doc_url.match('file://(.*)') || doc_url.match('file:///(.*)')
    Angus::SDoc::DefinitionsReader.service_definition($1)
  else
    definition_hash = fetch_remote_service_definition(doc_url, code_name, version)
    Angus::SDoc::DefinitionsReader.build_service_definition(definition_hash)
  end
end

.join_proxy(code_name, version, remote_code_name) ⇒ Angus::SDoc::Definitions::Service

Queries a service for definitions of proxy operations for the given remote service.

Merges those definitions and returns the result.

Parameters:

  • code_name (String)

    Service that acts as a proxy.

  • version (String)

    Service version.

  • remote_code_name (String)

    Remote service that implements operations for the proxy service

Returns:

  • (Angus::SDoc::Definitions::Service)


133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/angus/remote/service_directory.rb', line 133

def self.join_proxy(code_name, version, remote_code_name)

  service_definition = self.service_definition(code_name, version)

  @service_definitions_proxies ||= []
  if @service_definitions_proxies.include?([code_name, version, remote_code_name])
    return service_definition
  end

  proxy_doc_url = self.proxy_doc_url(code_name, version, remote_code_name)

  definition_hash = fetch_remote_service_definition(proxy_doc_url, code_name, version)

  proxy_service_definition = Angus::SDoc::DefinitionsReader.build_service_definition(definition_hash)

  service_definition.merge(proxy_service_definition)

  service_definition
end

.lookup(code_name, version = nil) ⇒ Object

Builds and returns a Client object for the service and version received



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/angus/remote/service_directory.rb', line 21

def self.lookup(code_name, version = nil)
  version ||= service_version(code_name)

  @clients_cache ||= {}
  if @clients_cache.include?([code_name, version])
    return @clients_cache[[code_name, version]]
  end

  begin
    service_definition = self.service_definition(code_name, version)
    client = Angus::Remote::Builder.build(code_name, service_definition,
                                          self.api_url(code_name, version),
                                          service_settings(code_name, version))
    @clients_cache[[code_name, version]] = client

  rescue Errno::ECONNREFUSED
    raise RemoteConnectionError.new(self.api_url(code_name, version))
  end
end

.proxy_doc_url(code_name, version, remote_code_name) ⇒ String

Returns the documentation url for proxy operations hosted by the service.

Parameters:

  • code_name (String)

    Service code name.

  • version (String)

    Service version.

  • remote_code_name (String)

    Service which implements proxy operations.

Returns:

  • (String)


64
65
66
67
68
# File 'lib/angus/remote/service_directory.rb', line 64

def self.proxy_doc_url(code_name, version, remote_code_name)
  doc_url = self.doc_url(code_name, version)

  "#{doc_url}/proxy/#{remote_code_name}"
end

.service_definition(code_name, version = nil) ⇒ Angus::SDoc::Definitions::Service

Returns the service’s definition for the given service name and version

Parameters:

  • code_name (String)

    Service that acts as a proxy.

  • version (String) (defaults to: nil)

    Service version.

Returns:

  • (Angus::SDoc::Definitions::Service)

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



111
112
113
114
115
116
117
118
119
120
121
# File 'lib/angus/remote/service_directory.rb', line 111

def self.service_definition(code_name, version = nil)
  version ||= service_version(code_name)

  @service_definitions_cache ||= {}
  if @service_definitions_cache.include?([code_name, version])
    return @service_definitions_cache[[code_name, version]]
  end

  service_definition = self.get_service_definition(code_name, version)
  @service_definitions_cache[[code_name, version]] = service_definition
end

.service_version(code_name) ⇒ String

Returns the configured version.

Parameters:

  • code_name (String)

    Service name

Returns:

  • (String)

    Version. Ex: 0.1

Raises:

  • (TooManyServiceVersions)

    When there are more than one configured version.



93
94
95
96
97
98
99
100
101
# File 'lib/angus/remote/service_directory.rb', line 93

def self.service_version(code_name)
  versions = service_configuration(code_name).keys

  if versions.length == 1
    versions.first.gsub(/^v/, '')
  else
    raise TooManyServiceVersions.new(code_name)
  end
end