Skip to content
Sviatoslav Dumchenko edited this page Oct 31, 2022 · 3 revisions

Architecture

Building chart

stateDiagram-v2
    [*] --> ParseChartFile
    ParseChartFile --> HelmBuild
    ParseChartFile --> WaveBuild
    HelmBuild --> PackageChart
    WaveBuild --> PackageChart
    PackageChart --> UploadChart
    UploadChart --> [*]

    ParseChartFile: Parse Chartfile
    state ParseChartFile {
        ParseBuildMode: Parse build mode (helm-compatible or chartwave v1)
        ParseCommands: Parse build commands
        BuildDependencies: Build dependencies graph for builder

        ParseBuildMode --> ParseCommands
        ParseCommands --> BuildDependencies
    }

    HelmBuild: Helm-compatible builder
    state HelmBuild {
        HelmDownloadBaseTarget: Download base target helm chart to tmpdir
        HelmDownloadBaseDep1: Download base dependency helm chart to tmpdir
        HelmDownloadBaseDep2: Download base dependency helm chart to tmpdir
        HelmRunCommandsTarget: Run commands in the chart dir (tmpdir)
        HelmRunCommandsDep1: Run commands in the chart dir (tmpdir)
        HelmRunCommandsDep2: Run commands in the chart dir (tmpdir)
        HelmPackageIntermediate: Package intermediate result (e.g. copy to predefined directory)

        HelmBuildTarget: Build target helm chart
        state HelmBuildTarget {
            HelmDownloadBaseTarget --> HelmRunCommandsTarget
        }

        HelmBuildDep1: Build dependency target
        state HelmBuildDep1 {
            HelmDownloadBaseDep1 --> HelmRunCommandsDep1
        }

        HelmBuildDep2: Build dependency target
        state HelmBuildDep2 {
            HelmDownloadBaseDep2 --> HelmRunCommandsDep2
        }

        HelmBuildDep1 --> HelmBuildTarget
        HelmBuildDep2 --> HelmBuildTarget

        HelmBuildTarget --> HelmPackageIntermediate
    }

    WaveBuild: Chartwave v1 builder
    state WaveBuild {
        WaveDownloadBaseTarget: Download base target Chartwave v1 chart to tmpdir
        WaveDownloadBaseDep1: Download base dependency Chartwave v1 chart to tmpdir
        WaveDownloadBaseDep2: Download base dependency Chartwave v1 chart to tmpdir
        WaveRunCommandsTarget: Run commands in the chart dir (tmpdir)
        WaveRunCommandsDep1: Run commands in the chart dir (tmpdir)
        WaveRunCommandsDep2: Run commands in the chart dir (tmpdir)
        WavePackageIntermediate: Package intermediate result (e.g. copy to predefined directory)

        WaveBuildTarget: Build target Chartwave v1 chart
        state WaveBuildTarget {
            WaveDownloadBaseTarget --> WaveRunCommandsTarget
        }

        WaveBuildDep1: Build dependency target
        state WaveBuildDep1 {
            WaveDownloadBaseDep1 --> WaveRunCommandsDep1
        }

        WaveBuildDep2: Build dependency target
        state WaveBuildDep2 {
            WaveDownloadBaseDep2 --> WaveRunCommandsDep2
        }

        WaveBuildDep1 --> WaveBuildTarget
        WaveBuildDep2 --> WaveBuildTarget

        WaveBuildTarget --> WavePackageIntermediate
    }

    PackageChart: Package Chart
    state PackageChart {
        HelmPackageArchive: Create helm-compatible tar.gz archive
        --
        HelmPackageOCI: Create helm-compatible OCI image
        --
        WavePackageOCI: Create chartwave v1 OCI image
    }

    UploadChart: Upload Chart
    state UploadChart {
        UploadChartArchive: HTTP PUT/POST archive
        --
        UploadChartOCI: Push OCI image to OCI registry
    }
Loading

Deploying chart

stateDiagram-v2
    DownloadChart: Download chart as archive or OCI image. Skip for local charts
    DetectArch: Detect chart architecture (helm or chartwave v1)

    [*] --> DownloadChart
    DownloadChart --> DetectArch
    DetectArch --> DeployHelm: if arch == helm
    DetectArch --> DeployWave: if arch == chartwave
    DeployHelm --> [*]
    DeployWave --> [*]

    DeployHelm: Deploy using Helm
    state DeployHelm {
        PrepareHelm: Prepare helm (copy from helmwave)
        RunHelm: Run helm (copy from helmwave)

        PrepareHelm --> RunHelm
    }

    DeployWave: Deploy using Chartwave
    state DeployWave {
        RunTemplater: Run templater (sprig or gomplate)
        PreprocessDependencies: Try to process all dependencies (like self-dependencies or already known values)
        BuildDependencies: Build dependencies graph for manifests (self-dependencies outside of graph)
        AcquireLease: Acquire Kubernetes lease.coordination.k8s.io
        SavePendingState: Save pending release state (secret?)
        ApplyManifest: Apply manifest via kubectl apply
        FetchManifest: Fetch applied manifest
        ProcessDependencies: Process dependencies on applied manifest
        SaveFailedState: Save failed release state
        SaveSuccessState: Save succeeded release state (secret?)
        ReleaseLease: Release Kubernetes lease.coordination.k8s.io

        RunTemplater --> PreprocessDependencies
        PreprocessDependencies --> BuildDependencies
        BuildDependencies --> AcquireLease
        AcquireLease --> SavePendingState
        SavePendingState --> ApplyManifest
        ApplyManifest --> FetchManifest
        FetchManifest --> ProcessDependencies
        ProcessDependencies --> ApplyManifest: Dependencies graph cycle
        ApplyManifest --> SaveFailedState: Apply failed
        ProcessDependencies --> SaveSuccessState: No more manifests in graph
        SaveFailedState --> ReleaseLease
        SaveSuccessState --> ReleaseLease
    }
Loading

Clone this wiki locally