server, stack, project run_list

This commit is contained in:
amartynov 2015-08-04 12:36:10 +03:00
parent 168691340c
commit 9d7a2968dc
19 changed files with 188 additions and 50 deletions

View File

@ -95,14 +95,19 @@ module Devops
"Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users" "Users '#{users.join("', '")}' have been removed from '#{id}' project's authorized users"
end end
# TODO: multi project def set_project_run_list id
list = parser.run_list
project = Devops::Db.connector.project(id)
Devops::Db.connector.set_project_run_list id, list
"Updated project with run_list '#{list.inspect}'"
end
def set_project_env_run_list id, deploy_env def set_project_env_run_list id, deploy_env
list = parser.run_list list = parser.run_list
project = Devops::Db.connector.project(id) project = Devops::Db.connector.project(id)
env = project.deploy_env deploy_env env = project.deploy_env deploy_env
env.run_list = list Devops::Db.connector.set_project_env_run_list id, deploy_env, list
Devops::Db.connector.project_update project "Updated environment '#{env.identifier}' with run_list '#{list.inspect}' in project '#{project.id}'"
"Updated environment '#{env.identifier}' with run_list '#{env.run_list.inspect}' in project '#{project.id}'"
end end
def delete_project id def delete_project id

View File

@ -55,7 +55,7 @@ module Devops
def create_server_stream out, body def create_server_stream out, body
status = [] status = []
prepare_create_server(body).each do |s| prepare_create_server(body).each do |s|
res = create_server_proc.call(out, s, provider, Devops::Db.connector) res = create_server_proc.call(out, s, provider)
status.push res status.push res
end end
status status
@ -253,6 +253,13 @@ module Devops
yield s.id, provider yield s.id, provider
end end
def set_run_list node_name
s = get_server_by_key(node_name, parser.instance_key)
user = parser.current_user
Devops::Db.connector.check_project_auth s.project, s.deploy_env, user
Devops::Db.connector.set_server_run_list(s.id, parser.run_list)
end
def get_server_by_key id, key def get_server_by_key id, key
mongo = Devops::Db.connector mongo = Devops::Db.connector
key == "instance" ? mongo.server_by_instance_id(id) : mongo.server_by_chef_node_name(id) key == "instance" ? mongo.server_by_instance_id(id) : mongo.server_by_chef_node_name(id)

View File

@ -49,6 +49,10 @@ module Devops
stack = Devops::Db.connector.stack(id) stack = Devops::Db.connector.stack(id)
stack.resource(resource_id) stack.resource(resource_id)
end end
def set_run_list id
Devops::Db.connector.set_stack_run_list(id, parser.run_list)
end
end end
end end
end end

View File

@ -34,12 +34,14 @@ module Devops
body = create_object_from_json_body body = create_object_from_json_body
check_string(body["name"], "Parameter 'name' must be a not empty string") check_string(body["name"], "Parameter 'name' must be a not empty string")
check_array(body["deploy_envs"], "Parameter 'deploy_envs' must be a not empty array of objects", Hash) check_array(body["deploy_envs"], "Parameter 'deploy_envs' must be a not empty array of objects", Hash)
check_array(body["run_list"], "Parameter 'run_list' must be a not empty array of string", String, false, true)
Devops::Model::Project.new(body) Devops::Model::Project.new(body)
end end
def update def update
body = create_object_from_json_body body = create_object_from_json_body
check_array(body["deploy_envs"], "Parameter 'deploy_envs' must be a not empty array of objects", Hash) check_array(body["deploy_envs"], "Parameter 'deploy_envs' must be a not empty array of objects", Hash)
check_array(body["run_list"], "Parameter 'run_list' must be a not empty array of string", String, false, true)
Devops::Model::Project.new(body) Devops::Model::Project.new(body)
end end

View File

