SMService 0.1.1 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f13efcebf96173e4944cfde2281b69edc3cae550c25d64f3ada024959edf8d88
4
- data.tar.gz: 8c0e06122a5f9e54567bebbf1e6b404039497783dc828f7ddac18809fd361681
3
+ metadata.gz: bd1b23168d2bcb45a8a2b5504f90864fa3edb1f39e4697985c7c2b848a39dca0
4
+ data.tar.gz: 818f88feaa388cb19a55c6da0eb9b63144429afcabf75058db74129bf8fefdac
5
5
  SHA512:
6
- metadata.gz: 0ad8734a1bcc6f58fc1fa5a28613eecd8a9ad93644e4ae108c33bc8cf052f3ae6575c1a82af7bf0cce2dc503c5041dcf832fdb7b71b1677e517b0ba6df537fe9
7
- data.tar.gz: df8b125661e22e0b95387e0d62ed4bd67d3fa38325967925f57089cd510066469ff6f8ec70aa052ba386720f779a03a74325cfb38d6c089900ef9664a16a4333
6
+ metadata.gz: a0cfde871cbbf2ef426f6d88d26b50a80630702197d4dec3423b437818c6732a1108e38768f200569b7fe9c56a2f7b545affbbb6d7a81bd1dc6838d79458be6b
7
+ data.tar.gz: 4bcf27ead688eec085f9348a64915cc4f27323cd3b6e76c8643309cbe2bb18b14871c50d12552e2added16f73c59f3196afcccb44aa5feb13ebcff57312c83b3
@@ -0,0 +1,34 @@
1
+ FROM ruby:alpine3.6
2
+
3
+ MAINTAINER Andrius Kairiukstis <k@andrius.mobi>
4
+
5
+ RUN apk update \
6
+ \
7
+ && apk add \
8
+ build-base \
9
+ git \
10
+ libxml2-dev \
11
+ libxslt-dev \
12
+ libffi-dev \
13
+ pcre-dev \
14
+ libstdc++ \
15
+ libxml2 \
16
+ libxslt \
17
+ libffi \
18
+ libzmq \
19
+ pcre \
20
+ zlib \
21
+ tzdata \
22
+ mc \
23
+ vim \
24
+ \
25
+ && cp -R /usr/share/zoneinfo/Europe/Amsterdam /etc/localtime \
26
+ && echo 'Europe/Amsterdam' > /etc/timezone \
27
+ \
28
+ && find /usr/lib/libzmq.so* -type f | head -1 | awk '{print ""$1" /usr/lib/libzmq.so"}' | xargs ln -s \
29
+ \
30
+ && gem install --no-rdoc --no-ri \
31
+ pry
32
+
33
+ WORKDIR /app
34
+ ADD . /app/
@@ -0,0 +1,45 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ smservice (0.1.2)
5
+ ffi-rzmq (~> 2.0)
6
+ logger (~> 1.2)
7
+ msgpack (~> 1.1)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ diff-lcs (1.3)
13
+ ffi (1.9.18)
14
+ ffi-rzmq (2.0.5)
15
+ ffi-rzmq-core (>= 1.0.6)
16
+ ffi-rzmq-core (1.0.6)
17
+ ffi
18
+ logger (1.2.8)
19
+ msgpack (1.1.0)
20
+ rake (10.5.0)
21
+ rspec (3.7.0)
22
+ rspec-core (~> 3.7.0)
23
+ rspec-expectations (~> 3.7.0)
24
+ rspec-mocks (~> 3.7.0)
25
+ rspec-core (3.7.0)
26
+ rspec-support (~> 3.7.0)
27
+ rspec-expectations (3.7.0)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.7.0)
30
+ rspec-mocks (3.7.0)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.7.0)
33
+ rspec-support (3.7.0)
34
+
35
+ PLATFORMS
36
+ ruby
37
+
38
+ DEPENDENCIES
39
+ bundler (~> 1.16)
40
+ rake (~> 10.0)
41
+ rspec (~> 3.0)
42
+ smservice!
43
+
44
+ BUNDLED WITH
45
+ 1.16.0
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "SMSwqervice"
3
+ require 'bundler'
4
+ Bundler.setup
5
+ Bundler.require
6
+ require 'smservice'
5
7
 
