{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Test.Sandwich.Contexts.Kubernetes.Types where

import Control.Monad.IO.Unlift
import Control.Monad.Logger
import Kubernetes.OpenAPI.Core as Kubernetes
import Network.HTTP.Client
import Relude
import Test.Sandwich
import Test.Sandwich.Contexts.Files
import Test.Sandwich.Contexts.Nix
import qualified Text.Show


instance Show Manager where
  show :: Manager -> String
show Manager
_ = String
"<HTTP manager>"

-- * Kubernetes cluster

data KubernetesClusterType =
  KubernetesClusterKind { KubernetesClusterType -> String
kubernetesClusterTypeKindBinary :: FilePath
                        , KubernetesClusterType -> Text
kubernetesClusterTypeKindClusterName :: Text
                        , KubernetesClusterType -> Text
kubernetesClusterTypeKindClusterDriver :: Text
                        , KubernetesClusterType -> Maybe [(String, String)]
kubernetesClusterTypeKindClusterEnvironment :: Maybe [(String, String)]
                        }
  | KubernetesClusterMinikube { KubernetesClusterType -> String
kubernetesClusterTypeMinikubeBinary :: FilePath
                              , KubernetesClusterType -> Text
kubernetesClusterTypeMinikubeProfileName :: Text
                              , KubernetesClusterType -> [Text]
kubernetesClusterTypeMinikubeFlags :: [Text]
                              }
  deriving (Int -> KubernetesClusterType -> ShowS
[KubernetesClusterType] -> ShowS
KubernetesClusterType -> String
(Int -> KubernetesClusterType -> ShowS)
-> (KubernetesClusterType -> String)
-> ([KubernetesClusterType] -> ShowS)
-> Show KubernetesClusterType
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> KubernetesClusterType -> ShowS
showsPrec :: Int -> KubernetesClusterType -> ShowS
$cshow :: KubernetesClusterType -> String
show :: KubernetesClusterType -> String
$cshowList :: [KubernetesClusterType] -> ShowS
showList :: [KubernetesClusterType] -> ShowS
Show, KubernetesClusterType -> KubernetesClusterType -> Bool
(KubernetesClusterType -> KubernetesClusterType -> Bool)
-> (KubernetesClusterType -> KubernetesClusterType -> Bool)
-> Eq KubernetesClusterType
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: KubernetesClusterType -> KubernetesClusterType -> Bool
== :: KubernetesClusterType -> KubernetesClusterType -> Bool
$c/= :: KubernetesClusterType -> KubernetesClusterType -> Bool
/= :: KubernetesClusterType -> KubernetesClusterType -> Bool
Eq)

data KubernetesClusterContext = KubernetesClusterContext {
  KubernetesClusterContext -> Text
kubernetesClusterName :: Text
  , KubernetesClusterContext -> String
kubernetesClusterKubeConfigPath :: FilePath
  , KubernetesClusterContext -> Int
kubernetesClusterNumNodes :: Int
  , KubernetesClusterContext -> (Manager, KubernetesClientConfig)
kubernetesClusterClientConfig :: (Manager, Kubernetes.KubernetesClientConfig)
  , KubernetesClusterContext -> KubernetesClusterType
kubernetesClusterType :: KubernetesClusterType
  } deriving (Int -> KubernetesClusterContext -> ShowS
[KubernetesClusterContext] -> ShowS
KubernetesClusterContext -> String
(Int -> KubernetesClusterContext -> ShowS)
-> (KubernetesClusterContext -> String)
-> ([KubernetesClusterContext] -> ShowS)
-> Show KubernetesClusterContext
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> KubernetesClusterContext -> ShowS
showsPrec :: Int -> KubernetesClusterContext -> ShowS
$cshow :: KubernetesClusterContext -> String
show :: KubernetesClusterContext -> String
$cshowList :: [KubernetesClusterContext] -> ShowS
showList :: [KubernetesClusterContext] -> ShowS
Show)

kubernetesCluster :: Label "kubernetesCluster" KubernetesClusterContext
kubernetesCluster :: Label "kubernetesCluster" KubernetesClusterContext
kubernetesCluster = Label "kubernetesCluster" KubernetesClusterContext
forall {k} (l :: Symbol) (a :: k). Label l a
Label
type HasKubernetesClusterContext context = HasLabel context "kubernetesCluster" KubernetesClusterContext

-- * Contexts with MonadReader

type KubernetesBasic context m = (
  MonadLoggerIO m
  , MonadUnliftIO m
  , HasBaseContextMonad context m
  )

type KubernetesClusterBasic context m = (
  KubernetesBasic context m
  , HasKubernetesClusterContext context
  )

type KubectlBasic context m = (
  KubernetesClusterBasic context m
  , HasFile context "kubectl"
  )

type NixContextBasic context m = (
  MonadLoggerIO m
  , MonadUnliftIO m
  , HasBaseContextMonad context m
  , HasNixContext context
  )

-- * Context with MonadReader

type KubernetesBasicWithoutReader context m = (
  MonadLoggerIO m
  , MonadUnliftIO m
  , HasBaseContext context
  )

type KubernetesClusterBasicWithoutReader context m = (
  MonadUnliftIO m
  , HasBaseContext context
  , HasKubernetesClusterContext context
  )

type KubectlBasicWithoutReader context m = (
  MonadUnliftIO m
  , HasBaseContext context
  , HasKubernetesClusterContext context
  , HasFile context "kubectl"
  )

-- * Kubernetes cluster images

kubernetesClusterImages :: Label "kubernetesClusterImages" [Text]
kubernetesClusterImages :: Label "kubernetesClusterImages" [Text]
kubernetesClusterImages = Label "kubernetesClusterImages" [Text]
forall {k} (l :: Symbol) (a :: k). Label l a
Label
type HasKubernetesClusterImagesContext context = HasLabel context "kubernetesClusterImages" [Text]

data ImagePullPolicy = Always | IfNotPresent | Never
  deriving (Int -> ImagePullPolicy -> ShowS
[ImagePullPolicy] -> ShowS
ImagePullPolicy -> String
(Int -> ImagePullPolicy -> ShowS)
-> (ImagePullPolicy -> String)
-> ([ImagePullPolicy] -> ShowS)
-> Show ImagePullPolicy
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ImagePullPolicy -> ShowS
showsPrec :: Int -> ImagePullPolicy -> ShowS
$cshow :: ImagePullPolicy -> String
show :: ImagePullPolicy -> String
$cshowList :: [ImagePullPolicy] -> ShowS
showList :: [ImagePullPolicy] -> ShowS
Show, ImagePullPolicy -> ImagePullPolicy -> Bool
(ImagePullPolicy -> ImagePullPolicy -> Bool)
-> (ImagePullPolicy -> ImagePullPolicy -> Bool)
-> Eq ImagePullPolicy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ImagePullPolicy -> ImagePullPolicy -> Bool
== :: ImagePullPolicy -> ImagePullPolicy -> Bool
$c/= :: ImagePullPolicy -> ImagePullPolicy -> Bool
/= :: ImagePullPolicy -> ImagePullPolicy -> Bool
Eq)

data ImageLoadSpec =
  -- | A @.tar@ or @.tar.gz@ file
  ImageLoadSpecTarball FilePath
  -- | An image pulled via Docker
  | ImageLoadSpecDocker { ImageLoadSpec -> Text
imageName :: Text
                        , ImageLoadSpec -> ImagePullPolicy
pullPolicy :: ImagePullPolicy }
  -- | An image pulled via Podman
  | ImageLoadSpecPodman { imageName :: Text
                        , pullPolicy :: ImagePullPolicy }
  deriving (Int -> ImageLoadSpec -> ShowS
[ImageLoadSpec] -> ShowS
ImageLoadSpec -> String
(Int -> ImageLoadSpec -> ShowS)
-> (ImageLoadSpec -> String)
-> ([ImageLoadSpec] -> ShowS)
-> Show ImageLoadSpec
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ImageLoadSpec -> ShowS
showsPrec :: Int -> ImageLoadSpec -> ShowS
$cshow :: ImageLoadSpec -> String
show :: ImageLoadSpec -> String
$cshowList :: [ImageLoadSpec] -> ShowS
showList :: [ImageLoadSpec] -> ShowS
Show, ImageLoadSpec -> ImageLoadSpec -> Bool
(ImageLoadSpec -> ImageLoadSpec -> Bool)
-> (ImageLoadSpec -> ImageLoadSpec -> Bool) -> Eq ImageLoadSpec
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ImageLoadSpec -> ImageLoadSpec -> Bool
== :: ImageLoadSpec -> ImageLoadSpec -> Bool
$c/= :: ImageLoadSpec -> ImageLoadSpec -> Bool
/= :: ImageLoadSpec -> ImageLoadSpec -> Bool
Eq)