onlyoffice_digitalocean_wrapper 0.4.0 → 0.7.0

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
  SHA256:
3
- metadata.gz: e8ffe80e6adc5bdef71b4a9f02dff5bc87aca9a6906390083a16ee9baa4a58d8
4
- data.tar.gz: 3b9e1844f675d02a7f9e684eac9971cb21cb3e77a9d69b891e42fcdd320e8efe
3
+ metadata.gz: 722a209dd7c530acc9eca5dc95af3482ce07b031f1d60458f0fd4f60d68d97f1
4
+ data.tar.gz: 2176a7c8518150703d75437360e757e2be7e6ed770affb877fb02dfc362f2124
5
5
  SHA512:
6
- metadata.gz: df597884080804a5fd4e10f538c75c330caba13b30d96059315564ebdc12abf2ffb01b571caef39f3c031da649c5a3da5d2ffb5a08c4d86bdb99d3dde65f2cfa
7
- data.tar.gz: df257f67704271ee1307ebdbe54cfbf06b71aae653b4923cbcd3febfc844b8f19c6182923a6331d262e2856e0a5eca225a0df5b5512c6f1cb82ae42a99cfbec4
6
+ metadata.gz: efec409153d5b1d2c94d8ef541ed957f708869b5096c42371224d389adab3d7282d0eccb0e56bb40a30dc6e5a43989eae1c2aeb73830346138f9f20511424e31
7
+ data.tar.gz: 5680e5bc73b4fd25f402fa18de9b788008710ef00fac98dff796e958e1e3e45c682563eeeb169a5b2871af8898a7247e975c81b5f1bf91fe793cb5448714bf6e
@@ -1,21 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'droplet_kit'
4
- require 'onlyoffice_logger_helper'
5
4
  require_relative 'digitalocean_wrapper/digitalocean_exceptions'
6
5
  require_relative 'digitalocean_wrapper/exceptions_retryer'
7
6
  require_relative 'digitalocean_wrapper/getters'
7
+ require_relative 'digitalocean_wrapper/logger_wrapper'
8
8
  require_relative 'digitalocean_wrapper/power_actions'
9
9
  require_relative 'digitalocean_wrapper/token_methods'
10
10
 
11
+ # Namespace for this gem
11
12
  module OnlyofficeDigitaloceanWrapper
12
13
  # Class for wrapping DigitalOcean API gem
13
14
  class DigitalOceanWrapper
14
15
  include Getters
16
+ include LoggerWrapper
15
17
  include ExceptionsRetryer
16
18
  include PowerActions
17
19
  include TokenMethods
18
20
 
21
+ # @return [Array<String>] list of allowed droplet sizes
19
22
  DROPLET_SIZES = %w[512mb 1gb 2gb 4gb 8gb 16gb 32gb 48gb 64gb].freeze
20
23
  attr_accessor :client
21
24
 
@@ -25,20 +28,32 @@ module OnlyofficeDigitaloceanWrapper
25
28
  raise ArgumentError, 'DigitalOceanWrapper: Your Access Token is Incorrect' unless correct_access_token?
26
29
  end
27
30
 
31
+ # Wait until droplet has status
32
+ # @param droplet_name [String] name of droplet
33
+ # @param status [String] status to wait
34
+ # @param params [Hash] additiona params
35
+ # @return [Symbol] droplet status after wait over
28
36
  def wait_until_droplet_have_status(droplet_name, status = 'active', params = {})
29
37
  timeout = params.fetch(:timeout, 300)
30
38
  counter = 0
31
39
  while get_droplet_status_by_name(droplet_name) != status && counter < timeout
32
40
  counter += 10
33
41
  sleep 10
34
- OnlyofficeLoggerHelper.log("waiting for droplet (#{droplet_name}) to have "\
35
- "status: #{status} for #{counter} seconds of #{timeout}")
42
+ logger.info("waiting for droplet (#{droplet_name}) to have "\
43
+ "status: #{status} for #{counter} seconds of #{timeout}")
36
44
  end
37
45
  raise DropletOperationTimeout, "#{droplet_name} was not #{status} for #{timeout}s" if counter >= timeout
