285 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			285 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | require "./base_test" | ||
|  | require "json" | ||
|  | 
 | ||
|  | class CreateServer < BaseTest | ||
|  |   TITLE = "Create server tests. " | ||
|  | 
 | ||
|  |   def run | ||
|  |     openstack = { | ||
|  |       :name => "openstack", | ||
|  |       :image => "36dc7618-4178-4e29-be43-286fbfe90f50", | ||
|  |       :flavor => "m1.small", | ||
|  |       :ssh_user => "root", | ||
|  |       :server_name => "test_create_server_openstack", | ||
|  |       :states => {:pause => "PAUSED", :unpause => "ACTIVE"} | ||
|  |     } | ||
|  |     ec2 = { | ||
|  |       :name => "ec2", | ||
|  |       :image => "ami-83e4bcea", | ||
|  |       :flavor => "m1.small", | ||
|  |       :ssh_user => "ec2-user", | ||
|  |       :server_name => "test_create_server_ec2", | ||
|  |       :states => {:pause => "stopped", :unpause => "running"} | ||
|  |     } | ||
|  | 
 | ||
|  |     project = { | ||
|  |       "name" => "project_test", | ||
|  |       "deploy_envs" => [ | ||
|  |         { | ||
|  |           "flavor" => openstack[:flavor], | ||
|  |           "groups" => [ | ||
|  |             "default" | ||
|  |           ], | ||
|  |           "identifier" =>  "openstack", | ||
|  |           "image" => openstack[:image], | ||
|  |           "provider" => "openstack", | ||
|  |           "run_list" => [ | ||
|  |             "role[project_test_openstack]" | ||
|  |           ], | ||
|  |           "subnets" => [ "private" ], | ||
|  |           "users" => [ "user_for_testing" ], | ||
|  |           "expires" => nil | ||
|  |         }, | ||
|  |         { | ||
|  |           "flavor" => ec2[:flavor], | ||
|  |           "groups" => [ | ||
|  |             "default" | ||
|  |           ], | ||
|  |           "identifier" => "ec2", | ||
|  |           "image" => ec2[:image], | ||
|  |           "provider" => "ec2", | ||
|  |           "run_list" => [ | ||
|  |             "role[project_test_ec2]" | ||
|  |           ], | ||
|  |           "subnets" => [], | ||
|  |           "users" => [ "user_for_testing" ], | ||
|  |           "expires" => nil | ||
|  |         } | ||
|  | 
 | ||
|  |       ] | ||
|  |     } | ||
|  | 
 | ||
|  |     self.config = CONFIGS[0] | ||
|  | 
 | ||
|  |     prepare openstack | ||
|  |     prepare ec2 | ||
|  | 
 | ||
