///|
fn deployment_manifest_json() -> String {
let manifest =
#|{
#| "name": "ops-rollout-kit",
#| "context": {
#| "service": {
#| "region": "cn-north"
#| }
#| },
#| "partials": {
#| "env_block": "LOG_LEVEL={{service.log_level}}\nFEATURE_FLAG={{service.feature_flag}}\n",
#| "contact_block": "owner={{owner.name}}\nchannel={{owner.channel}}\n"
#| },
#| "profiles": {
#| "staging": {
#| "context": {
#| "service": {
#| "replicas": 2,
#| "feature_flag": "staging-preview"
#| }
#| }
#| },
#| "production": {
#| "context": {
#| "service": {
#| "replicas": 5,
#| "feature_flag": "stable"
#| }
#| }
#| }
#| },
#| "files": [
#| {
#| "path": "deploy/{{service.name}}/deployment.env",
#| "template": "SERVICE={{service.name}}\nREGION={{service.region}}\nREPLICAS={{service.replicas}}\n{{> env_block}}"
#| },
#| {
#| "path": "deploy/{{service.name}}/owner.txt",
#| "template": "{{> contact_block}}"
#| },
#| {
#| "path": "deploy/{{service.name}}/summary.md",
#| "template": "# {{service.name}}\n\nprofile={{profile_name}}\nreplicas={{service.replicas}}\nregion={{service.region}}\n"
#| }
#| ]
#|}
manifest
}
///|
fn runtime_context(profile_name : String) -> @src.Value {
@src.Value::object({
"profile_name": @src.Value::string(profile_name),
"service": @src.Value::object({
"name": @src.Value::string("moon-control-plane"),
"log_level": @src.Value::string("info"),
}),
"owner": @src.Value::object({
"name": @src.Value::string("platform-team"),
"channel": @src.Value::string("#moon-ops"),
}),
})
}
///|
fn print_file(path : String, output : String) -> Unit {
println("== " + path + " ==")
println(output)
println("")
}
///|
fn main {
let manifest = @src.parse_bundle_manifest_json(deployment_manifest_json()).unwrap()
let validation = @src.validate_bundle_manifest(manifest)
let prepared = @src.prepare_bundle_manifest_profile(
manifest,
runtime_context("production"),
profile_name="production",
).unwrap()
let result = @src.render_prepared_bundle_manifest_checked(
prepared,
@src.RenderOptions::strict(),
)
let plan = @src.build_bundle_plan("ops-rollout-kit", result, validation)
println(@src.format_validation_report_markdown("ops-rollout-kit", validation))
println("")
println(@src.format_bundle_plan_markdown(plan))
println("")
for file in result.files {
print_file(file.path, file.output)
}
}