Skip to content

Commit

Permalink
Add migration for pluto -> schnauzer migration for pause container URL
Browse files Browse the repository at this point in the history
  • Loading branch information
tjkirch committed May 3, 2021
1 parent eaac383 commit 8b3d129
Show file tree
Hide file tree
Showing 5 changed files with 154 additions and 0 deletions.
1 change: 1 addition & 0 deletions Release.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,5 @@ version = "1.0.8"
"migrate_v1.1.0_kubelet-registry-qps-registry-burst.lz4",
"migrate_v1.1.0_shared-containerd-configs.lz4",
"migrate_v1.1.0_kubelet-event-qps-event-burst.lz4",
"migrate_v1.1.0_schnauzer-paws.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 @@ -29,6 +29,7 @@ members = [
"api/migration/migrations/v1.1.0/kubelet-registry-qps-registry-burst",
"api/migration/migrations/v1.1.0/shared-containerd-configs",
"api/migration/migrations/v1.1.0/kubelet-event-qps-event-burst",
"api/migration/migrations/v1.1.0/schnauzer-paws",

"bottlerocket-release",

Expand Down
13 changes: 13 additions & 0 deletions sources/api/migration/migrations/v1.1.0/schnauzer-paws/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[package]
name = "schnauzer-paws"
version = "0.1.0"
authors = ["Tom Kirchner <[email protected]>"]
license = "Apache-2.0 OR MIT"
edition = "2018"
publish = false
# Don't rebuild crate just because of changes to README.
exclude = ["README.md"]

[dependencies]
migration-helpers = { path = "../../../migration-helpers" }
serde_json = "1.0"
131 changes: 131 additions & 0 deletions sources/api/migration/migrations/v1.1.0/schnauzer-paws/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
#![deny(rust_2018_idioms)]

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

const SETTING: &str = "settings.kubernetes.pod-infra-container-image";
const OLD_SETTING_GENERATOR: &str = "pluto pod-infra-container-image";
const NEW_SETTING_GENERATOR: &str = "schnauzer settings.kubernetes.pod-infra-container-image";
const NEW_TEMPLATE: &str =
"{{ pause-prefix settings.aws.region }}/eks/pause-{{ goarch os.arch }}:3.1";

/// We moved from using pluto to schnauzer for generating the pause container image URL, since it
/// lets us reuse the existing region and arch settings, improving reliability and allowing for
/// testing new regions through settings overrides.
pub struct SchnauzerPaws;

impl Migration for SchnauzerPaws {
fn forward(&mut self, mut input: MigrationData) -> Result<MigrationData> {
// Check if we have this setting at all.
if let Some(metadata) = input.metadata.get_mut(SETTING) {
if let Some(metadata_value) = metadata.get_mut("setting-generator") {
// Make sure the value is what we expect.
match metadata_value {
serde_json::Value::String(string) => {
if string == OLD_SETTING_GENERATOR {
// Happy path. Update the generator.
*metadata_value = NEW_SETTING_GENERATOR.into();
println!(
"Changed setting-generator for '{}' from {:?} to {:?} on upgrade",
SETTING, OLD_SETTING_GENERATOR, NEW_SETTING_GENERATOR
);

// Set the associated template. We didn't have a template for this
// setting before, and metadata can't be changed by the user, so we can
// just set it.
metadata.insert("template".to_string(), NEW_TEMPLATE.into());
println!(
"Set 'template' metadata on '{}' to '{}'",
SETTING, NEW_TEMPLATE
);
} else {
println!(
"setting-generator for '{}' is not set to {:?}, leaving alone",
SETTING, OLD_SETTING_GENERATOR
);
}
}
_ => {
println!(
"setting-generator for '{}' is set to non-string value '{}'; SchnauzerPaws only handles strings",
SETTING, metadata_value
);
}
}
} else {
println!("Found no setting-generator for '{}'", SETTING);
}
} else {
println!("Found no metadata for '{}'", SETTING);
}

Ok(input)
}

fn backward(&mut self, mut input: MigrationData) -> Result<MigrationData> {
// Check if we have this setting at all.
if let Some(metadata) = input.metadata.get_mut(SETTING) {
if let Some(metadata_value) = metadata.get_mut("setting-generator") {
// Make sure the value is what we expect.
match metadata_value {
serde_json::Value::String(string) => {
if string == NEW_SETTING_GENERATOR {
// Happy path. Update the generator.
*metadata_value = OLD_SETTING_GENERATOR.into();
println!(
"Changed setting-generator for '{}' from {:?} to {:?} on downgrade",
SETTING, NEW_SETTING_GENERATOR, OLD_SETTING_GENERATOR
);

// Remove the associated template. We didn't have a template for this
// setting before, and metadata can't be changed by the user, so we can
// just remove it.
if let Some(metadata_value) = metadata.remove("template") {
println!(
"Removed 'template' metadata on '{}', which was set to '{}'",
SETTING, metadata_value
);
} else {
println!(
"Found no 'template' metadata to remove on setting '{}'",
SETTING
);
}
} else {
println!(
"setting-generator for '{}' is not set to {:?}, leaving alone",
SETTING, NEW_SETTING_GENERATOR
);
}
}
_ => {
println!(
"setting-generator for '{}' is set to non-string value '{}'; SchnauzerPaws only handles strings",
SETTING, metadata_value
);
}
}
} else {
println!("Found no setting-generator for '{}'", SETTING);
}
} else {
println!("Found no metadata for '{}'", SETTING);
}

Ok(input)
}
}

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

// 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 8b3d129

Please sign in to comment.