models in Devops::Model module, auth

This commit is contained in:
Anton Martynov 2015-03-06 12:20:30 +03:00
parent 5ee2e2f714
commit 42f936f040
38 changed files with 1093 additions and 1021 deletions

View File

@ -1,8 +1,9 @@
module Sinatra
module Devops
module DevopsAuth
module Helpers
def protect!
return if auth_with_basic?
headers['WWW-Authenticate'] = 'Basic realm="Restricted Area"'
halt 401, "Not authorized\n"
end
@ -23,10 +24,10 @@ module Sinatra
end
def self.registered(app)
app.helpers Devops::Helpers
app.helpers Sinatra::DevopsAuth::Helpers
end
end
register Devops
register Sinatra::DevopsAuth
end

View File

@ -182,7 +182,7 @@ module ServerCommands
servers = []
servers_info.each do |info|
image = info[:image]
s = Server.new
s = Devops::Model::Server.new
s.provider = provider.name
s.project = project_name
s.deploy_env = env_name

View File

@ -20,7 +20,7 @@ module Connectors
private
def model_from_bson(bson)
::Image.build_from_bson(bson)
Devops::Model::Image.build_from_bson(bson)
end
end

View File

@ -21,7 +21,7 @@ module Connectors
private
def model_from_bson(bson)
::Key.build_from_bson(bson)
Devops::Model::Key.build_from_bson(bson)
end
end

View File

@ -96,7 +96,7 @@ module Connectors
private
def model_from_bson(bson)
::Project.build_from_bson(bson)
Devops::Model::Project.build_from_bson(bson)
end
end

View File

@ -41,7 +41,7 @@ module Connectors
private
def model_from_bson(bson)
::Report.new(bson)
Devops::Model::Report.new(bson)
end
end

View File

@ -66,7 +66,7 @@ module Connectors
private
def model_from_bson(bson)
::Server.build_from_bson(bson)
Devops::Model::Server.build_from_bson(bson)
end
# couldn't be replaced with ShowCommand (_id doesn't neccesary appear in params)

View File

@ -18,7 +18,7 @@ module Connectors
def model_from_bson(bson)
provider = bson['provider']
::StackFactory.get_class(provider).build_from_bson(bson)
Devops::Model::StackFactory.get_class(provider).build_from_bson(bson)
end
end
end

View File

@ -18,7 +18,7 @@ module Connectors
def model_from_bson(bson)
provider = bson['provider']
::StackTemplateFactory.get_class(provider).build_from_bson(bson)
Devops::Model::StackTemplateFactory.get_class(provider).build_from_bson(bson)
end
end

View File

@ -29,7 +29,7 @@ module Connectors
def create_root_user
u = user('root')
rescue RecordNotFound => e
root = ::User.create_root
root = Devops::Model::User.create_root
collection.insert(root.to_mongo_hash)
end
@ -49,7 +49,7 @@ module Connectors
private
def model_from_bson(bson)
::User.build_from_bson(bson)
Devops::Model::User.build_from_bson(bson)
end
end

View File

@ -3,6 +3,8 @@ require "db/exceptions/invalid_record"
require "providers/provider_factory"
require "commands/deploy_env"
module Devops
module Model
class DeployEnvBase < MongoModel
include DeployEnvCommands
@ -54,3 +56,5 @@ class DeployEnvBase < MongoModel
end
end
end
end

View File

@ -1,5 +1,7 @@
require "db/mongo/models/deploy_env/deploy_env_base"
module Devops
module Model
class DeployEnvEc2 < DeployEnvBase
attr_accessor :flavor, :image, :subnets, :groups
@ -61,3 +63,5 @@ class DeployEnvEc2 < DeployEnvBase
end
end
end
end

View File

@ -2,6 +2,8 @@ require_relative "deploy_env_static"
require_relative "deploy_env_openstack"
require_relative "deploy_env_ec2"
module Devops
module Model
class DeployEnvFactory
def self.create hash
@ -19,3 +21,5 @@ class DeployEnvFactory
end
end
end
end

View File

@ -2,6 +2,8 @@ require "db/mongo/models/mongo_model"
require "db/exceptions/invalid_record"
require "commands/deploy_env"
module Devops
module Model
class DeployEnvMulti < MongoModel
include DeployEnvCommands
@ -116,3 +118,5 @@ class DeployEnvMulti < MongoModel
end
end
end
end

View File

