kubernix 0.3.1

Kubernetes development cluster bootstrapping with Nix packages
Documentation
//! Kubernetes controller manager component.
//!
//! Runs `kube-controller-manager` which watches cluster state via the
//! API server and drives the actual state toward the desired state.

use crate::{
    component::{ClusterContext, Component, Phase},
    config::Config,
    kubeconfig::KubeConfig,
    network::Network,
    pki::Pki,
    process::{Process, ProcessState, Stoppable},
};
use anyhow::Result;
use std::fs::create_dir_all;

/// Component wrapper for registry-based startup.
pub struct ControllerManagerComponent;

impl Component for ControllerManagerComponent {
    fn name(&self) -> &str {
        "Controller Manager"
    }

    fn phase(&self) -> Phase {
        Phase::Controller
    }

    fn start(&self, ctx: &ClusterContext<'_>) -> ProcessState {
        ControllerManager::start(ctx.config, ctx.network, ctx.pki, ctx.kubeconfig)
    }
}

/// Manages the `kube-controller-manager` process lifecycle.
pub struct ControllerManager {
    process: Process,
}

impl ControllerManager {
    /// Start the controller manager with the given cluster configuration.
    pub fn start(
        config: &Config,
        network: &Network,
        pki: &Pki,
        kubeconfig: &KubeConfig,
    ) -> ProcessState {
        let dir = config.root().join("controllermanager");
        create_dir_all(&dir)?;

        let mut process = Process::start(
            &dir,
            "Controller Manager",
            "kube-controller-manager",
            &[
                "--bind-address=0.0.0.0",
                &format!("--cluster-cidr={}", network.cluster_cidr()),
                "--cluster-name=kubernetes",
                &format!("--cluster-signing-cert-file={}", pki.ca().cert().display()),
                &format!("--cluster-signing-key-file={}", pki.ca().key().display()),
                &format!("--kubeconfig={}", kubeconfig.controller_manager().display()),
                "--leader-elect=false",
                &format!("--root-ca-file={}", pki.ca().cert().display()),
                &format!(
                    "--service-account-private-key-file={}",
                    pki.service_account().key().display()
                ),
                &format!("--service-cluster-ip-range={}", network.service_cidr()),
                "--use-service-account-credentials=true",
                "--v=2",
            ],
        )?;

        process.wait_ready("Serving securely")?;
        Ok(Box::new(Self { process }))
    }
}

impl Stoppable for ControllerManager {
    fn stop(&mut self) -> Result<()> {
        self.process.stop()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn component_metadata() {
        let c = ControllerManagerComponent;
        assert_eq!(c.name(), "Controller Manager");
        assert_eq!(c.phase(), Phase::Controller);
    }
}