swarm_cluster_cli_ope 0.5.6 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93771440f5d2a285cd10d390fe8983d8efcce1a5e3ef323d15de38ade748cfba
4
- data.tar.gz: 61d5654dcf67657bab0313da131292c930a5008dcb60359eef3eb0c9f334ffc1
3
+ metadata.gz: 3d51e0df2052c16b612f01ad3601fae2437cacdc0576934f9986ad9144cb56bd
4
+ data.tar.gz: aa35f3b0392254bac2e0279a4b03be48e117f7a30647579e853ee61d6b1e7b3b
5
5
  SHA512:
6
- metadata.gz: 5b6d4dd4be603b2ce5648bfcd345d3a2f0f415b370ec0834816272480faade213c18fdc17672cbe6c806c438ff2846e40458683d7fc5e48306189a230ca81d99
7
- data.tar.gz: 38ae9e73b07af96a439a2f624d0851f0de4686447694a41eb0dd86d63126926b626e9c91b64699cec2df331eee5361098a08e894969401183edd23bbb28ccba0
6
+ metadata.gz: ff8ba67141d48e2bf24ab2940c2567b2b48d8b1d92e8459dc14436813feee68c60886510a1812aafe340e2186a1a1bf11766c505d6a97ca8ee001a6cd016a16d
7
+ data.tar.gz: c34cfd520df2b7afcacfcd69827033fe12569eedff9f482053bf9b58e97f288632a92cc573aae71c02d7e457fb4f0ab307eeba07131c8dd03cc65a0283a4ccec
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ## Changelog
2
2
 
3
+ # 0.7
4
+ - riconoscimento delle immagini durante rsync per installare correttamente pacchetto,
5
+ viene riconosciuto ubuntu ed alpine
6
+
7
+ # 0.6
8
+ - sync con MongoDB
9
+
3
10
  # 0.5.6
4
11
  - correzione parsing variabili ambiente con '=='
5
12
 
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- swarm_cluster_cli_ope (0.5.6)
5
- activesupport
4
+ swarm_cluster_cli_ope (0.7.2)
5
+ activesupport (< 7)
6
6
  open4
7
7
  thor (~> 1.0)
8
8
  zeitwerk (~> 2.3)
@@ -10,22 +10,22 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (6.1.2)
13
+ activesupport (6.1.6)
14
14
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
15
  i18n (>= 1.6, < 2)
16
16
  minitest (>= 5.1)
17
17
  tzinfo (~> 2.0)
18
18
  zeitwerk (~> 2.3)
19
- concurrent-ruby (1.1.8)
20
- i18n (1.8.8)
19
+ concurrent-ruby (1.1.10)
20
+ i18n (1.10.0)
21
21
  concurrent-ruby (~> 1.0)
22
- minitest (5.14.3)
22
+ minitest (5.15.0)
23
23
  open4 (1.3.4)
24
24
  rake (12.3.3)
25
- thor (1.1.0)
25
+ thor (1.2.1)
26
26
  tzinfo (2.0.4)
27
27
  concurrent-ruby (~> 1.0)
28
- zeitwerk (2.4.2)
28
+ zeitwerk (2.6.0)
29
29
 
30
30
  PLATFORMS
31
31
  ruby
data/README.md CHANGED
@@ -112,10 +112,11 @@ ogni configurazione è composta da:
112
112
 
113
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
- - pg -> DB TODO
115
+ - pg -> DB: dump del DB con pgdump
116
116
  - mysql -> DB: dump del db con mysqldump
117
117
  - sqlite3 -> DB: viene eseguita una copia del file
118
118
  - rsync -> RSYNC
119
+ - mongodb -> mongodump e mongorestore
119
120
  - configs: è un hash con le configurazioni per ogni tipo di sincronizzazione
120
121
 
121
122
  Possibili CFGS per tipologia:
@@ -159,8 +160,21 @@ Possibili CFGS per tipologia:
159
160
  - pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
160
161
  - pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
161
162
  - database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