@ -35,6 +35,8 @@ module Devops
raise InvalidRecord.new("Parameter 'force' should be a null or true") unless force.nil? or force == true raise InvalidRecord.new("Parameter 'force' should be a null or true") unless force.nil? or force == true
groups = check_array(@body["groups"], "Parameter 'groups' should be null or not empty array of string", String, true) groups = check_array(@body["groups"], "Parameter 'groups' should be null or not empty array of string", String, true)
key_name = check_string(@body["key"], "Parameter 'key' should be null or not empty string", true) key_name = check_string(@body["key"], "Parameter 'key' should be null or not empty string", true)
rl = check_array(@body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true, true)
Validators::Helpers::RunList.new(rl).validate! unless rl.nil?
@body @body
end end
@ -43,10 +45,7 @@ module Devops
id = check_string(@body["instance_id"], "Parameter 'instance_id' must be a not empty string") id = check_string(@body["instance_id"], "Parameter 'instance_id' must be a not empty string")
name = check_string(@body["name"], "Parameter 'name' should be a not empty string", true) name = check_string(@body["name"], "Parameter 'name' should be a not empty string", true)
rl = check_array(@body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true) rl = check_array(@body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true)
unless rl.nil? Validators::Helpers::RunList.new(rl).validate! unless rl.nil?
validator = Validators::Helpers::RunList.new(rl)
halt_response(validator.message) unless validator.valid?
end
t = check_string(@body["bootstrap_template"], "Parameter 'bootstrap_template' should be a not empty string", true) t = check_string(@body["bootstrap_template"], "Parameter 'bootstrap_template' should be a not empty string", true)
@body @body
end end
@ -59,12 +58,21 @@ module Devops
remote_user = check_string(@body["remote_user"], "Parameter 'remote_user' must be a not empty string") remote_user = check_string(@body["remote_user"], "Parameter 'remote_user' must be a not empty string")
private_ip = check_string(@body["private_ip"], "Parameter 'private_ip' must be a not empty string") private_ip = check_string(@body["private_ip"], "Parameter 'private_ip' must be a not empty string")
public_ip = check_string(@body["public_ip"], "Parameter 'public_ip' should be a not empty string", true) public_ip = check_string(@body["public_ip"], "Parameter 'public_ip' should be a not empty string", true)
rl = check_array(@body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, true, true)
Validators::Helpers::RunList.new(rl).validate! unless rl.nil?
@body @body
end end
def tags def tags
@body ||= create_object_from_json_body @body ||= create_object_from_json_body
@body["tags"] check_param(@body["tags"], Hash, "Parameter 'tags' should be a hash", false, true)
end
def run_list
@body ||= create_object_from_json_body
rl = check_array(@body["run_list"], "Parameter 'run_list' should be a not empty array of string", String, false, true)
Validators::Helpers::RunList.new(rl).validate!
rl
end end
end end

View File

@ -6,7 +6,16 @@ module Devops
class StackParser < RequestParser class StackParser < RequestParser
def create def create
create_object_from_json_body body = create_object_from_json_body
list = check_array(body["run_list"], "Body must contains not empty array of strings", String, true, true)
Validators::Helpers::RunList.new(list).validate! unless list.nil?
body
end
def run_list
list = check_array(create_object_from_json_body(Array), "Body must contains not empty array of strings")
Validators::Helpers::RunList.new(list).validate!
list
end end
end end

View File

@ -295,10 +295,10 @@ module Devops
} }
app.multi_routes "/project/:id/user", {}, users_hash app.multi_routes "/project/:id/user", {}, users_hash
# Set run_list to project environment # Set run_list to project
# #
# * *Request* # * *Request*
# - method : PUT # - method : PATCH
# - headers : # - headers :
# - Accept: application/json # - Accept: application/json
# - Content-Type: application/json # - Content-Type: application/json
@ -310,7 +310,28 @@ module Devops
# #
# * *Returns* : # * *Returns* :
# 200 - Updated # 200 - Updated
app.put_with_headers "/project/:id/:env/run_list", :headers => [:accept, :content_type] do |project, deploy_env| app.patch_with_headers "/project/:id/run_list", :headers => [:accept, :content_type] do |project|
check_privileges("project", "w")
info = Devops::API2_0::Handler::Project.new(request).set_project_run_list(project)
create_response(info)
end
# Set run_list to project environment
#
# * *Request*
# - method : PATCH
# - headers :
# - Accept: application/json
# - Content-Type: application/json
# - body :
# [
# "role[role_1]",
# "recipe[recipe_1]"
# ]
#
# * *Returns* :
# 200 - Updated
app.patch_with_headers "/project/:id/:env/run_list", :headers => [:accept, :content_type] do |project, deploy_env|
check_privileges("project", "w") check_privileges("project", "w")
info = Devops::API2_0::Handler::Project.new(request).set_project_env_run_list(project, deploy_env) info = Devops::API2_0::Handler::Project.new(request).set_project_env_run_list(project, deploy_env)
create_response(info) create_response(info)