@ -1,6 +1,8 @@
require "db/mongo/models/deploy_env/deploy_env_base"
require "providers/provider_factory"
module Devops
module Model
class DeployEnvOpenstack < DeployEnvBase
attr_accessor :flavor, :image, :subnets, :groups
@ -55,3 +57,5 @@ class DeployEnvOpenstack < DeployEnvBase
end
end
end
end

View File

@ -1,5 +1,7 @@
require "db/mongo/models/deploy_env/deploy_env_base"
module Devops
module Model
class DeployEnvStatic < DeployEnvBase
types :identifier => {:type => String, :empty => false},
@ -14,28 +16,10 @@ class DeployEnvStatic < DeployEnvBase
def initialize d={}
super(d)
=begin
self.identifier = d["identifier"]
b = d["run_list"] || []
self.run_list = (b.is_a?(Array) ? b.uniq : b)
self.expires = d["expires"]
self.provider = d["provider"]
b = d["users"] || []
self.users = (b.is_a?(Array) ? b.uniq : b)
=end
end
def to_hash
super
=begin
{
"identifier" => self.identifier,
"run_list" => self.run_list,
"expires" => self.expires,
"provider" => self.provider,
"users" => self.users
}
=end
end
def self.create hash
@ -43,3 +27,5 @@ class DeployEnvStatic < DeployEnvBase
end
end
end
end

View File

@ -1,6 +1,8 @@
require "db/exceptions/invalid_record"
require "db/mongo/models/mongo_model"
module Devops
module Model
class Image < MongoModel
attr_accessor :id, :provider, :remote_user, :name, :bootstrap_template
@ -41,3 +43,5 @@ class Image < MongoModel
end
end
end
end

View File

@ -2,6 +2,8 @@ require "db/exceptions/invalid_record"
require "db/mongo/models/mongo_model"
require "json"
module Devops
module Model
class Key < MongoModel
SYSTEM = "system"
@ -44,3 +46,5 @@ class Key < MongoModel
end
end
end
end

View File

@ -2,6 +2,8 @@ require "providers/provider_factory"
require "db/exceptions/invalid_record"
require "json"
module Devops
module Model
class MongoModel
# multi_json sends argument to 'to_json' method
@ -144,3 +146,5 @@ class MongoModel
end
end
end
end

View File

@ -6,6 +6,8 @@ require "db/mongo/models/deploy_env/deploy_env_multi"
require "db/mongo/models/mongo_model"
require "json"
module Devops
module Model
class Project < MongoModel
attr_accessor :id, :deploy_envs, :type, :archived, :description
@ -137,3 +139,5 @@ class Project < MongoModel
end
end
end
end

View File

@ -1,6 +1,8 @@
require "db/exceptions/invalid_record"
require "db/mongo/models/mongo_model"
module Devops
module Model
class Report < MongoModel
DEPLOY_TYPE = 1
@ -32,3 +34,5 @@ class Report < MongoModel
end
end
end
end

View File

@ -1,6 +1,8 @@
require "db/exceptions/invalid_record"
require "db/mongo/models/mongo_model"
module Devops
module Model
class Server < MongoModel
attr_accessor :provider, :chef_node_name, :id, :remote_user, :project, :deploy_env, :private_ip, :public_ip, :created_at, :without_bootstrap, :created_by, :reserved_by
@ -87,3 +89,5 @@ class Server < MongoModel
end
end
end
end

View File

@ -1,3 +1,5 @@
module Devops
module Model
class StackBase < MongoModel
attr_accessor :id, :project, :deploy_env, :stack_template, :cloud_stack_id, :provider
@ -50,3 +52,5 @@ class StackBase < MongoModel
end
end
end
end

View File

@ -1,3 +1,5 @@
module Devops
module Model
class StackEc2 < StackBase
def create_stack_in_cloud!
@ -6,3 +8,5 @@ class StackEc2 < StackBase
end
end
end
end

View File

@ -2,6 +2,8 @@ require_relative "stack_base"
require_relative "stack_openstack"
require_relative "stack_ec2"
module Devops
module Model
class StackFactory
def self.create(provider, attrs)
@ -24,3 +26,5 @@ class StackFactory
end
end
end
end

View File

@ -1,3 +1,5 @@
module Devops
module Model
class StackOpenstack < StackBase
def create_stack_in_cloud!
@ -8,3 +10,5 @@ class StackOpenstack < StackBase
end
end
end
end

View File

@ -1,6 +1,8 @@
require 'tempfile'
require 'securerandom'
module Devops
module Model
class StackTemplateBase < MongoModel
attr_accessor :id, :template_url, :template_json, :provider
@ -71,3 +73,5 @@ class StackTemplateBase < MongoModel
end
end
end
end

