kanrisuru 0.10.0 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CONTRIBUTING.md +9 -9
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +7 -8
  4. data/.rspec +1 -1
  5. data/CHANGELOG.md +127 -102
  6. data/CODE_OF_CONDUCT.md +10 -10
  7. data/README.md +19 -90
  8. data/kanrisuru.gemspec +2 -1
  9. data/lib/kanrisuru/command.rb +7 -0
  10. data/lib/kanrisuru/core/archive.rb +11 -35
  11. data/lib/kanrisuru/core/disk.rb +0 -3
  12. data/lib/kanrisuru/core/dmi.rb +1 -1
  13. data/lib/kanrisuru/core/file.rb +4 -11
  14. data/lib/kanrisuru/core/find.rb +6 -11
  15. data/lib/kanrisuru/core/mount.rb +14 -15
  16. data/lib/kanrisuru/core/socket.rb +2 -1
  17. data/lib/kanrisuru/core/stream.rb +1 -2
  18. data/lib/kanrisuru/core/zypper.rb +6 -23
  19. data/lib/kanrisuru/os_package/collection.rb +58 -0
  20. data/lib/kanrisuru/os_package/define.rb +34 -0
  21. data/lib/kanrisuru/os_package/include.rb +163 -0
  22. data/lib/kanrisuru/os_package.rb +3 -245
  23. data/lib/kanrisuru/remote/cpu.rb +5 -1
  24. data/lib/kanrisuru/remote/fstab.rb +5 -5
  25. data/lib/kanrisuru/result.rb +5 -4
  26. data/lib/kanrisuru/util.rb +1 -1
  27. data/lib/kanrisuru/version.rb +1 -1
  28. data/spec/functional/core/apt_spec.rb +22 -30
  29. data/spec/functional/core/archive_spec.rb +96 -120
  30. data/spec/functional/core/find_spec.rb +94 -113
  31. data/spec/functional/core/mount_spec.rb +121 -0
  32. data/spec/functional/core/socket_spec.rb +23 -28
  33. data/spec/functional/core/stream_spec.rb +12 -12
  34. data/spec/functional/core/transfer_spec.rb +108 -131
  35. data/spec/functional/core/yum_spec.rb +58 -83
  36. data/spec/functional/remote/cluster_spec.rb +11 -2
  37. data/spec/functional/remote/cpu_spec.rb +104 -0
  38. data/spec/functional/remote/env_spec.rb +3 -5
  39. data/spec/helper/stub_network.rb +35 -16
  40. data/spec/helper/test_hosts.rb +11 -1
  41. data/spec/integration/core/apt_spec.rb +2 -3
  42. data/spec/integration/core/archive_spec.rb +8 -13
  43. data/spec/integration/core/disk_spec.rb +2 -3
  44. data/spec/integration/core/dmi_spec.rb +2 -3
  45. data/spec/integration/core/file_spec.rb +4 -14
  46. data/spec/integration/core/find_spec.rb +3 -3
  47. data/spec/integration/core/group_spec.rb +2 -3
  48. data/spec/integration/core/ip_spec.rb +2 -3
  49. data/spec/integration/core/path_spec.rb +2 -3
  50. data/spec/integration/core/socket_spec.rb +2 -4
  51. data/spec/integration/core/stat_spec.rb +2 -3
  52. data/spec/integration/core/stream_spec.rb +6 -9
  53. data/spec/integration/core/system_spec.rb +2 -4
  54. data/spec/integration/core/transfer_spec.rb +4 -9
  55. data/spec/integration/core/user_spec.rb +2 -4
  56. data/spec/integration/core/yum_spec.rb +2 -3
  57. data/spec/integration/core/zypper_spec.rb +5 -6
  58. data/spec/integration/remote/cpu_spec.rb +2 -3
  59. data/spec/integration/remote/env_spec.rb +2 -3
  60. data/spec/integration/remote/fstab_spec.rb +2 -3
  61. data/spec/integration/remote/host_spec.rb +2 -3
  62. data/spec/integration/remote/memory_spec.rb +2 -2
  63. data/spec/integration/remote/os_spec.rb +2 -3
  64. data/spec/integration/remote/remote_file_spec.rb +9 -15
  65. data/spec/spec_helper.rb +12 -3
  66. data/spec/unit/command_spec.rb +19 -1
  67. data/spec/unit/core/find_spec.rb +1 -1
  68. data/spec/unit/core/yum_spec.rb +1 -1
  69. data/spec/unit/mode_spec.rb +2 -2
  70. data/spec/unit/remote/cluster_spec.rb +3 -1
  71. data/spec/unit/remote/cpu_spec.rb +1 -2
  72. data/spec/unit/remote/env_spec.rb +1 -3
  73. data/spec/unit/util_spec.rb +13 -0
  74. metadata +23 -4
