kanrisuru 0.7.1 → 0.7.2
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 +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
|