View File

@ -1,3 +1,5 @@
module Devops
module Model
class StackTemplateEc2 < StackTemplateBase
def delete_template_file_from_storage
@ -13,3 +15,5 @@ class StackTemplateEc2 < StackTemplateBase
end
end
end
end

View File

@ -2,6 +2,8 @@ require_relative "stack_template_base"
require_relative "stack_template_openstack"
require_relative "stack_template_ec2"
module Devops
module Model
class StackTemplateFactory
def self.create(provider, attrs)
@ -24,3 +26,5 @@ class StackTemplateFactory
end
end
end
end

View File

@ -1,3 +1,5 @@
module Devops
module Model
class StackTemplateOpenstack < StackTemplateBase
def delete_template_file_from_storage
@ -13,3 +15,5 @@ class StackTemplateOpenstack < StackTemplateBase
end
end
end
end

View File

@ -2,6 +2,8 @@ require "db/exceptions/invalid_record"
require "exceptions/invalid_command"
require "db/mongo/models/mongo_model"
module Devops
module Model
class User < MongoModel
ROOT_USER_NAME = 'root'
@ -110,3 +112,5 @@ class User < MongoModel
end
end
end
end

View File

@ -37,6 +37,10 @@ class DevopsConfig
@@config
end
def [](key)
@@config[key]
end
def first_private_ipv4
Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
end

View File

@ -102,6 +102,8 @@ module Devops
helpers Sinatra::Streaming
helpers Devops::Version2_0::Helpers
register Sinatra::DevopsAuth
=begin
use Rack::Auth::Basic do |username, password|
begin

View File

@ -45,7 +45,7 @@ module Devops
lambda {
check_privileges("image", "w")
settings.mongo.image params[:image_id]
image = ::Image.new(create_object_from_json_body)
image = Devops::Model::Image.new(create_object_from_json_body)
image.id = params[:image_id]
settings.mongo.image_update image
create_response("Image '#{params[:image_id]}' has been updated")

View File

@ -18,7 +18,7 @@ module Devops
check_privileges("project", "r")
fields = []
if params.key?("fields") and params["fields"].is_a?(Array)
::Project.fields.each do |k|
Devops::Model::Project.fields.each do |k|
fields.push k if params["fields"].include?(k)
end
end
@ -49,7 +49,7 @@ module Devops
body = create_object_from_json_body
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)
p = ::Project.new(body)
p = Devops::Model::Project.new(body)
halt_response("Project '#{p.id}' already exist") if settings.mongo.is_project_exists?(p)
p.add_authorized_user [request.env['REMOTE_USER']]
settings.mongo.project_insert p
@ -70,11 +70,11 @@ module Devops
def self.update_project
lambda {
check_privileges("project", "w")
project = ::Project.new(create_object_from_json_body)
project = Devops::Model::Project.new(create_object_from_json_body)
project.id = params[:project]
old_project = settings.mongo.project params[:project]
settings.mongo.project_update project
roles = ::Project.create_new_roles(old_project, project, logger)
roles = Devops::Model::Project.create_new_roles(old_project, project, logger)
info = "Project '#{project.id}' has been updated." + Project.create_roles_response(roles)
create_response(info)
}
@ -181,7 +181,7 @@ module Devops
end
end
else
dir = DevopsService.config[:report_dir_v2]
dir = DevopsConfig[:report_dir_v2]
files = []
uri = URI.parse(request.url)
servers.each do |s|
@ -190,9 +190,9 @@ module Devops
rescue InvalidPrivileges, RecordNotFound => e
next
end
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsService.config)
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config)
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
end
json files
@ -234,23 +234,23 @@ module Devops
project = settings.mongo.project(params[:id])
env = project.deploy_env params[:env]
logger.info "Test project '#{project.id}' and environment '#{env.identifier}'"
if env.provider == Provider::Static::PROVIDER
msg = "Can not test environment with provider '#{Provider::Static::PROVIDER}'"
if env.provider == ::Provider::Static::PROVIDER
msg = "Can not test environment with provider '#{::Provider::Static::PROVIDER}'"
Logger.warn msg
return [400, msg]
end
dir = DevopsService.config[:report_dir_v2]
dir = DevopsConfig[:report_dir_v2]
uri = URI.parse(request.url)
p = {
:project => project.id,
:env => env.identifier,
:user => request.env['REMOTE_USER']
}
jid = ProjectTestWorker.perform_async(dir, p, DevopsService.config)
jid = ProjectTestWorker.perform_async(dir, p, DevopsConfig.config)
Worker.set_status jid, Worker::STATUS::IN_QUEUE
logger.info "Job '#{jid}' has been created"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files = [uri.to_s]
sleep 1
json files
@ -283,7 +283,7 @@ module Devops
old_project.deploy_envs.each do |e|
new_project.remove_env(e.identifier)
end
::Project.create_roles new_project.id, new_project.deploy_envs, logger
Devops::Model::Project.create_roles new_project.id, new_project.deploy_envs, logger
end
def self.create_roles_response roles

