wrata_api 0.1.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 +7 -0
- data/lib/wrata_api.rb +45 -0
- data/lib/wrata_api/file_tree.rb +16 -0
- data/lib/wrata_api/name.rb +9 -0
- data/lib/wrata_api/queue_methos.rb +58 -0
- data/lib/wrata_api/server_list.rb +82 -0
- data/lib/wrata_api/server_methods.rb +112 -0
- data/lib/wrata_api/server_methods/server_methods_exceptions.rb +7 -0
- data/lib/wrata_api/version.rb +9 -0
- data/lib/wrata_api/wrata_api_request.rb +45 -0
- metadata +72 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 557d84f0f762d728293064900d541e64bbac2f72cee30cbbc7453255f7f1dcc3
|
4
|
+
data.tar.gz: ab8a8885d4fe45746712d1614c9fc0b35676934eee88b9583fbe5550fbf48ddf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 73a54b8332386382265bc660375cdeccb022a56d7cbc1b0898aa3447e11b792ad7e811ccb0b16cf4644a2eb690af56648b032e63b70d4e36a6c7b39b1f963dd0
|
7
|
+
data.tar.gz: 254b4c171a0d637a1c1ffc1d5013d98127212f4c6ff6fe727afaf94fd79687d692928682338330c573516e5d264ee54c08ef376296e2f16cd48d505ceffbc33a
|
data/lib/wrata_api.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'wrata_api/wrata_api_request'
|
4
|
+
require_relative 'wrata_api/server_list'
|
5
|
+
require_relative 'wrata_api/server_methods'
|
6
|
+
require_relative 'wrata_api/file_tree'
|
7
|
+
require_relative 'wrata_api/queue_methos'
|
8
|
+
require 'json'
|
9
|
+
require 'logger'
|
10
|
+
require 'uri'
|
11
|
+
require 'yaml'
|
12
|
+
# Mail module of gem
|
13
|
+
module WrataApi
|
14
|
+
# Class for working with wrata api
|
15
|
+
class WrataApi
|
16
|
+
include WrataApiRequest
|
17
|
+
include ServerMethods
|
18
|
+
include FileListMethods
|
19
|
+
include QueueMethods
|
20
|
+
|
21
|
+
def initialize(config = nil)
|
22
|
+
config ||= YAML.load_file("#{ENV['HOME']}/.gem-wrata/config.yaml")
|
23
|
+
@uri = config['uri']
|
24
|
+
@cookie = config['cookie']
|
25
|
+
@wrata_session = config['wrata_session']
|
26
|
+
@csrf_token = config['csrf_token']
|
27
|
+
@logger = Logger.new(STDOUT)
|
28
|
+
@waiting_timeout = 5 * 60
|
29
|
+
@between_request_timeout = 10
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [True, False] check if service is running
|
33
|
+
def available?
|
34
|
+
uri = URI("#{@uri}/signin")
|
35
|
+
begin
|
36
|
+
source = Net::HTTP.get(uri)
|
37
|
+
rescue StandardError
|
38
|
+
source = ''
|
39
|
+
end
|
40
|
+
available = source.include?('Runner')
|
41
|
+
@logger.info("wrata_available?(#{@uri}): #{available}")
|
42
|
+
available
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WrataApi
|
4
|
+
# Methods to work with file tree
|
5
|
+
module FileListMethods
|
6
|
+
def file_list(project, ref = 'master')
|
7
|
+
uri = URI.parse("#{@uri}/runner/file_tree")
|
8
|
+
body = {
|
9
|
+
'flatten' => true,
|
10
|
+
'project' => project,
|
11
|
+
'refs' => ref
|
12
|
+
}
|
13
|
+
perform_get(uri, body)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WrataApi
|
4
|
+
# Methods for working with queue
|
5
|
+
module QueueMethods
|
6
|
+
# Clear test in queue
|
7
|
+
# @return [Nothing]
|
8
|
+
def clear_tests_list
|
9
|
+
uri = URI.parse("#{@uri}/queue/clear_tests")
|
10
|
+
perform_post(uri)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Get list of tests in queue
|
14
|
+
# @return [Array<Hash>] test list data
|
15
|
+
def tests_in_queue
|
16
|
+
uri = URI.parse("#{@uri}/runner/updated_data")
|
17
|
+
response = perform_get(uri)
|
18
|
+
response['queue_data']['tests']
|
19
|
+
end
|
20
|
+
|
21
|
+
# Add test to queue
|
22
|
+
# @param tests_to_add [String] path to add test
|
23
|
+
# @param options [Hash] string of some options
|
24
|
+
# @return [Nothing]
|
25
|
+
def add_to_queue(tests_to_add, options = {})
|
26
|
+
uri = URI.parse("#{@uri}/queue/add_test")
|
27
|
+
|
28
|
+
options = queue_item_default_values(options)
|
29
|
+
body = {
|
30
|
+
'test_path' => tests_to_add,
|
31
|
+
'branch' => options[:branch],
|
32
|
+
'location' => options[:location],
|
33
|
+
'spec_browser' => options[:browser]
|
34
|
+
}
|
35
|
+
perform_post(uri, body)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Add default value to queue item
|
39
|
+
# @param options [Hash] values for add to queue
|
40
|
+
# @return [Hash] after adding default
|
41
|
+
def queue_item_default_values(options)
|
42
|
+
options[:branch] ||= 'develop'
|
43
|
+
options[:location] ||= 'info us'
|
44
|
+
options[:browser] ||= 'default'
|
45
|
+
options
|
46
|
+
end
|
47
|
+
|
48
|
+
# Add several tests to queue
|
49
|
+
# @param test_list [Array, String] tests to add
|
50
|
+
# @param options [Hash] option to each test
|
51
|
+
# @return [Nothing]
|
52
|
+
def add_tests_to_queue(test_list, options = {})
|
53
|
+
test_list.each do |current_test|
|
54
|
+
add_to_queue(current_test, options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module WrataApi
|
4
|
+
# Class for working with several servers at once
|
5
|
+
class ServerList
|
6
|
+
# @return [Array, Hash] list of servers
|
7
|
+
attr_accessor :servers
|
8
|
+
|
9
|
+
def initialize(api)
|
10
|
+
@api = api
|
11
|
+
@servers = []
|
12
|
+
@concurrent_operation_at_once = 5
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Integer] count of servers
|
16
|
+
def length
|
17
|
+
@servers.length
|
18
|
+
end
|
19
|
+
|
20
|
+
# Turn on all servers in list
|
21
|
+
def concurrent_action
|
22
|
+
splitted_servers = @servers.each_slice(@concurrent_operation_at_once).to_a
|
23
|
+
splitted_servers.each do |each_slice|
|
24
|
+
threads = []
|
25
|
+
each_slice.each do |current_server|
|
26
|
+
threads << Thread.new(current_server) do
|
27
|
+
yield(current_server)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
threads.each(&:join)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Power on all servers
|
35
|
+
# @return [Nothing]
|
36
|
+
def power_on(size = nil)
|
37
|
+
concurrent_action do |server|
|
38
|
+
@api.power_on_server(server['name'], size)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [True, False] is all servers powered on?
|
43
|
+
def powered_on?
|
44
|
+
@servers.each do |current|
|
45
|
+
return false unless @api.powering_status(current['name']) == :on
|
46
|
+
end
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
# Power on all servers
|
51
|
+
# @return [Nothing]
|
52
|
+
def power_off
|
53
|
+
concurrent_action do |server|
|
54
|
+
@api.power_off_server(server['name'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [True, False] is all servers powered on?
|
59
|
+
def powered_off?
|
60
|
+
@servers.each do |current|
|
61
|
+
return false unless @api.powering_status(current['name']) == :off
|
62
|
+
end
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
66
|
+
# Book each server
|
67
|
+
# @return [Nothing]
|
68
|
+
def book
|
69
|
+
@servers.each do |current|
|
70
|
+
@api.book_server(current['name'])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Unbook each server
|
75
|
+
# @return [Nothing]
|
76
|
+
def unbook
|
77
|
+
@servers.each do |current|
|
78
|
+
@api.unbook_server(current['name'])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'server_methods/server_methods_exceptions'
|
4
|
+
module WrataApi
|
5
|
+
# Methods for getting server status
|
6
|
+
module ServerMethods
|
7
|
+
# @return [Array, String] list of all servers
|
8
|
+
def servers
|
9
|
+
uri = URI.parse("#{@uri}/servers.json")
|
10
|
+
perform_get(uri)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Got as much free servers as `count`
|
14
|
+
# @param count [Integer] how much servers to got
|
15
|
+
# @return [Array, Hash]
|
16
|
+
def free_servers(count)
|
17
|
+
free = ServerList.new(self)
|
18
|
+
raise NotEnoughServerCount if count > servers.length
|
19
|
+
|
20
|
+
servers.each do |single_server|
|
21
|
+
free.servers << single_server if single_server['book_client_id'].nil?
|
22
|
+
return free if free.length == count
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [Hash] Return servers data
|
27
|
+
def server_data(server_name)
|
28
|
+
uri = URI.parse("#{@uri}/runner/updated_data")
|
29
|
+
response = perform_get(uri, 'servers' => [{ name: server_name }].to_json)
|
30
|
+
response['servers_data'].first
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [Symbol] if server is powered on or off
|
34
|
+
def powering_status(server_name)
|
35
|
+
all_data = server_data(server_name)
|
36
|
+
status = all_data['_status']
|
37
|
+
if status == 'created'
|
38
|
+
:on
|
39
|
+
elsif status == 'destroyed'
|
40
|
+
:off
|
41
|
+
else
|
42
|
+
:other
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [True, False] check if server execute some test
|
47
|
+
def executing_test?(server_name)
|
48
|
+
all_data = server_data(server_name)
|
49
|
+
all_data.key?('test')
|
50
|
+
end
|
51
|
+
|
52
|
+
# @param server_name [Server] server to unbook
|
53
|
+
# @return [Nothing]
|
54
|
+
def unbook_server(server_name)
|
55
|
+
uri = URI.parse("#{@uri}/queue/unbook_server")
|
56
|
+
perform_post(uri, 'server' => server_name)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @param server_name [Server] server to book
|
60
|
+
# @return [Nothing]
|
61
|
+
def book_server(server_name)
|
62
|
+
uri = URI.parse("#{@uri}/queue/book_server")
|
63
|
+
perform_post(uri, 'server' => server_name)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @param server_name [Server] server to power on
|
67
|
+
# @return [Nothing]
|
68
|
+
def power_on_server(server_name, size = nil)
|
69
|
+
return if powering_status(server_name) == :on
|
70
|
+
|
71
|
+
uri = URI.parse("#{@uri}/servers/cloud_server_create")
|
72
|
+
perform_post(uri, 'server' => server_name, 'size' => size)
|
73
|
+
wait_for_server_have_status(server_name, :on)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @param server_name [Server] server to power on
|
77
|
+
# @return [Nothing]
|
78
|
+
def power_off_server(server_name)
|
79
|
+
return if powering_status(server_name) == :off
|
80
|
+
|
81
|
+
unbook_server(server_name)
|
82
|
+
uri = URI.parse("#{@uri}/servers/cloud_server_destroy")
|
83
|
+
perform_post(uri, 'server' => server_name)
|
84
|
+
wait_for_server_have_status(server_name, :off)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Waiting until server have statue
|
88
|
+
# @param server [String] name of server
|
89
|
+
# @param status [Symbol] state to wait
|
90
|
+
# @return [Nothing]
|
91
|
+
def wait_for_server_have_status(server, status)
|
92
|
+
current_wait_time = 0
|
93
|
+
loop do
|
94
|
+
return if powering_status(server) == status
|
95
|
+
|
96
|
+
@logger.info("Wait for state: #{status}: \
|
97
|
+
#{current_wait_time} of: #{@waiting_timeout}")
|
98
|
+
sleep @between_request_timeout
|
99
|
+
current_wait_time += @between_request_timeout
|
100
|
+
raise(server_status_timeout_error(server, status)) if current_wait_time > @waiting_timeout
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# @param server [String] name of server
|
105
|
+
# @param status [String] status to wait failed
|
106
|
+
# @return [String] error for server timeout
|
107
|
+
def server_status_timeout_error(server, status)
|
108
|
+
"Couldn't wait until #{server} have status "\
|
109
|
+
"#{status} in specified timeout"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
module WrataApi
|
5
|
+
# Module for describing base request actions
|
6
|
+
module WrataApiRequest
|
7
|
+
# @return [Hash] default header for requests
|
8
|
+
def default_header
|
9
|
+
{ 'Cookie' => "remember_token=#{@cookie}; \
|
10
|
+
_runner_session=#{@wrata_session}",
|
11
|
+
'X-CSRF-Token' => @csrf_token }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Make get request
|
15
|
+
# @param uri [URI] uri wiht server
|
16
|
+
# @param body [Hash] body of request
|
17
|
+
# @return [JSON] result of request
|
18
|
+
def perform_get(uri, body = {})
|
19
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
20
|
+
request = Net::HTTP::Get.new(uri.request_uri, default_header)
|
21
|
+
request.set_form_data(body)
|
22
|
+
body = http.request(request).body
|
23
|
+
@logger.info("Get request: #{uri} answered: #{body}")
|
24
|
+
return {} if body.empty?
|
25
|
+
|
26
|
+
JSON.parse(body)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Make post request
|
30
|
+
# @param uri [URI] uri wiht server
|
31
|
+
# @param body [Hash] body of request
|
32
|
+
# @return [JSON] result of request
|
33
|
+
def perform_post(uri, body = {})
|
34
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
35
|
+
request = Net::HTTP::Post.new(uri.request_uri, default_header)
|
36
|
+
request.set_form_data(body)
|
37
|
+
http.read_timeout = 500
|
38
|
+
body = http.request(request).body
|
39
|
+
@logger.info("Post request: #{uri} answered: #{body}")
|
40
|
+
return {} if body.empty?
|
41
|
+
|
42
|
+
JSON.parse(body)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wrata_api
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- ONLYOFFICE
|
8
|
+
- Pavel Lobashov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '13.0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '13.0'
|
28
|
+
description: Wrapper around wrata API
|
29
|
+
email:
|
30
|
+
- shockwavenn@gmail.com
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- lib/wrata_api.rb
|
36
|
+
- lib/wrata_api/file_tree.rb
|
37
|
+
- lib/wrata_api/name.rb
|
38
|
+
- lib/wrata_api/queue_methos.rb
|
39
|
+
- lib/wrata_api/server_list.rb
|
40
|
+
- lib/wrata_api/server_methods.rb
|
41
|
+
- lib/wrata_api/server_methods/server_methods_exceptions.rb
|
42
|
+
- lib/wrata_api/version.rb
|
43
|
+
- lib/wrata_api/wrata_api_request.rb
|
44
|
+
homepage: https://github.com/ONLYOFFICE/wrata_api
|
45
|
+
licenses:
|
46
|
+
- AGPL-3.0
|
47
|
+
metadata:
|
48
|
+
bug_tracker_uri: https://github.com/ONLYOFFICE/wrata_api/issues
|
49
|
+
changelog_uri: https://github.com/ONLYOFFICE/wrata_api/blob/master/CHANGELOG.md
|
50
|
+
documentation_uri: https://www.rubydoc.info/gems/wrata_api
|
51
|
+
homepage_uri: https://github.com/ONLYOFFICE/wrata_api
|
52
|
+
source_code_uri: https://github.com/ONLYOFFICE/wrata_api
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.4'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubygems_version: 3.1.2
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: Wrata API Gem
|
72
|
+
test_files: []
|