kanrisuru 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/kanrisuru/os_package.rb +11 -12
- data/lib/kanrisuru/version.rb +1 -1
- data/spec/functional/os_package_spec.rb +94 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ffb2183c8f1a5610dd416259a663787076f79cb8502fe8656a52d2c2cd1a7e0
|
4
|
+
data.tar.gz: 43b63c2e14d7f29356cd110261ef1ba55aabd50e97830e4aea3770429625caf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0b333f36fb00bd16177fe434522c2bd1717db0019d39dba681ab7810b786aca050e6ea79c2647a1bedf4f0bdb4d7e6ffb26079b2ad10d92d3b6da6e4372ee56
|
7
|
+
data.tar.gz: 17377294cc356a44b1a76c6d32bae36940d8ec43d31cdbf0716c4d347735a8d30591e94a8babc8f7cd70d68127f7177d6a2dd70015c4eb8132148868e47a227d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## Kanrisuru 0.7.2 (August 9, 2021) ##
|
2
|
+
* Fixed bug with the `os_method_cache` instance variable set in the namespaced instance of a host. This was causing collision issues inbetween host instances, where, hosts with the same aliased method name was getting overwritten (with a different OS), since the namespace instance variable existing on the host class definition wasn't getting reset inbetween host instantiations. Given that the `os_method_cache` is normally re-instantiated, this bug fix addresses this so that the `os_method_cache` is always defined on the host instance, ie:
|
3
|
+
|
4
|
+
```ruby
|
5
|
+
host.instance_variable_get(:@os_method_cache)
|
6
|
+
host.instance_variable_set(:@os_method_cache, os_method_cache)
|
7
|
+
```
|
8
|
+
This is done instead of being saved on the namespace module. With the previous bug fix of using namespaced keys, there's no way for a method to be overwritten otherwise with a global `os_method_cache`.
|
9
|
+
|
1
10
|
## Kanrisuru 0.7.1 (August 8, 2021) ##
|
2
11
|
* Fix bug with `os_include` when caching namespace unbound methods, use the namespace in the
|
3
12
|
cache key to avoid any namespace collisions with the same method name, namely:
|
data/lib/kanrisuru/os_package.rb
CHANGED
@@ -8,7 +8,6 @@ module Kanrisuru
|
|
8
8
|
def self.extended(base)
|
9
9
|
base.instance_variable_set(:@os_method_properties, {})
|
10
10
|
base.instance_variable_set(:@os_methods, Set.new)
|
11
|
-
base.instance_variable_set(:@os_method_cache, {})
|
12
11
|
end
|
13
12
|
|
14
13
|
def os_define(os_name, method_name, options = {})
|
@@ -102,12 +101,6 @@ module Kanrisuru
|
|
102
101
|
include_methods = (public_methods + protected_methods + private_methods).flatten
|
103
102
|
|
104
103
|
include_method_bindings = proc do
|
105
|
-
define_method 'os_method_cache' do
|
106
|
-
@os_method_cache ||= {}
|
107
|
-
end
|
108
|
-
|
109
|
-
private :os_method_cache
|
110
|
-
|
111
104
|
include_methods.each do |method_name|
|
112
105
|
define_method method_name do |*args, &block|
|
113
106
|
unbound_method = mod.instance_method(method_name)
|
@@ -144,10 +137,11 @@ module Kanrisuru
|
|
144
137
|
## defined with the methods added.
|
145
138
|
if Kanrisuru::Remote::Host.instance_variable_defined?("@#{namespace}")
|
146
139
|
namespace_class = Kanrisuru::Remote::Host.const_get(Kanrisuru::Util.camelize(namespace))
|
147
|
-
namespace_instance = instance_variable_get("@#{namespace}")
|
140
|
+
namespace_instance = Kanrisuru::Remote::Host.instance_variable_get("@#{namespace}")
|
148
141
|
else
|
149
142
|
namespace_class = Kanrisuru::Remote::Host.const_set(Kanrisuru::Util.camelize(namespace), Class.new)
|
150
143
|
namespace_instance = Kanrisuru::Remote::Host.instance_variable_set("@#{namespace}", namespace_class.new)
|
144
|
+
|
151
145
|
class_eval do
|
152
146
|
define_method namespace do
|
153
147
|
namespace_instance.instance_variable_set(:@host, self)
|
@@ -165,14 +159,16 @@ module Kanrisuru
|
|
165
159
|
os_method_names.each do |method_name|
|
166
160
|
if namespace
|
167
161
|
namespace_class.class_eval do
|
162
|
+
|
168
163
|
define_method method_name do |*args, &block|
|
169
164
|
unbound_method = nil
|
170
165
|
|
166
|
+
host = namespace_instance.instance_variable_get(:@host)
|
167
|
+
os_method_cache = host.instance_variable_get(:@os_method_cache) || {}
|
168
|
+
|
171
169
|
if os_method_cache.key?("#{namespace}.#{method_name}")
|
172
170
|
unbound_method = os_method_cache["#{namespace}.#{method_name}"]
|
173
171
|
else
|
174
|
-
host = namespace_instance.instance_variable_get(:@host)
|
175
|
-
|
176
172
|
## Find the correct method to resolve based on the OS for the remote host.
|
177
173
|
defined_method_name = host.resolve_os_method_name(os_method_properties, method_name)
|
178
174
|
unless defined_method_name
|
@@ -186,6 +182,7 @@ module Kanrisuru
|
|
186
182
|
## Cache the unbound method on this host instance for faster resolution on
|
187
183
|
## the next invocation of this method
|
188
184
|
os_method_cache["#{namespace}.#{method_name}"] = unbound_method
|
185
|
+
host.instance_variable_set(:@os_method_cache, os_method_cache)
|
189
186
|
end
|
190
187
|
|
191
188
|
## Bind the method to host instance and
|
@@ -196,12 +193,13 @@ module Kanrisuru
|
|
196
193
|
else
|
197
194
|
define_method method_name do |*args, &block|
|
198
195
|
unbound_method = nil
|
196
|
+
|
197
|
+
host = self
|
198
|
+
os_method_cache = host.instance_variable_get(:@os_method_cache) || {}
|
199
199
|
|
200
200
|
if os_method_cache.key?(method_name)
|
201
201
|
unbound_method = os_method_cache[method_name]
|
202
202
|
else
|
203
|
-
host = self
|
204
|
-
|
205
203
|
## Find the correct method to resolve based on the OS for the remote host.
|
206
204
|
defined_method_name = host.resolve_os_method_name(os_method_properties, method_name)
|
207
205
|
raise NoMethodError, "undefined method `#{method_name}' for #{self.class}" unless defined_method_name
|
@@ -213,6 +211,7 @@ module Kanrisuru
|
|
213
211
|
## Cache the unbound method on this host instance for faster resolution on
|
214
212
|
## the next invocation of this method
|
215
213
|
os_method_cache[method_name] = unbound_method
|
214
|
+
host.instance_variable_set(:@os_method_cache, os_method_cache)
|
216
215
|
end
|
217
216
|
|
218
217
|
## Bind the method to host instance and
|
data/lib/kanrisuru/version.rb
CHANGED
@@ -40,18 +40,66 @@ module Kanrisuru
|
|
40
40
|
a - b
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
module TestAliasNames
|
45
|
+
extend Kanrisuru::OsPackage::Define
|
46
|
+
|
47
|
+
os_define :fedora, :output_fedora, alias: :output
|
48
|
+
os_define :debian, :output_debian, alias: :output
|
49
|
+
os_define :sles, :output_sles, alias: :output
|
50
|
+
|
51
|
+
def output_debian
|
52
|
+
'debian'
|
53
|
+
end
|
54
|
+
|
55
|
+
def output_fedora
|
56
|
+
'fedora'
|
57
|
+
end
|
58
|
+
|
59
|
+
def output_sles
|
60
|
+
'sles'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module TestAliasNamesNamespace
|
65
|
+
extend Kanrisuru::OsPackage::Define
|
66
|
+
|
67
|
+
os_define :fedora, :output_fedora, alias: :output
|
68
|
+
os_define :debian, :output_debian, alias: :output
|
69
|
+
os_define :sles, :output_sles, alias: :output
|
70
|
+
|
71
|
+
def output_debian
|
72
|
+
'debian'
|
73
|
+
end
|
74
|
+
|
75
|
+
def output_fedora
|
76
|
+
'fedora'
|
77
|
+
end
|
78
|
+
|
79
|
+
def output_sles
|
80
|
+
'sles'
|
81
|
+
end
|
82
|
+
end
|
43
83
|
end
|
44
84
|
|
45
85
|
module Kanrisuru
|
46
86
|
module Remote
|
47
87
|
class Host
|
48
88
|
os_include Kanrisuru::TestInclude
|
89
|
+
|
90
|
+
os_include Kanrisuru::TestAliasNames
|
91
|
+
os_include Kanrisuru::TestAliasNamesNamespace, namespace: :alias
|
92
|
+
|
49
93
|
os_include Kanrisuru::TestNamespaceAdditions, namespace: :asdf
|
50
94
|
os_include Kanrisuru::TestNamespace, namespace: :asdf
|
51
95
|
end
|
52
96
|
|
53
97
|
class Cluster
|
54
98
|
os_collection Kanrisuru::TestInclude
|
99
|
+
|
100
|
+
os_collection Kanrisuru::TestAliasNames
|
101
|
+
os_collection Kanrisuru::TestAliasNamesNamespace, namespace: :alias
|
102
|
+
|
55
103
|
os_collection Kanrisuru::TestNamespaceAdditions, namespace: :asdf
|
56
104
|
os_collection Kanrisuru::TestNamespace, namespace: :asdf
|
57
105
|
end
|
@@ -94,6 +142,52 @@ RSpec.describe Kanrisuru::OsPackage do
|
|
94
142
|
expect(cluster.asdf.tester).to be_instance_of(Array)
|
95
143
|
|
96
144
|
host.disconnect
|
145
|
+
host2.disconnect
|
146
|
+
cluster.disconnect
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'includes the correct alias named method' do
|
150
|
+
host1 = Kanrisuru::Remote::Host.new(host: 'ubuntu-host', username: 'ubuntu', keys: ['~/.ssh/id_rsa'])
|
151
|
+
host2 = Kanrisuru::Remote::Host.new(host: 'centos-host', username: 'centos', keys: ['~/.ssh/id_rsa'])
|
152
|
+
host3 = Kanrisuru::Remote::Host.new(host: 'opensuse-host', username: 'opensuse', keys: ['~/.ssh/id_rsa'])
|
153
|
+
|
154
|
+
cluster = Kanrisuru::Remote::Cluster.new([host1, host2, host3])
|
155
|
+
|
156
|
+
expect(host1).to respond_to(:output)
|
157
|
+
expect(host2).to respond_to(:output)
|
158
|
+
expect(host3).to respond_to(:output)
|
159
|
+
expect(host1.output).to eq('debian')
|
160
|
+
expect(host2.output).to eq('fedora')
|
161
|
+
expect(host3.output).to eq('sles')
|
162
|
+
|
163
|
+
expect(cluster).to respond_to(:output)
|
164
|
+
expect(cluster.output).to eq([
|
165
|
+
{:host=>"ubuntu-host", :result=>"debian"},
|
166
|
+
{:host=>"centos-host", :result=>"fedora"},
|
167
|
+
{:host=>"opensuse-host", :result=>"sles"}
|
168
|
+
])
|
169
|
+
|
170
|
+
expect(host1).to respond_to(:alias)
|
171
|
+
expect(host2).to respond_to(:alias)
|
172
|
+
expect(host3).to respond_to(:alias)
|
173
|
+
expect(host1.alias).to respond_to(:output)
|
174
|
+
expect(host2.alias).to respond_to(:output)
|
175
|
+
expect(host3.alias).to respond_to(:output)
|
176
|
+
expect(host1.alias.output).to eq('debian')
|
177
|
+
expect(host2.alias.output).to eq('fedora')
|
178
|
+
expect(host3.alias.output).to eq('sles')
|
179
|
+
|
180
|
+
expect(cluster).to respond_to(:alias)
|
181
|
+
expect(cluster.alias).to respond_to(:output)
|
182
|
+
expect(cluster.alias.output).to eq([
|
183
|
+
{:host=>"ubuntu-host", :result=>"debian"},
|
184
|
+
{:host=>"centos-host", :result=>"fedora"},
|
185
|
+
{:host=>"opensuse-host", :result=>"sles"}
|
186
|
+
])
|
187
|
+
|
188
|
+
host1.disconnect
|
189
|
+
host2.disconnect
|
190
|
+
host3.disconnect
|
97
191
|
cluster.disconnect
|
98
192
|
end
|
99
193
|
end
|