swarm_cluster_cli_ope 0.4.2 → 0.5.0.pre.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/README.md +7 -2
- data/lib/swarm_cluster_cli_ope/base_configuration.rb +211 -0
- data/lib/swarm_cluster_cli_ope/cli.rb +6 -129
- data/lib/swarm_cluster_cli_ope/configuration.rb +3 -182
- data/lib/swarm_cluster_cli_ope/configuration_concern.rb +10 -9
- data/lib/swarm_cluster_cli_ope/k8s.rb +90 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/configuration.rb +64 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/pod.rb +144 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/rsync_cfgs/password +1 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/rsync_cfgs/rsyncd.conf +14 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/rsync_cfgs/rsyncd.secrets +1 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/sync_configs/base_decorator.rb +28 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/sync_configs/rsync.rb +127 -0
- data/lib/swarm_cluster_cli_ope/kubernetes/sync_configs/sqlite3.rb +9 -0
- data/lib/swarm_cluster_cli_ope/shell_command_execution.rb +1 -1
- data/lib/swarm_cluster_cli_ope/shell_command_response.rb +18 -5
- data/lib/swarm_cluster_cli_ope/stack_sync_concern.rb +128 -0
- data/lib/swarm_cluster_cli_ope/sync_configs/base.rb +1 -1
- data/lib/swarm_cluster_cli_ope/thor_configuration_concern.rb +29 -0
- data/lib/swarm_cluster_cli_ope/version.rb +1 -1
- metadata +16 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3ef506ff18497d7a1e4d7e8641d439f006d5a4efd6065436e4f9ab3ff9a251c
|
4
|
+
data.tar.gz: bbce35bf210097b7e2bb2d8a973ec345f2dd9cea786536947ddb88bd9baf0aef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa6b8661174a5b5c4961baf2c973c202b15b29ef25e5e796548c902339626d53aea85f6a70c83302127a4864ff868588d0c9b36431d9db71dd1c4626baa8482d
|
7
|
+
data.tar.gz: 6d81962999b8b01337c03c299db875264dde14bdf2b093448ed47e7f0f0dc51bc53fcdc70086975f0e66c6efee2ccfd5545a669e29d03a499fc1a88ab2ed9460
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
swarm_cluster_cli_ope (0.
|
4
|
+
swarm_cluster_cli_ope (0.5.0.pre.5)
|
5
5
|
activesupport
|
6
6
|
open4
|
7
7
|
thor (~> 1.0)
|
@@ -10,7 +10,7 @@ PATH
|
|
10
10
|
GEM
|
11
11
|
remote: https://rubygems.org/
|
12
12
|
specs:
|
13
|
-
activesupport (6.0.3.
|
13
|
+
activesupport (6.0.3.4)
|
14
14
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
15
15
|
i18n (>= 0.7, < 2)
|
16
16
|
minitest (~> 5.1)
|
@@ -24,9 +24,9 @@ GEM
|
|
24
24
|
rake (12.3.3)
|
25
25
|
thor (1.0.1)
|
26
26
|
thread_safe (0.3.6)
|
27
|
-
tzinfo (1.2.
|
27
|
+
tzinfo (1.2.8)
|
28
28
|
thread_safe (~> 0.1)
|
29
|
-
zeitwerk (2.4.
|
29
|
+
zeitwerk (2.4.1)
|
30
30
|
|
31
31
|
PLATFORMS
|
32
32
|
ruby
|
data/README.md
CHANGED
@@ -110,7 +110,7 @@ ogni configurazione è composta da:
|
|
110
110
|
}
|
111
111
|
```
|
112
112
|
|
113
|
-
- service è il nome del servizio
|
113
|
+
- service è il nome del servizio (o nel caso di k8s una stringa da utilizzare come selettore labels)
|
114
114
|
- how è il come sincronizzare, definendo la tipologia:
|
115
115
|
- pg -> DB TODO
|
116
116
|
- mysql -> DB: dump del db con mysqldump
|
@@ -193,7 +193,7 @@ Esempio di sincronizzazione di un file sqlite3 e una cartella
|
|
193
193
|
|
194
194
|
nel file di configurazione creato nella home aggiungere la chiave "dev_mode":1 per collegarsi localmente
|
195
195
|
|
196
|
-
### Abbiamo due tasks
|
196
|
+
### Abbiamo due tasks SWARM di simulazione
|
197
197
|
```shell script
|
198
198
|
docker stack deploy -c test_folder/test_1/docker-compose.yml test_1_stack
|
199
199
|
docker stack deploy -c test_folder/test_1/docker-compose.yml test1_staging
|
@@ -207,6 +207,11 @@ docker-compose -f test_folder/test_1/docker-compose-local.yml up -d
|
|
207
207
|
```
|
208
208
|
|
209
209
|
|
210
|
+
### K8s
|
211
|
+
Per Kubernetes dobbiamo avere minikube installato.
|
212
|
+
lanciare quindi l'ambiente di test:
|
213
|
+
|
214
|
+
kubectl apply -f test_folder/test_k8s/test.yaml
|
210
215
|
|
211
216
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version
|
212
217
|
number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git
|
@@ -0,0 +1,211 @@
|
|
1
|
+
module SwarmClusterCliOpe
|
2
|
+
##
|
3
|
+
# Classe Base delle configurazioni, utilizzabile per swarm e kubernetes
|
4
|
+
class BaseConfiguration
|
5
|
+
include Singleton
|
6
|
+
include LoggerConcern
|
7
|
+
|
8
|
+
#@return [String] nome dello stack con cui lavoriamo
|
9
|
+
attr_accessor :stack_name
|
10
|
+
|
11
|
+
#@return [String] in che enviroment siamo, altrimenti siamo nel default
|
12
|
+
attr_accessor :environment
|
13
|
+
|
14
|
+
NoBaseConfigurations = Class.new(Error)
|
15
|
+
|
16
|
+
##
|
17
|
+
# Serve per entrare nell'env corretto.
|
18
|
+
# passando l'env, tutto quello eseguito nello yield sarà gestito in quell'env.
|
19
|
+
# Verrà controllato quindi che esista il relativo file di configurazion
|
20
|
+
def env(enviroment = nil)
|
21
|
+
unless enviroment.nil?
|
22
|
+
@environment = enviroment.to_s.to_sym
|
23
|
+
end
|
24
|
+
logger.info { "ENV: #{@environment ? @environment : "BASE"}" }
|
25
|
+
yield self
|
26
|
+
@environment = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [String,NilClass] nome dello stack del progetto se configurato
|
30
|
+
def stack_name
|
31
|
+
return nil unless self.class.exist_base?
|
32
|
+
@stack_name ||= Hash.new do |hash, key|
|
33
|
+
hash[key] = merged_configurations[:stack_name] if merged_configurations.key?(:stack_name)
|
34
|
+
end
|
35
|
+
@stack_name[environment]
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Imposta il nome dello stack
|
40
|
+
def stack_name=(objs)
|
41
|
+
stack_name #lo richiamo per fargli generare la variabile di classe
|
42
|
+
@stack_name[environment] = objs
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Livello di logging
|
47
|
+
# @return [Integer]
|
48
|
+
def logger_level
|
49
|
+
merged_configurations[:log_level].to_s || "0"
|
50
|
+
rescue SwarmClusterCliOpe::Configuration::NoBaseConfigurations
|
51
|
+
# quando andiamo in errore durante l'installazione per avere le informazioni per il logger.
|
52
|
+
# Usiamo lo standard
|
53
|
+
"0"
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Siamo in sviluppo?
|
58
|
+
# @return [TrueClass, FalseClass]
|
59
|
+
def development_mode?
|
60
|
+
return false unless self.class.exist_base?
|
61
|
+
merged_configurations.key?(:dev_mode)
|
62
|
+
end
|
63
|
+
|
64
|
+
##
|
65
|
+
# Controlla se esiste il file di configurazione base, nella home dell'utente
|
66
|
+
def self.exist_base?
|
67
|
+
File.exist?(base_cfg_path)
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# @return [String] path to base home configurations
|
72
|
+
def self.base_cfg_path
|
73
|
+
File.join(ENV['HOME'], '.swarm_cluster', 'config.json')
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
##
|
78
|
+
# Elenco di tutte le configurazioni di sincronizzazione
|
79
|
+
# @return [Array]
|
80
|
+
def sync_configurations
|
81
|
+
cfgs = merged_configurations[:sync_configs]
|
82
|
+
return [] if cfgs.nil? or !cfgs.is_a?(Array)
|
83
|
+
cfgs.collect do |c|
|
84
|
+
|
85
|
+
if self.get_syncro(c[:how])
|
86
|
+
self.get_syncro(c[:how]).new(self, c)
|
87
|
+
end
|
88
|
+
|
89
|
+
end.compact
|
90
|
+
end
|
91
|
+
|
92
|
+
##
|
93
|
+
# Funzione per la restituzione della classe di sincro corretta
|
94
|
+
# @return [Class<SwarmClusterCliOpe::SyncConfigs::PostGres>, Class<SwarmClusterCliOpe::SyncConfigs::Mysql>, Class<SwarmClusterCliOpe::SyncConfigs::Rsync>, Class<SwarmClusterCliOpe::SyncConfigs::Sqlite3>, nil]
|
95
|
+
def get_syncro(name)
|
96
|
+
case name
|
97
|
+
when 'sqlite3'
|
98
|
+
SyncConfigs::Sqlite3
|
99
|
+
when 'rsync'
|
100
|
+
SyncConfigs::Rsync
|
101
|
+
when 'mysql'
|
102
|
+
SyncConfigs::Mysql
|
103
|
+
when 'pg'
|
104
|
+
SyncConfigs::PostGres
|
105
|
+
else
|
106
|
+
logger.error { "CONFIGURAIONE NON PREVISTA: #{name}" }
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
## Cerca le configurazioni di progetto e le mergia se sono presenti
|
112
|
+
# @return [Hash]
|
113
|
+
def merged_configurations
|
114
|
+
return @_merged_configurations[@environment] if @_merged_configurations
|
115
|
+
|
116
|
+
@_merged_configurations = Hash.new do |hash, key|
|
117
|
+
folder = FileUtils.pwd
|
118
|
+
default_file = looped_file(folder, self.class.cfgs_project_file_name)
|
119
|
+
enviroment_file = looped_file(folder, self.class.cfgs_project_file_name(with_env: key))
|
120
|
+
|
121
|
+
project_cfgs = {}
|
122
|
+
unless default_file.nil?
|
123
|
+
project_cfgs = JSON.parse(File.read(default_file)).deep_symbolize_keys
|
124
|
+
end
|
125
|
+
|
126
|
+
unless enviroment_file.nil?
|
127
|
+
project_cfgs.merge!(JSON.parse(File.read(enviroment_file)).deep_symbolize_keys)
|
128
|
+
end
|
129
|
+
|
130
|
+
hash[key] = self.class.read_base.merge(project_cfgs)
|
131
|
+
end
|
132
|
+
|
133
|
+
configuration_version = @_merged_configurations[@environment][:version]
|
134
|
+
if Gem::Version.new(configuration_version) > Gem::Version.new(VERSION)
|
135
|
+
puts "WARNING: Versione del file di configurazione [#{configuration_version}] più aggiornata della gemma [#{VERSION}], eseguire upgrade
|
136
|
+
gem update swarm_cluster_cli_ope"
|
137
|
+
exit
|
138
|
+
end
|
139
|
+
|
140
|
+
@_merged_configurations[@environment]
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
##
|
146
|
+
# Si occupa del salvataggio delle configurazioni di progetto, se abbiamo lo stack_name
|
147
|
+
def save_project_cfgs
|
148
|
+
if stack_name
|
149
|
+
File.open(File.join(FileUtils.pwd, self.class.cfgs_project_file_name(with_env: @environment)), "wb") do |f|
|
150
|
+
f.write({
|
151
|
+
stack_name: stack_name,
|
152
|
+
version: VERSION
|
153
|
+
}.to_json)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
##
|
160
|
+
# Salva le configurazioni base in HOME
|
161
|
+
def save_base_cfgs
|
162
|
+
FileUtils.mkdir_p(File.dirname(self.class.base_cfg_path))
|
163
|
+
File.open(self.class.base_cfg_path, "wb") do |f|
|
164
|
+
obj= {
|
165
|
+
version: SwarmClusterCliOpe::VERSION,
|
166
|
+
}
|
167
|
+
obj = yield(obj) if block_given?
|
168
|
+
|
169
|
+
f.write(obj.to_json)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
private
|
176
|
+
##
|
177
|
+
# nome del file in cui salvare le configurazioni di progetto
|
178
|
+
# @return [String]
|
179
|
+
# @param [nil|String] with_env nome dell'env da cercare
|
180
|
+
def self.cfgs_project_file_name(with_env: nil)
|
181
|
+
".swarm_cluster_project#{with_env ? ".#{with_env}" : ""}"
|
182
|
+
end
|
183
|
+
|
184
|
+
##
|
185
|
+
# Legge le configurazioni base
|
186
|
+
#
|
187
|
+
# @return [Hash]
|
188
|
+
def self.read_base
|
189
|
+
raise NoBaseConfigurations if !exist_base? or File.size(self.base_cfg_path)==0
|
190
|
+
JSON.parse(File.read(self.base_cfg_path)).deep_symbolize_keys
|
191
|
+
end
|
192
|
+
|
193
|
+
def looped_file(start_folder, file)
|
194
|
+
project_file = nil
|
195
|
+
loop do
|
196
|
+
|
197
|
+
if File.exist?(File.join(start_folder, file))
|
198
|
+
project_file = File.join(start_folder, file)
|
199
|
+
end
|
200
|
+
|
201
|
+
break unless project_file.nil?
|
202
|
+
break if start_folder == '/'
|
203
|
+
start_folder = File.expand_path("..", start_folder)
|
204
|
+
end
|
205
|
+
|
206
|
+
project_file
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
end
|
211
|
+
end
|
@@ -5,6 +5,7 @@ module SwarmClusterCliOpe
|
|
5
5
|
class Cli < Thor
|
6
6
|
include LoggerConcern
|
7
7
|
include ConfigurationConcern
|
8
|
+
include ThorConfigurationConcern
|
8
9
|
include Thor::Actions
|
9
10
|
|
10
11
|
def self.exit_on_failure?
|
@@ -14,6 +15,10 @@ module SwarmClusterCliOpe
|
|
14
15
|
class_option :environment, required: false, type: :string, aliases: [:e],
|
15
16
|
desc: "Esegue tutte le operazioni nell'env scelto, il file di configurazione dovrà avere il nome: #{Configuration.cfgs_project_file_name}.ENV"
|
16
17
|
|
18
|
+
|
19
|
+
desc "k8s SUBCOMMAND ...ARGS", "Gestisce un set di comandi specifici per K8s"
|
20
|
+
subcommand "k8s", K8s
|
21
|
+
|
17
22
|
desc "install", "Creazione della configurazione base della gemma"
|
18
23
|
|
19
24
|
def install
|
@@ -40,14 +45,6 @@ module SwarmClusterCliOpe
|
|
40
45
|
|
41
46
|
end
|
42
47
|
|
43
|
-
desc "config", "Visualizza le configurazioni mergiate (HOME + Project configuration[#{Configuration.cfgs_project_file_name}])"
|
44
|
-
|
45
|
-
def config
|
46
|
-
cfgs.env(options[:environment]) do
|
47
|
-
puts JSON.pretty_generate(cfgs.merged_configurations)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
48
|
|
52
49
|
# DOCKER_HOST=ssh://swarm_node_1 docker stack ls --format="{{json .}}"
|
53
50
|
desc "stacks", "Lista degli stacks nel cluster"
|
@@ -187,16 +184,6 @@ module SwarmClusterCliOpe
|
|
187
184
|
end
|
188
185
|
|
189
186
|
|
190
|
-
desc "configure_project STACK_NAME", "Genera il file di configurazione del progetto contenente il nome dello stack"
|
191
|
-
|
192
|
-
def configure_project(stack_name)
|
193
|
-
cfgs.env(options[:environment]) do |c|
|
194
|
-
c.stack_name = stack_name
|
195
|
-
c.save_project_cfgs
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
|
200
187
|
desc "service_shell SERVICE_NAME", "apre una shell [default bash] dentro al container"
|
201
188
|
option :stack_name, required: false, type: :string
|
202
189
|
option :shell, required: false, type: :string, default: 'bash'
|
@@ -248,117 +235,7 @@ module SwarmClusterCliOpe
|
|
248
235
|
say VERSION
|
249
236
|
end
|
250
237
|
|
251
|
-
|
252
|
-
long_desc <<-LONGDESC.gsub("\n", "\x5")
|
253
|
-
le configurazioni sono contenute nell'array: sync_configs.
|
254
|
-
ogni configurazione è composta da:
|
255
|
-
{
|
256
|
-
service:""
|
257
|
-
how:""
|
258
|
-
configs:{ }
|
259
|
-
}
|
260
|
-
- service è il nome del servizio
|
261
|
-
- how è il come sincronizzare, definendo la tipologia:
|
262
|
-
---- pg -> DB TODO
|
263
|
-
---- mysql -> DB dump con mysql
|
264
|
-
---- sqlite3 -> DB: viene eseguita una copia del file
|
265
|
-
---- rsync -> RSYNC
|
266
|
-
- configs: è un hash con le configurazioni per ogni tipo di sincronizzazione
|
267
|
-
|
268
|
-
Possibili CFGS per tipologia:
|
269
|
-
rsync:
|
270
|
-
--local: -> path cartella locale
|
271
|
-
--remote: -> path cartella remota (contesto del container)
|
272
|
-
|
273
|
-
sqlite3:
|
274
|
-
--local: -> path al file
|
275
|
-
--remote: -> path al file remoto (contesto del container)
|
276
|
-
|
277
|
-
mysql:
|
278
|
-
--local: -> hash di configurazioni per il DB locale
|
279
|
-
- service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
|
280
|
-
- mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
|
281
|
-
- mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
|
282
|
-
- mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
|
283
|
-
- mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
|
284
|
-
- database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
|
285
|
-
- database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
|
286
|
-
--remote: -> hash di configurazioni per il DB remoto
|
287
|
-
- service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
|
288
|
-
- mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
|
289
|
-
- mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
|
290
|
-
- mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
|
291
|
-
- mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
|
292
|
-
- database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
|
293
|
-
- database_name: "MYSQL_DATABASE" -> valore in chiaro, in sostituzione della variabile ambiente
|
294
|
-
pg:
|
295
|
-
--local: -> hash di configurazioni per il DB locale
|
296
|
-
- service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
|
297
|
-
- pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
|
298
|
-
- pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
|
299
|
-
- pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
|
300
|
-
- pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
|
301
|
-
- database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
|
302
|
-
- database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
|
303
|
-
--remote: -> hash di configurazioni per il DB remoto
|
304
|
-
- service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
|
305
|
-
- pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
|
306
|
-
- pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
|
307
|
-
- pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
|
308
|
-
- pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
|
309
|
-
- database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
|
310
|
-
- database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
|
311
|
-
|
312
|
-
|
313
|
-
EXAMPLE:
|
314
|
-
Esempio di sincronizzazione di un file sqlite3 e una cartella
|
315
|
-
{
|
316
|
-
"stack_name": "test1",
|
317
|
-
"sync_configs": [
|
318
|
-
{
|
319
|
-
"service": "second",
|
320
|
-
"how": "rsync",
|
321
|
-
"configs": {
|
322
|
-
"remote": "/test_bind",
|
323
|
-
"local": "./uploads"
|
324
|
-
}
|
325
|
-
},
|
326
|
-
{
|
327
|
-
"service": "test_sqlite3",
|
328
|
-
"how": "sqlite3",
|
329
|
-
"configs": {
|
330
|
-
"remote": "/cartella_sqlite3/esempio.sqlite3",
|
331
|
-
"local": "./development.sqlite3"
|
332
|
-
}
|
333
|
-
}
|
334
|
-
]
|
335
|
-
}
|
336
|
-
LONGDESC
|
337
|
-
|
338
|
-
def stacksync(direction)
|
339
|
-
direction = case direction
|
340
|
-
when 'push'
|
341
|
-
:push
|
342
|
-
when 'pull'
|
343
|
-
:pull
|
344
|
-
else
|
345
|
-
raise "ONLY [push|pull] action accepted"
|
346
|
-
end
|
347
|
-
cfgs.env(options[:environment]) do |cfgs|
|
348
|
-
sync_cfgs = cfgs.sync_configurations
|
349
|
-
if sync_cfgs.empty?
|
350
|
-
say "Attenzione, configurazioni di sincronizzazione vuoto. Leggere la documentazione"
|
351
|
-
else
|
352
|
-
sync_cfgs.each do |sync|
|
353
|
-
say "----------->>>>>>"
|
354
|
-
say "[ #{sync.class.name} ]"
|
355
|
-
sync.send(direction)
|
356
|
-
say "COMPLETE"
|
357
|
-
say "<<<<<<-----------"
|
358
|
-
end
|
359
|
-
end
|
360
|
-
end
|
361
|
-
end
|
238
|
+
include StackSyncConcern
|
362
239
|
|
363
240
|
private
|
364
241
|
|