View File

@ -322,7 +322,7 @@ module Devops
hash["PUT"] = lambda {|id| hash["PUT"] = lambda {|id|
check_privileges("server", "w") check_privileges("server", "w")
Devops::API2_0::Handler::Server.new(request).set_tags(id) Devops::API2_0::Handler::Server.new(request).set_tags(id)
"Added" create_response("Added")
} }
# Delete devops server tags # Delete devops server tags
@ -342,10 +342,34 @@ module Devops
hash["DELETE"] = lambda {|id| hash["DELETE"] = lambda {|id|
check_privileges("server", "w") check_privileges("server", "w")
Devops::API2_0::Handler::Server.new(request).unset_tags(id) Devops::API2_0::Handler::Server.new(request).unset_tags(id)
"Deleted" create_response("Deleted")
} }
app.multi_routes "/server/:id/tags", {:headers => [:content_type]}, hash app.multi_routes "/server/:id/tags", {:headers => [:content_type]}, hash
# Set run_list to server
#
# * *Request*
# - method : PATCH
# - headers :
# - Accept: application/json
# - Content-Type: application/json
# - body :
# {
# "run_list": [
# "role[role_1]",
# "recipe[recipe_1]"
# ],
# "key": "instance", -> search server by instance_id rather then chef_node_name
# }
#
# * *Returns* :
# 200 - Updated
app.patch_with_headers "/server/:id/run_list", :headers => [:accept, :content_type] do |node_name|
check_privileges("server", "w")
Devops::API2_0::Handler::Server.new(request).set_server_run_list(node_name)
create_response("Run list has been changed")
end
puts "Server routes initialized" puts "Server routes initialized"
end end

View File

@ -51,6 +51,28 @@ module Devops
json Devops::API2_0::Handler::Stack.new(request).resource(stack_id, resource_id) json Devops::API2_0::Handler::Stack.new(request).resource(stack_id, resource_id)
end end
# Set run_list to stack
#
# * *Request*
# - method : PATCH
# - headers :
# - Accept: application/json
# - Content-Type: application/json
# - body :
# [
# "role[role_1]",
# "recipe[recipe_1]"
# ]
#
# * *Returns* :
# 200 - Updated
app.patch_with_headers "/stack/:id/run_list", :headers => [:accept, :content_type] do |id|
check_privileges("stack", "w")
info = Devops::API2_0::Handler::Stack.new(request).set_run_list(id)
create_response(info)
end
puts "Stack routes initialized" puts "Stack routes initialized"
end end

View File

@ -93,6 +93,16 @@ module Connectors
project project
end end
def set_project_env_run_list(project_id, env, run_list)
Helpers::RunList.new(run_list).validate!
@collection.update({"_id" => project_id, "deploy_envs.identifier" => env}, {"$set" => {"deploy_envs.$.run_list" => run_list}})
end
def set_project_run_list(project_id, env, run_list)
Helpers::RunList.new(run_list).validate!
@collection.update({"_id" => project_id}, {"$set" => {run_list: run_list}})
end
private private
def list(query={}, query_options={}) def list(query={}, query_options={})

View File

