From ac4b0d1aeb4580a05a84609d19b490b80db08abf Mon Sep 17 00:00:00 2001 From: Gabriel Gonzalez Date: Thu, 9 Jan 2020 20:47:40 -0800 Subject: [PATCH] Remove dependence on `kubernetes-client-core` --- README.md | 4 +- .../dhall-kubernetes-generator.cabal | 1 - .../src/Dhall/Kubernetes/Convert.hs | 108 +++++++++++++++--- 3 files changed, 97 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 114b3cd..f74a64e 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ In the following example, we: -- examples/deploymentSimple.dhall let kubernetes = - ../package.dhall sha256:0a6949aabfb5a1250f08c4e3a533024d4705bea98ace08d8d107417e54a9648a + ../package.dhall sha256:63eb2e2bb9a50632801b673e67e666740c09c89deb0a0d0592d165178b5eba53 let deployment = kubernetes.Deployment::{ @@ -152,7 +152,7 @@ let map = Prelude.List.map let kv = Prelude.JSON.keyText let kubernetes = - ../package.dhall sha256:0a6949aabfb5a1250f08c4e3a533024d4705bea98ace08d8d107417e54a9648a + ../package.dhall sha256:63eb2e2bb9a50632801b673e67e666740c09c89deb0a0d0592d165178b5eba53 let Service = { name : Text, host : Text, version : Text } diff --git a/dhall-kubernetes-generator/dhall-kubernetes-generator.cabal b/dhall-kubernetes-generator/dhall-kubernetes-generator.cabal index 591ec41..ee38277 100644 --- a/dhall-kubernetes-generator/dhall-kubernetes-generator.cabal +++ b/dhall-kubernetes-generator/dhall-kubernetes-generator.cabal @@ -24,7 +24,6 @@ executable dhall-kubernetes-generator aeson >= 1.0.0.0 && < 1.5 , containers >= 0.5.0.0 && < 0.7 , dhall >= 1.22.0 && < 1.29 , - kubernetes-client-core >= 0.1.0.1 && < 0.2, megaparsec >= 7.0 && < 7.1 , optparse-applicative >= 0.14.3.0 && < 0.15 , parser-combinators >= 1.0.3 && < 1.3 , diff --git a/dhall-kubernetes-generator/src/Dhall/Kubernetes/Convert.hs b/dhall-kubernetes-generator/src/Dhall/Kubernetes/Convert.hs index 0031ed6..feaf98c 100644 --- a/dhall-kubernetes-generator/src/Dhall/Kubernetes/Convert.hs +++ b/dhall-kubernetes-generator/src/Dhall/Kubernetes/Convert.hs @@ -1,3 +1,6 @@ +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE FlexibleContexts #-} + module Dhall.Kubernetes.Convert ( toTypes , toDefault @@ -6,6 +9,17 @@ module Dhall.Kubernetes.Convert , toDefinition ) where +import Control.Applicative ((<|>)) +import Data.Aeson +import Data.Aeson.Types (Parser, parseMaybe) +import Data.Bifunctor (first, second) +import Data.Maybe (fromMaybe, mapMaybe) +import Data.Set (Set) +import Data.Text (Text) +import Dhall.Kubernetes.Types +import GHC.Generics (Generic, Rep) + +import qualified Data.Char as Char import qualified Data.List as List import qualified Data.Map.Strict as Data.Map import qualified Data.Set as Set @@ -14,18 +28,6 @@ import qualified Data.Text as Text import qualified Dhall.Core as Dhall import qualified Dhall.Map -import Control.Applicative ((<|>)) -import Data.Aeson -import Data.Aeson.Types (parseMaybe) -import Data.Bifunctor (first, second) -import Data.Maybe (fromMaybe, mapMaybe) -import Data.Set (Set) -import Data.Text (Text) - -import Dhall.Kubernetes.Types -import Kubernetes.OpenAPI.Model - - -- | Get all the required fields for a model -- See https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/#required-fields -- TLDR: because k8s API allows PUTS etc with partial data, @@ -296,6 +298,86 @@ getImportsMap prefixMap duplicateNameHandler objectNames folder toInclude [name] -> Just name names -> duplicateNameHandler (kind, names) +stripPrefix :: (Generic a, GFromJSON Zero (Rep a)) => Int -> Value -> Parser a +stripPrefix n = genericParseJSON options + where + options = defaultOptions { fieldLabelModifier } + + fieldLabelModifier string = case drop n string of + s : tring -> Char.toLower s : tring + [] -> [] + +data V1beta1CustomResourceDefinition = + V1beta1CustomResourceDefinition + { v1beta1CustomResourceDefinitionSpec :: V1beta1CustomResourceDefinitionSpec + } + deriving (Generic) + +instance FromJSON V1beta1CustomResourceDefinition where + parseJSON = stripPrefix 31 + +data V1beta1CustomResourceDefinitionSpec = + V1beta1CustomResourceDefinitionSpec + { v1beta1CustomResourceDefinitionSpecGroup :: Text + , v1beta1CustomResourceDefinitionSpecNames :: V1beta1CustomResourceDefinitionNames + , v1beta1CustomResourceDefinitionSpecValidation :: Maybe V1beta1CustomResourceValidation + , v1beta1CustomResourceDefinitionSpecVersion :: Maybe Text + , v1beta1CustomResourceDefinitionSpecVersions :: Maybe [V1beta1CustomResourceDefinitionVersion] + } deriving (Generic) + +instance FromJSON V1beta1CustomResourceDefinitionSpec where + parseJSON = stripPrefix 35 + +data V1beta1CustomResourceDefinitionNames = + V1beta1CustomResourceDefinitionNames + { v1beta1CustomResourceDefinitionNamesKind :: Text + } deriving (Generic) + +instance FromJSON V1beta1CustomResourceDefinitionNames where + parseJSON = stripPrefix 36 + +data V1beta1CustomResourceValidation = + V1beta1CustomResourceValidation + { v1beta1CustomResourceValidationOpenApiv3Schema :: Maybe V1beta1JSONSchemaProps + } deriving (Generic) + +instance FromJSON V1beta1CustomResourceValidation where + parseJSON = stripPrefix 31 + +data V1beta1CustomResourceDefinitionVersion = + V1betaV1beta1CustomResourceDefinitionVersion + { v1beta1CustomResourceDefinitionVersionName :: Text + } deriving (Generic) + +instance FromJSON V1beta1CustomResourceDefinitionVersion where + parseJSON = stripPrefix 38 + +data V1beta1JSONSchemaProps = + V1beta1JSONSchemaProps + { v1beta1JSONSchemaPropsRef :: Maybe Text + , v1beta1JSONSchemaPropsDescription :: Maybe Text + , v1beta1JSONSchemaPropsFormat :: Maybe Text + , v1beta1JSONSchemaPropsItems :: Maybe Value + , v1beta1JSONSchemaPropsProperties :: Maybe (Data.Map.Map String V1beta1JSONSchemaProps) + , v1beta1JSONSchemaPropsRequired :: Maybe [Text] + , v1beta1JSONSchemaPropsType :: Maybe Text + } deriving (Generic) + +instance FromJSON V1beta1JSONSchemaProps where + parseJSON = stripPrefix 22 + +mkV1beta1JSONSchemaProps :: V1beta1JSONSchemaProps +mkV1beta1JSONSchemaProps = + V1beta1JSONSchemaProps + { v1beta1JSONSchemaPropsRef = Nothing + , v1beta1JSONSchemaPropsDescription = Nothing + , v1beta1JSONSchemaPropsFormat = Nothing + , v1beta1JSONSchemaPropsItems = Nothing + , v1beta1JSONSchemaPropsProperties = Nothing + , v1beta1JSONSchemaPropsRequired = Nothing + , v1beta1JSONSchemaPropsType = Nothing + } + toDefinition :: V1beta1CustomResourceDefinition -> Maybe (ModelName, Definition) toDefinition crd = fmap (\d -> (modelName, d)) definition @@ -347,4 +429,4 @@ toDefinition crd = } toProperties :: Data.Map.Map String V1beta1JSONSchemaProps -> Data.Map.Map ModelName Definition toProperties props = - (Data.Map.fromList . fmap (\(k, p) -> ((ModelName . Text.pack) k, propsToDefinition p Nothing)) . Data.Map.toList) props \ No newline at end of file + (Data.Map.fromList . fmap (\(k, p) -> ((ModelName . Text.pack) k, propsToDefinition p Nothing)) . Data.Map.toList) props