optimus-runner 1.1.0 → 1.2.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/Gemfile.lock +7 -3
- data/exe/optimus-runner +11 -0
- data/exe/optimus_runner_manager +5 -0
- data/lib/optimus-runner/AppiumLocalService.rb +2 -2
- data/lib/optimus-runner/DeviceDetails.rb +17 -10
- data/lib/optimus-runner/clients/AkiraClient.rb +30 -0
- data/lib/optimus-runner/clients/AppiumServerClient.rb +18 -0
- data/lib/optimus-runner/server/optimus_runner_sm.rb +46 -7
- data/lib/optimus-runner/version.rb +1 -1
- data/optimus-runner.gemspec +2 -0
- metadata +34 -8
- data/optimus-runner-0.12.0.gem +0 -0
- data/optimus-runner-0.13.0.gem +0 -0
- data/optimus-runner-0.14.0.gem +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13e5dec7f952733d14d108f33347b3e16605b34978bad30bbe7b838068f4a4e9
|
4
|
+
data.tar.gz: 3acc90f802671fb7ae07c11f32a07414ef7a4fa7d1d1062d054fde92c7f2fcd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ad4243220a96544d38d89971de59810dd65b1e36f117d6dc61acca2af20ef48adebf6a85ddb04c23da96caeea762206b092cf300659c5eb57bd589557ee8921
|
7
|
+
data.tar.gz: e675ea483105f3e0c45523fc539bd04665d176c723c5ea13858ff5a9904876f63417945a204d6116dc44ccfb6c4d1e5e7c1366342fb756e75c46c1ea7881244e
|
data/Gemfile.lock
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
optimus-runner (1.
|
4
|
+
optimus-runner (1.1.4)
|
5
5
|
aasm (~> 5.0)
|
6
6
|
daemons (~> 1.3)
|
7
7
|
dotenv (~> 2.1, >= 2.1.1)
|
8
|
+
exponential-backoff (~> 0.0.4)
|
8
9
|
httparty (~> 0.16.3)
|
10
|
+
nenv (~> 0.3.0)
|
9
11
|
open4 (~> 1.3)
|
10
12
|
os (~> 1.0, >= 1.0.1)
|
11
13
|
random-port (~> 0.3.1)
|
@@ -14,14 +16,15 @@ PATH
|
|
14
16
|
GEM
|
15
17
|
remote: https://rubygems.org/
|
16
18
|
specs:
|
17
|
-
aasm (5.0.
|
19
|
+
aasm (5.0.8)
|
18
20
|
concurrent-ruby (~> 1.0)
|
19
21
|
concurrent-ruby (1.1.6)
|
20
22
|
daemons (1.3.1)
|
21
23
|
diff-lcs (1.3)
|
22
24
|
dotenv (2.7.5)
|
23
|
-
et-orbi (1.2.
|
25
|
+
et-orbi (1.2.4)
|
24
26
|
tzinfo
|
27
|
+
exponential-backoff (0.0.4)
|
25
28
|
fugit (1.3.3)
|
26
29
|
et-orbi (~> 1.1, >= 1.1.8)
|
27
30
|
raabro (~> 1.1)
|
@@ -32,6 +35,7 @@ GEM
|
|
32
35
|
mime-types-data (~> 3.2015)
|
33
36
|
mime-types-data (3.2019.1009)
|
34
37
|
multi_xml (0.6.0)
|
38
|
+
nenv (0.3.0)
|
35
39
|
open4 (1.3.4)
|
36
40
|
os (1.0.1)
|
37
41
|
raabro (1.1.6)
|
data/exe/optimus-runner
CHANGED
@@ -18,10 +18,21 @@ options = {
|
|
18
18
|
:log_dir => "#{File.expand_path('~')}/optimus_runner/logs",
|
19
19
|
:logfilename => 'optimus-runner.log'
|
20
20
|
}
|
21
|
+
|
22
|
+
ENV["ANDROID"]="true"
|
23
|
+
ENV["IOS"]="true"
|
21
24
|
optparser = OptionParser.new do |parser|
|
22
25
|
parser.on('-e=FILE','--env=FILE', "Optimus Cloud Environment file") do |file|
|
23
26
|
Dotenv.load(file)
|
24
27
|
end
|
28
|
+
parser.on('-a','--android-only',"Create sessions for android") do
|
29
|
+
ENV["IOS"]="false"
|
30
|
+
p "running android"
|
31
|
+
end
|
32
|
+
parser.on('-i','--ios-only',"Create sessions for iOS") do
|
33
|
+
ENV["ANDROID"]="false"
|
34
|
+
p "running ios"
|
35
|
+
end
|
25
36
|
end
|
26
37
|
optparser.parse!(ARGV)
|
27
38
|
Daemons.run(File.join(File.dirname(__FILE__),'optimus_runner_manager'), options)
|
data/exe/optimus_runner_manager
CHANGED
@@ -18,5 +18,10 @@ scheduler.interval '5s', :first_in => 0.1 do
|
|
18
18
|
optimus_runner_sm.add if optimus_runner_sm.new_device_added?
|
19
19
|
optimus_runner_sm.remove if optimus_runner_sm.device_removed?
|
20
20
|
optimus_runner_sm.restart if optimus_runner_sm.session_terminated?
|
21
|
+
optimus_runner_sm.empty if optimus_runner_sm.cloud_session_empty? # You have done FLUSHALL in akira
|
22
|
+
end
|
23
|
+
|
24
|
+
scheduler.every '1m', :first_in => 60 do
|
25
|
+
optimus_runner_sm.session_state
|
21
26
|
end
|
22
27
|
scheduler.join
|
@@ -53,9 +53,9 @@ class AppiumLocalService
|
|
53
53
|
def get_cmd(device_detail)
|
54
54
|
case device_detail["platform"]
|
55
55
|
when "ANDROID"
|
56
|
-
return "appium -p #{@port} --bootstrap-port #{get_random_port}"
|
56
|
+
return "appium -p #{@port} --bootstrap-port #{get_random_port} --relaxed-security --default-capabilities '{\"systemPort\":#{get_random_port}}'"
|
57
57
|
when "IOS"
|
58
|
-
return "appium -p #{@port} --webdriveragent-port #{get_random_port}"
|
58
|
+
return "appium -p #{@port} --webdriveragent-port #{get_random_port} --relaxed-security"
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'HTTParty'
|
2
2
|
require 'optimus-runner/clients/mdb_client'
|
3
3
|
require 'os'
|
4
|
+
require 'nenv'
|
4
5
|
|
5
6
|
class DeviceDetails
|
6
7
|
|
@@ -17,12 +18,16 @@ class DeviceDetails
|
|
17
18
|
end
|
18
19
|
|
19
20
|
def process_android_devices
|
20
|
-
|
21
|
+
if(Nenv.android?)
|
22
|
+
devices = `adb devices`
|
23
|
+
else
|
24
|
+
devices = []
|
25
|
+
end
|
21
26
|
return MDBClient.new.format_android_devices devices
|
22
27
|
end
|
23
28
|
|
24
29
|
def process_ios_devices
|
25
|
-
if(OS.mac?)
|
30
|
+
if(OS.mac? && Nenv.ios?)
|
26
31
|
devices = `instruments -s devices | grep 'iPhone'`
|
27
32
|
return [] if devices.length == 0
|
28
33
|
return MDBClient.new.format_ios_devices devices
|
@@ -32,14 +37,16 @@ class DeviceDetails
|
|
32
37
|
|
33
38
|
def find_android_devices(device_names)
|
34
39
|
device_details = []
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
if(Nenv.android?)
|
41
|
+
device_names.each do |a|
|
42
|
+
puts "adb -s #{a['udid']} shell getprop ro.product.model"
|
43
|
+
device_model = `adb -s #{a['udid']} shell getprop ro.product.model`
|
44
|
+
device_os_version = `adb -s #{a['udid']} shell getprop ro.build.version.release`
|
45
|
+
a['deviceName'] = device_model.to_s.rstrip
|
46
|
+
a['platformVersion'] = device_os_version.to_s.rstrip
|
47
|
+
a["platform"] = "ANDROID"
|
48
|
+
device_details.push(a)
|
49
|
+
end
|
43
50
|
end
|
44
51
|
device_details
|
45
52
|
end
|
@@ -28,6 +28,14 @@ class AkriaClient
|
|
28
28
|
HTTParty.put(uri, query: query_params, headers: get_default_headers)
|
29
29
|
end
|
30
30
|
|
31
|
+
def release_session(session_url)
|
32
|
+
uri = "#{@base_uri}/sessionState/release"
|
33
|
+
query_params = {
|
34
|
+
'sessionUrl':session_url
|
35
|
+
}
|
36
|
+
HTTParty.put(uri, query: query_params, headers: get_default_headers)
|
37
|
+
end
|
38
|
+
|
31
39
|
def get_session_info(session_url)
|
32
40
|
uri = "#{@base_uri}/sessionInfo"
|
33
41
|
puts uri
|
@@ -39,6 +47,25 @@ class AkriaClient
|
|
39
47
|
return session_info
|
40
48
|
end
|
41
49
|
|
50
|
+
def get_session_state(session_url)
|
51
|
+
uri = "#{@base_uri}/sessionState"
|
52
|
+
query_params = {
|
53
|
+
'sessionUrl':session_url
|
54
|
+
}
|
55
|
+
response = HTTParty.get(uri, query: query_params, headers: get_default_headers)
|
56
|
+
p response
|
57
|
+
session_state = response
|
58
|
+
return session_state
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_all_sessions
|
62
|
+
uri = "#{@base_uri}/sessionsList"
|
63
|
+
puts uri
|
64
|
+
response = HTTParty.get(uri, headers: get_default_headers)
|
65
|
+
sessions = JSON.parse(response.to_s)
|
66
|
+
return sessions
|
67
|
+
end
|
68
|
+
|
42
69
|
|
43
70
|
def get_default_headers
|
44
71
|
headers = {
|
@@ -48,4 +75,7 @@ class AkriaClient
|
|
48
75
|
end
|
49
76
|
|
50
77
|
|
78
|
+
|
79
|
+
|
80
|
+
|
51
81
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'HTTParty'
|
2
|
+
|
3
|
+
class AppiumServerClient
|
4
|
+
def isSessionAlive?(session_url)
|
5
|
+
uri = "#{session_url}/sessions"
|
6
|
+
response = HTTParty.get(uri, headers: get_default_headers)
|
7
|
+
sessions = JSON.parse(response.to_s)
|
8
|
+
session_state = sessions["value"].empty?
|
9
|
+
return !session_state
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_default_headers
|
13
|
+
headers = {
|
14
|
+
'Content-Type': "Application/json"
|
15
|
+
}
|
16
|
+
return headers
|
17
|
+
end
|
18
|
+
end
|
@@ -7,9 +7,10 @@ require 'json'
|
|
7
7
|
require 'optimus-runner/AppiumLocalService'
|
8
8
|
require 'optimus-runner/SessionInfoBuilder'
|
9
9
|
require 'optimus-runner/clients/AkiraClient'
|
10
|
-
require 'optimus-runner/clients/
|
10
|
+
require 'optimus-runner/clients/AppiumServerClient'
|
11
11
|
require 'logger'
|
12
12
|
require 'optimus-runner/commands/ShellCommands'
|
13
|
+
require 'exponential_backoff'
|
13
14
|
|
14
15
|
class OptimusRunnerSM
|
15
16
|
include AASM
|
@@ -51,6 +52,16 @@ class OptimusRunnerSM
|
|
51
52
|
transitions :from => [:created, :added, :removed, :restarted], :to => :created, :guard => :devices_available?
|
52
53
|
transitions :from => [:created, :added, :removed, :restarted], :to => :idle
|
53
54
|
end
|
55
|
+
|
56
|
+
event :empty, :before => :empty_sessions do
|
57
|
+
transitions :from => [:created, :added, :removed, :restarted], :to => :added, :guard => :cloud_session_empty?
|
58
|
+
transitions :from => [:created, :added, :removed, :restarted], :to => :created, :guard => :devices_available?
|
59
|
+
transitions :from => [:created, :added, :removed, :restarted], :to => :idle
|
60
|
+
end
|
61
|
+
|
62
|
+
event :session_state, :before => :is_session_alive? do
|
63
|
+
transitions :from => [:created, :added, :removed, :restarted], :to => :created, :guard => :devices_available?
|
64
|
+
end
|
54
65
|
end
|
55
66
|
|
56
67
|
def devices_available?
|
@@ -76,6 +87,10 @@ class OptimusRunnerSM
|
|
76
87
|
@session_restarted
|
77
88
|
end
|
78
89
|
|
90
|
+
def session_empty?
|
91
|
+
@sessions_empty
|
92
|
+
end
|
93
|
+
|
79
94
|
def gather_devices
|
80
95
|
details = DeviceDetails.new
|
81
96
|
@device_details = details.get_device_details
|
@@ -86,7 +101,6 @@ class OptimusRunnerSM
|
|
86
101
|
return unless devices_available?
|
87
102
|
@logger.info "Device details found are #{@device_details}"
|
88
103
|
sessions = AppiumLocalService.new.launch_appium_sessions(@device_details)
|
89
|
-
puts sessions
|
90
104
|
@session_info = sessions
|
91
105
|
AkriaClient.new.save_sessions(@session_info)
|
92
106
|
end
|
@@ -98,7 +112,6 @@ class OptimusRunnerSM
|
|
98
112
|
# session_info = SessionInfo.new(session,device_details).create_session_info
|
99
113
|
AkriaClient.new.save_sessions(session_info)
|
100
114
|
@session_info.push session_info[0]
|
101
|
-
p @session_info
|
102
115
|
end
|
103
116
|
|
104
117
|
def add_sessions
|
@@ -127,8 +140,6 @@ class OptimusRunnerSM
|
|
127
140
|
@initial_device_set = @device_details
|
128
141
|
end
|
129
142
|
end
|
130
|
-
|
131
|
-
|
132
143
|
end
|
133
144
|
|
134
145
|
def session_terminated?
|
@@ -162,6 +173,35 @@ class OptimusRunnerSM
|
|
162
173
|
@session_restarted = true
|
163
174
|
end
|
164
175
|
|
176
|
+
def empty_sessions
|
177
|
+
return unless devices_available?
|
178
|
+
if cloud_session_empty?
|
179
|
+
p "Session Info #{@session_info}"
|
180
|
+
AkriaClient.new.save_sessions(@session_info)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def cloud_session_empty?
|
185
|
+
sessions = AkriaClient.new.get_all_sessions
|
186
|
+
return false if sessions.instance_of? Array
|
187
|
+
return true if sessions.key?("errorCode")
|
188
|
+
end
|
189
|
+
|
190
|
+
def session_state
|
191
|
+
return unless devices_available?
|
192
|
+
@session_info.each do |session|
|
193
|
+
if(is_session_engaged?(session["sessionUrl"]))
|
194
|
+
AkriaClient.new.release_session session["sessionUrl"] unless AppiumServerClient.new.isSessionAlive? session["sessionUrl"]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def is_session_engaged?(session_url)
|
200
|
+
session_state = AkriaClient.new.get_session_state session_url
|
201
|
+
p "Session state is #{session_state}"
|
202
|
+
return session_state.casecmp?("ENGAGED")
|
203
|
+
end
|
204
|
+
|
165
205
|
def new_device_added?
|
166
206
|
added_device = get_added_devices
|
167
207
|
p "Is new devices added #{added_device.length>0}"
|
@@ -203,5 +243,4 @@ class OptimusRunnerSM
|
|
203
243
|
removed_device = @initial_device_set - @device_details
|
204
244
|
return removed_device
|
205
245
|
end
|
206
|
-
end
|
207
|
-
|
246
|
+
end
|
data/optimus-runner.gemspec
CHANGED
@@ -31,4 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_dependency 'aasm', '~> 5.0'
|
32
32
|
spec.add_dependency 'rufus-scheduler', '~> 3.2'
|
33
33
|
spec.add_dependency 'os', '~> 1.0', '>= 1.0.1'
|
34
|
+
spec.add_dependency 'nenv', '~> 0.3.0'
|
35
|
+
spec.add_dependency 'exponential-backoff', '~> 0.0.4'
|
34
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optimus-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KrishnanandB
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -182,6 +182,34 @@ dependencies:
|
|
182
182
|
- - ">="
|
183
183
|
- !ruby/object:Gem::Version
|
184
184
|
version: 1.0.1
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: nenv
|
187
|
+
requirement: !ruby/object:Gem::Requirement
|
188
|
+
requirements:
|
189
|
+
- - "~>"
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: 0.3.0
|
192
|
+
type: :runtime
|
193
|
+
prerelease: false
|
194
|
+
version_requirements: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - "~>"
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: 0.3.0
|
199
|
+
- !ruby/object:Gem::Dependency
|
200
|
+
name: exponential-backoff
|
201
|
+
requirement: !ruby/object:Gem::Requirement
|
202
|
+
requirements:
|
203
|
+
- - "~>"
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 0.0.4
|
206
|
+
type: :runtime
|
207
|
+
prerelease: false
|
208
|
+
version_requirements: !ruby/object:Gem::Requirement
|
209
|
+
requirements:
|
210
|
+
- - "~>"
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: 0.0.4
|
185
213
|
description: ''
|
186
214
|
email:
|
187
215
|
- krisnanandb@gmail.com
|
@@ -215,6 +243,7 @@ files:
|
|
215
243
|
- lib/optimus-runner/DeviceDetails.rb
|
216
244
|
- lib/optimus-runner/SessionInfoBuilder.rb
|
217
245
|
- lib/optimus-runner/clients/AkiraClient.rb
|
246
|
+
- lib/optimus-runner/clients/AppiumServerClient.rb
|
218
247
|
- lib/optimus-runner/clients/mdb_client.rb
|
219
248
|
- lib/optimus-runner/commands/ShellCommands.rb
|
220
249
|
- lib/optimus-runner/server/appium_server_manager.rb
|
@@ -224,16 +253,13 @@ files:
|
|
224
253
|
- lib/optimus-runner/utils/optimuscloudenv.rb
|
225
254
|
- lib/optimus-runner/version.rb
|
226
255
|
- lib/optimus_runner_control.rb
|
227
|
-
- optimus-runner-0.12.0.gem
|
228
|
-
- optimus-runner-0.13.0.gem
|
229
|
-
- optimus-runner-0.14.0.gem
|
230
256
|
- optimus-runner.gemspec
|
231
257
|
- pids/optimus-runner.log
|
232
258
|
- pids/optimus_runner_outputfile.txt
|
233
259
|
homepage: https://gitlab.com/testvagrant/optimus-pleiades/optimus-cloud/optimus-runner
|
234
260
|
licenses: []
|
235
261
|
metadata: {}
|
236
|
-
post_install_message:
|
262
|
+
post_install_message:
|
237
263
|
rdoc_options: []
|
238
264
|
require_paths:
|
239
265
|
- lib
|
@@ -249,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
249
275
|
version: '0'
|
250
276
|
requirements: []
|
251
277
|
rubygems_version: 3.0.6
|
252
|
-
signing_key:
|
278
|
+
signing_key:
|
253
279
|
specification_version: 4
|
254
280
|
summary: A worker service project
|
255
281
|
test_files: []
|
data/optimus-runner-0.12.0.gem
DELETED
Binary file
|
data/optimus-runner-0.13.0.gem
DELETED
Binary file
|
data/optimus-runner-0.14.0.gem
DELETED
Binary file
|