@ -67,6 +67,10 @@ module Connectors
collection.remove('stack' => stack_id) collection.remove('stack' => stack_id)
end end
def set_server_run_list(id, run_list)
@collection.update({"_id" => id}, {"$set" => {"run_list" => run_list}})
end
private private
def model_from_bson(bson) def model_from_bson(bson)

View File

@ -14,6 +14,10 @@ module Connectors
list(options) list(options)
end end
def set_stack_run_list id, run_list
collection.update({"_id" => id}, {"$set" => {"run_list" => run_list}})
end
private private
def model_from_bson(bson) def model_from_bson(bson)

View File

@ -1,14 +1,16 @@
require "db/mongo/models/mongo_model" require "db/mongo/models/mongo_model"
require "providers/provider_factory" require "providers/provider_factory"
require "commands/deploy_env" require "commands/deploy_env"
require "db/mongo/models/model_with_provider"
module Devops module Devops
module Model module Model
class DeployEnvBase < MongoModel class DeployEnvBase < MongoModel
include DeployEnvCommands include DeployEnvCommands
include ModelWithProvider
attr_accessor :identifier, :run_list, :expires, :provider, :users, :chef_env attr_accessor :identifier, :run_list, :expires, :users, :chef_env
def initialize d={} def initialize d={}
self.identifier = d["identifier"] self.identifier = d["identifier"]
@ -30,15 +32,10 @@ module Devops
} }
end end
def provider_instance
@provider_instance ||= ::Provider::ProviderFactory.get(self.provider)
end
def build_error_message(message) def build_error_message(message)
"Deploy environment '#{self.identifier}'. " + message "Deploy environment '#{self.identifier}'. " + message
end end
# class methods # class methods
class << self class << self

View File

@ -119,7 +119,7 @@ module Devops
end end
def self.validators def self.validators
@validators || [] @validators ||= []
end end
# all exceptions are handled in @validate! method # all exceptions are handled in @validate! method

View File

@ -18,14 +18,17 @@ module Devops
define_hook :before_delete define_hook :before_delete
define_hook :after_delete define_hook :after_delete
attr_accessor :id, :deploy_envs, :type, :archived, :description attr_accessor :id, :deploy_envs, :type, :archived, :description, :run_list
types :id => {:type => String, :empty => false}, types :id => {:type => String, :empty => false},
:deploy_envs => {:type => Array, :value_type => false, :empty => false}, :deploy_envs => {:type => Array, :value_type => false, :empty => false},
:description => {:type => String, :empty => true, :nil => true} :description => {:type => String, :empty => true, :nil => true},
:run_list => {:type => Array, :value_type => String, :empty => true, :nil => false}
MULTI_TYPE = "multi" MULTI_TYPE = "multi"
set_validators ::Validators::DeployEnv::RunList
def self.fields def self.fields
["deploy_envs", "type", "description"] ["deploy_envs", "type", "description"]
end end
@ -36,6 +39,7 @@ module Devops
self.type = p["type"] || Devops::GenericType.name self.type = p["type"] || Devops::GenericType.name
self.description = p["description"] self.description = p["description"]
self.archived = p["archived"] || false self.archived = p["archived"] || false
self.run_list = p["run_list"] || []
handler = Devops::TypesFactory.type self.type handler = Devops::TypesFactory.type self.type
handler.prepare(self) unless handler.nil? handler.prepare(self) unless handler.nil?

View File