38
46
 
39
47
  get_droplet_status_by_name(droplet_name)
40
48
  end
41
49
 
50
+ # Restore droplet from image by name
51
+ # @param image_name [String] name of image
52
+ # @param droplet_name [String] name for droplet
53
+ # @param region [String] region to restore
54
+ # @param size [String] size of droplet
55
+ # @param tags [String, Array<String>] name of tags to apply
56
+ # @return [Object] object with droplet data
42
57
  def restore_image_by_name(image_name = 'nct-at-stable',
43
58
  droplet_name = image_name,
44
59
  region = 'nyc3',
@@ -56,7 +71,7 @@ module OnlyofficeDigitaloceanWrapper
56
71
  monitoring: true,
57
72
  size: size)
58
73
  created = @client.droplets.create(droplet)
59
- OnlyofficeLoggerHelper.log("restore_image_by_name(#{image_name}, #{droplet_name})")
74
+ logger.info("restore_image_by_name(#{image_name}, #{droplet_name})")
60
75
  if created.is_a?(String)
61
76
  raise "Problem, while creating '#{droplet_name}' from image '#{image_name}'\n" \
62
77
  "Error: #{created}"
@@ -64,10 +79,13 @@ module OnlyofficeDigitaloceanWrapper
64
79
  created
65
80
  end
66
81
 
82
+ # Destroy droplet by name
83
+ # @param droplet_name [String] name of droplet
84
+ # @return [Symbol] Droplet status after destruction
67
85
  def destroy_droplet_by_name(droplet_name = 'nct-at1')
68
86
  droplet_id = get_droplet_id_by_name(droplet_name)
69
87
  client.droplets.delete(id: droplet_id)
70
- OnlyofficeLoggerHelper.log("destroy_droplet_by_name(#{droplet_name})")
88
+ logger.info("destroy_droplet_by_name(#{droplet_name})")
71
89
  wait_until_droplet_have_status(droplet_name, nil)
72
90
  end
73
91
  end
@@ -15,8 +15,8 @@ module OnlyofficeDigitaloceanWrapper
15
15
  yield
16
16
  rescue exception => e
17
17
  try += 1
18
- OnlyofficeLoggerHelper.log("Error '#{exception}, #{e}' happened during "\
19
- "operation. Retrying #{try} of #{retries}")
18
+ logger.error("Error '#{exception}, #{e}' happened during "\
19
+ "operation. Retrying #{try} of #{retries}")
20
20
  sleep timeout # Time to cooldown error
21
21
  try <= retries ? retry : raise
22
22
  end
@@ -8,7 +8,7 @@ module OnlyofficeDigitaloceanWrapper
8
8
  image = all_droplets.find { |x| x.name == image_name }
9
9
  raise DigitalOceanImageNotFound, image_name if image.nil?
10
10
 
11
- OnlyofficeLoggerHelper.log("get_image_id_by_name(#{image_name}): #{image.id}")
11
+ logger.info("get_image_id_by_name(#{image_name}): #{image.id}")
12
12
  image.id
13
13
  end
14
14
 
@@ -22,43 +22,85 @@ module OnlyofficeDigitaloceanWrapper
22
22
  end
23
23
  end
24
24
 
25
+ # Get project by name
26
+ # @param [String] project_name
27
+ # @return [DropletKit::Project] object representing a project
28
+ def project_by_name(project_name)
29
+ retry_exception do
30
+ projects = @client.projects.all
31
+ projects.find { |x| x.name == project_name }
32
+ end
33
+ end
34
+
35
+ # Get project id by name
36
+ # @param [String] project_name
37
+ # @return [nil, String] id of current project or nil is no project found
38
+ def get_project_id_by_name(project_name)
39
+ project = project_by_name(project_name)
40
+ if project.nil?
41
+ logger.info("get_project_id_by_name(#{project_name}): not found any projects")
42
+ nil
43
+ else
44
+ logger.info("get_project_id_by_name(#{project_name}): #{project.id}")
45
+ project.id
46
+ end
47
+ end
48
+
49
+ # Return droplet id by it's name
50
+ # @param droplet_name [String] name of droplet
51
+ # @return [nil, Integer] id of droplet or nil is no one droplet found
25
52
  def get_droplet_id_by_name(droplet_name)
