packages feed

sandwich-contexts-kubernetes-0.1.2.0: lib/Test/Sandwich/Contexts/Kubernetes/Kubectl.hs

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

{-|
Helper module for working with @kubectl@ processes.
-}

module Test.Sandwich.Contexts.Kubernetes.Kubectl (
  -- * Run commands with kubectl
  askKubectlArgs
  , askKubectlEnvironment
  , getKubectlEnvironment
  ) where

import Control.Monad.Logger
import qualified Data.List as L
import Relude
import Test.Sandwich
import Test.Sandwich.Contexts.Files
import Test.Sandwich.Contexts.Kubernetes.Types
import UnliftIO.Environment


-- | Retrieve the @kubectl@ binary path and the set of environment variables to use when invoking it.
-- Derives these from a 'HasFile' context and the 'KubernetesClusterContext' respectively.
--
-- Useful for running Kubectl commands with 'System.Process.createProcess' etc.
askKubectlArgs :: (
  KubectlBasic context m
  )
  -- | Returns the @kubectl@ binary and environment variables.
  => m (FilePath, [(String, String)])
askKubectlArgs = do
  kubectlBinary <- askFile @"kubectl"
  (kubectlBinary, ) <$> askKubectlEnvironment

-- | Same as 'askKubectlArgs', but only returns the environment variables.
askKubectlEnvironment :: (
  KubernetesClusterBasic context m
  )
  -- | Returns the @kubectl@ environment variables.
  => m [(String, String)]
askKubectlEnvironment = do
  KubernetesClusterContext {..} <- getContext kubernetesCluster
  baseEnv <- getEnvironment
  return $ L.nubBy (\x y -> fst x == fst y) (("KUBECONFIG", kubernetesClusterKubeConfigPath) : baseEnv)

-- | Same as 'askKubectlArgs', but only returns the environment variables.
getKubectlEnvironment :: (
  MonadLoggerIO m
  )
  -- | Kubernetes cluster context
  => KubernetesClusterContext
  -- | Returns the @kubectl@ environment variables.
  -> m [(String, String)]
getKubectlEnvironment (KubernetesClusterContext {..}) = do
  baseEnv <- getEnvironment
  return $ L.nubBy (\x y -> fst x == fst y) (("KUBECONFIG", kubernetesClusterKubeConfigPath) : baseEnv)