@ -1,10 +1,13 @@
require "db/mongo/models/mongo_model" require "db/mongo/models/mongo_model"
require "hooks" require "hooks"
require "db/mongo/models/model_with_provider"
module Devops module Devops
module Model module Model
class Server < MongoModel class Server < MongoModel
include ModelWithProvider
include Hooks include Hooks
#params: #params:
# out - container for output data # out - container for output data
@ -20,8 +23,8 @@ module Devops
define_hook :before_bootstrap define_hook :before_bootstrap
define_hook :after_bootstrap define_hook :after_bootstrap
attr_accessor :provider, :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by, :stack attr_accessor :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by, :stack, :run_list
attr_accessor :options, :static, :key attr_accessor :options, :key
types :id => {:type => String, :empty => false}, types :id => {:type => String, :empty => false},
:provider => {:type => String, :empty => false}, :provider => {:type => String, :empty => false},
@ -34,10 +37,13 @@ module Devops
:created_by => {:type => String, :empty => false}, :created_by => {:type => String, :empty => false},
:chef_node_name => {:type => String, :empty => true}, :chef_node_name => {:type => String, :empty => true},
:reserved_by => {:type => String, :empty => true}, :reserved_by => {:type => String, :empty => true},
:stack => {:type => String, :nil => true} :stack => {:type => String, :nil => true},
:run_list => {:type => Array, :value_type => String, :empty => true, :nil => false}
set_validators ::Validators::DeployEnv::RunList
def self.fields def self.fields
["chef_node_name", "project", "deploy_env", "provider", "remote_user", "private_ip", "public_ip", "created_at", "created_by", "static", "key", "reserved_by"] ["chef_node_name", "project", "deploy_env", "provider", "remote_user", "private_ip", "public_ip", "created_at", "created_by", "key", "reserved_by"]
end end
def initialize s={} def initialize s={}
@ -51,10 +57,10 @@ module Devops
self.private_ip = s["private_ip"] self.private_ip = s["private_ip"]
self.created_at = s["created_at"] self.created_at = s["created_at"]
self.created_by = s["created_by"] self.created_by = s["created_by"]
self.static = s["static"]
self.key = s["key"] self.key = s["key"]
self.reserved_by = s["reserved_by"] self.reserved_by = s["reserved_by"]
self.stack = s["stack"] self.stack = s["stack"]
self.run_list = p["run_list"] || []
end end
def create def create
@ -81,10 +87,10 @@ module Devops
"public_ip" => self.public_ip, "public_ip" => self.public_ip,
"created_at" => self.created_at, "created_at" => self.created_at,
"created_by" => self.created_by, "created_by" => self.created_by,
"static" => self.static,
"key" => self.key, "key" => self.key,
"reserved_by" => self.reserved_by, "reserved_by" => self.reserved_by,
"stack" => stack "stack" => stack,
"run_list" => self.run_list
}.delete_if{|k,v| v.nil?} }.delete_if{|k,v| v.nil?}
end end
@ -111,7 +117,7 @@ module Devops
end end
def static? def static?
self.static || false (self.provider == Provider::Static::PROVIDER) || false
end end
end end

View File

@ -1,9 +1,12 @@
require "db/mongo/models/model_with_provider"
module Devops module Devops
module Model module Model
class StackBase < MongoModel class StackBase < MongoModel
include ModelWithProvider
attr_accessor :id, :project, :deploy_env, :stack_template, attr_accessor :id, :project, :deploy_env, :stack_template,
:cloud_stack_id, :provider, :parameters, :details, :owner :cloud_stack_id, :parameters, :details, :owner
types id: {type: String, empty: false}, types id: {type: String, empty: false},
provider: {type: String, empty: false}, provider: {type: String, empty: false},
@ -11,7 +14,8 @@ module Devops
deploy_env: {type: String}, deploy_env: {type: String},
stack_template: {type: String, empty: false}, stack_template: {type: String, empty: false},
cloud_stack_id: {type: String, nil: true}, cloud_stack_id: {type: String, nil: true},
owner: {type: String} owner: {type: String},
:run_list => {:type => Array, :value_type => String, :empty => true, :nil => false}
# details: {type: Hash, nil: true} # Hash type isn't supported yet # details: {type: Hash, nil: true} # Hash type isn't supported yet
def initialize attrs={} def initialize attrs={}
@ -44,27 +48,27 @@ module Devops
def create_stack_in_cloud! def create_stack_in_cloud!
begin begin
self.cloud_stack_id = provider_class.create_stack(self) self.cloud_stack_id = provider_instance.create_stack(self)
rescue ProviderErrors::NameConflict rescue ProviderErrors::NameConflict
raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud" raise InvalidRecord.new "Duplicate key error: stack with name '#{id}' already exists in cloud"
end end
end end
def delete_stack_in_cloud! def delete_stack_in_cloud!
provider_class.delete_stack(self) provider_instance.delete_stack(self)
end end
def sync_details! def sync_details!
self.details = provider_class.stack_details(self).attributes self.details = provider_instance.stack_details(self).attributes
end end
def resources def resources
provider_class.stack_resources(self) provider_instance.stack_resources(self)
end end
# resource_id is logical # resource_id is logical
def resource(resource_id) def resource(resource_id)
provider_class.stack_resource(self, resource_id) provider_instance.stack_resource(self, resource_id)
end end
def stack_status def stack_status
@ -84,7 +88,6 @@ module Devops
end end
class << self class << self
attr_accessor :provider
# attrs should include: # attrs should include:
# - id (String) # - id (String)
@ -103,12 +106,6 @@ module Devops
end end
end end
private
def provider_class
Provider::ProviderFactory.get(provider)
end
end end
end end
end end