6
8
  # You can add fixtures and/or initialization code here to make experimenting
7
9
  # with your gem easier. You can also use a different console, if you like.
@@ -1,5 +1,144 @@
1
- require "SMService/version"
1
+ require 'timeout'
2
+ require 'logger'
3
+ require 'msgpack'
4
+ require 'ffi-rzmq'
5
+ require 'smservice/version'
2
6
 
3
7
  module SMService
4
- # Your code goes here...
8
+ LOGGER = Logger.new(STDERR)
9
+
10
+ ENDPOINT_OUT = 'tcp://proxy:6660'
11
+ ENDPOINT_IN = 'tcp://proxy:6661'
12
+
13
+ REGISTER_WAIT_TIME = 'infinite'
14
+ KEEPALIVE_WAIT_TIME = 30
15
+
16
+ attr_accessor :socket_in, :socket_out
17
+ attr_reader :service_name
18
+
19
+ def initialize(name:)
20
+ @service_name = name
21
+
22
+ context = ZMQ::Context.new
23
+ @socket_in = context.socket ZMQ::DEALER
24
+ @socket_out = context.socket ZMQ::DEALER
25
+
26
+ @socket_in.setsockopt ZMQ::IDENTITY, service_name
27
+ @socket_in.connect ENDPOINT_IN
28
+
29
+ @socket_out.setsockopt ZMQ::IDENTITY, service_name
30
+ @socket_out.connect ENDPOINT_OUT
31
+ end
32
+
33
+ def register!(wait_time: REGISTER_WAIT_TIME)
34
+ if wait_time.to_f <= 0
35
+ loop do
36
+ register!
37
+ break if registered?
38
+ # not registered, retrying in 10 seconds
39
+ sleep 10
40
+ end
41
+ else
42
+ Timeout::timeout(wait_time) do
43
+ loop do
44
+ register!
45
+ break if registered?
46
+ # not registered, retrying in 10 seconds
47
+ sleep 10
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def keep_alive!(wait_time: KEEPALIVE_WAIT_TIME)
54
+ Thread.start do
55
+ LOGGER.info "Starting registration update loop with periodic interval #{wait_time} sec"
56
+ loop do
57
+ break unless registered?
58
+ sleep wait_time
59
+ service_manager('UPDATE', [])
60
+ end
61
+ LOGGER.info 'Registration update loop terminated'
62
+ end
63
+ end
64
+
65
+ def registered?
66
+ @registered
67
+ end
68
+
69
+ def register!
70
+ service_manager('REGISTER', services: [service_name])
71
+ pull_action
72
+ end
73
+
74
+ def service_poller
75
+ loop do
76
+ pull_action
77
+ end
78
+ end
79
+
80
+ def start!
81
+ register!
82
+ keep_alive!
83
+ service_poller
84
+ end
85
+
86
+ def action_update(headers, message)
87
+ LOGGER.info("Action: UPDATE (successful)")
88
+ end
89
+
90
+ def action_register(headers, message)
91
+ if headers['action'] == 'REGISTER' && message['result'] == 'OK'
92
+ @registered = true
93
+ LOGGER.info "Action: REGISTER (successful), headers: #{headers.inspect}, message: #{message.inspect}"
94
+ else
95
+ LOGGER.info "Action: REGISTER (failure), headers: #{headers.inspect}, message: #{message.inspect}"
96
+ end
97
+ end
98
+
99
+ private
100
+
101
+ # Sending request to the Service Manager
102
+ #
103
+ def service_manager(action, message)
104
+ LOGGER.info "SM request. Action: #{action.inspect}, message: #{message.inspect}"
105
+ action = {action: action}.to_msgpack
106
+ message = message.to_msgpack
107
+ @socket_in.send_strings [action, message]
108
+ end
109
+
110
+ def pull_action
111
+ @socket_in.recv_strings( response = [] )
112
+
113
+ headers, message = response
114
+ headers = MessagePack.unpack(headers)
115
+ message = MessagePack.unpack(message)
116
+
117
+ LOGGER.info "SM response received by pull_action. Headers: #{headers.inspect}, message: #{message.inspect}"
118
+
119
+ # Validates is action_name exists as class method and calling it.
120
+ # In case, if Service Manager return headers['action'] == 'METHOD_NAME',
121
+ # ruby expecting that somethinf like this would be defined:
122
+ #
123
+ # def action_method_name(headers, message)
124
+ # # ... some business logic here
125
+ # end
126
+ #
127
+ # Two actions defined as part of module, it is :
128
+ # - action_register, that confirms registration of node with Service Manager, and
129
+ # - action_update, that confirms successfule registration update, we need it to support keep-alive
130
+ #
131
+ action_name = "action_#{headers['action'].downcase}".to_sym
132
+ if respond_to? action_name.to_sym
133
+ send(action_name, headers, message)
134
+ end
135
+ end
136
+ end
137
+
138
+ class SMService::Dummy
139
+ include SMService
140
+
141
+ def initialize
142
+ super name: 'dummy-ruby'
143
+ end
5
144
  end