View File

@ -29,7 +29,7 @@ module Devops
check_privileges("server", "r")
fields = []
if params.key?("fields") and params["fields"].is_a?(Array)
Server.fields.each do |k|
Devops::Model::Server.fields.each do |k|
fields.push k if params["fields"].include?(k)
end
end
@ -113,16 +113,16 @@ module Devops
end
end
else
dir = DevopsService.config[:report_dir_v2]
dir = DevopsConfig[:report_dir_v2]
files = []
uri = URI.parse(request.url)
servers.each do |s|
h = s.to_hash
h["options"] = s.options
jid = CreateServerWorker.perform_async(dir, env.provider, h, request.env['REMOTE_USER'], DevopsService.config)
jid = CreateServerWorker.perform_async(dir, env.provider, h, request.env['REMOTE_USER'], DevopsConfig.config)
Worker.set_status jid, Worker::STATUS::IN_QUEUE
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
end
sleep 1
@ -254,16 +254,16 @@ module Devops
end
end
else
dir = DevopsService.config[:report_dir_v2]
dir = DevopsConfig[:report_dir_v2]
files = []
uri = URI.parse(request.url)
h = s.to_hash
h["options"] = s.options
h["_id"] = s.id
jid = BootstrapWorker.perform_async(dir, d.provider, h, request.env['REMOTE_USER'], DevopsService.config)
jid = BootstrapWorker.perform_async(dir, d.provider, h, request.env['REMOTE_USER'], DevopsConfig.config)
Worker.set_status jid, Worker::STATUS::IN_QUEUE
logger.info "Job '#{jid}' has been started"
uri.path = "#{DevopsService.config[:url_prefix]}/v2.0/report/" + jid
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
uri.query = nil
uri.fragment = nil
files.push uri.to_s
@ -289,7 +289,7 @@ module Devops
cert = settings.mongo.key(key)
provider = ::Provider::ProviderFactory.get("static")
s = Server.new
s = Devops::Model::Server.new
s.provider = provider.name
s.project = project
s.deploy_env = deploy_env

View File

@ -22,7 +22,7 @@ module Devops
["username", "password", "email"].each do |p|
check_string(user[p], "Parameter '#{p}' must be a not empty string")
end
Devops::Db.connector.user_insert ::User.new(user)
Devops::Db.connector.user_insert Devops::Model::User.new(user)
create_response("Created", nil, 201)
}
end
@ -66,7 +66,7 @@ module Devops
check_privileges("user", "w")
action = File.basename(request.path)
u = File.basename(File.dirname(request.path))
raise InvalidPrivileges.new("Access denied for '#{request.env['REMOTE_USER']}'") if u == ::User::ROOT_USER_NAME and request.env['REMOTE_USER'] != ::User::ROOT_USER_NAME
raise InvalidPrivileges.new("Access denied for '#{request.env['REMOTE_USER']}'") if u == Devops::Model::User::ROOT_USER_NAME and request.env['REMOTE_USER'] != Devops::Model::User::ROOT_USER_NAME
check_privileges("user", "w") unless request.env['REMOTE_USER'] == u

View File

@ -2,12 +2,6 @@ require "sinatra/base"
module Sinatra
module HeadersHelpers
end
helpers HeadersHelpers
class Base
class << self
@ -16,6 +10,7 @@ module Sinatra
headers = opt.delete(:headers) || []
before path do
check_headers *headers
protect!
end
get path, opt, &block
@ -25,6 +20,7 @@ module Sinatra
headers = opt.delete(:headers) || []
before path do
check_headers *headers
protect!
end
post_with_statistic path, opt, &block
end
@ -41,6 +37,7 @@ module Sinatra
headers = opt.delete(:headers) || []
before path do
check_headers *headers
protect!
end
put path, opt, &block
@ -54,6 +51,7 @@ module Sinatra
headers = opt.delete(:headers) || []
before path do
check_headers *headers
protect!
end
delete path, opt, &block
@ -71,6 +69,7 @@ module Sinatra
else
check_headers *headers
end
protect!
end
hash.each do |method, block|