View File

@ -13,16 +13,16 @@ class MongoConnector
delegate( delegate(
[:images, :image, :image_insert, :image_delete, :image_update] => :images_connector, [:images, :image, :image_insert, :image_delete, :image_update] => :images_connector,
[:stack_templates, :stack_template, :stack_template_insert, :stack_template_delete, :stack_template_update] => :stack_templates_connector, [:stack_templates, :stack_template, :stack_template_insert, :stack_template_delete, :stack_template_update] => :stack_templates_connector,
[:stacks, :stack, :stack_insert, :stack_delete, :stack_update] => :stacks_connector, [:stacks, :stack, :stack_insert, :stack_delete, :stack_update, :set_stack_run_list] => :stacks_connector,
[:available_images, :add_available_images, :delete_available_images] => :filters_connector, [:available_images, :add_available_images, :delete_available_images] => :filters_connector,
[:project, :projects_all, :projects, :project_names_with_envs, [:project, :projects_all, :projects, :project_names_with_envs,
:projects_by_image, :projects_by_user, :project_insert, :project_update, :projects_by_image, :projects_by_user, :project_insert, :project_update,
:project_delete, :is_project_exists?, :check_project_auth] => :projects_connector, :project_delete, :is_project_exists?, :check_project_auth, :set_project_run_list, :set_project_env_run_list] => :projects_connector,
[:project_templates, :project_template_insert, :project_template_update, [:project_templates, :project_template_insert, :project_template_update,
:project_template_delete] => :projects_templates_connector, :project_template_delete] => :projects_templates_connector,
[:servers_find, :servers, :servers_by_names, :server_by_instance_id, [:servers_find, :servers, :servers_by_names, :server_by_instance_id,
:server_by_chef_node_name, :servers_by_key, :server_insert, :server_by_chef_node_name, :servers_by_key, :server_insert,
:server_delete, :server_update, :server_set_chef_node_name, :stack_servers_delete] => :servers_connector, :server_delete, :server_update, :server_set_chef_node_name, :stack_servers_delete, :set_server_run_list] => :servers_connector,
[:user_auth, :user, :users, :users_names, :user_insert, :user_delete, [:user_auth, :user, :users, :users_names, :user_insert, :user_delete,
:user_update, :create_root_user, :check_user_privileges] => :users_connector, :user_update, :create_root_user, :check_user_privileges] => :users_connector,
[:keys, :key, :key_insert, :key_delete] => :keys_connector, [:keys, :key, :key_insert, :key_delete] => :keys_connector,

View File

@ -47,6 +47,20 @@ module Sinatra
end end
end end
def patch_with_headers path, opt={}, &block
headers = opt.delete(:headers) || []
before path do
check_headers *headers
protect!
end
patch path, opt, &block
after path do
statistic
end
end
def delete_with_headers path, opt={}, &block def delete_with_headers path, opt={}, &block
headers = opt.delete(:headers) || [] headers = opt.delete(:headers) || []
before path do before path do