SwarmClusterCliOpe

WIP to translate Gemma per la gestione semplificata degli operatori con un cluster swarm

Installation

Add this line to your application's Gemfile:

gem 'swarm_cluster_cli_ope'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install swarm_cluster_cli_ope

Usage

Una volta installato lanciare il comando

swarm_cli_ope install che si occuperà di configurare le varie impostazioni dell'ambiente

FILE di configurazione base:

{"version":"0.1.0","dev_mode":1,"log_level": "3","connections_maps":{"swm1": "swarm_node_1","swm2": "swarm_node_2","swm3": "swarm_node_3"}}

LogLevel:

0 ERROR 1 WARN 2 INFO 3 DEBUG

ENV differenti

Tutti i comandi possono essere accompagnati con -e, per scopparli nel relativo ENVIRONMENT

Configuratione di un progetto

Si occupa di generare nel progetto il file di configurazione in cui impostare impostazioni specifiche di progetto quali stack_name (.swarm_cluster_project) ```shell script swarm_cli_ope configure_project STACK_NAME


### Configurazioni applicate nel progetto:
```shell script
swarm_cli_ope config

Elenco di tutti gli stack disponibili:

```shell script swarm_cli_ope stacks



### MC:
Apre MC collegato al container del servizio specificato
```shell script
swarm_cli_ope mc SERVICE_NAME --stack-name=NOME_STACK

SHELL:

Apre una shell (default bash) collegato al container del servizio specificato ```shell script swarm_cli_ope shell SERVICE_NAME --stack-name=NOME_STACK


### Elenco di tutti i servizi
Se siamo nel progetto con il file di progetto vedremo comunque i servizi filtrati
```shell script
swarm_cli_ope services

filtrando per stack:

```shell script swarm_cli_ope services --stack-name=NOME_STACK


### Copia di files da/verso container attraverso il docker cp   
```shell script
swarm_cli_ope cp --stack-name=NOME_STACK PATH_FILE_LOCALE NOME_SERVIZIO:DESTINAZIONE_NEL_CONTAINER

Rsync da/a container a/da locale

Utilizzare rsync_binded_from per scaricare e rsync_binded_to per caricare

```shell script swarm_cli_ope rsync_binded_from --stack-name=STACK_NAME --service_name NOME_SERVIZIO_SENZA_STACK --binded-container-folders CARTELLA_CONTAINER --local-folder CARTELLA_DESTINAZIONE


### stacksync
Si occupa di scaricare|caricare,utilizzando le configurazioni presenti, i dati dallo stack remoto

Le configurazioni sono contenute nell'array: sync_configs.

ogni configurazione è composta da:

```json 
    { 
       service:"" 
       how:"" 
       configs:{ }
      }
  • service è il nome del servizio (o nel caso di k8s una stringa da utilizzare come selettore labels)
  • how è il come sincronizzare, definendo la tipologia:
    • pg -> DB: dump del DB con pgdump
    • mysql -> DB: dump del db con mysqldump
    • sqlite3 -> DB: viene eseguita una copia del file
    • rsync -> RSYNC
    • mongodb -> mongodump e mongorestore
  • configs: è un hash con le configurazioni per ogni tipo di sincronizzazione

Possibili CFGS per tipologia:

  • rsync:
    • local: -> path cartella locale
    • remote: -> path cartella remota (contesto del container)
  • sqlite3:
    • local: -> path al file
    • remote: -> path al file remoto (contesto del container)
  • mysql:
    • local: -> hash di configurazioni per il DB locale
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
    • mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
    • mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
    • mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
    • database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
    • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
    • remote: -> hash di configurazioni per il DB remoto
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • mysql_password_env: "MYSQL_PASSWORD" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: MYSQL_PASSWORD
    • mysql_password: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
    • mysql_user_env: "MYSQL_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: MYSQL_USER
    • mysql_user: "root" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: root
    • database_name_env: "MYSQL_DATABASE" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: MYSQL_DATABASE
    • database_name: "MYSQL_DATABASE" -> valore in chiaro, in sostituzione della variabile ambiente
    • excluded_tables_data: [] -> elenco di tabelle di cui non scaricare i dati(solo lo schema), DEFAULT: []
  • pg:
    • local: -> hash di configurazioni per il DB locale
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
    • pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
    • pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
    • pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
    • database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
    • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
    • remote: -> hash di configurazioni per il DB remoto
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • pg_password_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente PASSWORD, DEFAULT: POSTGRES_PASSWORD
    • pg_password: "" -> valore in chiaro, in sostituzione della variabile ambiente
    • pg_user_env: "POSTGRES_USER" -> variabile ambiente interna al servizio contenente USERNAME, DEFAULT: POSTGRES_USER
    • pg_user: "postgres" -> valore in chiaro, in sostituzione della variabile ambiente, DEFAULT: postgres
    • database_name_env: "POSTGRES_DB" -> variabile ambiente interna al servizio contenente NOME DB, DEFAULT: POSTGRES_DB
    • database_name: "nome_db" -> valore in chiaro, in sostituzione della variabile ambiente
  • mongo:
    • local: -> hash di configurazioni per il DB locale
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • password: "" -> password per DB
    • username: "" -> username per DB
    • database_name: "nome_db" -> nome del DB
    • exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PUSH, DEFAULT: ''
    • remote: -> hash di configurazioni per il DB remoto
    • service: "db" -> nome del servizio nel compose locale, DEFAULT: quello definito sopra
    • password: "" -> password per DB
    • username: "" -> username per DB
    • database_name: "nome_db" -> nome del DB
    • exclude_from_sync: "coll1,coll2" -> elenco di collections di cui non eseguire il dump quando facciamo PULL, DEFAULT: ''

EXAMPLE:

Esempio di sincronizzazione di un file sqlite3 e una cartella

    {
    "stack_name": "test1",
    "sync_configs": [
      {
        "service": "second",
        "how": "rsync",
        "configs": {
          "remote": "/test_bind",
          "local": "./uploads"
        }
      },
      {
        "service": "test_sqlite3",
        "how": "sqlite3",
        "configs": {
          "remote": "/cartella_sqlite3/esempio.sqlite3",
          "local": "./development.sqlite3"
        }
      }
    ]
    }

Development

nel file di configurazione creato nella home aggiungere la chiave "dev_mode":1 per collegarsi localmente

Abbiamo due tasks SWARM di simulazione

```shell script docker stack deploy -c test_folder/test_1/docker-compose.yml test_1_stack docker stack deploy -c test_folder/test_1/docker-compose.yml test1_staging docker stack deploy -c test_folder/test_2/docker_compose.yml test2


Per simulare una sincronizzazione fra locale e remoto di un mysql, lanciamo lo stesso stack anche come compose, in modo
da trovarci sulla stessa macchina con tutte e due le situazioni
```shell script
docker compose -f test_folder/test_1/docker-compose-local.yml up -d

K8s

Per Kubernetes dobbiamo avere minikube installato. lanciare quindi l'ambiente di test:

```shell script kubectl apply -f test_folder/test_k8s/test.yaml docker compose -f test_folder/test_k8s/docker-compose-local.yml up -d



## Release

To install this gem onto your local machine, run `bundle exec rake install`. 

To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, 
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).


## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).