Skip to content

Commit

Permalink
vmware-variants: migrate host-container versions to latest versions
Browse files Browse the repository at this point in the history
We haven't been migrating host-container versions for vmware-variants.
This migration migrates all previous host-container versions to the
latest host-container version on upgrade.

It is unclear what version of the host-containers we should downgrade to
since it could be any of the older host-container versions.
We can just stay on the latest host-container version since there are no
breaking changes.
  • Loading branch information
etungsten committed Jan 11, 2022
1 parent d07091e commit 082e231
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Release.toml
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,6 @@ version = "1.5.2"
"migrate_v1.5.1_control-container-v0-5-4.lz4",
]
"(1.5.1, 1.5.2)" = []
"(1.5.2, 1.6.0)" = [
"migrate_v1.6.0_vmware-host-containers.lz4",
]
8 changes: 8 additions & 0 deletions sources/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions sources/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ members = [
"api/migration/migrations/v1.5.0/oci-hooks-setting",
"api/migration/migrations/v1.5.0/oci-hooks-setting-metadata",
"api/migration/migrations/v1.5.1/control-container-v0-5-4",
"api/migration/migrations/v1.6.0/vmware-host-containers",

"bottlerocket-release",

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "vmware-host-containers"
version = "0.1.0"
authors = ["Erikson Tung <[email protected]>"]
license = "Apache-2.0 OR MIT"
edition = "2021"
publish = false
# Don't rebuild crate just because of changes to README.
exclude = ["README.md"]

[dependencies]
serde_json = "1"
migration-helpers = { path = "../../../migration-helpers", version = "0.1.0"}
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#![deny(rust_2018_idioms)]

use migration_helpers::{migrate, Migration, MigrationData, Result};
use std::process;

const ADMIN_CONTAINER_SOURCE_SETTING_NAME: &str = "settings.host-containers.admin.source";
const ADMIN_CONTAINER_IMAGE_REPOSITORY: &str = "public.ecr.aws/bottlerocket/bottlerocket-admin";
const PREVIOUS_ADMIN_CONTAINER_VERSIONS: &[&str] = &["v0.7.0", "v0.7.1", "v0.7.2"];
const TARGET_ADMIN_CONTAINER_VERSION: &str = "v0.7.3";

const CONTROL_CONTAINER_SOURCE_SETTING_NAME: &str = "settings.host-containers.control.source";
const CONTROL_CONTAINER_IMAGE_REPOSITORY: &str = "public.ecr.aws/bottlerocket/bottlerocket-control";
const PREVIOUS_CONTROL_CONTAINER_VERSIONS: &[&str] = &["v0.5.0", "v0.5.1", "v0.5.2", "v0.5.3"];
const TARGET_CONTROL_CONTAINER_VERSION: &str = "v0.5.4";

pub struct VmwareHostContainerVersions;

impl Migration for VmwareHostContainerVersions {
fn forward(&mut self, mut input: MigrationData) -> Result<MigrationData> {
// For admin container
if let Some(data) = input.data.get_mut(ADMIN_CONTAINER_SOURCE_SETTING_NAME) {
match data {
serde_json::Value::String(source) => {
for ver in PREVIOUS_ADMIN_CONTAINER_VERSIONS {
let prev_source = format!("{}:{}", ADMIN_CONTAINER_IMAGE_REPOSITORY, ver);
if *source == prev_source {
*source = format!(
"{}:{}",
ADMIN_CONTAINER_IMAGE_REPOSITORY, TARGET_ADMIN_CONTAINER_VERSION
);
println!(
"Changed value of '{}' from '{}' to '{}' on upgrade",
ADMIN_CONTAINER_SOURCE_SETTING_NAME, prev_source, source
);
break;
}
}
}
_ => {
println!(
"'{}' is set to non-string value '{}'",
ADMIN_CONTAINER_SOURCE_SETTING_NAME, data
);
}
}
} else {
println!(
"Found no '{}' to change on upgrade",
ADMIN_CONTAINER_SOURCE_SETTING_NAME
);
}

// For control container
if let Some(data) = input.data.get_mut(CONTROL_CONTAINER_SOURCE_SETTING_NAME) {
match data {
serde_json::Value::String(source) => {
for ver in PREVIOUS_CONTROL_CONTAINER_VERSIONS {
let prev_source = format!("{}:{}", CONTROL_CONTAINER_IMAGE_REPOSITORY, ver);
if *source == prev_source {
*source = format!(
"{}:{}",
CONTROL_CONTAINER_IMAGE_REPOSITORY,
TARGET_CONTROL_CONTAINER_VERSION
);
println!(
"Changed value of '{}' from '{}' to '{}' on upgrade",
CONTROL_CONTAINER_SOURCE_SETTING_NAME, prev_source, source
);
break;
}
}
}
_ => {
println!(
"'{}' is set to non-string value '{}'",
CONTROL_CONTAINER_SOURCE_SETTING_NAME, data
);
}
}
} else {
println!(
"Found no '{}' to change on upgrade",
CONTROL_CONTAINER_SOURCE_SETTING_NAME
);
}

Ok(input)
}

fn backward(&mut self, input: MigrationData) -> Result<MigrationData> {
// It's unclear what version of the host-containers we should downgrade to since it could
// be any of the older host-container versions.
// We can just stay on the latest host-container version since there are no breaking changes.
println!("Vmware host-container versions migration has no work to do on downgrade");
Ok(input)
}
}

fn run() -> Result<()> {
migrate(VmwareHostContainerVersions)
}

// Returning a Result from main makes it print a Debug representation of the error, but with Snafu
// we have nice Display representations of the error, so we wrap "main" (run) and print any error.
// https://github.com/shepmaster/snafu/issues/110
fn main() {
if let Err(e) = run() {
eprintln!("{}", e);
process::exit(1);
}
}

0 comments on commit 082e231

Please sign in to comment.