From 2dbc20a47ffc78427018695012470c6e266a1667 Mon Sep 17 00:00:00 2001 From: Anton Martynov Date: Tue, 27 Oct 2015 12:01:21 +0300 Subject: [PATCH] #789: create server and stack with provider account --- devops-service/app/api2/handlers/stack.rb | 3 +++ .../mongo/models/deploy_env/cloud_deploy_env.rb | 1 + .../mongo/models/deploy_env/deploy_env_base.rb | 5 ++--- .../db/mongo/models/model_with_provider.rb | 17 +++++++++++++++-- devops-service/db/mongo/models/server.rb | 7 +++---- .../db/mongo/models/stack/stack_base.rb | 7 ++++--- devops-service/lib/executors/server_executor.rb | 6 +++--- devops-service/providers/provider_factory.rb | 1 + 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/devops-service/app/api2/handlers/stack.rb b/devops-service/app/api2/handlers/stack.rb index abf5637..e06efaa 100644 --- a/devops-service/app/api2/handlers/stack.rb +++ b/devops-service/app/api2/handlers/stack.rb @@ -25,7 +25,10 @@ module Devops raise InvalidRecord.new("Environment '#{env.identifier}' of project '#{project.id}' has no stack template") if env.stack_template.nil? object["stack_template"] = env.stack_template object["owner"] = parser.current_user + object["provider"] = env.provider + object["provider_account"] = env.provider_account + # TODO: without provider_name uri = Worker.start_async(StackBootstrapWorker, @request, provider_name: env.provider, stack_attributes: object diff --git a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb index 49eff30..27f05f0 100644 --- a/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb +++ b/devops-service/db/mongo/models/deploy_env/cloud_deploy_env.rb @@ -24,6 +24,7 @@ module Devops :groups => {:type => Array, :empty => false}, :stack_template => {:type => String, :empty => false, :nil => true} + #TODO: account validator set_validators ::Validators::DeployEnv::Flavor, ::Validators::DeployEnv::Image, ::Validators::DeployEnv::SubnetNotEmpty, diff --git a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb index 5fecd43..eaa1a21 100644 --- a/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb +++ b/devops-service/db/mongo/models/deploy_env/deploy_env_base.rb @@ -19,10 +19,10 @@ module Devops def initialize d={} self.identifier = d["identifier"] + set_provider(d) b = d["run_list"] || [] self.run_list = b.uniq self.expires = d["expires"] - self.provider = d["provider"] b = d["users"] || [] self.users = b.uniq end @@ -32,9 +32,8 @@ module Devops "identifier" => self.identifier, "run_list" => self.run_list, "expires" => self.expires, - "provider" => self.provider, "users" => self.users - } + }.merge(provider_hash) end def add_users users diff --git a/devops-service/db/mongo/models/model_with_provider.rb b/devops-service/db/mongo/models/model_with_provider.rb index 41fe401..9672a5d 100644 --- a/devops-service/db/mongo/models/model_with_provider.rb +++ b/devops-service/db/mongo/models/model_with_provider.rb @@ -4,11 +4,24 @@ module Devops module Model module ModelWithProvider - attr_accessor :provider + attr_accessor :provider, :provider_account def provider_instance - @provider_instance ||= Provider::ProviderFactory.get(self.provider) + @provider_instance ||= Provider::ProviderFactory.get(self.provider, self.provider_account) end + + def set_provider hash + self.provider = hash["provider"] + self.provider_account = hash["provider_account"] + end + + def provider_hash + { + "provider" => self.provider, + "provider_account" => self.provider_account + } + end + end end end diff --git a/devops-service/db/mongo/models/server.rb b/devops-service/db/mongo/models/server.rb index f6296fe..c9fc4f9 100644 --- a/devops-service/db/mongo/models/server.rb +++ b/devops-service/db/mongo/models/server.rb @@ -33,7 +33,7 @@ module Devops end def initialize s={} - self.provider = s["provider"] + self.set_provider(s) self.chef_node_name = s["chef_node_name"] self.id = s["_id"] self.remote_user = s["remote_user"] @@ -66,7 +66,6 @@ module Devops def to_hash_without_id { - "provider" => self.provider, "chef_node_name" => self.chef_node_name, "remote_user" => self.remote_user, "project" => self.project, @@ -79,7 +78,7 @@ module Devops "reserved_by" => self.reserved_by, "stack" => stack, "run_list" => self.run_list - }.delete_if { |k,v| v.nil? } + }.merge(provider_hash).delete_if { |k,v| v.nil? } end def self.build_from_bson s @@ -98,7 +97,7 @@ module Devops end def static? - (self.provider == Provider::Static::PROVIDER) || false + self.provider == Provider::Static::PROVIDER end end diff --git a/devops-service/db/mongo/models/stack/stack_base.rb b/devops-service/db/mongo/models/stack/stack_base.rb index 0d71b8b..b8cb4c6 100644 --- a/devops-service/db/mongo/models/stack/stack_base.rb +++ b/devops-service/db/mongo/models/stack/stack_base.rb @@ -21,7 +21,7 @@ module Devops def initialize attrs={} # self.provider = self.class.provider - + self.set_provider(attrs) self.id = attrs['id'] self.project = attrs['project'] self.deploy_env = attrs['deploy_env'] @@ -36,7 +36,6 @@ module Devops def to_hash_without_id { - provider: provider, project: project, deploy_env: deploy_env, stack_template: stack_template, @@ -46,7 +45,7 @@ module Devops details: bson_safe_details, stack_status: stack_status, owner: owner - } + }.merge(provider_hash) end # overrided in ec2 @@ -106,6 +105,8 @@ module Devops # - id (String) # - deploy_env (String) # - stack_template (String) + # - provider (String) + # - provider_account (String) def create(attrs, out) model = new(attrs) model.create_stack_in_cloud!(out) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 2edf407..ea58f17 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -74,11 +74,11 @@ module Devops end def create_server options - @server = Devops::Model::Server.new({"project" => @project.id, "deploy_env" => @deploy_env.identifier, "created_by" => options["created_by"], "provider" => @deploy_env.provider}) - provider = @server.provider_instance + @server = Devops::Model::Server.new({"project" => @project.id, "deploy_env" => @deploy_env.identifier, "created_by" => options["created_by"], "provider" => @deploy_env.provider, "provider_account" => @deploy_env.provider_account}) + provider = @deploy_env.provider_instance mongo = ::Devops::Db.connector begin - @out << "Create server...\n" + @out.puts "Create server..." @out.flush @server.run_list = options["run_list"] || [] diff --git a/devops-service/providers/provider_factory.rb b/devops-service/providers/provider_factory.rb index d087a13..8fcaa89 100644 --- a/devops-service/providers/provider_factory.rb +++ b/devops-service/providers/provider_factory.rb @@ -16,6 +16,7 @@ module Provider else @@providers_with_accounts_factories[provider].connection(account) end + # TODO: new exception raise ::Sinatra::NotFound.new("Provider #{provider} not found") if p.nil? p end