wf_node_api 0.6.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.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +7 -0
  3. data/Gemfile +28 -0
  4. data/Gemfile.lock +66 -0
  5. data/LICENSE +340 -0
  6. data/Makefile +19 -0
  7. data/README.md +78 -0
  8. data/Rakefile +2 -0
  9. data/Vagrantfile +102 -0
  10. data/_docs/api/Api/NodeApi.html +123 -0
  11. data/_docs/api/Api.html +149 -0
  12. data/_docs/api/Config/Check.html +331 -0
  13. data/_docs/api/Config.html +115 -0
  14. data/_docs/api/ConfigCheck.html +365 -0
  15. data/_docs/api/ContainerManager.html +1632 -0
  16. data/_docs/api/ContainerManagerAdapter/Lxc.html +1352 -0
  17. data/_docs/api/ContainerManagerAdapter/Vserver.html +1358 -0
  18. data/_docs/api/ContainerManagerAdapter.html +151 -0
  19. data/_docs/api/Error/NotFound.html +134 -0
  20. data/_docs/api/Error.html +115 -0
  21. data/_docs/api/NotFoundError.html +157 -0
  22. data/_docs/api/OS.html +234 -0
  23. data/_docs/api/ResourceManager.html +322 -0
  24. data/_docs/api/ResourceManagerAdapter/Linux.html +326 -0
  25. data/_docs/api/ResourceManagerAdapter.html +149 -0
  26. data/_docs/api/WfNodeApi.html +163 -0
  27. data/_docs/api/_index.html +239 -0
  28. data/_docs/api/class_list.html +58 -0
  29. data/_docs/api/css/common.css +1 -0
  30. data/_docs/api/css/full_list.css +57 -0
  31. data/_docs/api/css/style.css +339 -0
  32. data/_docs/api/file.README.html +146 -0
  33. data/_docs/api/file_list.html +60 -0
  34. data/_docs/api/frames.html +26 -0
  35. data/_docs/api/index.html +146 -0
  36. data/_docs/api/js/app.js +219 -0
  37. data/_docs/api/js/full_list.js +181 -0
  38. data/_docs/api/js/jquery.js +4 -0
  39. data/_docs/api/method_list.html +273 -0
  40. data/_docs/api/top-level-namespace.html +244 -0
  41. data/_docs/rest/api_data.js +1 -0
  42. data/_docs/rest/api_data.json +1 -0
  43. data/_docs/rest/api_project.js +1 -0
  44. data/_docs/rest/api_project.json +1 -0
  45. data/_docs/rest/css/style.css +538 -0
  46. data/_docs/rest/header.md +3 -0
  47. data/_docs/rest/img/favicon.ico +0 -0
  48. data/_docs/rest/img/glyphicons-halflings-white.png +0 -0
  49. data/_docs/rest/img/glyphicons-halflings.png +0 -0
  50. data/_docs/rest/index.html +658 -0
  51. data/_docs/rest/locales/de.js +25 -0
  52. data/_docs/rest/locales/fr.js +25 -0
  53. data/_docs/rest/locales/locale.js +43 -0
  54. data/_docs/rest/locales/nl.js +25 -0
  55. data/_docs/rest/locales/pl.js +25 -0
  56. data/_docs/rest/locales/pt_br.js +25 -0
  57. data/_docs/rest/locales/ru.js +25 -0
  58. data/_docs/rest/locales/zh.js +25 -0
  59. data/_docs/rest/main.js +691 -0
  60. data/_docs/rest/utils/handlebars_helper.js +327 -0
  61. data/_docs/rest/utils/send_sample_request.js +158 -0
  62. data/_docs/rest/vendor/bootstrap-responsive.min.css +9 -0
  63. data/_docs/rest/vendor/bootstrap.min.css +9 -0
  64. data/_docs/rest/vendor/bootstrap.min.js +6 -0
  65. data/_docs/rest/vendor/diff_match_patch.min.js +49 -0
  66. data/_docs/rest/vendor/handlebars.min.js +28 -0
  67. data/_docs/rest/vendor/jquery.min.js +4 -0
  68. data/_docs/rest/vendor/lodash.min.js +61 -0
  69. data/_docs/rest/vendor/path-to-regexp/LICENSE +21 -0
  70. data/_docs/rest/vendor/path-to-regexp/index.js +205 -0
  71. data/_docs/rest/vendor/polyfill.js +100 -0
  72. data/_docs/rest/vendor/prettify/lang-apollo.js +2 -0
  73. data/_docs/rest/vendor/prettify/lang-basic.js +3 -0
  74. data/_docs/rest/vendor/prettify/lang-clj.js +18 -0
  75. data/_docs/rest/vendor/prettify/lang-css.js +2 -0
  76. data/_docs/rest/vendor/prettify/lang-dart.js +3 -0
  77. data/_docs/rest/vendor/prettify/lang-erlang.js +2 -0
  78. data/_docs/rest/vendor/prettify/lang-go.js +1 -0
  79. data/_docs/rest/vendor/prettify/lang-hs.js +2 -0
  80. data/_docs/rest/vendor/prettify/lang-lisp.js +3 -0
  81. data/_docs/rest/vendor/prettify/lang-llvm.js +1 -0
  82. data/_docs/rest/vendor/prettify/lang-lua.js +2 -0
  83. data/_docs/rest/vendor/prettify/lang-matlab.js +6 -0
  84. data/_docs/rest/vendor/prettify/lang-ml.js +2 -0
  85. data/_docs/rest/vendor/prettify/lang-mumps.js +2 -0
  86. data/_docs/rest/vendor/prettify/lang-n.js +4 -0
  87. data/_docs/rest/vendor/prettify/lang-pascal.js +3 -0
  88. data/_docs/rest/vendor/prettify/lang-proto.js +1 -0
  89. data/_docs/rest/vendor/prettify/lang-r.js +2 -0
  90. data/_docs/rest/vendor/prettify/lang-rd.js +1 -0
  91. data/_docs/rest/vendor/prettify/lang-scala.js +2 -0
  92. data/_docs/rest/vendor/prettify/lang-sql.js +2 -0
  93. data/_docs/rest/vendor/prettify/lang-tcl.js +3 -0
  94. data/_docs/rest/vendor/prettify/lang-tex.js +1 -0
  95. data/_docs/rest/vendor/prettify/lang-vb.js +2 -0
  96. data/_docs/rest/vendor/prettify/lang-vhdl.js +3 -0
  97. data/_docs/rest/vendor/prettify/lang-wiki.js +2 -0
  98. data/_docs/rest/vendor/prettify/lang-xq.js +3 -0
  99. data/_docs/rest/vendor/prettify/lang-yaml.js +2 -0
  100. data/_docs/rest/vendor/prettify/prettify.css +1 -0
  101. data/_docs/rest/vendor/prettify/prettify.js +30 -0
  102. data/_docs/rest/vendor/prettify/run_prettify.js +34 -0
  103. data/_docs/rest/vendor/prettify.css +101 -0
  104. data/_docs/rest/vendor/require.min.js +36 -0
  105. data/apidoc.json +23 -0
  106. data/bin/wf_node_api +80 -0
  107. data/lib/wf_node_api/api/node_api.rb +360 -0
  108. data/lib/wf_node_api/config/config_template.erb +50 -0
  109. data/lib/wf_node_api/config_check.rb +50 -0
  110. data/lib/wf_node_api/container_manager.rb +286 -0
  111. data/lib/wf_node_api/container_manager_adapter/lxc.rb +431 -0
  112. data/lib/wf_node_api/container_manager_adapter/vserver.rb +448 -0
  113. data/lib/wf_node_api/error/not_found.rb +27 -0
  114. data/lib/wf_node_api/os.rb +32 -0
  115. data/lib/wf_node_api/resource_manager.rb +49 -0
  116. data/lib/wf_node_api/resource_manager_adapter/linux.rb +53 -0
  117. data/lib/wf_node_api/translations.rb +38 -0
  118. data/lib/wf_node_api/version.rb +28 -0
  119. data/lib/wf_node_api.rb +57 -0
  120. data/manifests/files/dhozac-vserver.repo +4 -0
  121. data/wf-node-api.gemspec +53 -0
  122. metadata +221 -0