162
- - database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
163
-
163
+ - database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
164
+ - mongo:
165
+ - local: -> hash di configurazioni per il DB locale
166
+ - service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
167
+ - password: "" -> password per DB
168
+ - username: "" -> username per DB
169
+ - database_name: "nome_db" -> nome del DB
170
+ - exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PUSH, DEFAULT: ''
171
+ - remote: -> hash di configurazioni per il DB remoto
172
+ - service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
173
+ - password: "" -> password per DB
174
+ - username: "" -> username per DB
175
+ - database_name: "nome_db" -> nome del DB
176
+ - exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PULL, DEFAULT: ''
177
+
164
178
  #### EXAMPLE:
165
179
  Esempio di sincronizzazione di un file sqlite3 e una cartella
166
180
 
@@ -217,9 +231,12 @@ docker-compose -f test_folder/test_k8s/docker-compose-local.yml up -d
217
231
  ```
218
232
 
219
233
 
220
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version
221
- number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git
222
- commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
234
+ ## Release
235
+
236
+ To install this gem onto your local machine, run `bundle exec rake install`.
237
+
238
+ To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`,
239
+ which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
223
240
 
224
241
 
225
242
  ## License
@@ -102,6 +102,8 @@ module SwarmClusterCliOpe
102
102
  SyncConfigs::Mysql
103
103
  when 'pg'
104
104
  SyncConfigs::PostGres
105
+ when 'mongodb'
106
+ SyncConfigs::MongoDb
105
107
  else
106
108
  logger.error { "CONFIGURAIONE NON PREVISTA: #{name}" }
107
109
  nil
@@ -53,7 +53,7 @@ module SwarmClusterCliOpe
53
53
  when 'pg'
54
54
  SyncConfigs::PostGres
55
55
  else
56
- logger.error { "CONFIGURAIONE NON PREVISTA: #{name}" }
56
+ logger.error { "CONFIGURAIONE NON PREVISTA in K8S: #{name}" }
57
57
  nil
58
58
  end
59
59
  end
@@ -31,8 +31,9 @@ module SwarmClusterCliOpe
31
31
 
32
32
  # @param [String,Array<String>] cmd -> comando da passare a kubectl exec -- CMD
33
33
  # @return [SwarmClusterCliOpe::ShellCommandResponse]
34
- def exec(cmd)
35
- base_cmd(["exec", name, "--", cmd].flatten).execute
34
+ # @param [FalseClass] allow_failure -> parametro per lasciar fallire o meno il comando senza bloccarsi e poi gestirlo
35
+ def exec(cmd, allow_failure: false)
36
+ base_cmd(["exec", name, "--", cmd].flatten).execute(allow_failure: allow_failure)
36
37
  end
37
38
 
38
39
  ##
@@ -45,22 +45,24 @@ module SwarmClusterCliOpe
45
45
 
46
46
  # controllo presenza comandi necessari
47
47
  command_installed = false
48
- cmd_ricerca = container.exec(['bash -c "command -v rsync && command -v killall"'])
49
- unless cmd_ricerca.failed?
50
- num_commands = cmd_ricerca.raw_result[:stdout].split("\n").count rescue 0
51
- if num_commands == 2
52
- command_installed = true
53
- end
48
+ install_rsync = false
49
+ install_psmisc = false
50
+ if container.exec(['sh -c "command -v apt"'], allow_failure: true).success?
51
+ puts "Container Ubuntu"
52
+ install_rsync = container.exec(['sh -c "command -v rsync || apt update && apt install -yq rsync "'], allow_failure: true).success?
53
+ install_psmisc = container.exec(['sh -c "command -v killall || apt update && apt install -yq psmisc"'], allow_failure: true).success?
54
54
  end
55
55
 
56
- unless command_installed
57
- # tentiamo di installarlo
58
- cmd = container.exec(['bash -c "apt update && apt install -yq rsync psmisc"'])
59
- if cmd.failed?
60
- puts "Problemi nell'installazione di rsync nel pod"
61
- else
62
- command_installed = true
63
- end
56
+ if container.exec(['sh -c "command -v apk"'], allow_failure: true).success?
57
+ puts "Container Alpine"
58
+ install_rsync = container.exec(['sh -c "command -v rsync || apk add rsync"'], allow_failure: true).success?
59
+ install_psmisc = true
60
+ end
61
+
62
+ if install_rsync and install_psmisc
63
+ command_installed = true
64
+ else
65
+ puts "Problemi nell'installazione di rsync nel pod"
64
66
  end
