fulmar 1.10.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.travis.yml +11 -4
- data/README.md +87 -102
- data/fulmar.gemspec +2 -2
- data/lib/fulmar/domain/{service/application_service.rb → model/application.rb} +16 -2
- data/lib/fulmar/domain/model/configuration.rb +185 -0
- data/lib/fulmar/domain/service/config_test_service.rb +32 -114
- data/lib/fulmar/domain/service/config_tests/hosts.rb +23 -0
- data/lib/fulmar/domain/service/config_tests/mariadb.rb +19 -0
- data/lib/fulmar/domain/service/config_tests/paths.rb +15 -0
- data/lib/fulmar/domain/service/config_tests/project.rb +5 -0
- data/lib/fulmar/domain/service/configuration_service.rb +13 -131
- data/lib/fulmar/domain/service/file_sync_service.rb +7 -7
- data/lib/fulmar/domain/service/helper/common_helper.rb +18 -32
- data/lib/fulmar/domain/service/plugin_service.rb +60 -0
- data/lib/fulmar/domain/service/{config_rendering_service.rb → template_rendering_service.rb} +3 -3
- data/lib/fulmar/domain/task/configuration.rake +9 -7
- data/lib/fulmar/domain/task/console.rake +3 -3
- data/lib/fulmar/domain/task/environment.rake +5 -12
- data/lib/fulmar/domain/task/initialization/base.rake +3 -9
- data/lib/fulmar/domain/task/versions.rake +8 -12
- data/lib/fulmar/infrastructure/default_files/Fulmar/project.config.yml +26 -0
- data/lib/fulmar/infrastructure/default_files/Fulmarfile +22 -0
- data/lib/fulmar/infrastructure/{service → model}/transfer/base.rb +4 -4
- data/lib/fulmar/infrastructure/{service → model}/transfer/rsync.rb +4 -2
- data/lib/fulmar/infrastructure/{service → model}/transfer/rsync_with_versions.rb +18 -20
- data/lib/fulmar/infrastructure/{service → model}/transfer/tar.rb +2 -2
- data/lib/fulmar/infrastructure/service/copy_service.rb +2 -2
- data/lib/fulmar/infrastructure/service/ssh_config_service.rb +8 -21
- data/lib/fulmar/service/bootstrap_service.rb +1 -5
- data/lib/fulmar/task_manager.rb +2 -8
- data/lib/fulmar/version.rb +1 -1
- data/spec/lib/fulmar/model/configuration_spec.rb +193 -0
- data/spec/lib/fulmar/service/plugin_service_spec.rb +29 -0
- metadata +29 -34
- data/lib/fulmar/domain/service/helper/database_helper.rb +0 -14
- data/lib/fulmar/domain/service/helper/flow_helper.rb +0 -16
- data/lib/fulmar/domain/service/helper/vhost_helper.rb +0 -21
- data/lib/fulmar/domain/task/database_sync.rake +0 -63
- data/lib/fulmar/infrastructure/service/composer_service.rb +0 -22
- data/lib/fulmar/infrastructure/service/database/database_service.rb +0 -118
- data/lib/fulmar/infrastructure/service/flow_service.rb +0 -47
- data/lib/fulmar/infrastructure/service/shell_service.rb +0 -10
- data/lib/fulmar/service/logger_service.rb +0 -7
- data/test/rsync_with_versions.rb +0 -20
@@ -5,137 +5,55 @@ module Fulmar
|
|
5
5
|
module Service
|
6
6
|
# Tests the configuration
|
7
7
|
class ConfigTestService
|
8
|
+
include Fulmar::Domain::Model
|
9
|
+
|
8
10
|
def initialize(config)
|
9
11
|
@config = config
|
10
|
-
@
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def test_hostnames_exist
|
25
|
-
@config.each do |env, target, data|
|
26
|
-
if data[:hostname].blank? && !data[:host].blank?
|
27
|
-
@report << {
|
28
|
-
message: "#{env}:#{target} has a host (#{data[:host]}) but is missing a hostname",
|
29
|
-
severity: :warning
|
30
|
-
}
|
12
|
+
@tests = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def target_test(name, &block)
|
16
|
+
@tests[name] = Proc.new do
|
17
|
+
results = []
|
18
|
+
@config.each do |env, target, _data|
|
19
|
+
@config.set env, target
|
20
|
+
result = block.call(@config)
|
21
|
+
if result
|
22
|
+
result[:message] = "in [#{env}:#{target}]: #{result[:message]}"
|
23
|
+
results << result
|
24
|
+
end
|
31
25
|
end
|
26
|
+
results.reject(&:nil?)
|
32
27
|
end
|
33
|
-
end
|
34
28
|
|
35
|
-
def test_project_name_exists
|
36
|
-
if @config.project.name.blank?
|
37
|
-
add_report 'Project is missing a name', :warning
|
38
|
-
end
|
39
29
|
end
|
40
30
|
|
41
|
-
def
|
42
|
-
|
43
|
-
|
44
|
-
@config.each do |env, target, data|
|
45
|
-
next if data[:hostname].blank?
|
46
|
-
|
47
|
-
unless hostnames.include? data[:hostname]
|
48
|
-
@report << {
|
49
|
-
message: "#{env}:#{target} has a hostname (#{data[:hostname]}) which is not found in your ssh config",
|
50
|
-
severity: :info
|
51
|
-
}
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_required_hostnames
|
57
|
-
types = %i(rsync rsync_with_version maria)
|
58
|
-
@config.each do |env, target, data|
|
59
|
-
if types.include?(data[:type]) && data[:hostname].blank?
|
60
|
-
@report << {
|
61
|
-
message: "#{env}:#{target} requires a hostname (#{data[:hostname]})",
|
62
|
-
severity: :error
|
63
|
-
}
|
64
|
-
end
|
65
|
-
end
|
31
|
+
def global_test(name, &block)
|
32
|
+
@tests[name] = block
|
66
33
|
end
|
67
34
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
add_report(
|
76
|
-
'The configuration uses the vhost feature but misses a valid configuration for it (missing :vhost_template)',
|
77
|
-
:warning
|
78
|
-
) if @config.feature?(:vhost) && !vhost_template
|
79
|
-
end
|
80
|
-
|
81
|
-
# Run simple test which only require one configuration
|
82
|
-
def test_simple_tests
|
83
|
-
@config.each do |env, target, data|
|
84
|
-
tests = methods.select { |name| name.to_s[0, 12] == 'simple_test_' }
|
85
|
-
tests.each do |test|
|
86
|
-
send(test, env, target, data)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def simple_test_local_path_exists(env, target, data)
|
92
|
-
unless File.exist? data[:local_path]
|
93
|
-
add_report("#{env}:#{target} has no valid local_path (#{data[:local_path]})", :warning)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def simple_test_mariadb_feature_is_set(env, target, data)
|
98
|
-
if data[:type] == :maria && !@config.feature?(:database)
|
99
|
-
@report << {
|
100
|
-
message: "#{env}:#{target} uses mysql/mariadb but your config is missing the database feature",
|
101
|
-
severity: :notice
|
102
|
-
}
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def simple_test_vhost_feature_is_set(env, target, data)
|
107
|
-
if data[:vhost_template] && !@config.feature?(:vhost)
|
108
|
-
@report << {
|
109
|
-
message: "#{env}:#{target} refers to a vhost_template but your config is missing the vhost feature",
|
110
|
-
severity: :warning
|
111
|
-
}
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def simple_test_maria_db_config_exists(env, target, data)
|
116
|
-
if data[:type] == :maria && data[:maria][:database].blank?
|
117
|
-
add_report "#{env}:#{target} is missing a database name in maria:database", :error
|
35
|
+
# Runs all methods beginning with test_ and returns the report
|
36
|
+
def run
|
37
|
+
test_dirs = ["#{File.dirname(__FILE__)}/config_tests/"]
|
38
|
+
test_files = test_dirs.collect{ |dir| Dir.glob("#{dir}/*.rb") }.flatten
|
39
|
+
test_files.each do |file|
|
40
|
+
eval File.read(file)
|
118
41
|
end
|
119
|
-
end
|
120
42
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
add_report "#{env}:#{target} is missing a remote path", :error
|
43
|
+
results = []
|
44
|
+
@tests.each_pair do |name, test|
|
45
|
+
results << test.call(@config)
|
125
46
|
end
|
47
|
+
results.reject!(&:nil?)
|
48
|
+
results.reject!(&:empty?)
|
49
|
+
results.flatten!
|
50
|
+
results
|
126
51
|
end
|
127
52
|
|
128
53
|
protected
|
129
54
|
|
130
|
-
def add_report(message, severity)
|
131
|
-
@report << {
|
132
|
-
message: message,
|
133
|
-
severity: severity
|
134
|
-
}
|
135
|
-
end
|
136
|
-
|
137
55
|
def ssh_hostnames
|
138
|
-
`grep -E '^Host [^ *]+$' ~/.ssh/config | sort | uniq | cut -d ' ' -f 2`.split("\n")
|
56
|
+
@ssh_hostnames ||= `grep -E '^Host [^ *]+$' ~/.ssh/config | sort | uniq | cut -d ' ' -f 2`.split("\n")
|
139
57
|
end
|
140
58
|
end
|
141
59
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
target_test 'hostname is set' do |config|
|
2
|
+
if config[:hostname].blank? && !config[:host].blank?
|
3
|
+
next {
|
4
|
+
severity: :warning,
|
5
|
+
message: "config has a host (#{[:host]}) but is missing a hostname"
|
6
|
+
}
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
target_test 'hostnames in ssh config' do |config|
|
11
|
+
next if config[:hostname].blank?
|
12
|
+
|
13
|
+
unless ssh_hostnames.include? config[:hostname]
|
14
|
+
{severity: :info, message: "config has a hostname (#{config[:hostname]}) which is not in your ssh config"}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
target_test 'required hostnames' do |config|
|
19
|
+
types = %i(rsync rsync_with_version maria)
|
20
|
+
if types.include?(config[:type]) && config[:hostname].blank?
|
21
|
+
next {severity: :error, message: "config requires a hostname (#{config[:hostname]})"}
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Move this file into the plugin
|
2
|
+
|
3
|
+
target_test 'mariadb is loaded' do |config|
|
4
|
+
if config[:type] == :mariadb && !config.plugins.include?(:mariadb)
|
5
|
+
next {
|
6
|
+
severity: :warning,
|
7
|
+
message: 'config uses mysql/mariadb but your config is missing the maria plugin'
|
8
|
+
}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
target_test 'database name exists' do |config|
|
13
|
+
if config.plugins.include?(:mariadb) && config[:maria] && config[:maria][:database].blank?
|
14
|
+
next {
|
15
|
+
severity: :error,
|
16
|
+
message: 'config is missing a database name in maria:database'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
target_test 'local path exists' do |config|
|
2
|
+
if config[:local_path] && !File.exist?(config[:local_path])
|
3
|
+
next {
|
4
|
+
severity: :warning,
|
5
|
+
message: "local_path does not exist (#{config[:local_path]})"
|
6
|
+
}
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
target_test 'remote_path is set' do |config|
|
11
|
+
types = %w(rsync rsync_with_version)
|
12
|
+
if types.include?(config[:type]) && config[:remote_path].blank?
|
13
|
+
next {severity: :error, message: 'config is missing a remote path for rsync'}
|
14
|
+
end
|
15
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'pp'
|
3
3
|
require 'fulmar/domain/model/project'
|
4
|
-
require '
|
4
|
+
require 'fulmar/domain/model/configuration'
|
5
|
+
require 'active_support/core_ext/hash/keys'
|
5
6
|
|
6
7
|
module Fulmar
|
7
8
|
module Domain
|
@@ -20,39 +21,17 @@ module Fulmar
|
|
20
21
|
environments: {},
|
21
22
|
features: {},
|
22
23
|
hosts: {},
|
23
|
-
dependencies: { all: {} }
|
24
24
|
}
|
25
25
|
|
26
|
-
include
|
26
|
+
include Singleton
|
27
27
|
|
28
28
|
attr_reader :environment, :target
|
29
|
-
attr_accessor :load_user_config
|
29
|
+
attr_accessor :load_user_config, :debug
|
30
30
|
|
31
31
|
def initialize
|
32
|
-
@environment = nil
|
33
|
-
@target = nil
|
34
32
|
@load_user_config = true
|
35
33
|
end
|
36
34
|
|
37
|
-
# Allow access of configuration via array/hash access methods (read access)
|
38
|
-
def [](id)
|
39
|
-
ready? ? configuration[:environments][@environment][@target][id] : nil
|
40
|
-
end
|
41
|
-
|
42
|
-
# Allow access of configuration via array/hash access methods (write access)
|
43
|
-
def []=(id, value)
|
44
|
-
if ready?
|
45
|
-
configuration[:environments][@environment][@target][id] = value
|
46
|
-
else
|
47
|
-
fail 'Environment or target not set. Please set both variables via configuration.environment = \'xxx\' / '\
|
48
|
-
'configuration.target = \'yyy\''
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def to_hash
|
53
|
-
ready? ? configuration[:environments][@environment][@target] : configuration
|
54
|
-
end
|
55
|
-
|
56
35
|
def base_path
|
57
36
|
@base_path ||= lookup_base_path
|
58
37
|
end
|
@@ -61,68 +40,6 @@ module Fulmar
|
|
61
40
|
@config ||= load_configuration
|
62
41
|
end
|
63
42
|
|
64
|
-
def project
|
65
|
-
@project ||= Fulmar::Domain::Model::Project.new(configuration[:project])
|
66
|
-
end
|
67
|
-
|
68
|
-
def method_missing(name)
|
69
|
-
environment(name) if configuration[:environments][name]
|
70
|
-
end
|
71
|
-
|
72
|
-
def environment=(env)
|
73
|
-
@environment = env ? env.to_sym : nil
|
74
|
-
end
|
75
|
-
|
76
|
-
def target=(target)
|
77
|
-
@target = target ? target.to_sym : nil
|
78
|
-
end
|
79
|
-
|
80
|
-
def ssh_user_and_host
|
81
|
-
self[:user].blank? ? self[:hostname] : self[:user] + '@' + self[:hostname]
|
82
|
-
end
|
83
|
-
|
84
|
-
def dependencies(env = nil)
|
85
|
-
if env.nil? || !@config[:dependencies].has_key?(env)
|
86
|
-
@config[:dependencies][:all]
|
87
|
-
else
|
88
|
-
@config[:dependencies][:all].deep_merge(@config[:dependencies][env])
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def ready?
|
93
|
-
return false if @environment.nil? || @target.nil?
|
94
|
-
fail 'Environment is invalid' if configuration[:environments][@environment].nil?
|
95
|
-
fail 'Target is invalid' if configuration[:environments][@environment][@target].nil?
|
96
|
-
true
|
97
|
-
end
|
98
|
-
|
99
|
-
def feature?(feature)
|
100
|
-
return configuration[:features].include? feature.to_s unless configuration[:features].nil?
|
101
|
-
case feature
|
102
|
-
when :database
|
103
|
-
any? { |data| data[:type] == 'maria' }
|
104
|
-
else
|
105
|
-
false
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def each
|
110
|
-
configuration[:environments].each_key do |env|
|
111
|
-
configuration[:environments][env].each_pair do |target, data|
|
112
|
-
yield(env, target, data)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def any?
|
118
|
-
if block_given?
|
119
|
-
each { |_env, _target, data| return true if yield(data) }
|
120
|
-
false
|
121
|
-
else
|
122
|
-
configuration[:environments].any?
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
43
|
# Merge another configuration into the currently active one
|
127
44
|
# Useful for supplying a default configuration, as values are not overwritten.
|
128
45
|
# Hashes are merged.
|
@@ -158,45 +75,17 @@ module Fulmar
|
|
158
75
|
File.dirname(fulmar_file)
|
159
76
|
end
|
160
77
|
|
161
|
-
# Fills a target with all globally set variables so all necessary information
|
162
|
-
# is found within each target
|
163
|
-
def fill_target(env, target)
|
164
|
-
@config[:environments][env][target] = @config[:environments][:all].deep_merge(@config[:environments][env][target]) if @config[:environments][:all]
|
165
|
-
|
166
|
-
return if @config[:environments][env][target][:host].blank?
|
167
|
-
|
168
|
-
host = @config[:environments][env][target][:host].to_sym
|
169
|
-
return unless @config[:hosts] && @config[:hosts][host]
|
170
|
-
@config[:hosts][host].each do
|
171
|
-
@config[:environments][env][target] = @config[:hosts][host].deep_merge(@config[:environments][env][target])
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
78
|
# Loads the configuration from the YAML file and populates all targets
|
176
79
|
def load_configuration
|
177
|
-
|
80
|
+
config = BLANK_CONFIG
|
178
81
|
config_files.each do |config_file|
|
179
|
-
|
180
|
-
end
|
181
|
-
|
182
|
-
prepare_environments
|
183
|
-
prepare_dependencies
|
184
|
-
# Iterate over all environments and targets to prepare them
|
185
|
-
@config[:environments].delete(:all)
|
186
|
-
check_version
|
187
|
-
@config
|
188
|
-
end
|
189
|
-
|
190
|
-
def prepare_environments
|
191
|
-
@config[:environments].each_key do |env|
|
192
|
-
next if env == :all
|
193
|
-
@config[:environments][env].each_key do |target|
|
194
|
-
fill_target(env, target)
|
195
|
-
check_path(env, target)
|
196
|
-
end
|
82
|
+
config = config.deep_merge((YAML.load_file(config_file) || {}).deep_symbolize_keys)
|
197
83
|
end
|
84
|
+
check_version(config[:project][:fulmar_version])
|
85
|
+
Fulmar::Domain::Model::Configuration.new(config, base_path, @debug)
|
198
86
|
end
|
199
87
|
|
88
|
+
# @todo Move to configuration model if I know what this was or if it is relevant
|
200
89
|
def prepare_dependencies
|
201
90
|
@config[:dependencies].each_pair do |_env, repos|
|
202
91
|
repos.each_pair do |_name, repo|
|
@@ -207,17 +96,10 @@ module Fulmar
|
|
207
96
|
end
|
208
97
|
end
|
209
98
|
|
210
|
-
def
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
@config[:environments][env][target][:local_path] = File.expand_path("#{base_path}/#{path}")
|
215
|
-
end
|
216
|
-
|
217
|
-
def check_version
|
218
|
-
return if @config[:project][:fulmar_version].nil?
|
219
|
-
unless Gem::Dependency.new('', @config[:project][:fulmar_version]).match?('', Fulmar::VERSION)
|
220
|
-
fail "Project requires another version of fulmar: #{@config[:project][:fulmar_version]}"
|
99
|
+
def check_version(version)
|
100
|
+
return if version.nil?
|
101
|
+
unless Gem::Dependency.new('', version).match?('', Fulmar::VERSION)
|
102
|
+
fail "Project requires a newer version of fulmar: #{version}"
|
221
103
|
end
|
222
104
|
end
|
223
105
|
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
|
2
|
-
require 'fulmar/infrastructure/
|
3
|
-
require 'fulmar/infrastructure/
|
4
|
-
require 'fulmar/infrastructure/
|
2
|
+
require 'fulmar/infrastructure/model/transfer/rsync'
|
3
|
+
require 'fulmar/infrastructure/model/transfer/rsync_with_versions'
|
4
|
+
require 'fulmar/infrastructure/model/transfer/tar'
|
5
5
|
|
6
6
|
module Fulmar
|
7
7
|
# Creates the required transfer model from the configuration
|
8
8
|
class FileSync
|
9
|
-
def self.
|
9
|
+
def self.get_model(config)
|
10
10
|
case config[:type]
|
11
11
|
when 'rsync_with_versions'
|
12
|
-
transfer_model = Fulmar::Infrastructure::
|
12
|
+
transfer_model = Fulmar::Infrastructure::Model::Transfer::RsyncWithVersions.new(config)
|
13
13
|
when 'rsync'
|
14
|
-
transfer_model = Fulmar::Infrastructure::
|
14
|
+
transfer_model = Fulmar::Infrastructure::Model::Transfer::Rsync.new(config)
|
15
15
|
when 'tar'
|
16
|
-
transfer_model = Fulmar::Infrastructure::
|
16
|
+
transfer_model = Fulmar::Infrastructure::Model::Transfer::Tar.new(config)
|
17
17
|
else
|
18
18
|
help = config[:type] == '' ? 'Add a "type: " field to your deployment yaml file. ' : ''
|
19
19
|
transfer_model = nil
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fulmar/domain/service/configuration_service'
|
2
|
+
require 'fulmar/shell'
|
2
3
|
require 'colorize'
|
3
4
|
|
4
5
|
module Fulmar
|
@@ -9,73 +10,58 @@ module Fulmar
|
|
9
10
|
module CommonHelper
|
10
11
|
attr_accessor :environment
|
11
12
|
|
12
|
-
# @return [Hash]
|
13
|
-
def full_configuration
|
14
|
-
configuration.configuration
|
15
|
-
end
|
16
|
-
|
17
13
|
# @return [Fulmar::Domain::Service::ConfigurationService]
|
18
|
-
def
|
19
|
-
(@_config_service ||= Fulmar::Domain::Service::ConfigurationService.instance)
|
14
|
+
def config
|
15
|
+
(@_config_service ||= Fulmar::Domain::Service::ConfigurationService.instance.configuration)
|
20
16
|
end
|
21
17
|
|
22
18
|
# @return [Fulmar::Domain::Model::Project]
|
23
19
|
def project
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def composer(command, arguments = Fulmar::Infrastructure::Service::ComposerService::DEFAULT_PARAMS)
|
28
|
-
storage['composer'] ||= Fulmar::Infrastructure::Service::ComposerService.new(local_shell)
|
29
|
-
storage['composer'].shell.quiet = !configuration[:debug]
|
30
|
-
storage['composer'].execute(command, arguments)
|
20
|
+
config.project
|
31
21
|
end
|
32
22
|
|
33
23
|
# @return [Fulmar::Shell]
|
34
24
|
def local_shell
|
35
|
-
storage['local_shell'] ||= new_shell(
|
25
|
+
storage['local_shell'] ||= new_shell(config[:local_path])
|
36
26
|
end
|
37
27
|
|
38
28
|
# @return [Fulmar::Shell]
|
39
29
|
def remote_shell
|
40
|
-
storage['remote_shell'] ||= new_shell(
|
30
|
+
storage['remote_shell'] ||= new_shell(config[:remote_path], config.ssh_user_and_host)
|
41
31
|
end
|
42
32
|
|
43
33
|
def file_sync
|
44
|
-
storage['file_sync'] ||= Fulmar::FileSync.
|
34
|
+
storage['file_sync'] ||= Fulmar::FileSync.get_model config
|
45
35
|
end
|
46
36
|
|
47
37
|
def render_templates
|
48
|
-
(Fulmar::Domain::Service::
|
49
|
-
end
|
50
|
-
|
51
|
-
def git
|
52
|
-
storage['git'] ||= Fulmar::Infrastructure::Service::GitService.new configuration
|
38
|
+
(Fulmar::Domain::Service::TemplateRenderingService.new config).render
|
53
39
|
end
|
54
40
|
|
55
|
-
def upload(filename)
|
56
|
-
Fulmar::Infrastructure::Service::CopyService.upload(local_shell, filename,
|
41
|
+
def upload(filename, target = config[:remote_path])
|
42
|
+
Fulmar::Infrastructure::Service::CopyService.upload(local_shell, filename, config.ssh_user_and_host, target)
|
57
43
|
end
|
58
44
|
|
59
|
-
def download(filename)
|
60
|
-
Fulmar::Infrastructure::Service::CopyService.download(local_shell,
|
45
|
+
def download(filename, target = config[:local_path])
|
46
|
+
Fulmar::Infrastructure::Service::CopyService.download(local_shell, config.ssh_user_and_host, filename, target)
|
61
47
|
end
|
62
48
|
|
63
49
|
def new_shell(path, hostname = 'localhost')
|
64
|
-
shell = Fulmar::
|
50
|
+
shell = Fulmar::Shell.new(path, hostname)
|
65
51
|
shell.strict = true
|
66
|
-
shell.debug =
|
52
|
+
shell.debug = config[:debug]
|
67
53
|
shell
|
68
54
|
end
|
69
55
|
|
70
56
|
def ssh_config
|
71
|
-
storage['ssh_config'] ||= Fulmar::Infrastructure::Service::SSHConfigService.new
|
57
|
+
storage['ssh_config'] ||= Fulmar::Infrastructure::Service::SSHConfigService.new config
|
72
58
|
end
|
73
59
|
|
74
60
|
def storage
|
75
|
-
fail 'You need to set an environment and a target first' unless
|
61
|
+
fail 'You need to set an environment and a target first' unless config.ready?
|
76
62
|
@storage ||= {}
|
77
|
-
@storage[
|
78
|
-
@storage[
|
63
|
+
@storage[config.environment] ||= {}
|
64
|
+
@storage[config.environment][config.target] ||= {}
|
79
65
|
end
|
80
66
|
|
81
67
|
def info(text)
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'active_support/core_ext/string/inflections'
|
3
|
+
require 'fulmar/domain/service/configuration_service'
|
4
|
+
|
5
|
+
module Fulmar
|
6
|
+
module Domain
|
7
|
+
module Service
|
8
|
+
class PluginService
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
def self.instance
|
12
|
+
@@instance ||= new
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@plugins = {}
|
17
|
+
config = ConfigurationService.instance.configuration
|
18
|
+
|
19
|
+
if config.plugins.class == Array
|
20
|
+
fail 'Plugin list must not be an array. Have a look at https://github.com/CORE4/fulmar#plugins for ' +
|
21
|
+
'more information'
|
22
|
+
end
|
23
|
+
|
24
|
+
config.plugins.each_pair do |name, plugin_config|
|
25
|
+
puts "Loading plugin '#{name}'..." if config.debug
|
26
|
+
require_plugin(name)
|
27
|
+
@plugins[name] = classname(name, :configuration).new(plugin_config)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def classname(plugin, name = nil)
|
33
|
+
"Fulmar::Plugin::#{class_map[plugin.to_s.downcase]}#{name.nil? ? '' : '::'+name.to_s.camelize}".constantize
|
34
|
+
end
|
35
|
+
|
36
|
+
def class_map
|
37
|
+
map = {}
|
38
|
+
Fulmar::Plugin.constants.each do |classname|
|
39
|
+
map[classname.to_s.downcase] = classname.to_s
|
40
|
+
end
|
41
|
+
map
|
42
|
+
end
|
43
|
+
|
44
|
+
def require_plugin(name)
|
45
|
+
require "fulmar/plugin/#{name}/configuration"
|
46
|
+
end
|
47
|
+
|
48
|
+
def helpers
|
49
|
+
@plugins.keys.select { |plugin| classname(plugin).constants.include? (:DslHelper) }.collect do |plugin|
|
50
|
+
classname(plugin, :DslHelper)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def rake_files
|
55
|
+
@plugins.values.collect(&:rake_files).flatten
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/fulmar/domain/service/{config_rendering_service.rb → template_rendering_service.rb}
RENAMED
@@ -4,14 +4,14 @@ module Fulmar
|
|
4
4
|
module Domain
|
5
5
|
module Service
|
6
6
|
# Renders templates of config files
|
7
|
-
class
|
7
|
+
class TemplateRenderingService
|
8
8
|
def initialize(config)
|
9
9
|
@config = config
|
10
10
|
end
|
11
11
|
|
12
12
|
def render
|
13
|
-
return unless @config[:
|
14
|
-
@config[:
|
13
|
+
return unless @config[:templates]
|
14
|
+
@config[:templates].each do |template_file|
|
15
15
|
template = template_path(template_file)
|
16
16
|
|
17
17
|
renderer = ERB.new(File.read(template))
|
@@ -3,7 +3,7 @@ require 'pp'
|
|
3
3
|
namespace :test do
|
4
4
|
task :config do
|
5
5
|
require 'fulmar/domain/service/config_test_service'
|
6
|
-
test_service = Fulmar::Domain::Service::ConfigTestService.new(
|
6
|
+
test_service = Fulmar::Domain::Service::ConfigTestService.new(config)
|
7
7
|
results = test_service.run
|
8
8
|
|
9
9
|
results.each do |report|
|
@@ -22,18 +22,20 @@ namespace :test do
|
|
22
22
|
|
23
23
|
task :hosts do
|
24
24
|
error_count = 0
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
config.each do |env, target, _data|
|
26
|
+
config.environment = env
|
27
|
+
config.target = target
|
28
28
|
|
29
|
-
next if
|
29
|
+
next if config[:hostname].blank?
|
30
30
|
remote_shell.quiet = true
|
31
31
|
remote_shell.strict = false
|
32
32
|
|
33
|
-
|
33
|
+
info "Testing #{env}:#{target}..."
|
34
|
+
|
35
|
+
message = "Cannot open remote shell to host '#{config[:hostname]}' (#{env}:#{target})"
|
34
36
|
|
35
37
|
begin
|
36
|
-
remote_shell.run
|
38
|
+
remote_shell.run('true') || error(message)
|
37
39
|
rescue
|
38
40
|
error(message)
|
39
41
|
end
|