@@ -0,0 +1,50 @@
1
+ =begin
2
+ __ ___ _ _ _____ ____ __ __
3
+ \ \ / / |__ (_) |_ ___| ___| _ ___ ___ / ___| \/ |
4
+ \ \ /\ / /| '_ \| | __/ _ \ |_ | | | / __|/ _ \ | | |\/| |
5
+ \ V V / | | | | | || __/ _|| |_| \__ \ __/ |___| | | |
6
+ \_/\_/ |_| |_|_|\__\___|_| \__,_|___/\___|\____|_| |_|
7
+ Container Manager
8
+
9
+ Copyright (C) 2015 David Prandzioch <kontakt@davidprandzioch.de>
10
+
11
+ This program is free software; you can redistribute it and/or
12
+ modify it under the terms of the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2
14
+ of the License, or (at your option) any later version.
15
+
16
+ This program is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU General Public License for more details.
20
+
21
+ You should have received a copy of the GNU General Public License
22
+ along with this program; if not, write to the Free Software
23
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24
+ =end
25
+
26
+ module ConfigCheck
27
+
28
+ # Runs the configuration check
29
+ #
30
+ # @raise [RuntimeError]
31
+ def self.run
32
+ if self.valid_container_type?($container_type) == false
33
+ raise RuntimeError, 'container_type is invalid'
34
+ end
35
+ end
36
+
37
+ # Checks if the submitted container type is registered and valid
38
+ #
39
+ # @param container_type [String] The container type to check
40
+ #
41
+ # @raise [ArgumentError] If the container type is not set
42
+ #
43
+ # @return [Boolean] Result of the validation
44
+ def self.valid_container_type?(container_type)
45
+ raise ArgumentError 'container_type not set' if container_type.nil?
46
+ valid_types = ['lxc', 'vserver']
47
+
48
+ valid_types.include?(container_type)
49
+ end
50
+ end
@@ -0,0 +1,286 @@
1
+ =begin
2
+ __ ___ _ _ _____ ____ __ __
3
+ \ \ / / |__ (_) |_ ___| ___| _ ___ ___ / ___| \/ |
4
+ \ \ /\ / /| '_ \| | __/ _ \ |_ | | | / __|/ _ \ | | |\/| |
5
+ \ V V / | | | | | || __/ _|| |_| \__ \ __/ |___| | | |
6
+ \_/\_/ |_| |_|_|\__\___|_| \__,_|___/\___|\____|_| |_|
7
+ Container Manager
8
+
9
+ Copyright (C) 2015 David Prandzioch <kontakt@davidprandzioch.de>
10
+
11
+ This program is free software; you can redistribute it and/or
12
+ modify it under the terms of the GNU General Public License
13
+ as published by the Free Software Foundation; either version 2
14
+ of the License, or (at your option) any later version.
15
+
16
+ This program is distributed in the hope that it will be useful,
17
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ GNU General Public License for more details.
20
+
21
+ You should have received a copy of the GNU General Public License
22
+ along with this program; if not, write to the Free Software
23
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24
+ =end
25
+
26
+ # Manager for containers, meta class
27
+ class ContainerManager
28
+ # Checks the installation with a simple test procedure
29
+ #
30
+ # @raise [StandardError]
31
+ def check
32
+ name = (0...8).map { (65 + rand(26)).chr }.join
33
+ puts "==> Random name for the container: #{name}"
34
+
35
+ # containers should return an array
36
+ puts "==> Listing containers"
37
+ res = containers()
38
+ #puts res.inspect
39
+
40
+ raise 'containers() failed' unless res.is_a?(Array)
41
+ puts "==> PASS"
42
+
43
+ # container should not work
44
+ puts "==> Getting container info on non-existant container (should not work)"
45
+
46
+ begin
47
+ res = container(name)
48
+ raise 'container() failed'
49
+ rescue => e
50
+ puts "==> PASS"
51
+ end
52
+
53
+ # delete should not work
54
+ puts "==> Delete non-existing container (should not work)"
55
+
56
+ begin
57
+ res = delete(name)
58
+ raise 'delete() failed'
59
+ rescue => e
60
+ puts "==> PASS"
61
+ end
62
+
63
+ # start should not work
64
+ puts "==> Starting non-existing container (should not work)"
65
+
66
+ begin
67
+ res = start(name)
68
+ raise 'start() failed'
69
+ rescue => e
70
+ puts "==> PASS"
71
+ end
72
+
73
+ # stop should not work
74
+ puts "==> Stopping non-existing container (should not work)"
75
+
76
+ begin
77
+ res = stop(name)
78
+ raise 'stop() failed'
79
+ rescue => e
80
+ puts "==> PASS"
81
+ end
82
+
83
+ # kill should not work
84
+ puts "==> Killing non-existing container (should not work)"
85
+
86
+ begin
87
+ res = kill(name)
88
+ raise 'kill() failed'
89
+ rescue => e
90
+ puts "==> PASS"
91
+ end
92
+
93
+ # create should work
94
+ puts "==> Create container"
95
+ create_container(name, '1.2.3.4', 1, 64, 1)
96
+ puts "==> PASS"
97
+
98
+ # start should work
99
+ puts "==> Starting container"
100
+ start(name)
101
+ puts "==> PASS"
102
+
103
+ # stop should work
104
+ puts "==> Stopping container"
105
+ stop(name)
106
+ puts "==> PASS"
107
+
108
+ # kill should not work
109
+ puts "==> Killing stopped container (should not work)"
110
+
111
+ begin
112
+ res = kill(name)
113
+ raise 'kill() failed'
114
+ rescue => e
115
+ puts "==> PASS"
116
+ end
117
+
118
+ # stop should not work
119
+ puts "==> Stopping stopped container (should not work)"
120
+
121
+ begin
122
+ res = stop(name)
123
+ raise 'stop() failed'
124
+ rescue => e
125
+ puts "==> PASS"
126
+ end
127
+
128
+ # start should work
129
+ puts "==> Starting container"
130
+ start(name)
131
+ puts "==> PASS"
132
+
133
+ # kill should work
134
+ puts "==> Killing container"
135
+ kill(name)
136
+ puts "==> PASS"
137
+
138
+ # delete should work
139
+ puts "==> Deleting container"
140
+ delete(name)
141
+ puts "==> PASS"
142
+ end
143
+
144
+ # Initializes the manager with the matching adapter
145
+ #
146
+ # @param container_type [String] Container adapter
147
+ #
148
+ # @raise [ArgumentError] if the container type is invalid
149
+ def initialize(container_type)
150
+ if container_type == 'lxc'
151
+ @adapter = ContainerManagerAdapter::Lxc.new
152
+ elsif container_type == 'vserver'
153
+ @adapter = ContainerManagerAdapter::Vserver.new
154
+ else
155
+ raise ArgumentError, 'invalid container type'
156
+ end
157
+ end
158
+
159
+ # Lists all available containers
160
+ #
161
+ # @return [Array]
162
+ def containers
163
+ @adapter.containers
164
+ end
165
+
166
+ # Returns information for a single container
167
+ #
168
+ # @param name [String] The container name
169
+ #
170
+ # @raise [NotFoundError]
171
+ #
172
+ # @return [Hash] Hash with information about the container
173
+ def container(name)
174
+ if !@adapter.exist?(name)
175
+ raise ::NotFoundError
176
+ end
177
+
178
+ @adapter.container(name)
179
+ end
180
+
181
+ # Returns the amount of free cpu cores
182
+ #
183
+ # @param resman [ResourceManager] A ResourceManager instance
184
+ #
185
+ # @return [Integer] The amount of free cpu cores
186
+ def free_cpu_core_count(resman)
187
+ @adapter.free_cpu_core_count(resman)
188
+ end
189
+
190
+ # Starts a container with the given name
191
+ #
192
+ # @param name [String] The container name
193
+ #
194
+ # @raise [RuntimeError]
195
+ # @raise [NotFoundError]
196
+ #
197
+ # @return [String] CLI output
198
+ def start(name)
199
+ if !@adapter.exist?(name)
200
+ raise ::NotFoundError
201
+ end
202
+
203
+ @adapter.start(name)
204
+ end
205
+
206
+ # Stops a container with the given name
207
+ #
208
+ # @param name [String] The container name
209
+ #
210
+ # @raise [RuntimeError]
211
+ # @raise [NotFoundError]
212
+ #
213
+ # @return [String] CLI output
214
+ def stop(name)
215
+ if !@adapter.exist?(name)
216
+ raise ::NotFoundError
217
+ end
218
+
219
+ @adapter.stop(name)
220
+ end
221
+
222
+ # Kills a container with the given name
223
+ #
224
+ # @param name [String] The container name
225
+ #
226
+ # @raise [RuntimeError]
227
+ # @raise [NotFoundError]
228
+ #
229
+ # @return [String] CLI output
230
+ def kill(name)
231
+ if !@adapter.exist?(name)
232
+ raise ::NotFoundError
233
+ end
234
+
235
+ @adapter.kill(name)
236
+ end
237
+
238
+ # Deletes a container with the given name
239
+ #
240
+ # @param name [String] The container name
241
+ #
242
+ # @raise [RuntimeError]
243
+ # @raise [NotFoundError]
244
+ #
245
+ # @return [String] CLI output
246
+ def delete(name)
247
+ if !@adapter.exist?(name)
248
+ raise ::NotFoundError
249
+ end
250
+
251
+ @adapter.delete(name)
252
+ end
253
+
254
+ # Creates a container with the given parameters
255
+ #
256
+ # @param name [String] The container name
257
+ # @param ip_address [String] A valid IPv4 address
258
+ # @param disk_size_gb [Integer] The disk size in GB
259
+ # @param memory_limit_mb [Integer] The memory limit in MB
260
+ # @param cpu_core_count [Integer] Amount of Vcores to assign
261
+ #
262
+ # @raise [RuntimeError]
263
+ # @raise [NotFoundError]
264
+ # @raise [ArgumentError]
265
+ #
266
+ # @return [String] CLI output
267
+ def create_container(name, ip_address, disk_size_gb, memory_limit_mb, cpu_core_count)
268
+ disk_size_gb = disk_size_gb.to_i
269
+ memory_limit_mb = memory_limit_mb.to_i
270
+ cpu_core_count = cpu_core_count.to_i
271
+
272
+ if name.nil? || name.empty? || (/^([A-Za-z0-9_]+)$/ =~ name).nil?
273
+ raise ArgumentError, 'container name is invalid'
274
+ end
275
+
276
+ if ip_address.nil? || ip_address.empty? || (/^#{Resolv::IPv4::Regex}$/ =~ ip_address).nil?
277
+ raise ArgumentError, 'the submitted ip address is not a valid ipv4 address'
278
+ end
279
+
280
+ if @adapter.exist?(name)
281
+ raise ::NotFoundError
282
+ end
283
+
284
+ @adapter.create_container(name, ip_address, disk_size_gb, memory_limit_mb, cpu_core_count)
285
+ end
286
+ end