packages feed

sandwich-contexts-kubernetes-0.1.3.0: lib/Test/Sandwich/Contexts/Kubernetes/KataContainers/HelmChart.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}

module Test.Sandwich.Contexts.Kubernetes.KataContainers.HelmChart (
  withKataContainers
  , withKataContainers'
  ) where

import Control.Monad.IO.Unlift
import Control.Monad.Logger
import Data.String.Interpolate
import qualified Data.Text as T
import Relude hiding (withFile)
import System.Exit
import Test.Sandwich
import Test.Sandwich.Contexts.Files
import Test.Sandwich.Contexts.Kubernetes.KataContainers.Types
import Test.Sandwich.Contexts.Kubernetes.Kubectl
import Test.Sandwich.Contexts.Kubernetes.Types
import UnliftIO.Process


withKataContainers :: (
  MonadFail m, MonadLoggerIO m, MonadUnliftIO m
  , HasBaseContextMonad context m, HasFile context "helm"
  )
  => KubernetesClusterContext
  -> KataContainersOptions
  -> (KataContainersContext -> m b)
  -> m b
withKataContainers kcc options action = do
  helmBinary <- askFile @"helm"
  withKataContainers' helmBinary kcc options action

withKataContainers' :: (
  MonadFail m, MonadLoggerIO m, MonadUnliftIO m, HasBaseContextMonad context m
  )
  => FilePath
  -> KubernetesClusterContext
  -> KataContainersOptions
  -> (KataContainersContext -> m b)
  -> m b
withKataContainers' helmBinary kcc options@(KataContainersOptions {..}) action = do
  let args = [
        "install", "kata-deploy"
        , kataContainersHelmChart
        , "--namespace", "kube-system"
        , "--wait"
        , "--timeout", "10m", "--atomic"
        -- , "--version", helmChartVersion
        ] <> kataContainersHelmArgs

  info [i|helm #{T.intercalate " " (fmap toText args)}|]

  env <- getKubectlEnvironment kcc

  createProcessWithFileLogging' "helm-install-kata-containers" ((proc helmBinary args) { env = Just env })
    >>= waitForProcess >>= (`shouldBe` ExitSuccess)

  action (KataContainersContext options)