|  |     env_os = project["deploy_envs"][0] | ||
|  |     env_ec2 = project["deploy_envs"][1] | ||
|  |     self.title = TITLE + "Create project '#{project["name"]}'" | ||
|  |     run_tests [ | ||
|  |       "project create #{project["name"]} --groups #{env_os["groups"].join(",")} --deploy_env #{env_os["identifier"]} --subnets #{env_os["subnets"].join(",")} --flavor #{env_os["flavor"]} --image #{env_os["image"]} --run_list role[#{project["name"]}_#{env_os["identifier"]}] --users #{env_os["users"].join(",")} --provider openstack -y --no_expires", | ||
|  |       "project create #{project["name"]} --groups #{env_ec2["groups"].join(",")} --deploy_env #{env_ec2["identifier"]} --flavor #{env_ec2["flavor"]} --image #{env_ec2["image"]} --run_list role[#{project["name"]}_#{env_ec2["identifier"]}] --users #{env_ec2["users"].join(",")} --provider ec2 -y --no_expires" | ||
|  |     ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Project list" | ||
|  |     run_test_with_block "project list --format json" do |l| | ||
|  |       projects = JSON.parse(l) | ||
|  |       projects.include? project["name"] | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Show project '#{project["name"]}'" | ||
|  |     run_test_with_block "project show #{project["name"]} --format json" do |p| | ||
|  |       pr = JSON.parse(p) | ||
|  |       name = (project["name"] == pr["name"]) | ||
|  |       envs = (project["deploy_envs"].size == pr["deploy_envs"].size) | ||
|  |       o = pr["deploy_envs"].detect{|e| e["identifier"] == "openstack"} | ||
|  |       po = project["deploy_envs"][0] | ||
|  |       e = pr["deploy_envs"].detect{|e| e["identifier"] == "ec2"} | ||
|  |       pe = project["deploy_envs"][1] | ||
|  |       unless name | ||
|  |         puts "Project name is not a '#{project["name"]}'" | ||
|  |       end | ||
|  |       unless envs | ||
|  |         puts "Project environments not equals #{project["deploy_envs"].size}" | ||
|  |       end | ||
|  |       name and envs and check_envs(po, o) and check_envs(pe, e) | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Add user 'root' to project '#{project["name"]}'" | ||
|  |     run_tests [ "project user add #{project["name"]} root" ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Show project '#{project["name"]}' with user 'root'" | ||
|  |     run_test_with_block "project show #{project["name"]} --format json" do |p| | ||
|  |       pr = JSON.parse(p) | ||
|  |       envs = true | ||
|  |       pr["deploy_envs"].each {|e| envs = (envs and e["users"].include?("root"))} | ||
|  |       envs | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Delete user 'root' from project '#{project["name"]}'" | ||
|  |     run_tests [ "project user delete #{project["name"]} root -y" ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Show project '#{project["name"]}' without user 'root'" | ||
|  |     run_test_with_block "project show #{project["name"]} --format json" do |p| | ||
|  |       pr = JSON.parse(p) | ||
|  |       envs = true | ||
|  |       pr["deploy_envs"].each {|e| envs = (envs and !e["users"].include?("root"))} | ||
|  |       envs | ||
|  |     end | ||
|  | 
 | ||
|  |     create_server project["name"], env_os["identifier"], openstack | ||
|  |     create_server project["name"], env_ec2["identifier"], ec2 | ||
|  | 
 | ||
|  |     self.title = TITLE + "Delete project '#{project["name"]}'" | ||
|  |     run_tests [ "project delete #{project["name"]} -y" ] | ||
|  | 
 | ||
|  |     clear openstack | ||
|  |     clear ec2 | ||
|  | 
 | ||
|  |   end | ||
|  | 
 | ||
|  |   def check_envs origin, created | ||
|  |     r = true | ||
|  |     %w(flavor groups identifier image provider run_list subnets users expires).each do |key| | ||
|  |       flag = (origin[key] == created[key]) | ||
|  |       unless flag | ||
|  |         puts "Environments params '#{key}' not equals ('#{origin[key].inspect}' and '#{created[key].inspect}')" | ||
|  |       end | ||
|  |       r = r and flag | ||
|  |     end | ||
|  |     r | ||
|  |   end | ||
|  | 
 | ||
|  |   def prepare conf | ||
|  |     name = conf[:name] | ||
|  |     self.title = TITLE + "Check #{name} flavor" | ||
|  |     run_test_with_block "flavor list #{name} --format json" do |f| | ||
|  |       flavors = JSON.parse(f) | ||
|  |       !flavors.detect{|o| o["id"] == conf[:flavor]}.nil? | ||
|  |     end | ||
|  | 
 | ||
|  |     image_in_filter = false | ||
|  |     self.title = TITLE + "Check #{name} filter" | ||
|  |     run_test_with_block "filter image list #{name} --format json" do |i| | ||
|  |       images = JSON.parse(i) | ||
|  |       image_in_filter = !images.index(conf[:image]).nil? | ||
|  |       true | ||
|  |     end | ||
|  | 
 | ||
|  |     if image_in_filter | ||
|  |       puts_warn "Image '#{conf[:image]}' for '#{name}' already in filter" | ||
|  |     else | ||
|  |       self.title = TITLE + "Add #{name} filter" | ||
|  |       run_tests [ "filter image add #{name} #{conf[:image]}" ] | ||
|  |     end | ||
|  | 
 | ||
|  |     image_created = false | ||
|  |     self.title = TITLE + "Check image for #{name}" | ||
|  |     run_test_with_block "image list #{name} --format json" do |s| | ||
|  |       images = JSON.parse s | ||
|  |       image_created = !images.detect{|i| i["id"] == conf[:image]}.nil? | ||
|  |       true | ||
|  |     end | ||
|  | 
 | ||
|  |     if image_created | ||
|  |       puts_warn "Image '#{conf[:image]}' for '#{name}' already created" | ||
|  |     else | ||
|  |       self.title = TITLE + "Create image for #{name}" | ||
|  |       run_tests [ "image create --image #{conf[:image]} --ssh_user #{conf[:ssh_user]} --provider #{name} --no_bootstrap_template -y" ] | ||
|  |     end | ||
|  | 
 | ||
|  |   end | ||
|  | 
 | ||
|  |   def create_server project, env, conf | ||
|  | 
 | ||
|  |     self.title = TITLE + "Create server '#{conf[:server_name]}'" | ||
|  |     run_tests [ "server create #{project} #{env} -N #{conf[:server_name]}" ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Is server '#{conf[:server_name]}' created" | ||
|  |     run_test_with_block "server list --format json" do |l| | ||
|  |       servers = JSON.parse l | ||
|  |       !servers.detect{|s| s["chef_node_name"] == conf[:server_name].to_s }.nil? | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Pause server '#{conf[:server_name]}'" | ||
|  |     run_tests [ "server pause #{conf[:server_name]}" ] | ||
|  |     delay = (conf[:name] == "openstack" ? 5 : 90) | ||
|  |     puts "Sleeping for #{delay} seconds" | ||
|  |     sleep(delay) | ||
|  | 
 | ||
|  |     self.title = TITLE + "Check server '#{conf[:server_name]}' state" | ||
|  |     run_test_with_block "server list #{conf[:name]} --format json" do |s| | ||
|  |       servers = JSON.parse s | ||
|  |       state = servers.detect{|o| o["name"] == conf[:server_name]}["state"] | ||
|  |       if state == conf[:states][:pause] | ||
|  |         true | ||
|  |       else | ||
|  |         puts_error "State should be '#{conf[:states][:pause]}' but it is '#{state}'" | ||
|  |         false | ||
|  |       end | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Unpause server '#{conf[:server_name]}'" | ||
|  |     run_tests [ "server unpause #{conf[:server_name]}" ] | ||
|  |     delay = (conf[:name] == "openstack" ? 5 : 90) | ||
|  |     puts "Sleeping for #{delay} seconds" | ||
|  |     sleep(delay) | ||
|  | 
 | ||
|  |     self.title = TITLE + "Check server '#{conf[:server_name]}' state" | ||
|  |     run_test_with_block "server list #{conf[:name]} --format json" do |s| | ||
|  |       servers = JSON.parse s | ||
|  |       state = servers.detect{|o| o["name"] == conf[:server_name]}["state"] | ||
|  |       if state == conf[:states][:unpause] | ||
|  |         true | ||
|  |       else | ||
|  |         puts_error "State should be '#{conf[:states][:unpause]}' but it is '#{state}'" | ||
|  |         false | ||
|  |       end | ||
|  |     end | ||
|  | 
 | ||
|  |     tag = "tag_" + conf[:name] | ||
|  |     self.title = TITLE + "Add tag '#{tag}' to server '#{conf[:server_name]}'" | ||
|  |     run_tests [ | ||
|  |       "tag create #{conf[:server_name]} #{tag}", | ||
|  |       "tag create #{conf[:server_name]} #{tag}" | ||
|  |     ] | ||
|  |     self.title = TITLE + "Check tag '#{tag}' for server '#{conf[:server_name]}'" | ||
|  |     run_test_with_block "tag list #{conf[:server_name]} --format json" do |t| | ||
|  |       JSON.parse(t).include?(tag) | ||
|  |     end | ||
|  | 
 | ||
|  |     tag2 = tag + "_2" | ||
|  |     self.title = TITLE + "Check deploy with tag '#{tag2}' for server '#{conf[:server_name]}'" | ||
|  |     run_tests ["deploy #{conf[:server_name]} -t #{tag2}"] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Check tag '#{tag}' for server '#{conf[:server_name]}'" | ||
|  |     run_test_with_block "tag list #{conf[:server_name]} --format json" do |t| | ||
|  |       JSON.parse(t).include?(tag) | ||
|  |       !JSON.parse(t).include?(tag2) | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Delete tag '#{tag}' from server '#{conf[:server_name]}'" | ||
|  |     run_tests [ | ||
|  |       "tag delete #{conf[:server_name]} #{tag} -y", | ||
|  |       "tag delete #{conf[:server_name]} #{tag} -y" | ||
|  |     ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Delete server '#{conf[:server_name]}'" | ||
|  |     run_tests [ "server delete #{conf[:server_name]} -y" ] | ||
|  | 
 | ||
|  |   end | ||
|  | 
 | ||
|  |   def clear conf | ||
|  |     name = conf[:name] | ||
|  |     self.title = TITLE + "Delete image for #{name}" | ||
|  |     run_tests [ "image delete #{conf[:image]} -y" ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Check image for #{name}" | ||
|  |     run_test_with_block "image list #{name} --format json" do |s| | ||
|  |       images = JSON.parse s | ||
|  |       images.detect{|i| i["id"] == conf[:image]}.nil? | ||
|  |     end | ||
|  | 
 | ||
|  |     self.title = TITLE + "Delete #{name} filter" | ||
|  |     run_tests [ "filter image delete #{name} #{conf[:image]} -y" ] | ||
|  | 
 | ||
|  |     self.title = TITLE + "Check #{name} filter" | ||
|  |     run_test_with_block "filter image list #{name} --format json" do |i| | ||
|  |       images = JSON.parse(i) | ||
|  |       images.index(conf[:image]).nil? | ||
|  |     end | ||
|  |   end | ||
|  | 
 | ||
|  | end |