@@ -1,247 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
-
5
- module Kanrisuru
6
- module OsPackage
7
- module Define
8
- def self.extended(base)
9
- base.instance_variable_set(:@os_method_properties, {})
10
- base.instance_variable_set(:@os_methods, Set.new)
11
- end
12
-
13
- def os_define(os_name, method_name, options = {})
14
- unique_method_name = options[:alias] || method_name
15
-
16
- @os_methods.add(method_name)
17
-
18
- if @os_method_properties.key?(unique_method_name)
19
- params = {
20
- os_name: os_name.to_s,
21
- method_name: method_name,
22
- options: options
23
- }
24
-
25
- @os_method_properties[unique_method_name].prepend(params)
26
- else
27
- @os_method_properties[unique_method_name] = [{
28
- os_name: os_name.to_s,
29
- method_name: method_name,
30
- options: options
31
- }]
32
- end
33
- end
34
- end
35
-
36
- module Collection
37
- def os_collection(mod, opts = {})
38
- os_method_properties = mod.instance_variable_get(:@os_method_properties)
39
- os_method_names = os_method_properties.keys
40
-
41
- namespace = opts[:namespace]
42
- namespace_instance = nil
43
-
44
- if namespace
45
- ## Define the namespace as an eigen class instance on the host.
46
- ## Namespaced instances will access core host methods
47
- ## with @host instance variable.
48
-
49
- if Kanrisuru::Remote::Cluster.instance_variable_defined?("@#{namespace}")
50
- namespace_class = Kanrisuru::Remote::Cluster.const_get(Kanrisuru::Util.camelize(namespace))
51
- namespace_instance = instance_variable_get("@#{namespace}")
52
- else
53
- namespace_class = Kanrisuru::Remote::Cluster.const_set(Kanrisuru::Util.camelize(namespace), Class.new)
54
- namespace_instance = Kanrisuru::Remote::Cluster.instance_variable_set("@#{namespace}", namespace_class.new)
55
-
56
- class_eval do
57
- define_method namespace do
58
- namespace_instance.instance_variable_set(:@cluster, self)
59
- namespace_instance
60
- end
61
- end
62
- end
63
-
64
- namespace_class.class_eval do
65
- os_method_names.each do |method_name|
66
- define_method method_name do |*args, &block|
67
- cluster = namespace_instance.instance_variable_get(:@cluster)
68
- hosts = cluster.instance_variable_get(:@hosts)
69
- hosts.map do |host_addr, host|
70
- { host: host_addr, result: host.send(namespace).send(method_name, *args, &block) }
71
- end
72
- end
73
- end
74
- end
75
- else
76
- class_eval do
77
- os_method_names.each do |method_name|
78
- define_method method_name do |*args, &block|
79
- @hosts.map do |host_addr, host|
80
- { host: host_addr, result: host.send(method_name, *args, &block) }
81
- end
82
- end
83
- end
84
- end
85
- end
86
- end
87
- end
88
-
89
- module Include
90
- def os_include(mod, opts = {})
91
- os_method_properties = mod.instance_variable_get(:@os_method_properties)
92
- os_method_names = os_method_properties.keys
93
-
94
- ## Need to encapsulate any helper methods called in the module
95
- ## to bind to the host instance. This acts as a psudeo module include.
96
- os_methods = mod.instance_variable_get(:@os_methods)
97
-
98
- public_methods = mod.instance_methods(false) - os_methods.to_a
99
- private_methods = mod.private_instance_methods(false)
100
- protected_methods = mod.protected_instance_methods(false)
101
- include_methods = (public_methods + protected_methods + private_methods).flatten
102
-
103
- include_method_bindings = proc do
104
- include_methods.each do |method_name|
105
- define_method method_name do |*args, &block|
106
- unbound_method = mod.instance_method(method_name)
107
- bind_method(unbound_method, *args, &block)
108
- end
109
- end
110
-
111
- private_methods.each { |method_name| private(method_name) }
112
- protected_methods.each { |method_name| protected(method_name) }
113
-
114
- private
115
- if RUBY_VERSION < '2.7'
116
- define_method 'bind_method' do |unbound_method, *args, &block|
117
- unbound_method.bind(self).call(*args, &block)
118
- end
119
- else
120
- define_method 'bind_method' do |unbound_method, *args, &block|
121
- unbound_method.bind_call(self, *args, &block)
122
- end
123
- end
124
- end
125
-
126
- namespace = opts[:namespace]
127
- namespace_class = nil
128
- namespace_instance = nil
129
-
130
- if namespace
131
- ## Define the namespace as an eigen class instance within the host class.
132
- ## Namespaced instances will access core host methods
133
- ## with @host instance variable.
134
-
135
- ## Check to see if the namespace was defined. If so, additional methods will be appended to the
136
- ## existing namespace class definition, otherwise, a new namespace class and instance will be
137
- ## defined with the methods added.
138
- if Kanrisuru::Remote::Host.instance_variable_defined?("@#{namespace}")
139
- namespace_class = Kanrisuru::Remote::Host.const_get(Kanrisuru::Util.camelize(namespace))
140
- namespace_instance = Kanrisuru::Remote::Host.instance_variable_get("@#{namespace}")
141
- else
142
- namespace_class = Kanrisuru::Remote::Host.const_set(Kanrisuru::Util.camelize(namespace), Class.new)
143
- namespace_instance = Kanrisuru::Remote::Host.instance_variable_set("@#{namespace}", namespace_class.new)
144
-
145
- class_eval do
146
- define_method namespace do
147
- namespace_instance.instance_variable_set(:@host, self)
148
- namespace_instance
149
- end
150
- end
151
- end
152
-
153
- namespace_class.class_eval(&include_method_bindings)
154
- else
155
- class_eval(&include_method_bindings)
156
- end
157
-
158
- class_eval do
159
- os_method_names.each do |method_name|
160
- if namespace
161
- namespace_class.class_eval do
162
- define_method method_name do |*args, &block|
163
- unbound_method = nil
164
-
165
- host = namespace_instance.instance_variable_get(:@host)
166
- os_method_cache = host.instance_variable_get(:@os_method_cache) || {}
167
-
168
- if os_method_cache.key?("#{namespace}.#{method_name}")
169
- unbound_method = os_method_cache["#{namespace}.#{method_name}"]
170
- else
171
- ## Find the correct method to resolve based on the OS for the remote host.
172
- defined_method_name = host.resolve_os_method_name(os_method_properties, method_name)
173
- unless defined_method_name
174
- raise NoMethodError, "undefined method `#{method_name}' for #{self.class}"
175
- end
176
-
177
- ## Get reference to the unbound method defined in module
178
- unbound_method = mod.instance_method(defined_method_name)
179
- raise NoMethodError, "undefined method `#{method_name}' for #{self.class}" unless unbound_method
180
-
181
- ## Cache the unbound method on this host instance for faster resolution on
182
- ## the next invocation of this method
183
- os_method_cache["#{namespace}.#{method_name}"] = unbound_method
184
- host.instance_variable_set(:@os_method_cache, os_method_cache)
185
- end
186
-
187
- ## Bind the method to host instance and
188
- ## call it with args and block
189
- bind_method(unbound_method, *args, &block)
190
- end
191
- end
192
- else
193
- define_method method_name do |*args, &block|
194
- unbound_method = nil
195
-
196
- host = self
197
- os_method_cache = host.instance_variable_get(:@os_method_cache) || {}
198
-
199
- if os_method_cache.key?(method_name)
200
- unbound_method = os_method_cache[method_name]
201
- else
202
- ## Find the correct method to resolve based on the OS for the remote host.
203
- defined_method_name = host.resolve_os_method_name(os_method_properties, method_name)
204
- raise NoMethodError, "undefined method `#{method_name}' for #{self.class}" unless defined_method_name
205
-
206
- ## Get reference to the unbound method defined in module
207
- unbound_method = mod.instance_method(defined_method_name)
208
- raise NoMethodError, "undefined method `#{method_name}' for #{self.class}" unless unbound_method
209
-
210
- ## Cache the unbound method on this host instance for faster resolution on
211
- ## the next invocation of this method
212
- os_method_cache[method_name] = unbound_method
213
- host.instance_variable_set(:@os_method_cache, os_method_cache)
214
- end
215
-
216
- ## Bind the method to host instance and
217
- ## call it with args and block
218
- bind_method(unbound_method, *args, &block)
219
- end
220
- end
221
- end
222
-
223
- def resolve_os_method_name(properties, method_name)
224
- kernel = os.kernel.downcase
225
- release = os.release.downcase
226
-
227
- properties[method_name].each do |property|
228
- os_name = property[:os_name]
229
- strict = property[:options] ? property[:options][:strict] : false
230
- except = property[:options] ? property[:options][:except] : ''
231
-
232
- next if except && (except == release || except.include?(release))
233
-
234
- if release == os_name || kernel == os_name ||
235
- (Kanrisuru::Util::OsFamily.family_include_distribution?(os_name, release) && !strict) ||
236
- (Kanrisuru::Util::OsFamily.upstream_include_distribution?(os_name, release) && !strict)
237
- return property[:method_name]
238
- end
239
- end
240
-
241
- nil
242
- end
243
- end
244
- end
245
- end
246
- end
247
- end
3
+ require_relative 'os_package/collection'
4
+ require_relative 'os_package/define'
5
+ require_relative 'os_package/include'
@@ -27,6 +27,10 @@ module Kanrisuru
27
27
  load_average[2]
