Skip to content

Commit

Permalink
Updating inventory via build command (#156)
Browse files Browse the repository at this point in the history
* Add:
     * "recreate" argument for build command
     *  upgrade via build command if state exists
     * fixed panic when upgrading

* To update a previous cluster using the generated `Genin`
inventory, you can use the `build` command. In this case `Genin`
automatically restores the latest cluster state and applies changes
from the new cluster configuration

```shell
genin build -s cluster.genin.yml
```

Option `-s` path to the new cluster configuration (default `cluster.genin.yml`).
The `--recreate` option will remove all previous cluster states and collect a new inventory

---------

Co-authored-by: Alexandr Sorokin <a.sorokin@picodata.io>
  • Loading branch information
alrsorokin and Alexandr Sorokin authored Apr 24, 2024
1 parent 5593a50 commit fee93b6
Show file tree
Hide file tree
Showing 13 changed files with 545 additions and 173 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,20 @@ vars:

#### Cluster reconfiguration

To update a previous cluster using the generated `Genin`
inventory, you can use the `build` command. In this case `Genin`
automatically restores the latest cluster state and applies changes
from the new cluster configuration

```shell
genin build -s cluster.genin.yml
```

Option `-s` path to the new cluster configuration (default `cluster.genin.yml`).
The `--recreate` option will remove all previous cluster states and collect a new inventory

#### [DEPRECATED]

To update a deployed cluster using the generated `Genin` inventory, there is
a special `upgrade` command for adding new instances. Unlike inventory
regeneration, when which all instances are redistributed each time anew,
Expand Down
19 changes: 16 additions & 3 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -601,11 +601,24 @@ vars:

#### Реконфигурация кластера

Для обновления кластера ранее развернутого с помощью сгенерированного `Genin`
инвентаря вы можете воспользоваться командой `build`. В этом случае `Genin`
автоматически восстановит последнее состояние кластера и применит изменения
из новой конфигурации кластера

```shell
genin build -s cluster.genin.yml
```
Опция `-s` путь к новой конфигурации кластера (по умолчанию `cluster.genin.yml`).
Опция `--recreate` удалит все предыдущие состояния кластера и соберет новый инвентарь

#### [DEPRECATED]

Для обновления кластера развернутого с помощью сгенерированного `Genin`
инвентаря, существует специальная команда `upgrade`, предназначенная для
добавления новых инстансов. В отличии от повторной генерации инвентаря, при
которой все инстансы перераспределяются каждый раз заново, `upgrade` оставит
распределение как есть, и лишь добавит новыеинстансы. Это позволит
распределение как есть, и лишь добавит новые инстансы. Это позволит
безболезненно обновить кластер, без полного редеплоя.

Для запуска `upgrade` нужно передать два обязательных оргумента `--old`
Expand Down Expand Up @@ -637,7 +650,7 @@ genin upgrade --old cluster.genin.yml --new upgrade.genin.yml -o inventory.yml
В этом параграфе мы рассмотрим несколько полезных флагов и опций которые могут
пригодиться при использовании `Genin`.
Как до этого всколько упоминалось, всегда можно задавать исходный и целевой путь
для генерации. Путь может быть как относительным так и асболютным.
для генерации. Путь может быть как относительным, так и асболютным.
```shell
genin init --output /home/tarantool/custom_cluster_name.yml
genin show --source /home/tarantool/custom_cluster_name.yml
Expand Down Expand Up @@ -749,7 +762,7 @@ genin --version
- **Dmitry Travyan**
- **Lomakina Anastasia**

© 2020-2023 Picodata.io https://github.com/picodata
© 2020-2024 Picodata.io https://github.com/picodata

## Лицензия

Expand Down
35 changes: 29 additions & 6 deletions src/task.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,35 @@ pub fn run_v2() -> Result<(), Box<dyn Error>> {
.write(args)?;
}
Some(("build", args)) => {
Cluster::try_from(args)?
.use_failure_domain_as_zone_for_instances(args)
.print(args)
.write_build_state(args)?
.to_inventory()?
.write(args)?;
if args.get_flag("recreate") {
State::recreate(args)?;
}

match State::from_latest(args) {
Ok(state) => {
let mut old: Cluster = state.into();
old.hosts.clear_view();

let mut new =
Cluster::try_from(args)?.use_failure_domain_as_zone_for_instances(args);

let hosts_diff = old.merge(&mut new, args.get_flag("idiomatic-merge"))?;

old.use_failure_domain_as_zone_for_instances(args)
.print(args)
.write_upgrade_state(args, hosts_diff)?
.to_inventory()?
.write(args)?;
}
_ => {
Cluster::try_from(args)?
.use_failure_domain_as_zone_for_instances(args)
.print(args)
.write_build_state(args)?
.to_inventory()?
.write(args)?;
}
}
}
Some(("inspect", args)) => {
println!("{}", Cluster::try_from(args)?);
Expand Down
33 changes: 19 additions & 14 deletions src/task/args.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,20 @@ pub(super) fn read() -> ArgMatches {
.short('q')
.action(ArgAction::SetTrue)
.help("do not print table and cluster yaml"),
Arg::new("export-state")
.long("export-state")
Arg::new("state-dir")
.long("state-dir")
.env("GENIN_STATE_DIR")
.action(ArgAction::Set)
.help("export the build state"),
.help("override .geninstate directory location"),
Arg::new("recreate")
.long("recreate")
.action(ArgAction::SetTrue)
.help("Delete the existing state before building"),
Arg::new("idiomatic-merge")
.long("idiomatic-merge")
.short('I')
.action(ArgAction::SetTrue)
.help("merge replicasets with similar names like router-1 and router-1-1"),
]),
Command::new("init")
.about("Init genin and create cluster.genin.yml configuration")
Expand Down Expand Up @@ -201,17 +211,14 @@ pub(super) fn read() -> ArgMatches {
]),
Command::new("upgrade")
.about(
"Using the genin configuration and the inventory to be \
"[Deprecated] Using the genin configuration and the inventory to be \
modified creates a new inventory",
)
.args(&[
Arg::new("old")
.long("old")
.action(ArgAction::Set)
.help(
"Absolute or relative path of the file with \
Arg::new("old").long("old").action(ArgAction::Set).help(
"Absolute or relative path of the file with \
the description of the cluster to be generated",
),
),
Arg::new("new")
.long("new")
.action(ArgAction::Set)
Expand Down Expand Up @@ -287,12 +294,10 @@ pub(super) fn read() -> ArgMatches {
.short('I')
.action(ArgAction::SetTrue)
.help("merge replicasets with similar names like router-1 and router-1-1"),
fd_as_zone_arg()
fd_as_zone_arg(),
]),
Command::new("list-state")
.about(
"Print last 10 genin states",
)
.about("Print last 10 genin states")
.args(&[
Arg::new("export-state")
.long("export-state")
Expand Down
Loading

0 comments on commit fee93b6

Please sign in to comment.