65
67
 
66
68
  if command_installed
@@ -4,7 +4,14 @@ module SwarmClusterCliOpe
4
4
 
5
5
  # @return [SwarmClusterCliOpe::Models::ComposeContainer]
6
6
  def self.find_by_service_name(service_name, stack_name: '')
7
- res = ShellCommandExecution.new("docker inspect #{[stack_name, service_name, "1"].compact.join("_".strip)}").execute
7
+ # prima controlliamo se siamo con il vecchio sistema di docker-compose dove i nomi dei servizi venivano
8
+ # costruiti con _ oppure se siamo nella nuova versione di docker compose dove c'è il - che fà da spaziatore
9
+ res = nil
10
+ ["_", "-"].each do |separatore|
11
+ res = ShellCommandExecution.new("docker inspect #{[stack_name, service_name, "1"].compact.join(separatore)}").execute(allow_failure: true)
12
+ break unless res.failed?
13
+ end
14
+ raise "Non siamo riusciti ad identificare il servizio in locale" if res.failed?
8
15
  self.new(JSON.parse(res.raw_result[:stdout]).first)
9
16
  end
10
17
 
@@ -66,7 +66,19 @@ module SwarmClusterCliOpe
66
66
  - pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
67
67
  - database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
68
68
  - database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
69
-
69
+ mongo:
70
+ -- local: -> hash di configurazioni per il DB locale
71
+ - service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
72
+ - password: "" -> password per DB
73
+ - username: "" -> username per DB
74
+ - database_name: "nome_db" -> nome del DB
75
+ - exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PUSH, DEFAULT: ''
76
+ -- remote: -> hash di configurazioni per il DB remoto
77
+ - service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
78
+ - password: "" -> password per DB
79
+ - username: "" -> username per DB
80
+ - database_name: "nome_db" -> nome del DB
81
+ - exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PULL, DEFAULT: ''
70
82
 
71
83
  EXAMPLE:
72
84
  Esempio di sincronizzazione di un file sqlite3 e una cartella
@@ -37,7 +37,7 @@ module SwarmClusterCliOpe
37
37
  # con _env o senza....precedenza SENZA
38
38
  # @param [Block] from_proc -> proc da utilizzare per ricavare il valore
39
39
  # @param [nil,String] default_value se non è estrapolato nessun valore, viene utilizzato il valore di default
40
- def self.define_cfgs(name, default_env:, configuration_name:, default_value: nil, from_proc: nil)
40
+ def self.define_cfgs(name, default_env: nil, configuration_name:, default_value: nil, from_proc: nil)
41
41
  configuration_name ||= name
42
42
 
43
43
  define_method(name) do
@@ -48,7 +48,7 @@ module SwarmClusterCliOpe
48
48
  value = @configs["#{configuration_name}".to_sym]
49
49
  end
50
50
  # se non abbiamo nulla dalle configurazioni utilizziamo le variabili d'ambiente
51
- if value.nil?
51
+ if value.nil? and default_env
52
52
 
53
53
  #cerchiamo nella lista delle variabili ambiente possibili, la prima che ha un valore la tengo per buona
54
54
  env_vars = []