28
28
  end
29
29
 
30
+ def architecture
31
+ @cpu_architecture.architecture
32
+ end
33
+
30
34
  def sockets
31
35
  @cpu_architecture.sockets
32
36
  end
@@ -103,7 +107,7 @@ module Kanrisuru
103
107
  @cpu_architecture.flags
104
108
  end
105
109
 
106
- def hyperthreading?
110
+ def hyperthreading?
107
111
  threads_per_core > 1
108
112
  end
109
113
 
@@ -161,7 +161,7 @@ module Kanrisuru
161
161
 
162
162
  if Kanrisuru::Util.present?(@line) && @line.instance_of?(String)
163
163
  parse_line!
164
- elsif Kanrisuru::Util.present?(@opts) && @opts.instance_of?(String) || @opts.instance_of?(Hash)
164
+ elsif (Kanrisuru::Util.present?(@opts) && @opts.instance_of?(String)) || @opts.instance_of?(Hash)
165
165
  @opts = Kanrisuru::Remote::Fstab::Options.new(@type, @opts)
166
166
  end
167
167
  end
@@ -255,7 +255,7 @@ module Kanrisuru
255
255
  end
256
256
 
257
257
  result = @host.blkid(device: @device)
258
- @uuid = result.success? ? result.uuid : nil
258
+ @uuid = result.success? ? result[0].uuid : nil
259
259
  end
