icontrol 0.0.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.
- data/LICENSE +20 -0
- data/README.markdown +9 -0
- data/README.rdoc +16 -0
- data/lib/icontrol.rb +17 -0
- data/lib/icontrol/attributable.rb +36 -0
- data/lib/icontrol/base.rb +197 -0
- data/lib/icontrol/common.rb +109 -0
- data/lib/icontrol/local_lb/common.rb +47 -0
- data/lib/icontrol/local_lb/monitor.rb +17 -0
- data/lib/icontrol/local_lb/monitor_rule.rb +22 -0
- data/lib/icontrol/local_lb/pool.rb +76 -0
- data/lib/icontrol/local_lb/pool_member.rb +5 -0
- data/lib/icontrol/local_lb/profile_auth.rb +6 -0
- data/lib/icontrol/local_lb/profile_http_class.rb +242 -0
- data/lib/icontrol/local_lb/rate_class.rb +4 -0
- data/lib/icontrol/local_lb/rule.rb +4 -0
- data/lib/icontrol/local_lb/snat_pool.rb +4 -0
- data/lib/icontrol/local_lb/virtual_server.rb +611 -0
- data/lib/icontrol/mappings.rb +62 -0
- data/lib/icontrol/statistic_type.rb +508 -0
- data/spec/fixtures/endpoint_helper.rb +14 -0
- data/spec/fixtures/soap/soap_fixture.rb +14 -0
- data/spec/fixtures/wsdl/wsdl_fixture.rb +15 -0
- data/spec/icontrol_local_lb_pool_spec.rb +119 -0
- data/spec/icontrol_local_lb_profile_http_class_spec.rb +271 -0
- data/spec/icontrol_local_lb_rule_spec.rb +22 -0
- data/spec/icontrol_local_lb_virtual_server_spec.rb +664 -0
- data/spec/icontrol_spec.rb +79 -0
- data/spec/spec_helper.rb +54 -0
- metadata +150 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# For the
|
2
|
+
IControl::LocalLB::Monitor
|
3
|
+
|
4
|
+
class IControl::LocalLB::Monitor
|
5
|
+
|
6
|
+
set_id_name :pool_name
|
7
|
+
|
8
|
+
def self.id_name
|
9
|
+
:pool_name
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
private
|
14
|
+
def default_body
|
15
|
+
{"pool_names" => {:value => [@attributes[:id]] }}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class IControl::LocalLB::MonitorRule
|
2
|
+
|
3
|
+
include Attributable
|
4
|
+
|
5
|
+
def self.from_xml(xml_hash)
|
6
|
+
monitor_templates = [xml_hash.delete(:monitor_templates)[:item]].flatten
|
7
|
+
return self.new(:quorum => xml_hash[:quorum],:monitor_templates => monitor_templates,:type => xml_hash[:type])
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(attributes)
|
11
|
+
attributes[:quorum] ||= "0"
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def rule_type
|
16
|
+
@attributes[:type]
|
17
|
+
end
|
18
|
+
|
19
|
+
def rule_type=(monitor_type)
|
20
|
+
@attributes[:type] = monitor_type
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# For the
|
2
|
+
IControl::LocalLB::Pool
|
3
|
+
|
4
|
+
class IControl::LocalLB::Pool
|
5
|
+
|
6
|
+
set_id_name :pool_name
|
7
|
+
|
8
|
+
def status_for(pool_member)
|
9
|
+
status = IControl::LocalLB::PoolMember.get_object_status do |soap|
|
10
|
+
soap.body = { "pool_names" => {:value => [@attributes[:id]] } }
|
11
|
+
end
|
12
|
+
pool_info = status.find { |i| i.address == pool_member.address && i.port == pool_member.port }
|
13
|
+
return pool_info.status if pool_info
|
14
|
+
end
|
15
|
+
|
16
|
+
def lb_method
|
17
|
+
aux = super
|
18
|
+
return aux.first if aux.respond_to? 'first'
|
19
|
+
aux
|
20
|
+
end
|
21
|
+
|
22
|
+
# This method clones a pool with another name (id)
|
23
|
+
def clone(new_id)
|
24
|
+
prv_monitor_rule = monitor_rule
|
25
|
+
new_pool = IControl::LocalLB::Pool.create(:id => new_id, :lb_method => lb_method, :members => member)
|
26
|
+
new_pool.monitor_rule = prv_monitor_rule
|
27
|
+
return new_pool
|
28
|
+
end
|
29
|
+
|
30
|
+
def destroy
|
31
|
+
return delete_pool
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns a collection of the monitors associated with this pool
|
35
|
+
def monitor_rule
|
36
|
+
return monitor_association
|
37
|
+
end
|
38
|
+
|
39
|
+
def monitor_rule=(new_monitor_rule)
|
40
|
+
item = 0
|
41
|
+
|
42
|
+
templates = new_monitor_rule.monitor_templates.map { |i| {:"item#{item+=1}" => i}}
|
43
|
+
rule_type = ( templates.length > 1 ) ? "MONITOR_RULE_TYPE_AND_LIST" : "MONITOR_RULE_TYPE_SINGLE"
|
44
|
+
response = IControl::LocalLB::Pool.set_monitor_association do |soap|
|
45
|
+
soap.body = {
|
46
|
+
"monitor_associations" => {
|
47
|
+
"item" => {
|
48
|
+
"pool_name" => @attributes[:id] ,
|
49
|
+
|
50
|
+
"monitor_rule" => {
|
51
|
+
:type => rule_type,
|
52
|
+
:quorum => new_monitor_rule.quorum,
|
53
|
+
"monitor_templates" => templates
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
}
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.create(attributes)
|
63
|
+
response = super do |soap|
|
64
|
+
item = 0
|
65
|
+
members = {}
|
66
|
+
attributes[:members].each{ |i| members[:"item#{item+=1}"] = {:address => i.address, :port => i.port } }
|
67
|
+
|
68
|
+
soap.body = {
|
69
|
+
"pool_names" => {:item => attributes[:id] },
|
70
|
+
"lb_methods" => {:item => attributes[:lb_method]},
|
71
|
+
"members" => {:item => members}
|
72
|
+
}
|
73
|
+
end
|
74
|
+
return new(attributes)
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
# For the
|
2
|
+
IControl::LocalLB::ProfileHttpClass
|
3
|
+
|
4
|
+
class IControl::LocalLB::ProfileHttpClass
|
5
|
+
|
6
|
+
set_id_name :profile_name
|
7
|
+
|
8
|
+
|
9
|
+
# Deletes the specified HTTP class profiles.
|
10
|
+
def delete
|
11
|
+
super.delete_profile
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(profile)
|
15
|
+
return self.id == profile.id
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
# Creates the specified HTTP class profiles.
|
20
|
+
def self.create!(profile_name)
|
21
|
+
self.create do |soap|
|
22
|
+
soap.body = {"profile_names" => {"value" => profile_name} }
|
23
|
+
end
|
24
|
+
return self.find(profile_name)
|
25
|
+
end
|
26
|
+
|
27
|
+
def profile_type
|
28
|
+
return IControl::LocalLB::ProfileType::PROFILE_TYPE_HTTPCLASS
|
29
|
+
end
|
30
|
+
|
31
|
+
def pool
|
32
|
+
self.pool_name.first
|
33
|
+
end
|
34
|
+
|
35
|
+
def pool=(pool,default_flag = false)
|
36
|
+
IControl::LocalLB::ProfileHttpClass.set_pool_name do |soap|
|
37
|
+
soap.body = {
|
38
|
+
"pool_names" => { :item => {:value => pool.id, "default_flag" => default_flag } },
|
39
|
+
"profile_names" => { "value" => id }
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Determines whether the specified profile is base/pre-configured profile, or user-defined profile.
|
45
|
+
def base_profile?
|
46
|
+
self.is_base_profile
|
47
|
+
end
|
48
|
+
|
49
|
+
# Gets the names of the default profile from which the specifie profile will derive default values for its attributes.
|
50
|
+
def default_profile
|
51
|
+
profile = super
|
52
|
+
IControl::LocalLB::ProfileHttpClass.find(profile)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Sets the names of the default profiles from which the specified profiles will derive default values for its attributes.
|
56
|
+
def default_profile=(profile)
|
57
|
+
IControl::LocalLB::ProfileHttpClass.set_default_profile do |soap|
|
58
|
+
soap.body = {
|
59
|
+
"profile_names" => {"value" => id},
|
60
|
+
"defaults" => {"value" => profile.id}
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Gets the lists of patterns used to match the hosts.
|
66
|
+
def host_match_pattern
|
67
|
+
super
|
68
|
+
end
|
69
|
+
|
70
|
+
# Resets the lists to parent defaults.
|
71
|
+
def set_default_host_match_pattern
|
72
|
+
super
|
73
|
+
host_match_pattern
|
74
|
+
end
|
75
|
+
|
76
|
+
# Adds a new pattern to the lists of patterns used to match the hosts
|
77
|
+
# * pattern: The string of the pattern that is to be used
|
78
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
79
|
+
def add_host_match_pattern (pattern,is_glob = false)
|
80
|
+
pattern_operation("add","host",pattern,is_glob)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Removes from the lists of patterns used to match the hosts
|
84
|
+
# * pattern: The string of the pattern that is to be used
|
85
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
86
|
+
def remove_host_match_pattern (pattern,is_glob = false)
|
87
|
+
pattern_operation("remove","host",pattern,is_glob)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Gets the lists of patterns used to match the paths.
|
91
|
+
def path_match_pattern
|
92
|
+
super
|
93
|
+
end
|
94
|
+
|
95
|
+
# Resets the lists to parent defaults.
|
96
|
+
def set_default_path_match_pattern
|
97
|
+
super
|
98
|
+
path_match_pattern
|
99
|
+
end
|
100
|
+
|
101
|
+
# Adds a pattern to the lists of patterns used to match the paths
|
102
|
+
# * pattern: The string of the pattern that is to be used
|
103
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
104
|
+
def add_path_match_pattern (pattern,is_glob = false)
|
105
|
+
pattern_operation("add","path",pattern,is_glob)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Removes from the lists of patterns used to match the paths
|
109
|
+
# * pattern: The string of the pattern that is to be used
|
110
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
111
|
+
def remove_path_match_pattern (pattern,is_glob = false)
|
112
|
+
pattern_operation("remove","path",pattern,is_glob)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Gets the lists of used to match the headers.
|
116
|
+
def header_match_pattern
|
117
|
+
super
|
118
|
+
end
|
119
|
+
|
120
|
+
# Resets the lists to parent defaults.
|
121
|
+
def set_default_header_match_pattern
|
122
|
+
super
|
123
|
+
header_match_pattern
|
124
|
+
end
|
125
|
+
|
126
|
+
# Adds a pattern to the lists of patterns used to match the headers
|
127
|
+
# * pattern: The string of the pattern that is to be used
|
128
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
129
|
+
def add_header_match_pattern (pattern,is_glob = false)
|
130
|
+
pattern_operation("add","header",pattern,is_glob)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Removes from the lists of patterns used to match the headers
|
134
|
+
# * pattern: The string of the pattern that is to be used
|
135
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
136
|
+
def remove_header_match_pattern (pattern,is_glob = false)
|
137
|
+
pattern_operation("remove","header",pattern,is_glob)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Gets the lists of used to match the headers.
|
141
|
+
def cookie_match_pattern
|
142
|
+
super
|
143
|
+
end
|
144
|
+
|
145
|
+
# Resets the lists to parent defaults.
|
146
|
+
def set_default_cookie_match_pattern
|
147
|
+
super
|
148
|
+
cookie_match_pattern
|
149
|
+
end
|
150
|
+
|
151
|
+
# Adds a pattern to the lists of patterns used to match the cookies
|
152
|
+
# * pattern: The string of the pattern that is to be used
|
153
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
154
|
+
def add_cookie_match_pattern (pattern,is_glob = false)
|
155
|
+
pattern_operation("add","cookie",pattern,is_glob)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Removes from the lists of patterns used to match the cookies
|
159
|
+
# * pattern: The string of the pattern that is to be used
|
160
|
+
# * is_glob: Whether the pattern is a string or not (defaults to false, i.e. regexps)
|
161
|
+
def remove_cookie_match_pattern (pattern,is_glob = false)
|
162
|
+
pattern_operation("remove","cookie",pattern,is_glob)
|
163
|
+
end
|
164
|
+
|
165
|
+
# Gets the string (which may include a TCL expression) with which to rewrite the URLs.
|
166
|
+
def rewrite_url
|
167
|
+
value = super.first
|
168
|
+
if value
|
169
|
+
value_string = value.value
|
170
|
+
value_string = "" if value_string.class != String
|
171
|
+
return {:rule => value_string,:default_flag => value.default_flag}
|
172
|
+
end
|
173
|
+
value
|
174
|
+
end
|
175
|
+
|
176
|
+
# Sets the strings (which may include a TCL expression) with which to rewrite the URLs.
|
177
|
+
# if default_flag is true then the rewriting is disabled (default_flag means work as default)
|
178
|
+
def set_rewrite_url(rule,default_flag = false)
|
179
|
+
match_operation("rewrite_url",rule,default_flag)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Unsets the rewrite url
|
183
|
+
def unset_rewrite_url
|
184
|
+
set_rewrite_url("",true)
|
185
|
+
end
|
186
|
+
|
187
|
+
# Gets the string (which may include a TCL expression) to indicates where to
|
188
|
+
# redirect the original HTTP request once a match occurs. For example, to redirect
|
189
|
+
# requests to https://myserver.com to http://myotherserver.com.
|
190
|
+
def redirect_location
|
191
|
+
value = super.first
|
192
|
+
if value
|
193
|
+
value_string = value.value
|
194
|
+
value_string = "" if value_string.class != String
|
195
|
+
return {:rule => value_string,:default_flag => value.default_flag}
|
196
|
+
end
|
197
|
+
value
|
198
|
+
end
|
199
|
+
|
200
|
+
# Sets the strings (which may include a TCL expression) with which to rewrite the URLs.
|
201
|
+
# if default_flag is true then the rewriting is disabled (default_flag means work as default)
|
202
|
+
def set_redirect_location(rule,default_flag = false)
|
203
|
+
match_operation("redirect_location",rule,default_flag)
|
204
|
+
end
|
205
|
+
|
206
|
+
# Unsets the rewrite url
|
207
|
+
def unset_redirect_location
|
208
|
+
set_redirect_location("",true)
|
209
|
+
end
|
210
|
+
|
211
|
+
private
|
212
|
+
|
213
|
+
#
|
214
|
+
def match_operation(type,rule,default_flag)
|
215
|
+
parameter = type == "redirect_location" ? "redirect_locations" : "urls"
|
216
|
+
IControl::LocalLB::ProfileHttpClass.send("set_#{type}") do |soap|
|
217
|
+
soap.body = {
|
218
|
+
"profile_names" => {"value" => id},
|
219
|
+
parameter => {"item" => {"value" => rule,"default_flag" => default_flag}}
|
220
|
+
}
|
221
|
+
end
|
222
|
+
send("#{type}")
|
223
|
+
end
|
224
|
+
|
225
|
+
# Generic method for matching manipulation
|
226
|
+
def pattern_operation(op,type,pattern,is_glob)
|
227
|
+
if pattern.class == Hash
|
228
|
+
pattern["is_glob"] = pattern[:is_glob]
|
229
|
+
pattern_hash = pattern
|
230
|
+
else
|
231
|
+
pattern_hash = {"pattern" => pattern ,"is_glob" => is_glob}
|
232
|
+
end
|
233
|
+
IControl::LocalLB::ProfileHttpClass.send("#{op}_#{type}_match_pattern") do |soap|
|
234
|
+
soap.body = {
|
235
|
+
"profile_names" => {"value" => id},
|
236
|
+
"patterns" => {"item" => {"value" => pattern_hash }}
|
237
|
+
}
|
238
|
+
end
|
239
|
+
pattern_hash
|
240
|
+
end
|
241
|
+
|
242
|
+
end
|
@@ -0,0 +1,611 @@
|
|
1
|
+
#
|
2
|
+
# TODO:
|
3
|
+
# - protocol_type= does not seem to work ( there is something that prevent the protocol to be assigned in the server side )
|
4
|
+
# - module_score Does not return any module score
|
5
|
+
# - persostence_record Does not work, it expects more arguments than documented
|
6
|
+
#
|
7
|
+
|
8
|
+
IControl::LocalLB::VirtualServer
|
9
|
+
class IControl::LocalLB::VirtualServer
|
10
|
+
|
11
|
+
class Type
|
12
|
+
include IControl::ConstDefiner
|
13
|
+
valid_consts = [:RESOURCE_TYPE_POOL,:RESOURCE_TYPE_IP_FORWARDING,:RESOURCE_TYPE_L2_FORWARDING,
|
14
|
+
:RESOURCE_TYPE_REJECT,:RESOURCE_TYPE_FAST_L4,:RESOURCE_TYPE_FAST_HTTP]
|
15
|
+
|
16
|
+
declare_constants valid_consts,Type
|
17
|
+
end
|
18
|
+
|
19
|
+
class CMPEnableMode
|
20
|
+
include IControl::ConstDefiner
|
21
|
+
valid_consts = [:RESOURCE_TYPE_CMP_ENABLE_ALL,:RESOURCE_TYPE_CMP_ENABLE_SINGLE,
|
22
|
+
:RESOURCE_TYPE_CMP_ENABLE_GROUP,:RESOURCE_TYPE_CMP_ENABLE_UNKNOWN]
|
23
|
+
|
24
|
+
declare_constants valid_consts,CMPEnableMode
|
25
|
+
end
|
26
|
+
|
27
|
+
class StatisticEntry
|
28
|
+
attr_accessor :virtual_server,:statistics
|
29
|
+
|
30
|
+
def self.from_xml(result)
|
31
|
+
result[:item] = [result[:item]].flatten
|
32
|
+
aux_result = result[:item].map do |i|
|
33
|
+
aux = self.new
|
34
|
+
aux.virtual_server = IControl::LocalLB::VirtualServer.find(i[:virtual_server][:name])
|
35
|
+
aux.statistics = {}
|
36
|
+
i[:statistics][:item].each do |entry|
|
37
|
+
aux.statistics[IControl::Common::StatisticType.from_string(entry[:type])] = IControl::Common::ULong64.new(entry[:value])
|
38
|
+
end
|
39
|
+
aux
|
40
|
+
end
|
41
|
+
return aux_result.length == 1 ? aux_result.first : aux_result
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class ModuleScore
|
46
|
+
attr_accessor :tmos_module ,:score
|
47
|
+
def initialize(attribules)
|
48
|
+
@score = attributes[:score]
|
49
|
+
@tmos_module = IControl::Common::TMOSModule.from_string(attributes[:tmos_module])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
=begin
|
53
|
+
class Rule
|
54
|
+
attr_accessor :rule_name,:priority
|
55
|
+
def initialize(attributes)
|
56
|
+
@rule_name = attributes[:rule_name]
|
57
|
+
@priority = ( attributes[:priority] && attributes[:priority].to_i ) || -1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
=end
|
61
|
+
|
62
|
+
class ClonePool
|
63
|
+
attr_accessor :pool,:clone_type
|
64
|
+
def initialize(attributes)
|
65
|
+
@pool = IControl::LocalLB::Pool.find(attributes[:pool_name])
|
66
|
+
@clone_type = IControl::LocalLB::ClonePoolType.from_string(attributes[:type])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class ProfileAttribute
|
71
|
+
attr_accessor :profile_type,:profile_context,:profile_name
|
72
|
+
def initialize(options)
|
73
|
+
@profile_type = options[:profile_type]
|
74
|
+
@profile_context = options[:profile_context]
|
75
|
+
@profile_name = options[:profile_name]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class Persistence
|
80
|
+
attr_accessor :profile_name,:default_profile
|
81
|
+
def initialize(options)
|
82
|
+
@profile_name = options[:profile_name]
|
83
|
+
@default_profile = ( options[:default_profile] == "true" )
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class GenericEnumerator
|
88
|
+
|
89
|
+
STATE_CHANGED=[ :<<, :push, :pop, :shift, :unshift, :insert, :join, :reverse!, :sort!, :collect!,:map!, :delete, :delete_at, :delete_if, :reject!,:slice!, :uniq!, :compact!, :flatten!, :shuffle! ]
|
90
|
+
|
91
|
+
attr_accessor :parent,:contents
|
92
|
+
|
93
|
+
def initialize(contents,parent)
|
94
|
+
@contents = contents
|
95
|
+
@parent = parent
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def method_missing(method_name,*args)
|
100
|
+
if @contents.methods.include? method_name
|
101
|
+
output = @contents.send(method_name,*args)
|
102
|
+
save! if STATE_CHANGED.include? method_name
|
103
|
+
return output
|
104
|
+
else
|
105
|
+
super
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
class HttpClassProfileEnumerator < GenericEnumerator
|
112
|
+
def save!
|
113
|
+
@parent.remove_all_httpclass_profiles
|
114
|
+
@parent.add_httpclass_profile(@contents)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
class RuleEnumerator < GenericEnumerator
|
119
|
+
def save!
|
120
|
+
@parent.remove_all_rules
|
121
|
+
@parent.add_rule(@contents)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class AuthProfileEnumerator < GenericEnumerator
|
126
|
+
def save!
|
127
|
+
@parent.remove_all_authentication_profiles
|
128
|
+
@parent.add_authentication_profile(@contents)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
set_id_name :virtual_server
|
133
|
+
|
134
|
+
# This method creates a new virtual_server
|
135
|
+
# receives a Hash with this values
|
136
|
+
# :name => "The name of the virtual host"
|
137
|
+
# :address => "the ip address of the virtual server"
|
138
|
+
# :port => "the port the server is going to listen to"
|
139
|
+
# :protocol => "a protocol type"
|
140
|
+
# :wildmask => "The wildmask of the virtual server"
|
141
|
+
# :type => "The type of the virtual_server"
|
142
|
+
# :default_pool_name => "The default pool name"
|
143
|
+
# :profiles
|
144
|
+
#
|
145
|
+
def self.create(attributes)
|
146
|
+
item = 0
|
147
|
+
profiles = {}
|
148
|
+
raise IControl::NoSuchPoolException.new(attributes[:default_pool]) unless attributes[:default_pool]
|
149
|
+
|
150
|
+
attributes[:profiles].each do |i|
|
151
|
+
if i.class == Hash
|
152
|
+
profiles["item#{item+=1}"] = {"profile_context" => i["profile_context"].class_name,"profile_name" => ( i["profile"] ? i["profile"] : "tcp" ) }
|
153
|
+
else
|
154
|
+
profiles["item#{item+=1}"] = {"profile_context" => i.profile_context,"profile_name" => i.profile_name || "tcp" }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
response = super do |soap|
|
158
|
+
soap.body = {
|
159
|
+
"definitions" => {:item => {
|
160
|
+
:name => attributes[:name],
|
161
|
+
:address => attributes[:address],
|
162
|
+
"port" => attributes[:port],
|
163
|
+
:protocol => (attributes[:protocol] || IControl::Common::ProtocolType::PROTOCOL_TCP).class_name
|
164
|
+
}
|
165
|
+
},
|
166
|
+
"wildmasks" => {:item => attributes[:wildmask] || "255.255.255.255"},
|
167
|
+
"resources" => {:item => {
|
168
|
+
:type => (attributes[:type] || IControl::LocalLB::VirtualServer::Type::RESOURCE_TYPE_POOL).class_name,
|
169
|
+
"default_pool_name" => attributes[:default_pool] ? attributes[:default_pool].id : ""
|
170
|
+
}
|
171
|
+
},
|
172
|
+
"profiles" => {:item => profiles}
|
173
|
+
}
|
174
|
+
end
|
175
|
+
return find(attributes[:name])
|
176
|
+
end
|
177
|
+
|
178
|
+
def destroy
|
179
|
+
return delete_virtual_server
|
180
|
+
end
|
181
|
+
|
182
|
+
# Gets the wildmask for the specified virtual server.
|
183
|
+
def wildmask
|
184
|
+
super
|
185
|
+
end
|
186
|
+
# Sets the wildmask
|
187
|
+
def wildmask=(wildmask)
|
188
|
+
IControl::LocalLB::VirtualServer.set_wildmask do |soap|
|
189
|
+
soap.body = {
|
190
|
+
"virtual_servers" => {:item => id},
|
191
|
+
"wildmasks" => {:item => wildmask }
|
192
|
+
}
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
def type
|
198
|
+
super
|
199
|
+
end
|
200
|
+
|
201
|
+
# Sets the type for the virtual server
|
202
|
+
def type=(new_type)
|
203
|
+
IControl::LocalLB::VirtualServer.set_type do |soap|
|
204
|
+
soap.body = {
|
205
|
+
"virtual_servers" => {:item => id},
|
206
|
+
"types" => {:item => new_type.class_name}
|
207
|
+
}
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Gets the CMP enable modes from the specified virtual servers.
|
212
|
+
# This is read-only, as the modes are set according to the system and
|
213
|
+
# configuration, and influenced by the desired CMP enabled state.
|
214
|
+
def cmp_enable_mode
|
215
|
+
super
|
216
|
+
end
|
217
|
+
|
218
|
+
# Gets the destination IP and port of the specified virtual servers.
|
219
|
+
# it returns an instance of class IControl::Common::IPPortDefinition
|
220
|
+
# that has mainly two methods, address and port
|
221
|
+
def destination
|
222
|
+
super
|
223
|
+
end
|
224
|
+
|
225
|
+
# Sets the destination IP and port
|
226
|
+
# it receives an IPPortDefinition instance with the keys
|
227
|
+
# :address and :port
|
228
|
+
def destination=(destination)
|
229
|
+
IControl::LocalLB::VirtualServer.set_destination do |soap|
|
230
|
+
soap.body = {
|
231
|
+
"virtual_servers" => {:item => id},
|
232
|
+
"destinations" => {:item => {:address => destination.address, :port => destination.port }}
|
233
|
+
}
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# Gets the protocols supported by the specified virtual servers
|
238
|
+
def protocol
|
239
|
+
super
|
240
|
+
end
|
241
|
+
|
242
|
+
# Gets the protocols supported by the specified virtual servers.
|
243
|
+
def enabled_state
|
244
|
+
super
|
245
|
+
end
|
246
|
+
|
247
|
+
# Sets the enabled state of the specified virtual servers.
|
248
|
+
def enabled_state=(state)
|
249
|
+
IControl::LocalLB::VirtualServer.set_enabled_state do |soap|
|
250
|
+
soap.body = {
|
251
|
+
"virtual_servers" => {:item => id},
|
252
|
+
"states" => {:item => state.class_name}
|
253
|
+
}
|
254
|
+
end if state
|
255
|
+
end
|
256
|
+
|
257
|
+
# Gets the rate classes that will be used to rate limit the traffic.
|
258
|
+
def rate_class
|
259
|
+
rate_class = get_rate_class
|
260
|
+
IControl::LocalLB::RateClass.find(rate_class) if rate_class
|
261
|
+
end
|
262
|
+
|
263
|
+
# Sets the rate class that will be used to rate limit the traffic.
|
264
|
+
def rate_class=(rate)
|
265
|
+
IControl::LocalLB::VirtualServer.set_rate_class do |soap|
|
266
|
+
soap.body = {"virtual_servers" => {:item => id},"rate_classes" => {:item => rate}}
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# Gets the mirror connection states for the specified virtual servers.
|
271
|
+
def connection_mirror_state
|
272
|
+
super
|
273
|
+
end
|
274
|
+
|
275
|
+
def connection_mirror_state=(state)
|
276
|
+
IControl::LocalLB::VirtualServer.set_connection_mirror_state do |soap|
|
277
|
+
soap.body = {"virtual_servers" => {:item => id},:states => {:item => state.class_name }}
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Gets the connection limits for the specified virtual servers.
|
282
|
+
def connection_limit
|
283
|
+
super
|
284
|
+
end
|
285
|
+
|
286
|
+
# Sets the connection limits of the specified virtual server.
|
287
|
+
def connection_limit=(limit)
|
288
|
+
IControl::LocalLB::VirtualServer.set_connection_limit do |soap|
|
289
|
+
soap.body = {"virtual_servers" => {:item => id},:limits => {:item => IControl::Common::ULong64.new(:low => limit).to_hash}}
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
# Gets the port translation states for the specified virtual servers. Enables or disables port translation.
|
294
|
+
def translate_port_state
|
295
|
+
super
|
296
|
+
end
|
297
|
+
|
298
|
+
# Gets the address translation states for the specified virtual servers. Enables or disables address translation.
|
299
|
+
def translate_address_state
|
300
|
+
super
|
301
|
+
end
|
302
|
+
|
303
|
+
# Gets the source port behavior for the specified virtual servers.
|
304
|
+
def source_port_behavior
|
305
|
+
super
|
306
|
+
end
|
307
|
+
|
308
|
+
# Gets the last hop pools for the specified virtual servers.
|
309
|
+
def last_hop_pool
|
310
|
+
pool_name = super
|
311
|
+
IControl::LocalLB::Pool.find(pool_name) if pool_name
|
312
|
+
end
|
313
|
+
|
314
|
+
# Gets the actual hardware acceleration modes for the specified virtual servers.
|
315
|
+
def actual_hardware_acceleration
|
316
|
+
super
|
317
|
+
end
|
318
|
+
|
319
|
+
# Gets the SNAT type for the specified virtual servers.
|
320
|
+
def snat_type
|
321
|
+
super
|
322
|
+
end
|
323
|
+
|
324
|
+
def snat_type=(new_type)
|
325
|
+
method = new_type == IControl::LocalLB::SnatType::SNAT_TYPE_AUTOMAP ? "set_snat_automap" : "set_snat_none"
|
326
|
+
IControl::LocalLB::VirtualServer.send(method) do |soap|
|
327
|
+
soap.body = {"virtual_servers" => {:item => id}}
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
# Gets the SNAT pools to be used in iSNAT configurations for the specified virtual servers.
|
332
|
+
def snat_pool
|
333
|
+
snat = super
|
334
|
+
IControl::LocalLB::SNATPool.find(snat) if snat
|
335
|
+
end
|
336
|
+
|
337
|
+
# Gets the persistence profiles to use for fallback persistence for the specified virtual servers.
|
338
|
+
# A string is returned
|
339
|
+
def fallback_persistence_profile
|
340
|
+
super
|
341
|
+
end
|
342
|
+
|
343
|
+
|
344
|
+
def enable_fallback_persistence_profile!
|
345
|
+
fallback_persistence_profile = IControl::Common::EnabledState::STATE_ENABLED
|
346
|
+
end
|
347
|
+
|
348
|
+
def disable_fallback_persistence_profile!
|
349
|
+
fallback_persistence_profile = IControl::Common::EnabledState::STATE_DISABLED
|
350
|
+
end
|
351
|
+
|
352
|
+
private
|
353
|
+
|
354
|
+
# Sets de fallback persistence profile profile has to be a string
|
355
|
+
def fallback_persistence_profile=(profile)
|
356
|
+
IControl::LocalLB::VirtualServer.set_fallback_persistence_profile do |soap|
|
357
|
+
soap.body = {
|
358
|
+
"virtual_servers" => {:item => id},
|
359
|
+
"profile_names" => {:item => profile}
|
360
|
+
}
|
361
|
+
end if profile
|
362
|
+
end
|
363
|
+
|
364
|
+
public
|
365
|
+
|
366
|
+
# Gets the lists of VLANs on which access to the specified Virtual Servers are enabled/disabled.
|
367
|
+
def vlan
|
368
|
+
super
|
369
|
+
end
|
370
|
+
|
371
|
+
# Gets the lists of profiles the specified virtual server are associated with.
|
372
|
+
def profiles
|
373
|
+
return get_profile
|
374
|
+
end
|
375
|
+
|
376
|
+
# Gets the default pool for the specified virtual server.
|
377
|
+
def default_pool
|
378
|
+
return IControl::LocalLB::Pool.find(default_pool_name)
|
379
|
+
end
|
380
|
+
|
381
|
+
def default_pool=(pool)
|
382
|
+
IControl::LocalLB::VirtualServer.set_default_pool_name do |soap|
|
383
|
+
soap.body = {
|
384
|
+
"virtual_servers" => {:item => id},
|
385
|
+
"default_pools" => {:item => pool.id }
|
386
|
+
}
|
387
|
+
end if pool
|
388
|
+
end
|
389
|
+
|
390
|
+
# Gets the lists of persistence profiles the virtual server is associated with.
|
391
|
+
def persistence_profile
|
392
|
+
super
|
393
|
+
end
|
394
|
+
|
395
|
+
# Gets the lists of clone pools the virtual server is associated with.
|
396
|
+
def clone_pool
|
397
|
+
super
|
398
|
+
end
|
399
|
+
|
400
|
+
# Gets the lists of rules the specified virtual servers are associated with.
|
401
|
+
# If a specified virtual server is not associated with any rule, then the list
|
402
|
+
# of rules for that virtual server will be empty
|
403
|
+
def rules
|
404
|
+
@rules ||= RuleEnumerator.new( get_rule.sort {|a,b| a.priority.to_i <=> b.priority.to_i}.map{|i| i}.compact,self)
|
405
|
+
end
|
406
|
+
|
407
|
+
# Gets the statistics.
|
408
|
+
def statistics
|
409
|
+
get_statistics.statistics
|
410
|
+
end
|
411
|
+
|
412
|
+
# Gets the version information for this interface.
|
413
|
+
def version
|
414
|
+
super
|
415
|
+
end
|
416
|
+
|
417
|
+
def gtm_score
|
418
|
+
super
|
419
|
+
end
|
420
|
+
|
421
|
+
def persistence_profile=(persistence_profile)
|
422
|
+
add_persistence_profile(persistence_profile)
|
423
|
+
end
|
424
|
+
|
425
|
+
def add_persistence_profile(persistence_profile)
|
426
|
+
IControl::LocalLB::VirtualServer.add_persistence_profile do |soap|
|
427
|
+
soap.body = {
|
428
|
+
"virtual_servers" => {:item => id},
|
429
|
+
"profiles" => {:item => {:item => {"profile_name" => persistence_profile.profile_name,"default_profile" => persistence_profile.default_profile}}}
|
430
|
+
}
|
431
|
+
end if persistence_profile && persistence_profile!= ""
|
432
|
+
end
|
433
|
+
|
434
|
+
def rules=(my_rules)
|
435
|
+
@rules = my_rules
|
436
|
+
@rules.parent = self
|
437
|
+
@rules.save!
|
438
|
+
end
|
439
|
+
|
440
|
+
def httpclass_profiles
|
441
|
+
@httpclass_profile ||= HttpClassProfileEnumerator.new( httpclass_profile.sort {|a,b| a.priority.to_i <=> b.priority.to_i}.map{|i| i}.compact,self)
|
442
|
+
end
|
443
|
+
|
444
|
+
def httpclass_profiles=(profiles)
|
445
|
+
@httpclass_profile = profiles
|
446
|
+
@httpclass_profile.parent = self
|
447
|
+
@httpclass_profile.save!
|
448
|
+
end
|
449
|
+
|
450
|
+
# Adds/associates HTTP class profiles to the specified virtual server.
|
451
|
+
def add_httpclass_profile(http_class_profiles)
|
452
|
+
IControl::LocalLB::VirtualServer.add_httpclass_profile do |soap|
|
453
|
+
item = "item"; count = 0
|
454
|
+
profiles = {}
|
455
|
+
http_class_profiles.each{ |i| profiles[item + (count +=1).to_s] = {"profile_name" => i.class == String ? i : i.id, "priority" => count } }
|
456
|
+
soap.body = {
|
457
|
+
"virtual_servers" => {:item => id},
|
458
|
+
"profiles" => {"value" => profiles }
|
459
|
+
}
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
|
464
|
+
def add_rule(rules)
|
465
|
+
IControl::LocalLB::VirtualServer.add_rule do |soap|
|
466
|
+
item = "item"; count = 0
|
467
|
+
my_rules = {}
|
468
|
+
rules.each{ |i| my_rules[item + (count +=1).to_s] = {"rule_name" => i.class == String ? i : i.id, "priority" => count } }
|
469
|
+
soap.body = {
|
470
|
+
"virtual_servers" => {:item => id},
|
471
|
+
"rules" => {"value" => my_rules }
|
472
|
+
}
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
def add_authentication_profile(profiles)
|
477
|
+
IControl::LocalLB::VirtualServer.add_authentication_profile do |soap|
|
478
|
+
item = "item"; count = 0
|
479
|
+
my_profiles = {}
|
480
|
+
profiles.each{ |i| my_profiles[item + (count +=1).to_s] = {"profile_name" => i.class == String ? i : i.id, "priority" => count } }
|
481
|
+
soap.body = {
|
482
|
+
"virtual_servers" => {:item => id},
|
483
|
+
"profiles" => {"value" => my_profiles }
|
484
|
+
}
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
488
|
+
# add_authentication_profile
|
489
|
+
# remove_authentication_profile
|
490
|
+
# remove_all_authentication_profiles
|
491
|
+
|
492
|
+
def object_status
|
493
|
+
super
|
494
|
+
end
|
495
|
+
|
496
|
+
def authentication_profiles
|
497
|
+
@authentication_profile ||= AuthProfileEnumerator.new(authentication_profile.sort {|a,b| a.priority.to_i <=> b.priority.to_i}.map{|i| i}.compact,self)
|
498
|
+
end
|
499
|
+
|
500
|
+
def authentication_profiles=(profiles)
|
501
|
+
@authentication_profile = profiles
|
502
|
+
@authentication_profile.parent = self
|
503
|
+
@authentication_profile.save!
|
504
|
+
end
|
505
|
+
|
506
|
+
def self.all_statistics
|
507
|
+
self.get_all_statistics
|
508
|
+
end
|
509
|
+
|
510
|
+
def persistence_record(mode)
|
511
|
+
raise "Not Implemented"
|
512
|
+
end
|
513
|
+
|
514
|
+
def version
|
515
|
+
super
|
516
|
+
end
|
517
|
+
|
518
|
+
def module_score
|
519
|
+
super
|
520
|
+
end
|
521
|
+
|
522
|
+
# Sets the protocol it reeives a ProtocolType constant
|
523
|
+
def protocol=(protocol)
|
524
|
+
IControl::LocalLB::VirtualServer.set_protocol do |soap|
|
525
|
+
soap.body = {
|
526
|
+
"virtual_servers" => {:item => id},
|
527
|
+
"protocols" => {:item => protocol.class_name }
|
528
|
+
}
|
529
|
+
end
|
530
|
+
end
|
531
|
+
|
532
|
+
def enable_address_translation!
|
533
|
+
translate_address_state = IControl::Common::EnabledState::STATE_ENABLED
|
534
|
+
end
|
535
|
+
|
536
|
+
def disable_address_translation!
|
537
|
+
translate_address_state = IControl::Common::EnabledState::STATE_DISABLED
|
538
|
+
end
|
539
|
+
|
540
|
+
# Sets the translate address state receives a EnabledState constant
|
541
|
+
def translate_address_state=(translate_address_state)
|
542
|
+
IControl::LocalLB::VirtualServer.set_translate_address_state do |soap|
|
543
|
+
soap.body = {
|
544
|
+
"virtual_servers" => {:item => id},
|
545
|
+
"states" => {:item => translate_address_state}
|
546
|
+
}
|
547
|
+
end
|
548
|
+
end
|
549
|
+
|
550
|
+
def enable_cmp!
|
551
|
+
cmp_enabled_state = IControl::Common::EnabledState::STATE_ENABLED
|
552
|
+
end
|
553
|
+
|
554
|
+
def disable_cmp!
|
555
|
+
cmp_enabled_state = IControl::Common::EnabledState::STATE_DISABLED
|
556
|
+
end
|
557
|
+
|
558
|
+
# Sets the translate cmp address state receives a EnabledState constant
|
559
|
+
def cmp_enabled_state=(cmp_enabled_state)
|
560
|
+
IControl::LocalLB::VirtualServer.set_cmp_enabled_state do |soap|
|
561
|
+
soap.body = {
|
562
|
+
"virtual_servers" => {:item => id},
|
563
|
+
"states" => {:item => cmp_enabled_state}
|
564
|
+
}
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
# sets the snat_pool receives a Pool instance
|
569
|
+
def snat_pool=(snat_pool)
|
570
|
+
IControl::LocalLB::VirtualServer.set_snat_pool do |soap|
|
571
|
+
soap.body = {
|
572
|
+
"virtual_servers" => {:item => id},
|
573
|
+
"snatpools" => {:item => snat_pool.id}
|
574
|
+
}
|
575
|
+
end
|
576
|
+
end
|
577
|
+
|
578
|
+
def destroy
|
579
|
+
IControl::LocalLB::VirtualServer.delete_virtual_server do |soap|
|
580
|
+
soap.body = {
|
581
|
+
"virtual_servers" => {:item => id}
|
582
|
+
}
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
def self.destroy_all
|
587
|
+
puts "NOT IMPLEMENTED (for security reasons)"
|
588
|
+
end
|
589
|
+
|
590
|
+
def vlan=(vlan)
|
591
|
+
puts "NOT IMPLEMENTED"
|
592
|
+
raise LocalLB::MethodNotImplementedException
|
593
|
+
end
|
594
|
+
|
595
|
+
=begin
|
596
|
+
add_profile
|
597
|
+
remove_profile
|
598
|
+
remove_all_profiles
|
599
|
+
remove_persistence_profile
|
600
|
+
|
601
|
+
|
602
|
+
add_clone_pool
|
603
|
+
remove_clone_pool
|
604
|
+
remove_all_clone_pools
|
605
|
+
|
606
|
+
+ reset_statistics
|
607
|
+
delete_persistence_record
|
608
|
+
remove_httpclass_profile
|
609
|
+
set_gtm_score
|
610
|
+
=end
|
611
|
+
end
|