onlyoffice_digitalocean_wrapper 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 94fccd0b0f0384b0a7ed421e65c7e90726641e61
4
+ data.tar.gz: 0ee556325a69a1a183ea610675beb8b938d3df32
5
+ SHA512:
6
+ metadata.gz: 6831cb41c10316979e73d3bf13be472927435783ca49bbbaaa89c3681ebbe528f343f3f342dbda077d217d9790658aa7e2877ca3ae60588e05470bd31c8bbdff
7
+ data.tar.gz: e4193acf767e774180c9c66e35300ad50121821afe505da3fb3c25a9d8e30d3c501bbc989e8970a0f8539aaae924ffc41835895c5db4332eca9470756060d8f1
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # OnlyofficeDigitaloceanWrapper
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library
4
+ into a gem. Put your Ruby code in the file `lib/onlyoffice_digitalocean_wrapper`. To experiment with that code, run
5
+ `bin/console` for an interactive prompt.
6
+
7
+ TODO: Delete this and the text above, and describe your gem
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'onlyoffice_digitalocean_wrapper'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install onlyoffice_digitalocean_wrapper
24
+
25
+ ## Usage
26
+
27
+ TODO: Write usage instructions here
28
+
29
+ ## Development
30
+
31
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
32
+ You can also run `bin/console` for an interactive prompt that will allow you to experiment.
33
+
34
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update
35
+ the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for
36
+ the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
37
+
38
+ ## Contributing
39
+
40
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/onlyoffice_digitalocean_wrapper.
41
+
@@ -0,0 +1,2 @@
1
+ require_relative 'onlyoffice_digitalocean_wrapper/digitalocean_wrapper'
2
+ require_relative 'onlyoffice_digitalocean_wrapper/version'
@@ -0,0 +1,170 @@
1
+ require 'droplet_kit'
2
+ require 'onlyoffice_logger_helper'
3
+ require_relative 'digitalocean_wrapper/digitalocean_exceptions'
4
+
5
+ module OnlyofficeDigitaloceanWrapper
6
+ # Class for wrapping DigitalOcean API gem
7
+ class DigitalOceanWrapper
8
+ attr_accessor :client
9
+
10
+ def initialize(access_token = nil)
11
+ access_token ||= DigitalOceanWrapper.read_token
12
+ @client = DropletKit::Client.new(access_token: access_token)
13
+ raise ArgumentError, 'DigitalOceanWrapper: Your Access Token is Incorrect' unless correct_access_token?
14
+ end
15
+
16
+ # Check if access token is correct
17
+ # @return [true, false] result of check
18
+ def correct_access_token?
19
+ begin
20
+ @client.droplets.all.first
21
+ rescue DropletKit::Error
22
+ return false
23
+ end
24
+ true
25
+ end
26
+
27
+ # Check if token is correct. If not trying to read new token
28
+ # If reading failed - fail
29
+ def assure_correct_token
30
+ return if correct_access_token?
31
+ @client = DropletKit::Client.new(access_token: DigitalOceanWrapper.read_token)
32
+ return if correct_access_token?
33
+ raise ArgumentError, 'Access token for DigitalOcean API is incorrect'
34
+ end
35
+
36
+ def get_image_id_by_name(image_name)
37
+ assure_correct_token
38
+ all_droplets = @client.images.all
39
+ image = all_droplets.find { |x| x.name == image_name }
40
+ raise DigitalOceanImageNotFound, image_name if image.nil?
41
+ OnlyofficeLoggerHelper.log("get_image_id_by_name(#{image_name}): #{image.id}")
42
+ image.id
43
+ end
44
+
45
+ # Get droplet by its name
46
+ # @param [String] droplet_name
47
+ # @return [DropletKit::Droplet] droplet
48
+ def droplet_by_name(droplet_name)
49
+ assure_correct_token
50
+ droplets = @client.droplets.all
51
+ droplets.find { |x| x.name == droplet_name }
52
+ end
53
+
54
+ def get_droplet_id_by_name(droplet_name)
55
+ droplet = droplet_by_name(droplet_name)
56
+ if droplet.nil?
57
+ OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
58
+ nil
59
+ else
60
+ OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
61
+ droplet.id
62
+ end
63
+ end
64
+
65
+ def get_droplet_ip_by_name(droplet_name)
66
+ droplet = droplet_by_name(droplet_name)
67
+ if droplet.nil?
68
+ OnlyofficeLoggerHelper.log("There is no created droplet with name: #{droplet_name}")
69
+ return
70
+ end
71
+ ip = droplet.networks.first.first.ip_address
72
+ OnlyofficeLoggerHelper.log("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
73
+ ip
74
+ end
75
+
76
+ def current_kernel(droplet_name)
77
+ droplet = droplet_by_name(droplet_name)
78
+ kernel_name = droplet.kernel.name
79
+ OnlyofficeLoggerHelper.log("get_droplet_kernel_by_name(#{droplet_name}): #{kernel_name}")
80
+ kernel_name
81
+ end
82
+
83
+ def get_droplet_status_by_name(droplet_name)
84
+ droplet = droplet_by_name(droplet_name)
85
+ if droplet.nil?
86
+ OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
87
+ nil
88
+ else
89
+ status = droplet.status
90
+ status = :locked if droplet.locked
91
+ OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): #{status}")
92
+ status
93
+ end
94
+ end
95
+
96
+ def wait_until_droplet_have_status(droplet_name, status = 'active')
97
+ timeout = 300
98
+ counter = 0
99
+ while get_droplet_status_by_name(droplet_name) != status && counter < timeout
100
+ counter += 10
101
+ sleep 10
102
+ OnlyofficeLoggerHelper.log("waiting for droplet (#{droplet_name}) to have "\
103
+ "status: #{status} for #{counter} seconds of #{timeout}")
104
+ end
105
+ get_droplet_status_by_name(droplet_name)
106
+ end
107
+
108
+ def kernels_of_droplet(droplet_name)
109
+ droplet_id = get_droplet_id_by_name(droplet_name)
110
+ kernels = client.droplets.kernels(id: droplet_id).to_a
111
+ OnlyofficeLoggerHelper.log("Got kernels_of_droplet(#{droplet_name})")
112
+ kernels
113
+ end
114
+
115
+ def restore_image_by_name(image_name = 'nct-at-stable',
116
+ droplet_name = image_name,
117
+ region = 'nyc2',
118
+ size = '2gb',
119
+ tags: nil)
120
+ image_id = get_image_id_by_name(image_name)
121
+ droplet = DropletKit::Droplet.new(name: droplet_name,
122
+ region: region,
123
+ image: image_id.to_i,
124
+ tags: Array(tags),
125
+ size: size)
126
+ created = @client.droplets.create(droplet)
127
+ OnlyofficeLoggerHelper.log("restore_image_by_name(#{image_name}, #{droplet_name})")
128
+ if created.is_a?(String)
129
+ raise "Problem, while creating '#{droplet_name}' from image '#{image_name}'\n" \
130
+ "Error: #{created}"
131
+ end
132
+ created
133
+ end
134
+
135
+ def power_off_droplet(droplet_name)
136
+ droplet_id = get_droplet_id_by_name(droplet_name)
137
+ client.droplet_actions.power_off(droplet_id: droplet_id)
138
+ wait_until_droplet_have_status(droplet_name, 'off')
139
+ end
140
+
141
+ def power_on_droplet(droplet_name)
142
+ droplet_id = get_droplet_id_by_name(droplet_name)
143
+ client.droplet_actions.power_on(droplet_id: droplet_id)
144
+ wait_until_droplet_have_status(droplet_name)
145
+ end
146
+
147
+ def reboot_droplet(droplet_name)
148
+ droplet_id = get_droplet_id_by_name(droplet_name)
149
+ client.droplet_actions.reboot(droplet_id: droplet_id)
150
+ wait_until_droplet_have_status(droplet_name)
151
+ end
152
+
153
+ def destroy_droplet_by_name(droplet_name = 'nct-at1')
154
+ droplet_id = get_droplet_id_by_name(droplet_name)
155
+ client.droplets.delete(id: droplet_id)
156
+ OnlyofficeLoggerHelper.log("destroy_droplet_by_name(#{droplet_name})")
157
+ wait_until_droplet_have_status(droplet_name, nil)
158
+ end
159
+
160
+ # Read access token from file system
161
+ # @return [String] token
162
+ def self.read_token
163
+ return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_TOKEN']
164
+ File.read(Dir.home + '/.do/access_token').delete("\n")
165
+ rescue Errno::ENOENT
166
+ raise Errno::ENOENT, "No access token found in #{Dir.home}/.do/ directory." \
167
+ "Please create files #{Dir.home}/.do/access_token"
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,5 @@
1
+ module OnlyofficeDigitaloceanWrapper
2
+ # Class raised if image with name is not found
3
+ class DigitalOceanImageNotFound < StandardError
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module OnlyofficeDigitaloceanWrapper
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: onlyoffice_digitalocean_wrapper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pavel Lobashov
8
+ - Oleg Nazarov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-12-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '4'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '4'
28
+ - !ruby/object:Gem::Dependency
29
+ name: droplet_kit
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.0.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.0.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: onlyoffice_logger_helper
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '='
47
+ - !ruby/object:Gem::Version
48
+ version: 1.0.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '='
54
+ - !ruby/object:Gem::Version
55
+ version: 1.0.0
56
+ description: Wrapper gem for DigitalOcean. Use in testing projects
57
+ email:
58
+ - shockwavenn@gmail.com
59
+ - nazarov90@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - README.md
65
+ - lib/onlyoffice_digitalocean_wrapper.rb
66
+ - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper.rb
67
+ - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/digitalocean_exceptions.rb
68
+ - lib/onlyoffice_digitalocean_wrapper/version.rb
69
+ homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
70
+ licenses:
71
+ - AGPL-3.0
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.5.1
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Wrapper gem for DigitalOcean
93
+ test_files: []