260
260
 
261
261
  def parse_uuid(fsline)
@@ -269,15 +269,15 @@ module Kanrisuru
269
269
  end
270
270
 
271
271
  result = @host.blkid(device: @device)
272
- @label = result.success? ? result.label : nil
272
+ @label = result.success? ? result[0].label : nil
273
273
  end
274
274
 
275
275
  def parse_dev(fsline)
276
276
  @device = fsline
277
277
  result = @host.blkid(device: @device)
278
278
 
279
- @label = result.success? ? result.label : nil
280
- @uuid = result.success? ? result.uuid : nil
279
+ @label = result.success? ? result[0].label : nil
280
+ @uuid = result.success? ? result[0].uuid : nil
281
281
  end
282
282
  end
283
283
 
@@ -40,13 +40,14 @@ module Kanrisuru
40
40
  end
41
41
 
42
42
  def to_i
43
- if @data.instance_of?(Integer)
43
+ case @data
44
+ when Integer
44
45
  @data
45
- elsif @data.instance_of?(String)
46
+ when String
46
47
  @data.to_i
47
- elsif @data.instance_of?(Array)
48
+ when Array
48
49
  @data.map(&:to_i)
49
- elsif @data.instance_of?(NilClass)
50
+ when NilClass
50
51
  nil