@@ -1,3 +1,3 @@
1
1
  module SMService
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -1,37 +1,41 @@
1
-
2
1
  lib = File.expand_path("../lib", __FILE__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require "smservice/version"
5
4
 
6
- Gem::Specification.new do |spec|
7
- spec.name = "SMService"
8
- spec.version = SMService::VERSION
9
- spec.authors = ["Andrius Kairiukstis"]
10
- spec.email = ["k@andrius.mobi"]
5
+ Gem::Specification.new do |s|
6
+ s.name = "SMService"
7
+ s.version = SMService::VERSION
8
+ s.authors = ["Andrius Kairiukstis"]
9
+ s.email = ["k@andrius.mobi"]
11
10
 
12
- spec.summary = %q{Service Manager client.}
13
- spec.description = %q{Service Manager client with ZeroMQ DEALER endpoints, to build voice test automation actions based on ruby.}
14
- spec.homepage = "https://github.com/andrius/smservice"
15
- spec.license = "MIT"
11
+ s.summary = %q{Service Manager client.}
12
+ s.description = %q{Service Manager client with ZeroMQ DEALER endpoints, to build voice test automation actions based on ruby.}
13
+ s.homepage = "https://github.com/andrius/smservice"
14
+ s.license = "MIT"
16
15
 
17
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
17
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
- # if spec.respond_to?(:metadata)
20
- # spec.metadata["allowed_push_host"] = "https://rubygems.org"
18
+ # if s.respond_to?(:metadata)
19
+ # s.metadata["allowed_push_host"] = "https://rubygems.org"
21
20
  # else
22
21
  # raise "RubyGems 2.0 or newer is required to protect against " \
23
22
  # "public gem pushes."
24
23
  # end
25
24
 
26
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
27
26
  f.match(%r{^(test|spec|features)/})
28
27
  end
29
- # spec.bindir = "exe"
30
- # spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.executables = []
32
- spec.require_paths = ["lib"]
28
+ # s.bindir = "bin"
29
+ # s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
+ s.executables = []
31
+ s.require_paths = ["lib"]
32
+
33
+ s.add_runtime_dependency "logger", "~> 1.2"
34
+ s.add_runtime_dependency "msgpack", "~> 1.1"
35
+ s.add_runtime_dependency "ffi-rzmq", "~> 2.0"
36
+
33
37
 
34
- spec.add_development_dependency "bundler", "~> 1.16"
35
- spec.add_development_dependency "rake", "~> 10.0"
36
- spec.add_development_dependency "rspec", "~> 3.0"
38
+ s.add_development_dependency "bundler", "~> 1.16"
39
+ s.add_development_dependency "rake", "~> 10.0"
40
+ s.add_development_dependency "rspec", "~> 3.0"
37
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: SMService
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrius Kairiukstis
@@ -10,6 +10,48 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2017-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: logger
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: msgpack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ffi-rzmq
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: bundler
15
57
  requirement: !ruby/object:Gem::Requirement
@@ -64,7 +106,9 @@ files:
64
106
  - ".rspec"
65
107
  - ".travis.yml"
66
108
  - CODE_OF_CONDUCT.md
109
+ - Dockerfile
67
110
  - Gemfile
111
+ - Gemfile.lock
68
112
  - LICENSE.txt
69
113
  - README.md
70
114
  - Rakefile