26
53
  droplet = droplet_by_name(droplet_name)
27
54
  if droplet.nil?
28
- OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
55
+ logger.info("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
29
56
  nil
30
57
  else
31
- OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
58
+ logger.info("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
32
59
  droplet.id
33
60
  end
34
61
  end
35
62
 
63
+ # Return droplet ip by it's name
64
+ # @param droplet_name [String] name of droplet
65
+ # @return [String] ip of droplet
36
66
  def get_droplet_ip_by_name(droplet_name)
37
67
  droplet = droplet_by_name(droplet_name)
38
68
  if droplet.nil?
39
- OnlyofficeLoggerHelper.log("There is no created droplet with name: #{droplet_name}")
69
+ logger.info("There is no created droplet with name: #{droplet_name}")
40
70
  return
41
71
  end
42
72
  retry_exception do
43
- ip = droplet.networks.first.first.ip_address
44
- OnlyofficeLoggerHelper.log("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
73
+ ip = public_ip(droplet)
74
+ logger.info("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
45
75
  ip
46
76
  end
47
77
  end
48
78
 
79
+ # Return droplet status by it's name
80
+ # @param droplet_name [String] name of droplet
81
+ # @return [Symbol] droplet status
49
82
  def get_droplet_status_by_name(droplet_name)
50
83
  droplet = droplet_by_name(droplet_name)
51
84
  if droplet.nil?
52
- OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
85
+ logger.info("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
53
86
  nil
54
87
  else
55
88
  retry_exception do
56
89
  status = droplet.status
57
90
  status = :locked if droplet.locked
58
- OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): #{status}")
91
+ logger.info("get_droplet_status_by_name(#{droplet_name}): #{status}")
59
92
  status
60
93
  end
61
94
  end
62
95
  end
96
+
97
+ # Get public ip of droplet
98
+ # @param [DropletKit] droplet to get ip
99
+ # @return [String] public ip
100
+ def public_ip(droplet)
101
+ networks = droplet.networks.to_a.first
102
+ public_network = networks.find { |net| net.type == 'public' }
103
+ public_network.ip_address
104
+ end
63
105
  end
64
106
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'logger'
4
+
5
+ module OnlyofficeDigitaloceanWrapper
6
+ # Logger module for logging stuff
7
+ module LoggerWrapper
8
+ # @return [Logger] default logger
9
+ def logger
10
+ @logger ||= Logger.new($stdout)
11
+ end
12
+ end
13
+ end
@@ -3,18 +3,27 @@
3
3
  module OnlyofficeDigitaloceanWrapper
4
4
  # Actions with power (turn on/off, reboot)
5
5
  module PowerActions
6
+ # Turn off droplet
7
+ # @param droplet_name [String] droplet to turn off
8
+ # @return [Symbol] droplet result status
6
9
  def power_off_droplet(droplet_name)
7
10
  droplet_id = get_droplet_id_by_name(droplet_name)
8
11
  client.droplet_actions.power_off(droplet_id: droplet_id)
9
12
  wait_until_droplet_have_status(droplet_name, 'off')
10
13
  end
11
14
 
15
+ # Turn on droplet
16
+ # @param droplet_name [String] droplet to turn on
17
+ # @return [Symbol] droplet result status
12
18
  def power_on_droplet(droplet_name)
13
19
  droplet_id = get_droplet_id_by_name(droplet_name)
14
20
  client.droplet_actions.power_on(droplet_id: droplet_id)
15
21
  wait_until_droplet_have_status(droplet_name)
16
22
  end
17
23
 
24
+ # Reboot droplet
25
+ # @param droplet_name [String] droplet to reboot
26
+ # @return [Symbol] droplet result status
18
27
  def reboot_droplet(droplet_name)
19
28
  droplet_id = get_droplet_id_by_name(droplet_name)
20
29
  client.droplet_actions.reboot(droplet_id: droplet_id)
@@ -15,14 +15,17 @@ module OnlyofficeDigitaloceanWrapper
15
15
  end
16
16
 
17
17
  # Read access token from file system
18
+ # @param token_file_path [String] path to token
19
+ # @param force_file_read [True, False] should read from file be forced
18
20
  # @return [String] token
19
- def read_token
20
- return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_TOKEN']
21
+ def read_token(token_file_path: "#{Dir.home}/.do/access_token",
22
+ force_file_read: false)
23
+ return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_TOKEN'] && !force_file_read
21
24
 
22
- File.read(Dir.home + '/.do/access_token').delete("\n")
25
+ File.read(token_file_path).delete("\n")
23
26
  rescue Errno::ENOENT
24
- raise Errno::ENOENT, "No access token found in #{Dir.home}/.do/ directory." \
25
- "Please create files #{Dir.home}/.do/access_token"
27
+ raise Errno::ENOENT, "No access token found in #{token_file_path}. " \
28
+ "Please create file #{token_file_path} with token"
26
29
  end
27
30
  end
28
31
  end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlyofficeDigitaloceanWrapper
4
- VERSION = '0.4.0'
4
+ # @return [String] version of gem
5
+ VERSION = '0.7.0'
6
+ # @return [String] name of gem
5
7
  NAME = 'onlyoffice_digitalocean_wrapper'
6
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onlyoffice_digitalocean_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ONLYOFFICE
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-03-20 00:00:00.000000000 Z
13
+ date: 2021-07-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: droplet_kit
@@ -27,19 +27,33 @@ dependencies:
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3'
29
29
  - !ruby/object:Gem::Dependency
30
- name: onlyoffice_logger_helper
30
+ name: codecov
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '1'
36
- type: :runtime
35
+ version: '0'
36
+ type: :development
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '1'
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: overcommit
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
43
57
  - !ruby/object:Gem::Dependency
44
58
  name: rake
45
59
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +68,90 @@ dependencies:
54
68
  - - "~>"
55
69
  - !ruby/object:Gem::Version
56
70
  version: '13.0'
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '3'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '3'
85
+ - !ruby/object:Gem::Dependency
86
+ name: rubocop
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: 0.49.0
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 0.49.0
99
+ - !ruby/object:Gem::Dependency
100
+ name: rubocop-performance
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '1'
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop-rake
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rubocop-rspec
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '2'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '2'
141
+ - !ruby/object:Gem::Dependency
142
+ name: yard
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 0.9.20
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.9.20
57
155
  description: Wrapper gem for DigitalOcean. Use in testing projects
58
156
  email:
59
157
  - shockwavenn@gmail.com
@@ -67,18 +165,19 @@ files:
67
165
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/digitalocean_exceptions.rb
68
166
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/exceptions_retryer.rb
69
167
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/getters.rb
168
+ - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/logger_wrapper.rb
70
169
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/power_actions.rb
71
170
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/token_methods.rb
72
171
  - lib/onlyoffice_digitalocean_wrapper/version.rb
73
- homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
172
+ homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
74
173
  licenses:
75
174
  - AGPL-3.0
76
175
  metadata:
77
- bug_tracker_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper/issues
78
- changelog_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper/blob/master/CHANGELOG.md
176
+ bug_tracker_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/issues
177
+ changelog_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/blob/master/CHANGELOG.md
79
178
  documentation_uri: https://www.rubydoc.info/gems/onlyoffice_digitalocean_wrapper
80
- homepage_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
81
- source_code_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
179
+ homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
180
+ source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
82
181
  post_install_message:
83
182
  rdoc_options: []
84
183
  require_paths:
@@ -87,14 +186,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
186
  requirements:
88
187
  - - ">="
89
188
  - !ruby/object:Gem::Version
90
- version: '2.3'
189
+ version: '2.5'
91
190
  required_rubygems_version: !ruby/object:Gem::Requirement
92
191
  requirements:
93
192
  - - ">="
94
193
  - !ruby/object:Gem::Version
95
194
  version: '0'
96
195
  requirements: []
97
- rubygems_version: 3.0.6
196
+ rubygems_version: 3.2.22
98
197
  signing_key:
99
198
  specification_version: 4
100
199
  summary: Wrapper gem for DigitalOcean