mu 5.7.2.3
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/Mu_Gem.html +1591 -0
- data/bin/mu +11 -0
- data/lib/mu.rb +65 -0
- data/lib/mu/api/ddt.rb +233 -0
- data/lib/mu/api/homepage.rb +54 -0
- data/lib/mu/api/muapi.rb +231 -0
- data/lib/mu/api/netconfig.rb +233 -0
- data/lib/mu/api/scale.rb +199 -0
- data/lib/mu/api/system.rb +40 -0
- data/lib/mu/client.rb +31 -0
- data/lib/mu/command.rb +28 -0
- data/lib/mu/command/api.rb +95 -0
- data/lib/mu/command/cmd_appid.rb +486 -0
- data/lib/mu/command/cmd_cli.rb +151 -0
- data/lib/mu/command/cmd_ddt.rb +449 -0
- data/lib/mu/command/cmd_homepage.rb +146 -0
- data/lib/mu/command/cmd_muapi.rb +361 -0
- data/lib/mu/command/cmd_netconfig.rb +262 -0
- data/lib/mu/command/cmd_runscale.rb +533 -0
- data/lib/mu/command/cmd_runscenario.rb +258 -0
- data/lib/mu/command/cmd_runverify.rb +336 -0
- data/lib/mu/command/cmd_scale.rb +333 -0
- data/lib/mu/command/cmd_system.rb +127 -0
- data/lib/mu/command/curl.rb +246 -0
- data/lib/mu/command/help.rb +29 -0
- data/lib/mu/curl/error.rb +54 -0
- data/lib/mu/curl/verify.rb +137 -0
- data/lib/mu/helper.rb +55 -0
- data/lib/mu/http_helper.rb +232 -0
- data/rdoc/classes/Mu.html +305 -0
- data/rdoc/classes/Mu/Client.html +265 -0
- data/rdoc/classes/Mu/Command.html +208 -0
- data/rdoc/classes/Mu/Command/API.html +524 -0
- data/rdoc/classes/Mu/Command/Cmd_appid.html +934 -0
- data/rdoc/classes/Mu/Command/Cmd_cli.html +515 -0
- data/rdoc/classes/Mu/Command/Cmd_ddt.html +1169 -0
- data/rdoc/classes/Mu/Command/Cmd_homepage.html +489 -0
- data/rdoc/classes/Mu/Command/Cmd_muapi.html +968 -0
- data/rdoc/classes/Mu/Command/Cmd_netconfig.html +743 -0
- data/rdoc/classes/Mu/Command/Cmd_runscale.html +970 -0
- data/rdoc/classes/Mu/Command/Cmd_runscenario.html +530 -0
- data/rdoc/classes/Mu/Command/Cmd_runverify.html +621 -0
- data/rdoc/classes/Mu/Command/Cmd_scale.html +939 -0
- data/rdoc/classes/Mu/Command/Cmd_system.html +426 -0
- data/rdoc/classes/Mu/Command/Curl.html +524 -0
- data/rdoc/classes/Mu/Command/Help.html +166 -0
- data/rdoc/classes/Mu/Curl.html +116 -0
- data/rdoc/classes/Mu/Curl/Error.html +157 -0
- data/rdoc/classes/Mu/Curl/Error/Authorize.html +178 -0
- data/rdoc/classes/Mu/Curl/Error/Connect.html +149 -0
- data/rdoc/classes/Mu/Curl/Error/DNS.html +113 -0
- data/rdoc/classes/Mu/Curl/Error/Region.html +160 -0
- data/rdoc/classes/Mu/Curl/Error/Status.html +149 -0
- data/rdoc/classes/Mu/Curl/Error/Timeout.html +149 -0
- data/rdoc/classes/Mu/Curl/Verify.html +282 -0
- data/rdoc/classes/Mu/Curl/Verify/Request.html +227 -0
- data/rdoc/classes/Mu/Curl/Verify/Response.html +187 -0
- data/rdoc/classes/Mu/Curl/Verify/Result.html +188 -0
- data/rdoc/classes/Mu/Ddt.html +914 -0
- data/rdoc/classes/Mu/Helper.html +308 -0
- data/rdoc/classes/Mu/Homepage.html +377 -0
- data/rdoc/classes/Mu/HttpHelper.html +639 -0
- data/rdoc/classes/Mu/Muapi.html +816 -0
- data/rdoc/classes/Mu/Netconfig.html +781 -0
- data/rdoc/classes/Mu/Scale.html +832 -0
- data/rdoc/classes/Mu/System.html +281 -0
- data/rdoc/classes/Object.html +148 -0
- data/rdoc/classes/TCTestMu.html +1793 -0
- data/rdoc/classes/Test.html +107 -0
- data/rdoc/classes/Test/Unit.html +107 -0
- data/rdoc/classes/Test/Unit/TestCase.html +113 -0
- data/rdoc/created.rid +1 -0
- data/rdoc/files/lib/mu/api/ddt_rb.html +101 -0
- data/rdoc/files/lib/mu/api/homepage_rb.html +101 -0
- data/rdoc/files/lib/mu/api/muapi_rb.html +101 -0
- data/rdoc/files/lib/mu/api/netconfig_rb.html +101 -0
- data/rdoc/files/lib/mu/api/scale_rb.html +101 -0
- data/rdoc/files/lib/mu/api/system_rb.html +101 -0
- data/rdoc/files/lib/mu/client_rb.html +101 -0
- data/rdoc/files/lib/mu/command/api_rb.html +101 -0
- data/rdoc/files/lib/mu/command/cmd_appid_rb.html +119 -0
- data/rdoc/files/lib/mu/command/cmd_cli_rb.html +108 -0
- data/rdoc/files/lib/mu/command/cmd_ddt_rb.html +117 -0
- data/rdoc/files/lib/mu/command/cmd_homepage_rb.html +115 -0
- data/rdoc/files/lib/mu/command/cmd_muapi_rb.html +116 -0
- data/rdoc/files/lib/mu/command/cmd_netconfig_rb.html +116 -0
- data/rdoc/files/lib/mu/command/cmd_runscale_rb.html +119 -0
- data/rdoc/files/lib/mu/command/cmd_runscenario_rb.html +115 -0
- data/rdoc/files/lib/mu/command/cmd_runverify_rb.html +117 -0
- data/rdoc/files/lib/mu/command/cmd_scale_rb.html +115 -0
- data/rdoc/files/lib/mu/command/cmd_system_rb.html +116 -0
- data/rdoc/files/lib/mu/command/curl_rb.html +101 -0
- data/rdoc/files/lib/mu/command/help_rb.html +101 -0
- data/rdoc/files/lib/mu/command_rb.html +107 -0
- data/rdoc/files/lib/mu/curl/error_rb.html +101 -0
- data/rdoc/files/lib/mu/curl/verify_rb.html +101 -0
- data/rdoc/files/lib/mu/helper_rb.html +101 -0
- data/rdoc/files/lib/mu/http_helper_rb.html +101 -0
- data/rdoc/files/lib/mu_rb.html +121 -0
- data/rdoc/files/test/helper_rb.html +112 -0
- data/rdoc/files/test/tc_test_mu_rb.html +111 -0
- data/rdoc/fr_class_index.html +68 -0
- data/rdoc/fr_file_index.html +55 -0
- data/rdoc/fr_method_index.html +374 -0
- data/rdoc/index.html +24 -0
- data/rdoc/rdoc-style.css +208 -0
- data/test/data/app_id_stats.csv +1 -0
- data/test/data/data_cgi.msl +94 -0
- data/test/data/data_cgi.xml +322 -0
- data/test/data/default_test.csv +3 -0
- data/test/data/ftp_with_channel.xml +1643 -0
- data/test/data/irc.xml +3837 -0
- data/test/data/scale_configuration.json +25 -0
- data/test/data/test_data_cgi_error.xml +35 -0
- data/test/helper.rb +18 -0
- data/test/tc_test_mu.rb +716 -0
- metadata +322 -0
data/bin/mu
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
|
|
4
|
+
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
|
|
5
|
+
|
|
6
|
+
require 'mu'
|
|
7
|
+
|
|
8
|
+
argv = ARGV.dup
|
|
9
|
+
ARGV.clear
|
|
10
|
+
cmd = argv.shift.strip rescue 'help'
|
|
11
|
+
Mu.run cmd, argv
|
data/lib/mu.rb
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'hexy'
|
|
3
|
+
require 'json/pure'
|
|
4
|
+
require 'logger'
|
|
5
|
+
require 'net/https'
|
|
6
|
+
require 'nokogiri'
|
|
7
|
+
require 'restclient'
|
|
8
|
+
require 'uri'
|
|
9
|
+
|
|
10
|
+
# Command-line tools and applications for using the Mu Dynamics REST Api's
|
|
11
|
+
class Mu
|
|
12
|
+
require 'mu/helper'
|
|
13
|
+
@version = "5.7.2"
|
|
14
|
+
Version = @version.freeze
|
|
15
|
+
$log = Logger.new(STDOUT)
|
|
16
|
+
$cookie = nil # http_helper
|
|
17
|
+
|
|
18
|
+
extend Mu::Helper
|
|
19
|
+
|
|
20
|
+
def self.run cmd, argv
|
|
21
|
+
$log.datetime_format = "%Y-%m-%d %H:%M:%S"
|
|
22
|
+
$log.level = Logger::INFO
|
|
23
|
+
$log.formatter = proc { |severity, datetime, progname, msg|
|
|
24
|
+
"[#{datetime} #{severity}]: #{msg}\n"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
check_version
|
|
28
|
+
|
|
29
|
+
kname, mname = cmd.split(':', 2)
|
|
30
|
+
klass = Mu::Command.const_get kname.capitalize rescue nil
|
|
31
|
+
mname ||= 'default'
|
|
32
|
+
mname = "cmd_#{mname}".to_sym
|
|
33
|
+
if klass and klass < Mu::Command and klass.method_defined? mname
|
|
34
|
+
command = klass.new
|
|
35
|
+
begin
|
|
36
|
+
command.send mname, argv
|
|
37
|
+
rescue => e
|
|
38
|
+
error e.message.chomp('.')
|
|
39
|
+
end
|
|
40
|
+
else
|
|
41
|
+
error "Unknown command #{cmd}"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def self.check_version
|
|
46
|
+
begin
|
|
47
|
+
api = Mu::System.new(ENV['MU_IP'], ENV['MU_ADMIN_USER'], ENV['MU_ADMIN_PASS'])
|
|
48
|
+
resp = Nokogiri::XML(api.status)
|
|
49
|
+
version_string = resp.xpath("//versions/platform")[0].content
|
|
50
|
+
version = version_string[0...version_string.rindex(".")]
|
|
51
|
+
if @version > version
|
|
52
|
+
puts "Warning. Version mismatch. Mu Gem version (#{@version}) is higher than Mu Platform version (#{version})"
|
|
53
|
+
end
|
|
54
|
+
rescue => e
|
|
55
|
+
puts "#{e}. Check Mu env settings: $MU_IP (#{ENV['MU_IP']}), $MU_ADMIN_USER (#{ENV['MU_ADMIN_USER']}), $MU_ADMIN_PASS (#{ENV['MU_ADMIN_PASS']}) "
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
require 'mu/client'
|
|
62
|
+
require 'mu/curl/error'
|
|
63
|
+
require 'mu/curl/verify'
|
|
64
|
+
require 'mu/command'
|
|
65
|
+
require 'mu/http_helper'
|
data/lib/mu/api/ddt.rb
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
class Mu
|
|
2
|
+
class Ddt
|
|
3
|
+
include Helper
|
|
4
|
+
|
|
5
|
+
attr_accessor :host, :docroot, :username, :password, :session_id
|
|
6
|
+
|
|
7
|
+
def initialize(host=ENV['MU_IP'], username=ENV['MU_ADMIN_USER'], password=ENV['MU_ADMIN_PASS'])
|
|
8
|
+
@host = host
|
|
9
|
+
@username = username
|
|
10
|
+
@password = password
|
|
11
|
+
@docroot = "/api/v5/ddt/"
|
|
12
|
+
@session_id = nil
|
|
13
|
+
@http = HttpHelper.new(@host, @username, @password, @docroot)
|
|
14
|
+
msg "Created Ddt Api object to :#{@host}", Logger::DEBUG
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# verifies the loaded scenario
|
|
18
|
+
def run
|
|
19
|
+
response = @http.post("session/test/run")
|
|
20
|
+
msg response, Logger::DEBUG
|
|
21
|
+
return response
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# sets and executes test suite
|
|
25
|
+
# * uuid = the uuid of a testset loaded on the Mu
|
|
26
|
+
def run_testset(uuid)
|
|
27
|
+
response = @http.post("session/test/runSuite/#{uuid}")
|
|
28
|
+
msg response, Logger::DEBUG
|
|
29
|
+
return response
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# must be called first to establish a new Studio Verify session
|
|
33
|
+
def new_session
|
|
34
|
+
reply = @http.post("newSession") # with no args
|
|
35
|
+
response = reply["response"]
|
|
36
|
+
msg response, Logger::DEBUG
|
|
37
|
+
@session_id = response["sessionId"]
|
|
38
|
+
msg @session_id, Logger::DEBUG
|
|
39
|
+
return @session_id
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# closes the existing Studio Verify session
|
|
43
|
+
def close_session
|
|
44
|
+
response = @http.get("session/closeSession")
|
|
45
|
+
msg response, Logger::DEBUG
|
|
46
|
+
return response
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# returns array of session_ids
|
|
50
|
+
def get_sessions
|
|
51
|
+
all_sessions = Array.new
|
|
52
|
+
response = @http.get("") # with no args
|
|
53
|
+
sessions = response["sessions"]
|
|
54
|
+
if !sessions["session"].nil?
|
|
55
|
+
num = sessions["session"].size
|
|
56
|
+
if num > 1
|
|
57
|
+
sessions["session"].each do | s |
|
|
58
|
+
all_sessions << s["id"]
|
|
59
|
+
end
|
|
60
|
+
else # special case if there is only one (there is no array)
|
|
61
|
+
all_sessions << sessions["session"]["id"]
|
|
62
|
+
end
|
|
63
|
+
return all_sessions
|
|
64
|
+
end
|
|
65
|
+
return nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# closes all Studio Verify sessions
|
|
69
|
+
def close_all_sessions
|
|
70
|
+
response = @http.post("closeAllSessions")
|
|
71
|
+
msg response, Logger::DEBUG
|
|
72
|
+
return response
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# returns the session id's of all existing Studio Verify sessions
|
|
76
|
+
def get_all_sessions
|
|
77
|
+
response = @http.get("getAllSessions")
|
|
78
|
+
msg response, Logger::DEBUG
|
|
79
|
+
return response
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# sets up a test for run
|
|
83
|
+
def setup_test
|
|
84
|
+
response = @http.post("session/setupTest")
|
|
85
|
+
msg response, Logger::DEBUG
|
|
86
|
+
return response
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# tears down a test
|
|
90
|
+
def teardown_test
|
|
91
|
+
response = @http.post("session/test/tearDownTest")
|
|
92
|
+
msg response, Logger::DEBUG
|
|
93
|
+
return response
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# loads a scenario
|
|
97
|
+
# * the uuid of a scenario present on the Mu
|
|
98
|
+
def load_scenario(uuid)
|
|
99
|
+
response = @http.post("session/loadScenario/#{uuid}")
|
|
100
|
+
msg response, Logger::DEBUG
|
|
101
|
+
return response
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# returns the hosts in the loaded scenario
|
|
105
|
+
def get_hosts
|
|
106
|
+
response = @http.get("session/scenario/hosts")
|
|
107
|
+
msg response, Logger::DEBUG
|
|
108
|
+
return response
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# sets the hosts in the loaded scenario
|
|
112
|
+
# * roles = an array of the host roles defined in the scenario
|
|
113
|
+
# * names = an array of host names to be mapped to the roles
|
|
114
|
+
# * type = network layer type (v4, v6 or l2) matching the defined hosts
|
|
115
|
+
def set_hosts(roles=[], names=[], type="v4")
|
|
116
|
+
responses = Array.new
|
|
117
|
+
hosts = roles.length.to_i
|
|
118
|
+
hosts.times do | i |
|
|
119
|
+
response = @http.post("session/scenario/hosts/#{roles[i]}/#{names[i]}/#{type}")
|
|
120
|
+
responses << response
|
|
121
|
+
end
|
|
122
|
+
msg responses, Logger::DEBUG
|
|
123
|
+
return responses
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# returns the channel elements of the loaded scenario
|
|
127
|
+
def get_channels
|
|
128
|
+
response = @http.get("session/scenario/channels")
|
|
129
|
+
msg response, Logger::DEBUG
|
|
130
|
+
return response
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# sets the channel elements of the loaded scenario
|
|
134
|
+
# * roles = an array of the roles defined for the channels in the scenario ('channel')
|
|
135
|
+
# * names = an array of host names to be mapped to the roles
|
|
136
|
+
def set_channels(roles=[], names=[])
|
|
137
|
+
responses = Array.new
|
|
138
|
+
roles.length.times do | i |
|
|
139
|
+
response = @http.post("session/scenario/channels/#{roles[i]}/#{names[i]}")
|
|
140
|
+
responses << response
|
|
141
|
+
end
|
|
142
|
+
msg responses, Logger::DEBUG
|
|
143
|
+
return responses
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# returns the options from the loaded scenario
|
|
147
|
+
def get_options
|
|
148
|
+
response = @http.get("session/scenario/options")
|
|
149
|
+
msg response, Logger::DEBUG
|
|
150
|
+
return response
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# sets the options for the loaded scenario
|
|
154
|
+
# * an array of option names
|
|
155
|
+
# * an array of option values
|
|
156
|
+
def set_options(names=[], values=[])
|
|
157
|
+
responses = Array.new
|
|
158
|
+
names.length.times do | i |
|
|
159
|
+
response = @http.post("session/scenario/options/#{names[i]}/#{values[i]}")
|
|
160
|
+
responses << response
|
|
161
|
+
end
|
|
162
|
+
msg responses, Logger::DEBUG
|
|
163
|
+
return responses
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# collects results until the test is done or the timeout expires
|
|
167
|
+
# * timeout = time in seconds to wait for the test to complete
|
|
168
|
+
def collect_results(timeout=120)
|
|
169
|
+
wait_until_done(timeout)
|
|
170
|
+
results = get_testset_results
|
|
171
|
+
return results
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# waits until the test is done or the timeout expires
|
|
175
|
+
# * timeout = the time in seconds to wait for the test to complete
|
|
176
|
+
def wait_until_done(timeout=120)
|
|
177
|
+
finished = false
|
|
178
|
+
interval = timeout / 10
|
|
179
|
+
10.times do
|
|
180
|
+
begin
|
|
181
|
+
response = get_testset_status
|
|
182
|
+
#msg "wait_until_done, response = #{response}", Logger::DEBUG
|
|
183
|
+
if !response.nil?
|
|
184
|
+
if response.to_s.include?("Done")
|
|
185
|
+
finished = true
|
|
186
|
+
return finished
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
rescue Exception => e
|
|
190
|
+
puts e, Logger::DEBUG # status may not be ready right away. may return a 500
|
|
191
|
+
end
|
|
192
|
+
sleep interval
|
|
193
|
+
end
|
|
194
|
+
return finished
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# returns the status of a running test set
|
|
198
|
+
def get_testset_status
|
|
199
|
+
response = @http.get("session/test/runSuite/status")
|
|
200
|
+
msg response, Logger::DEBUG
|
|
201
|
+
return response
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# returns the results of a running test set. can be called repeatedly.
|
|
205
|
+
# the test is done when the results include the 'END' keyword
|
|
206
|
+
def get_testset_results
|
|
207
|
+
response = @http.get("session/test/runSuite/results")
|
|
208
|
+
msg response, Logger::DEBUG
|
|
209
|
+
return response
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# exports a testset to a csv file
|
|
213
|
+
# * uuid = the uuid of the testset to export
|
|
214
|
+
def csv_export(uuid=@testset)
|
|
215
|
+
response = @http.post("session/test/export/csv/#{uuid}")
|
|
216
|
+
msg response, Logger::DEBUG
|
|
217
|
+
return response
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# imports a csv file to the Mu
|
|
222
|
+
# * filepath = the path to the csv file
|
|
223
|
+
def csv_import(filepath)
|
|
224
|
+
return "new_session required" if $cookie.nil? or $cookie["testSessionId"].nil?
|
|
225
|
+
testSessionId = $cookie["testSessionId"]
|
|
226
|
+
response = @http.post_form("session/test/import/csv?testSessionId=#{testSessionId}", filepath)
|
|
227
|
+
msg response, Logger::DEBUG
|
|
228
|
+
return response
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class Mu
|
|
2
|
+
class Homepage
|
|
3
|
+
include Helper
|
|
4
|
+
|
|
5
|
+
attr_accessor :host, :docroot, :cookie, :username, :password, :session_id, :results, :posted_uuid, :testsuite, :results, :failed, :errors
|
|
6
|
+
|
|
7
|
+
def initialize(host=ENV['MU_IP'], username=ENV['MU_ADMIN_USER'], password=ENV['MU_ADMIN_PASS'])
|
|
8
|
+
@host = host
|
|
9
|
+
@username = username
|
|
10
|
+
@password = password
|
|
11
|
+
@docroot = "/api/v5/homepage/"
|
|
12
|
+
@cookie = ""
|
|
13
|
+
@response = nil
|
|
14
|
+
@http = HttpHelper.new(@host, @username, @password, @docroot)
|
|
15
|
+
msg "Created Homepage object to :#{@host}", Logger::DEBUG
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# returns all homepage elements
|
|
19
|
+
def all
|
|
20
|
+
response = @http.get("all/")
|
|
21
|
+
msg response, Logger::DEBUG
|
|
22
|
+
return response
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# returns recent homepage activity
|
|
26
|
+
def recent
|
|
27
|
+
response = @http.get("recent/")
|
|
28
|
+
msg response, Logger::DEBUG
|
|
29
|
+
return response
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# returns homepage status
|
|
33
|
+
def status
|
|
34
|
+
response = @http.get("status/")
|
|
35
|
+
msg response, Logger::DEBUG
|
|
36
|
+
return response
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# returns the latest test
|
|
40
|
+
def latest_test
|
|
41
|
+
response = @http.get("test/latest/")
|
|
42
|
+
msg response, Logger::DEBUG
|
|
43
|
+
return response
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# returns queued tests
|
|
47
|
+
def queue_test
|
|
48
|
+
response = @http.get("test/queue/")
|
|
49
|
+
msg response, Logger::DEBUG
|
|
50
|
+
return response
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
end # Mu
|
data/lib/mu/api/muapi.rb
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
class Mu
|
|
2
|
+
class Muapi
|
|
3
|
+
include Helper
|
|
4
|
+
|
|
5
|
+
attr_accessor :host, :docroot, :posted_uuid, :run_uuid, :job_id, :username, :password, :params, :expected_error
|
|
6
|
+
|
|
7
|
+
def initialize(host=ENV['MU_IP'], username=ENV['MU_ADMIN_USER'], password=ENV['MU_ADMIN_PASS'])
|
|
8
|
+
@host = host
|
|
9
|
+
@username = username
|
|
10
|
+
@password = password
|
|
11
|
+
@docroot = "/api/v3/"
|
|
12
|
+
@params = nil
|
|
13
|
+
@expected_error = nil
|
|
14
|
+
@http = HttpHelper.new(@host, @username, @password, @docroot)
|
|
15
|
+
msg "Created Mu Api object to :#{@host}", Logger::DEBUG
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# lists the statuses of tests
|
|
19
|
+
# * status = the status type, such as 'running' or 'failed'
|
|
20
|
+
def list_by_status(status="")
|
|
21
|
+
uuid_list = Array.new()
|
|
22
|
+
if !status.empty?
|
|
23
|
+
doc = @http.get_xml("analysis/list?status=#{status}")
|
|
24
|
+
else
|
|
25
|
+
doc = @http.get_xml("analysis/list")
|
|
26
|
+
end
|
|
27
|
+
unless doc.xpath("//analysis").empty?
|
|
28
|
+
doc.xpath('//analysis').each { |e| uuid_list << e.attribute('uuid') }
|
|
29
|
+
end
|
|
30
|
+
return uuid_list
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# returns the status of a test
|
|
34
|
+
# * uuid = the uuid of the test
|
|
35
|
+
def status(uuid=@run_uuid)
|
|
36
|
+
doc = @http.get_xml("analysis/status?uuid=#{uuid}")
|
|
37
|
+
return nil if doc.nil?
|
|
38
|
+
unless doc.xpath("//analysis").empty?
|
|
39
|
+
status = doc.xpath("//status")[0].text
|
|
40
|
+
return status
|
|
41
|
+
end
|
|
42
|
+
return doc
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# starts a test
|
|
46
|
+
# * uuid = the uuid of the test
|
|
47
|
+
def run(uuid, rename="")
|
|
48
|
+
req = "analysis/run?uuid=#{uuid}"
|
|
49
|
+
unless rename.empty?
|
|
50
|
+
req = "#{req}&rename=#{rename}"
|
|
51
|
+
end
|
|
52
|
+
doc = @http.get_xml(req)
|
|
53
|
+
unless doc.xpath("//analysis").empty?
|
|
54
|
+
@run_uuid = doc.xpath("//analysis")[0].attribute('uuid')
|
|
55
|
+
return @run_uuid
|
|
56
|
+
end
|
|
57
|
+
return @run_uuid
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# stops a running test
|
|
61
|
+
# * uuid = the uuid of the test
|
|
62
|
+
def stop(uuid=@run_uuid)
|
|
63
|
+
doc = @http.get_xml("analysis/stop?uuid=#{uuid}")
|
|
64
|
+
unless doc.xpath("//analysis").empty?
|
|
65
|
+
status = doc.xpath("//analysis")[0].attribute('status')
|
|
66
|
+
return status
|
|
67
|
+
end
|
|
68
|
+
return false
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# pauses a running test
|
|
72
|
+
# * uuid = the uuid of the test
|
|
73
|
+
def pause(uuid=@run_uuid)
|
|
74
|
+
doc = @http.get_xml("analysis/pause?uuid=#{uuid}")
|
|
75
|
+
unless doc.xpath("//analysis").empty?
|
|
76
|
+
status = doc.xpath("//analysis")[0].attribute('status')
|
|
77
|
+
return status
|
|
78
|
+
end
|
|
79
|
+
return false
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# resumes a suspended test
|
|
83
|
+
# * uuid = the uuid of the test
|
|
84
|
+
def resume(uuid=@run_uuid)
|
|
85
|
+
doc = @http.get_xml("analysis/resume?uuid=#{uuid}")
|
|
86
|
+
unless doc.xpath("//analysis").empty?
|
|
87
|
+
status = doc.xpath("//analysis")[0].attribute('status')
|
|
88
|
+
return status
|
|
89
|
+
end
|
|
90
|
+
return false
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# deletes the specified test
|
|
94
|
+
# * uuid = the uuid of the test
|
|
95
|
+
def delete(uuid=@run_uuid)
|
|
96
|
+
doc = @http.get_xml("analysis/delete?uuid=#{uuid}")
|
|
97
|
+
unless doc.xpath("//analysis").empty?
|
|
98
|
+
status = doc.xpath("//analysis")[0].attribute('status')
|
|
99
|
+
return status
|
|
100
|
+
end
|
|
101
|
+
return true
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# returns a list of faults from the specified test
|
|
105
|
+
# * uuid = the uuid of the test
|
|
106
|
+
def get_faults(uuid=@run_uuid)
|
|
107
|
+
doc = @http.get_xml("templates/export?uuid=#{uuid}")
|
|
108
|
+
unless doc.xpath("//analysis").empty?
|
|
109
|
+
faults = get_xml("analysis/getFaultList?uuid=#{uuid}",true)
|
|
110
|
+
return faults
|
|
111
|
+
end
|
|
112
|
+
return "error: no analysis with uuid: #{uuid} found"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# returns the name of an test
|
|
116
|
+
# * uuid = the uuid of the test
|
|
117
|
+
def get_name(uuid=@run_uuid)
|
|
118
|
+
doc = @http.get_xml("templates/export?uuid=#{uuid}")
|
|
119
|
+
unless doc.xpath("//analysis").empty?
|
|
120
|
+
return doc.xpath("//analysis")[0].attribute('name')
|
|
121
|
+
end
|
|
122
|
+
return
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# lists the templates on the Mu system using the template type and template name:
|
|
126
|
+
# * type = the template type, such as 'scenario' or 'monitor'
|
|
127
|
+
def list(type)
|
|
128
|
+
names = Array.new
|
|
129
|
+
doc = @http.get_xml("templates/list?type=#{type}")
|
|
130
|
+
doc.xpath("//templates/*").each {|a| names << a.attribute('name') }
|
|
131
|
+
return names
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# lists the types of templates on the Mu system
|
|
135
|
+
def types
|
|
136
|
+
doc = @http.get("templates/types?")
|
|
137
|
+
return doc
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# exports a template from the Mu system using the template type and template name
|
|
141
|
+
# * name = the template name
|
|
142
|
+
def export_by_type_and_name(type, name)
|
|
143
|
+
return @http.get_xml("templates/export?type=#{type}&name=#{name}")
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# exports a template from the Mu system using the template uuid
|
|
147
|
+
# * uuid = the template uuid
|
|
148
|
+
def export_by_uuid(uuid)
|
|
149
|
+
return @http.get_xml("templates/export?uuid=#{uuid}")
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# performs archive operations
|
|
153
|
+
# * command=run to create a test archive
|
|
154
|
+
# * command=status to view the status of a test archive job
|
|
155
|
+
# * command=get to download a test archive job
|
|
156
|
+
# * uuid = the uuid of the test
|
|
157
|
+
def archive(command="run", id=@run_uuid)
|
|
158
|
+
case command
|
|
159
|
+
when 'run'
|
|
160
|
+
request_string = "archive/run?uuid=#{id}"
|
|
161
|
+
request_string += @params unless @params.nil?
|
|
162
|
+
doc = @http.get_xml(request_string)
|
|
163
|
+
unless doc.xpath("//job").empty?
|
|
164
|
+
@job_id = doc.xpath("//job")[0].attribute('id')
|
|
165
|
+
msg "job_id = #{@job_id}"
|
|
166
|
+
return @job_id
|
|
167
|
+
end
|
|
168
|
+
return doc
|
|
169
|
+
when 'status'
|
|
170
|
+
doc = @http.get("archive/status?jobId=#{id}")
|
|
171
|
+
return doc
|
|
172
|
+
when 'get'
|
|
173
|
+
file_size = @http.download_file("archive/get?jobId=#{id}","#{id}.zip")
|
|
174
|
+
return "#{id}.zip file size = #{file_size}"
|
|
175
|
+
end
|
|
176
|
+
return false
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# performs backup operations
|
|
180
|
+
# * command=run to create a system backup file.
|
|
181
|
+
# * command=status to view the status of a backup job. If no backup job is running, gets the date of the most recent backup.
|
|
182
|
+
# * command=get to retrieve the backup file
|
|
183
|
+
# * name = backup file name
|
|
184
|
+
def backup(command="run", name="")
|
|
185
|
+
case command
|
|
186
|
+
when 'run'
|
|
187
|
+
doc = @http.get_xml("backup/run")
|
|
188
|
+
unless doc.xpath("//job").empty?
|
|
189
|
+
@job_id = doc.xpath("//job")[0].attribute('id')
|
|
190
|
+
msg "job_id = #{@job_id}"
|
|
191
|
+
return @job_id
|
|
192
|
+
end
|
|
193
|
+
return doc
|
|
194
|
+
when 'status'
|
|
195
|
+
doc = @http.get("backup/status")
|
|
196
|
+
return doc
|
|
197
|
+
when 'get'
|
|
198
|
+
file_size = @http.download_file("backup/get","#{name}.dat")
|
|
199
|
+
return "#{name}.dat file size = #{file_size}"
|
|
200
|
+
end
|
|
201
|
+
return false
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# packet capture operations
|
|
205
|
+
# * command=run to start capturing packets on the specified Mu appliance port
|
|
206
|
+
# * command=status tp view the status of packet capture activity
|
|
207
|
+
# * command=get to download the pcap file generated during packet capture
|
|
208
|
+
# * port = the Mu appliance port
|
|
209
|
+
# * id = job_id for status and get commands
|
|
210
|
+
def capture(command='run', port='a1', id=@job_id)
|
|
211
|
+
case command
|
|
212
|
+
when 'run'
|
|
213
|
+
doc = @http.get_xml("capture/run?port=#{port}")
|
|
214
|
+
unless doc.xpath("//job").empty?
|
|
215
|
+
@job_id = doc.xpath("//job")[0].attribute('id')
|
|
216
|
+
msg "job_id = #{@job_id}"
|
|
217
|
+
return @job_id
|
|
218
|
+
end
|
|
219
|
+
return doc
|
|
220
|
+
when 'status'
|
|
221
|
+
doc = @http.get("capture/status?jobId=#{id}")
|
|
222
|
+
return doc
|
|
223
|
+
when 'get'
|
|
224
|
+
file_size = @http.download_file("capture/get?jobId=#{id}","#{id}.pcap")
|
|
225
|
+
return "#{id}.pcap file size = #{file_size}"
|
|
226
|
+
end
|
|
227
|
+
return false
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
end
|
|
231
|
+
end # Mu
|