203 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			203 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "json"
 | |
| require "httpclient"
 | |
| require "./config"
 | |
| 
 | |
| class DevopsTest
 | |
| 
 | |
|   attr_accessor :password, :response, :host
 | |
|   attr_reader :username
 | |
| 
 | |
|   def initialize
 | |
|     puts_head " #{self.title} ".center(80, "=")
 | |
|     self.host = HOST
 | |
| #    self.username = USERNAME
 | |
| #    self.password = PASSWORD
 | |
|   end
 | |
| 
 | |
|   def submit
 | |
|     http = HTTPClient.new
 | |
|     http.receive_timeout = 0
 | |
|     http.send_timeout = 0
 | |
|     http.set_auth(nil, self.username, self.password)
 | |
|     self.response = yield http
 | |
|     self.response.body
 | |
|   end
 | |
| 
 | |
|   def username= user
 | |
|     @username = user
 | |
|     self.password = if user == ROOTUSER
 | |
|       ROOTPASS
 | |
|     else
 | |
|       PASSWORD
 | |
|     end
 | |
|     puts_warn(" - User: " + @username + " - ")
 | |
|   end
 | |
| 
 | |
|   def all_privileges
 | |
|     self.username = USERNAME
 | |
|   end
 | |
| 
 | |
|   def read_only_privileges
 | |
|     self.username = USERNAME + "_r"
 | |
|   end
 | |
| 
 | |
|   def write_only_privileges
 | |
|     self.username = USERNAME + "_w"
 | |
|   end
 | |
| 
 | |
|   def empty_privileges
 | |
|     self.username = USERNAME + "_"
 | |
|   end
 | |
| 
 | |
|   def get path, params={}, headers={}
 | |
|     url = create_url(path)
 | |
|     m = "GET #{url.path.ljust(30)}"
 | |
|     m += " HEADERS(#{headers.map{|k,v| "#{k}: #{v}" }.join(", ")})" unless headers.empty?
 | |
|     print m.ljust(99)
 | |
|     submit do |http|
 | |
|       http.get(url, convert_params(params), headers)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def post path, params={}, headers={}
 | |
|     url = create_url(path)
 | |
|     m = "POST #{url.path.ljust(30)}"
 | |
|     m += " HEADERS(#{headers.map{|k,v| "#{k}: #{v}" }.join(", ")})" unless headers.empty?
 | |
|     print m.ljust(99)
 | |
|     submit do |http|
 | |
|       http.post(url, params.to_json, headers)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def send_post path, params={}, headers={}, status=200
 | |
|     self.post path, params, headers
 | |
|     self.check_status status
 | |
|     self.check_json_response
 | |
|   end
 | |
| 
 | |
|   def delete path, params={}, headers={}
 | |
|     url = create_url(path)
 | |
|     m = "DELETE #{url.path.ljust(30)}"
 | |
|     m += " HEADERS(#{headers.map{|k,v| "#{k}: #{v}" }.join(", ")})" unless headers.empty?
 | |
|     print m.ljust(99)
 | |
|     b = (params.nil? ? nil : params.to_json)
 | |
|     submit do |http|
 | |
|       http.delete(url, b, headers)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def send_delete path, params={}, headers={}, status=200
 | |
|     self.delete path, params, headers
 | |
|     self.check_status status
 | |
|     self.check_json_response
 | |
|   end
 | |
| 
 | |
|   def post_chunk path, params={}, headers={}
 | |
|     url = create_url(path)
 | |
|     m = "POST #{url.path.ljust(30)}"
 | |
|     m += " HEADERS(#{headers.map{|k,v| "#{k}: #{v}" }.join(", ")})" unless headers.empty?
 | |
|     print m.ljust(99)
 | |
|     submit do |http|
 | |
|       http.post(url, params.to_json, headers) do |c|
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def send_put path, params={}, headers={}, status=200
 | |
|     self.put path, params, headers
 | |
|     self.check_status status
 | |
|     self.check_json_response
 | |
|   end
 | |
| 
 | |
|   def put path, params={}, headers={}
 | |
|     url = create_url(path)
 | |
|     m = "PUT #{url.path.ljust(30)}"
 | |
|     m += " HEADERS(#{headers.map{|k,v| "#{k}: #{v}" }.join(", ")})" unless headers.empty?
 | |
|     print m.ljust(99)
 | |
|     submit do |http|
 | |
|       http.put(url, params.to_json, headers)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def check_status code
 | |
|     if self.response.status == code
 | |
|       self.puts_success
 | |
|     else
 | |
|       self.puts_error "STATUS: #{self.response.status}, but checked with '#{code}'"
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def check_json_response
 | |
|     return if self.response.status == 404
 | |
|     j = begin
 | |
|       JSON.parse(self.response.body)
 | |
|     rescue
 | |
|       self.puts_error "Invalid json, response body: '#{self.response.body}'"
 | |
|     end
 | |
|     self.puts_error "Response in Json format, but without parameter 'message'" unless j.key?("message")
 | |
|   end
 | |
| 
 | |
|   def check_type type
 | |
|     res = self.response
 | |
|     if res.ok?
 | |
|       case type
 | |
|       when :json
 | |
|         puts_error("Invalid content-type '#{res.contenttype}'") unless res.contenttype.include?("application/json")
 | |
|       else
 | |
|         puts_error("Unknown type '#{type}'")
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def puts_head str
 | |
|     puts "\e[31m#{str}\e[0m"
 | |
|   end
 | |
| 
 | |
|   def puts_error str
 | |
|     puts "\t\e[31m#{str}\e[0m"
 | |
|     raise str
 | |
|   end
 | |
| 
 | |
|   def puts_warn str
 | |
|     puts "\t\e[33m#{str}\e[0m"
 | |
|   end
 | |
| 
 | |
|   def puts_success str="success"
 | |
|     puts "\t\e[32m#{str}\e[0m"
 | |
|   end
 | |
| 
 | |
| private
 | |
|   def create_url path
 | |
|     path = "/" + path unless path.start_with? "/"
 | |
|     URI.join("http://" + self.host, "v2.0" + path)
 | |
|   end
 | |
| 
 | |
|   def convert_params params
 | |
|     return nil if params.nil? or params.empty?
 | |
|     params_filter(params).join("&")
 | |
|   end
 | |
| 
 | |
|   def params_filter params
 | |
|     r = []
 | |
|     return params if params.kind_of?(String)
 | |
|     params.each do |k,v|
 | |
|       key = k.to_s
 | |
|       if v.kind_of?(Array)
 | |
|         v.each do |val|
 | |
|           r.push "#{key}[]=#{val}"
 | |
|         end
 | |
|       elsif v.kind_of?(Hash)
 | |
|         buf = {}
 | |
|         v.each do |k1,v1|
 | |
|           buf["#{key}[#{k1}]"] = v1
 | |
|         end
 | |
|         r = r + params_filter(buf)
 | |
|       else
 | |
|         r.push "#{key}=#{v}"
 | |
|       end
 | |
|     end
 | |
|     r
 | |
|   end
 | |
| 
 | |
| end
 | 