@@ -0,0 +1,94 @@
1
+ module SwarmClusterCliOpe
2
+ module SyncConfigs
3
+ class MongoDb < BaseDatabase
4
+
5
+ # @return [TrueClass, FalseClass]
6
+ def pull
7
+ resume('pull')
8
+ if yes?("Confermare il comando?[y,yes]")
9
+
10
+ tmp_file = make_dump(remote, container)
11
+
12
+ local_container.copy_in(tmp_file, tmp_file)
13
+
14
+ restore(tmp_file, remote, local, local_container)
15
+ end
16
+ true
17
+ end
18
+
19
+ # @return [TrueClass, FalseClass]
20
+ def push
21
+ resume('PUSH')
22
+ if yes?("ATTENZIONE !!!!!!PUSH!!!!! - Confermare il comando?[y,yes]")
23
+ tmp_file = make_dump(local, local_container)
24
+ container.copy_in(tmp_file, tmp_file)
25
+ restore(tmp_file, local, remote, container)
26
+ end
27
+ true
28
+ end
29
+
30
+ ##
31
+ # Classe interna che rappresenta le configurazioni del DB
32
+ class EnvConfigs < BaseDatabase::EnvConfigs
33
+
34
+ define_cfgs :database_name, configuration_name: :database_name
35
+ define_cfgs :username, configuration_name: :username
36
+ define_cfgs :password, configuration_name: :password
37
+
38
+ define_cfgs :database_version, default_env: "MONGO_VERSION", configuration_name: :version
39
+
40
+ ##
41
+ # Possiamo definire una lista, comma-separated, per limitare le collections da non importare
42
+ define_cfgs :exclude_from_sync, default_env: "EXCLUDE_FROM_SYNC", configuration_name: :exclude_from_sync, default_value: ""
43
+
44
+ ##
45
+ # Helper per avere un array di collections da non sincronizzare, specifico per mongodb
46
+ # @return [Array<String>]
47
+ def excluded_collections
48
+ return [] if exclude_from_sync.nil?
49
+ exclude_from_sync.split(",").compact
50
+ end
51
+
52
+ end
53
+
54
+ private
55
+
56
+ # @param [String] tmp_file
57
+ # @param [EnvConfigs] from_env environment sorgente (per rinominare anche il nome del DB)
58
+ # @param [EnvConfigs] to_env environment di arrivo (per rinominare anche il nome del DB)
59
+ # @param [SwarmClusterCliOpe::Models::Container] cnt in cui eseguire l'import
60
+ def restore(tmp_file, from_env, to_env, cnt)
61
+ command = []
62
+ command << "bash -c '"
63
+ command << "mongorestore"
64
+ command << "--nsFrom '#{from_env.database_name}.*'"
65
+ command << "--nsTo '#{to_env.database_name}.*'"
66
+ command << "--drop --archive=#{tmp_file} --gzip"
67
+ command << "'"
68
+
69
+ cnt.exec(command.join " ")
70
+ end
71
+
72
+ # @param [EnvConfigs] environment
73
+ # @param [SwarmClusterCliOpe::Models::Container] cnt
74
+ def make_dump(environment, cnt)
75
+ tmp_file = "/tmp/dump.#{Time.now.to_i}.archive"
76
+ command = []
77
+ command << "bash -c '"
78
+
79
+ command << "mongodump --db #{environment.database_name} "
80
+ environment.excluded_collections.each do |collection|
81
+ command << " --excludeCollection \"#{collection}\" "
82
+ end
83
+ command << "--username \"#{environment.username}\" " if environment.username
84
+ command << "--password \"#{environment.password}\" " if environment.password
85
+ command << "--archive --gzip"
86
+
87
+ command << "' > #{tmp_file}"
88
+ cnt.exec(command.join " ")
89
+ tmp_file
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -1,3 +1,3 @@
1
1
  module SwarmClusterCliOpe
2
- VERSION = "0.5.6"
2
+ VERSION = "0.7.2"
3
3
  end
@@ -32,5 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency "thor", '~>1.0'
33
33
  spec.add_dependency "zeitwerk", '~>2.3'
34
34
  spec.add_dependency "open4"
35
- spec.add_dependency "activesupport"
35
+ spec.add_dependency "activesupport", '<7'
36
36
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swarm_cluster_cli_ope
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.6
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marino Bonetti
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
11
+ date: 2022-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: activesupport
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "<"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '7'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "<"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '7'
69
69
  description: |-
70
70
  Gestione di varie operazioni come sincronia con le cartelle bindate dei container (rsync) up o
71
71
  down e possibilità di scaricare/caricare i file direttamente all'interno del cluster, in
@@ -126,6 +126,7 @@ files:
126
126
  - lib/swarm_cluster_cli_ope/sync_configs/base_database.rb
127
127
  - lib/swarm_cluster_cli_ope/sync_configs/copy.rb
128
128
  - lib/swarm_cluster_cli_ope/sync_configs/env_configs.rb
129
+ - lib/swarm_cluster_cli_ope/sync_configs/mongo_db.rb
129
130
  - lib/swarm_cluster_cli_ope/sync_configs/mysql.rb
130
131
  - lib/swarm_cluster_cli_ope/sync_configs/post_gres.rb
131
132
  - lib/swarm_cluster_cli_ope/sync_configs/rsync.rb