{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Test.Sandwich.Contexts.Kubernetes.Run where import Control.Monad import Control.Monad.IO.Unlift import Control.Monad.Logger import qualified Data.ByteString.Lazy.Char8 as BL import Data.String.Interpolate import Kubernetes.OpenAPI.Client as Kubernetes import Kubernetes.OpenAPI.Core as Kubernetes import Kubernetes.OpenAPI.MimeTypes import Network.HTTP.Client import Relude import Test.Sandwich import Test.Sandwich.Contexts.Kubernetes.Types import UnliftIO.Exception type Constraints context m = (MonadIO m, MonadUnliftIO m, MonadLogger m, MonadReader context m) instance Exception MimeError -- * Run Exception k8sRunException :: (Produces req accept, MimeUnrender accept res, MimeType contentType, Constraints context m, HasKubernetesClusterContext context) => KubernetesRequest req contentType res accept -> m res k8sRunException req = do (manager, clientConfig) <- kubernetesClusterClientConfig <$> getContext kubernetesCluster k8sRunException' manager clientConfig req k8sRunException' :: (MimeUnrender accept res, MimeType contentType, Produces req accept, Constraints context m) => Manager -> KubernetesClientConfig -> KubernetesRequest req contentType res accept -> m res k8sRunException' manager clientConfig req = k8sRunEither'' manager clientConfig req >>= \case Left err -> throwIO err Right x -> return x -- * Run Either k8sRunEither :: (Produces req accept, MimeUnrender accept res, MimeType contentType, Constraints context m, HasKubernetesClusterContext context) => KubernetesRequest req contentType res accept -> m (Either Text res) k8sRunEither req = do (manager, clientConfig) <- kubernetesClusterClientConfig <$> getContext kubernetesCluster k8sRunEither' manager clientConfig req k8sRunEither' :: (Produces req accept, MimeUnrender accept res, MimeType contentType, Constraints context m) => Manager -> KubernetesClientConfig -> KubernetesRequest req contentType res accept -> m (Either Text res) k8sRunEither' manager clientConfig req = first show <$> k8sRunEither'' manager clientConfig req k8sRunEither'' :: (Produces req accept, MimeUnrender accept res, MimeType contentType, Constraints context m) => Manager -> KubernetesClientConfig -> KubernetesRequest req contentType res accept -> m (Either MimeError res) k8sRunEither'' k8sManager k8sClientConfig req = do MimeResult parsedResult _httpResponse <- liftIO (dispatchMime k8sManager k8sClientConfig req) let successMessage = case parsedResult of Left err -> "FAIL: " <> show err _ -> "SUCCESS" :: Text debug [i|Kubernetes request: #{rMethod req} to #{BL.intercalate "/" $ rUrlPath req} = #{successMessage}|] return parsedResult