51
52
  else
52
53
  raise NoMethodError, "(undefined method `to_i' for Kanrisuru::Result)"
@@ -24,7 +24,7 @@ module Kanrisuru
24
24
  Kanrisuru.logger.info do
25
25
  'DEPRECATION WARNING: string_join_array will be removed in the upcoming major release. Use array_join_string instead.'
26
26
  end
27
-
27
+
28
28
  array = arg.instance_of?(String) ? [arg] : arg
29
29
  array.join(field)
30
30
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kanrisuru
4
- VERSION = '0.10.0'
4
+ VERSION = '0.12.1'
5
5
  end
@@ -22,10 +22,9 @@ RSpec.describe Kanrisuru::Core::Apt do
22
22
  it 'prepares apt list command' do
23
23
  expect_command(host.apt('list'), 'apt list')
24
24
  expect_command(host.apt('list',
25
- installed: true,
26
- upgradeable: true,
27
- all_versions: true,
28
- ), 'apt list --installed --upgradeable --all-versions')
25
+ installed: true,
26
+ upgradeable: true,
27
+ all_versions: true), 'apt list --installed --upgradeable --all-versions')
29
28
 
30
29
  expect_command(host.apt('list', package_name: 'nginx'), 'apt list -a nginx')
31
30
  end
@@ -43,28 +42,22 @@ RSpec.describe Kanrisuru::Core::Apt do
43
42
  end
44
43
 
45
44
  it 'prepares apt install command' do
46
- expect_command(host.apt('install',
47
- packages: 'nginx'
48
- ),
49
- 'apt-get install -y nginx'
50
- )
51
-
52
- expect_command(host.apt('install',
53
- packages: 'monit',
54
- no_upgrade: true,
55
- reinstall: true
56
- ),
57
- 'apt-get install -y --no-upgrade --reinstall monit'
58
- )
59
-
60
- expect_command(host.apt('install',
61
- packages: ['build-essential', 'manpages-dev'],
62
- only_upgrade: true,
63
- ),
64
- 'apt-get install -y --only-upgrade build-essential manpages-dev'
65
- )
45
+ expect_command(host.apt('install',
46
+ packages: 'nginx'),
47
+ 'apt-get install -y nginx')
48
+
49
+ expect_command(host.apt('install',
50
+ packages: 'monit',
51
+ no_upgrade: true,
52
+ reinstall: true),
53
+ 'apt-get install -y --no-upgrade --reinstall monit')
54
+
55
+ expect_command(host.apt('install',
56
+ packages: %w[build-essential manpages-dev],
57
+ only_upgrade: true),
58
+ 'apt-get install -y --only-upgrade build-essential manpages-dev')
66
59
  end
67
-
60
+
68
61
  it 'prepares apt remove command' do
69
62
  expect_command(host.apt('remove', packages: ['python']), 'apt-get remove -y python')
70
63
  end
@@ -82,15 +75,14 @@ RSpec.describe Kanrisuru::Core::Apt do
82
75
  end
83
76
 
84
77
  it 'prepares apt show command' do
85
- expect_command(host.apt('show', packages: 'ruby'), 'apt show -a ruby')
86
- end
78
+ expect_command(host.apt('show', packages: 'ruby'), 'apt show -a ruby')
79
+ end
87
80
 
88
81
  it 'prepares apt clean command' do
89
- expect_command(host.apt('clean'), 'apt-get clean')
82
+ expect_command(host.apt('clean'), 'apt-get clean')
90
83
  end
91
84
 
92
85
  it 'prepares apt autoclean command' do
93
- expect_command(host.apt('autoclean'), 'apt-get autoclean')
86
+ expect_command(host.apt('autoclean'), 'apt-get autoclean')
94
87
  end
95
-
96
88
  end