From 53fae376bbaf39b77b152f26a49a29ee6dcbdcb3 Mon Sep 17 00:00:00 2001 From: Peter Becich Date: Mon, 12 Dec 2022 22:10:05 -0800 Subject: [PATCH 1/5] GitHub Action generated with https://github.com/haskell-CI/haskell-ci --- .github/workflows/haskell-ci.yml | 204 ++++++++++++++++++++++ README.md | 1 + cabal.project | 4 + examples/.gitignore | 1 - examples/kubernetes-examples.cabal | 56 ++++++ examples/package.yaml | 1 + kubernetes-client/kubernetes-client.cabal | 2 + kubernetes-client/package.yaml | 1 + kubernetes/kubernetes-client-core.cabal | 2 + 9 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/haskell-ci.yml create mode 100644 cabal.project create mode 100644 examples/kubernetes-examples.cabal diff --git a/.github/workflows/haskell-ci.yml b/.github/workflows/haskell-ci.yml new file mode 100644 index 00000000..d60e8f2d --- /dev/null +++ b/.github/workflows/haskell-ci.yml @@ -0,0 +1,204 @@ +# This GitHub workflow config has been generated by a script via +# +# haskell-ci 'github' 'cabal.project' +# +# To regenerate the script (for example after adjusting tested-with) run +# +# haskell-ci regenerate +# +# For more information, see https://github.com/haskell-CI/haskell-ci +# +# version: 0.14.3 +# +# REGENDATA ("0.14.3",["github","cabal.project"]) +# +name: Haskell-CI +on: + - push + - pull_request +jobs: + linux: + name: Haskell-CI - Linux - ${{ matrix.compiler }} + runs-on: ubuntu-18.04 + timeout-minutes: + 60 + container: + image: buildpack-deps:bionic + continue-on-error: ${{ matrix.allow-failure }} + strategy: + matrix: + include: + - compiler: ghc-9.0.2 + compilerKind: ghc + compilerVersion: 9.0.2 + setup-method: ghcup + allow-failure: false + - compiler: ghc-8.10.7 + compilerKind: ghc + compilerVersion: 8.10.7 + setup-method: ghcup + allow-failure: false + fail-fast: false + steps: + - name: apt + run: | + apt-get update + apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5 + mkdir -p "$HOME/.ghcup/bin" + curl -sL https://downloads.haskell.org/ghcup/0.1.17.5/x86_64-linux-ghcup-0.1.17.5 > "$HOME/.ghcup/bin/ghcup" + chmod a+x "$HOME/.ghcup/bin/ghcup" + "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" + "$HOME/.ghcup/bin/ghcup" install cabal 3.6.2.0 + env: + HCKIND: ${{ matrix.compilerKind }} + HCNAME: ${{ matrix.compiler }} + HCVER: ${{ matrix.compilerVersion }} + - name: Set PATH and environment variables + run: | + echo "$HOME/.cabal/bin" >> $GITHUB_PATH + echo "LANG=C.UTF-8" >> "$GITHUB_ENV" + echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV" + echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV" + HCDIR=/opt/$HCKIND/$HCVER + HC=$HOME/.ghcup/bin/$HCKIND-$HCVER + echo "HC=$HC" >> "$GITHUB_ENV" + echo "HCPKG=$HOME/.ghcup/bin/$HCKIND-pkg-$HCVER" >> "$GITHUB_ENV" + echo "HADDOCK=$HOME/.ghcup/bin/haddock-$HCVER" >> "$GITHUB_ENV" + echo "CABAL=$HOME/.ghcup/bin/cabal-3.6.2.0 -vnormal+nowrap" >> "$GITHUB_ENV" + HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))') + echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV" + echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV" + echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV" + echo "HEADHACKAGE=false" >> "$GITHUB_ENV" + echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV" + echo "GHCJSARITH=0" >> "$GITHUB_ENV" + env: + HCKIND: ${{ matrix.compilerKind }} + HCNAME: ${{ matrix.compiler }} + HCVER: ${{ matrix.compilerVersion }} + - name: env + run: | + env + - name: write cabal config + run: | + mkdir -p $CABAL_DIR + cat >> $CABAL_CONFIG <> $CABAL_CONFIG < cabal-plan.xz + echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c - + xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan + rm -f cabal-plan.xz + chmod a+x $HOME/.cabal/bin/cabal-plan + cabal-plan --version + - name: checkout + uses: actions/checkout@v2 + with: + path: source + - name: initial cabal.project for sdist + run: | + touch cabal.project + echo "packages: $GITHUB_WORKSPACE/source/kubernetes" >> cabal.project + echo "packages: $GITHUB_WORKSPACE/source/kubernetes-client" >> cabal.project + echo "packages: $GITHUB_WORKSPACE/source/examples" >> cabal.project + cat cabal.project + - name: sdist + run: | + mkdir -p sdist + $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist + - name: unpack + run: | + mkdir -p unpacked + find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \; + - name: generate cabal.project + run: | + PKGDIR_kubernetes_client_core="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/kubernetes-client-core-[0-9.]*')" + echo "PKGDIR_kubernetes_client_core=${PKGDIR_kubernetes_client_core}" >> "$GITHUB_ENV" + PKGDIR_kubernetes_client="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/kubernetes-client-[0-9.]*')" + echo "PKGDIR_kubernetes_client=${PKGDIR_kubernetes_client}" >> "$GITHUB_ENV" + PKGDIR_kubernetes_examples="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/kubernetes-examples-[0-9.]*')" + echo "PKGDIR_kubernetes_examples=${PKGDIR_kubernetes_examples}" >> "$GITHUB_ENV" + rm -f cabal.project cabal.project.local + touch cabal.project + touch cabal.project.local + echo "packages: ${PKGDIR_kubernetes_client_core}" >> cabal.project + echo "packages: ${PKGDIR_kubernetes_client}" >> cabal.project + echo "packages: ${PKGDIR_kubernetes_examples}" >> cabal.project + echo "package kubernetes-client-core" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package kubernetes-client" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + echo "package kubernetes-examples" >> cabal.project + echo " ghc-options: -Werror=missing-methods" >> cabal.project + cat >> cabal.project <> cabal.project.local + cat cabal.project + cat cabal.project.local + - name: dump install plan + run: | + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all + cabal-plan + - name: cache + uses: actions/cache@v2 + with: + key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }} + path: ~/.cabal/store + restore-keys: ${{ runner.os }}-${{ matrix.compiler }}- + - name: install dependencies + run: | + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all + - name: build w/o tests + run: | + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all + - name: build + run: | + $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always + - name: tests + run: | + $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct + - name: cabal check + run: | + cd ${PKGDIR_kubernetes_client_core} || false + ${CABAL} -vnormal check + cd ${PKGDIR_kubernetes_client} || false + ${CABAL} -vnormal check + cd ${PKGDIR_kubernetes_examples} || false + ${CABAL} -vnormal check + - name: haddock + run: | + $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all + - name: unconstrained build + run: | + rm -f cabal.project.local + $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all diff --git a/README.md b/README.md index 1f4cb715..4b795cf4 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Kubernetes Haskell Client +[![Haskell-CI](https://github.com/kubernetes-client/haskell/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/kubernetes-client/haskell/actions/workflows/haskell-ci.yml) [![Build Status](https://travis-ci.org/kubernetes-client/haskell.svg?branch=master)](https://travis-ci.org/kubernetes-client/haskell) Haskell client for the [kubernetes](http://kubernetes.io/) API. diff --git a/cabal.project b/cabal.project new file mode 100644 index 00000000..a6f6b90a --- /dev/null +++ b/cabal.project @@ -0,0 +1,4 @@ +packages: + kubernetes + kubernetes-client + examples \ No newline at end of file diff --git a/examples/.gitignore b/examples/.gitignore index 403847d5..b81a6033 100644 --- a/examples/.gitignore +++ b/examples/.gitignore @@ -1,4 +1,3 @@ dist dist-newstyle -*.cabal .stack-work diff --git a/examples/kubernetes-examples.cabal b/examples/kubernetes-examples.cabal new file mode 100644 index 00000000..f0500939 --- /dev/null +++ b/examples/kubernetes-examples.cabal @@ -0,0 +1,56 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.34.4. +-- +-- see: https://github.com/sol/hpack + +name: kubernetes-examples +version: 0.1.0.1 +synopsis: Kubernetes examples with Haskell +description: Examples to interact with Kubernetes using kubernetes-client and kubernetes-client-core +category: Examples, Kubernetes +maintainer: Shimin Guo , + Akshay Mankar +license: Apache-2.0 +license-file: LICENSE +build-type: Simple +tested-with: + GHC==9.0.2, GHC==8.10.7 + +executable in-cluster + main-is: Main.hs + other-modules: + Paths_kubernetes_examples + hs-source-dirs: + in-cluster + ghc-options: -Wall + build-depends: + base + , containers + , http-client + , http-types + , kubernetes-client + , kubernetes-client-core + , safe-exceptions + , stm + , text + default-language: Haskell2010 + +executable simple + main-is: Main.hs + other-modules: + Paths_kubernetes_examples + hs-source-dirs: + simple + ghc-options: -Wall + build-depends: + base + , containers + , http-client + , http-types + , kubernetes-client + , kubernetes-client-core + , safe-exceptions + , stm + , text + default-language: Haskell2010 diff --git a/examples/package.yaml b/examples/package.yaml index b926d257..c748e26e 100644 --- a/examples/package.yaml +++ b/examples/package.yaml @@ -31,3 +31,4 @@ dependencies: - safe-exceptions - stm - text +tested-with: GHC==9.0.2, GHC==8.10.7 diff --git a/kubernetes-client/kubernetes-client.cabal b/kubernetes-client/kubernetes-client.cabal index 47c51a75..d3ac2338 100644 --- a/kubernetes-client/kubernetes-client.cabal +++ b/kubernetes-client/kubernetes-client.cabal @@ -16,6 +16,8 @@ maintainer: Shimin Guo , license: Apache-2.0 license-file: LICENSE build-type: Simple +tested-with: + GHC==9.0.2, GHC==8.10.7 extra-source-files: test/testdata/certs/certificate.pem test/testdata/certs/private-key.pem diff --git a/kubernetes-client/package.yaml b/kubernetes-client/package.yaml index ba9d5589..43b1eaee 100644 --- a/kubernetes-client/package.yaml +++ b/kubernetes-client/package.yaml @@ -15,6 +15,7 @@ library: source-dirs: src ghc-options: - -Wall +tested-with: GHC==9.0.2, GHC==8.10.7 tests: spec: main: Spec.hs diff --git a/kubernetes/kubernetes-client-core.cabal b/kubernetes/kubernetes-client-core.cabal index 1f636261..40d395fd 100644 --- a/kubernetes/kubernetes-client-core.cabal +++ b/kubernetes/kubernetes-client-core.cabal @@ -21,6 +21,8 @@ license-file: LICENSE build-type: Simple cabal-version: >= 1.10 +tested-with: GHC==9.0.2, GHC==8.10.7 + extra-source-files: README.md openapi.yaml From fed034bff9811be1520bbe878232877efcb0b740 Mon Sep 17 00:00:00 2001 From: Peter Becich Date: Mon, 12 Dec 2022 22:36:28 -0800 Subject: [PATCH 2/5] build-tool-depends --- kubernetes-client/kubernetes-client.cabal | 6 ++++++ kubernetes-client/package.yaml | 2 ++ 2 files changed, 8 insertions(+) diff --git a/kubernetes-client/kubernetes-client.cabal b/kubernetes-client/kubernetes-client.cabal index d3ac2338..38ed708a 100644 --- a/kubernetes-client/kubernetes-client.cabal +++ b/kubernetes-client/kubernetes-client.cabal @@ -46,6 +46,8 @@ library hs-source-dirs: src ghc-options: -Wall + build-tool-depends: + hspec-discover:hspec-discover build-depends: aeson >=1.2 && <3 , attoparsec >=0.13 @@ -90,6 +92,8 @@ test-suite example Paths_kubernetes_client hs-source-dirs: example + build-tool-depends: + hspec-discover:hspec-discover build-depends: aeson >=1.2 && <3 , attoparsec >=0.13 @@ -140,6 +144,8 @@ test-suite spec Paths_kubernetes_client hs-source-dirs: test + build-tool-depends: + hspec-discover:hspec-discover build-depends: aeson >=1.2 && <3 , attoparsec >=0.13 diff --git a/kubernetes-client/package.yaml b/kubernetes-client/package.yaml index 43b1eaee..34b24da5 100644 --- a/kubernetes-client/package.yaml +++ b/kubernetes-client/package.yaml @@ -15,6 +15,8 @@ library: source-dirs: src ghc-options: - -Wall +build-tools: + - hspec-discover tested-with: GHC==9.0.2, GHC==8.10.7 tests: spec: From afd58357eb3e43d99c2b731150e711fd9c8ec65d Mon Sep 17 00:00:00 2001 From: Peter Becich Date: Mon, 12 Dec 2022 23:11:36 -0800 Subject: [PATCH 3/5] fix `cabal check` --- examples/kubernetes-examples.cabal | 4 ++-- examples/package.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/kubernetes-examples.cabal b/examples/kubernetes-examples.cabal index f0500939..956452db 100644 --- a/examples/kubernetes-examples.cabal +++ b/examples/kubernetes-examples.cabal @@ -25,7 +25,7 @@ executable in-cluster in-cluster ghc-options: -Wall build-depends: - base + base <5 , containers , http-client , http-types @@ -44,7 +44,7 @@ executable simple simple ghc-options: -Wall build-depends: - base + base <5 , containers , http-client , http-types diff --git a/examples/package.yaml b/examples/package.yaml index c748e26e..7d93018f 100644 --- a/examples/package.yaml +++ b/examples/package.yaml @@ -22,7 +22,7 @@ executables: ghc-options: - -Wall dependencies: -- base +- base < 5 - containers - http-client - http-types From d688d496356efd366766a51665114d94f539190d Mon Sep 17 00:00:00 2001 From: Alexander Vershilov Date: Wed, 11 Jan 2023 15:45:37 +0600 Subject: [PATCH 4/5] Add GHC options to reduce simplier steps. The code in the module is autogenerated, it has only data definitions and manually written instances, so there is not much point in many simplifier steps. Reducing amount of simplification passes reduces about of required RAM 3 times versus default version. --- kubernetes/lib/Kubernetes/OpenAPI/Model.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kubernetes/lib/Kubernetes/OpenAPI/Model.hs b/kubernetes/lib/Kubernetes/OpenAPI/Model.hs index bb26a61e..9f6cc073 100644 --- a/kubernetes/lib/Kubernetes/OpenAPI/Model.hs +++ b/kubernetes/lib/Kubernetes/OpenAPI/Model.hs @@ -24,7 +24,8 @@ Module : Kubernetes.OpenAPI.Model {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE TypeFamilies #-} -{-# OPTIONS_GHC -fno-warn-unused-matches -fno-warn-unused-binds -fno-warn-unused-imports #-} +{-# OPTIONS_GHC -fno-warn-unused-matches -fno-warn-unused-binds -fno-warn-unused-imports -fsimplifier-phases=1 -fmax-simplifier-iterations=1 #-} + module Kubernetes.OpenAPI.Model (module Kubernetes.OpenAPI.Model, module Kubernetes.OpenAPI.ImportMappings) where From fb00fb3ad20870ce4bf336fc03c6fa0ba9a25922 Mon Sep 17 00:00:00 2001 From: Danil Berestov Date: Mon, 27 Nov 2023 22:01:25 +0700 Subject: [PATCH 5/5] bump text aeson (#1) * bump text aeson * fix test deps * update code for new jsonpath * delete package.yaml * bump x509 * bump connection --- kubernetes-client/kubernetes-client.cabal | 64 ++++++++-------- kubernetes-client/package.yaml | 73 ------------------- .../src/Kubernetes/Client/Auth/GCP.hs | 7 +- .../src/Kubernetes/Client/Auth/OIDC.hs | 3 +- .../src/Kubernetes/Data/K8sJSONPath.hs | 29 +++++--- .../test/Kubernetes/Data/K8sJSONPathSpec.hs | 6 +- kubernetes/kubernetes-client-core.cabal | 6 +- kubernetes/stack.yaml.lock | 8 +- 8 files changed, 66 insertions(+), 130 deletions(-) delete mode 100644 kubernetes-client/package.yaml diff --git a/kubernetes-client/kubernetes-client.cabal b/kubernetes-client/kubernetes-client.cabal index 38ed708a..df15a456 100644 --- a/kubernetes-client/kubernetes-client.cabal +++ b/kubernetes-client/kubernetes-client.cabal @@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.34.4. +-- This file has been generated from package.yaml by hpack version 0.35.2. -- -- see: https://github.com/sol/hpack name: kubernetes-client -version: 0.4.3.0 +version: 0.5.0.0 synopsis: Client library for Kubernetes description: Client library for interacting with a Kubernetes cluster. . @@ -49,22 +49,22 @@ library build-tool-depends: hspec-discover:hspec-discover build-depends: - aeson >=1.2 && <3 - , attoparsec >=0.13 + aeson >=2.0 + , megaparsec >=9.2.2 , base >=4.7 && <5.0 , base64-bytestring , bytestring >=0.10 - , connection >=0.2 + , crypton-connection >=0.2 , containers >=0.5 , data-default-class >=0.1 , either >=5.0 , filepath >=1.4 - , hoauth2 >=1.11 && <=2.3.0 + , hoauth2 >=2.0 , http-client >=0.5 && <0.8 , http-client-tls >=0.3 , jose-jwt >=0.8 - , jsonpath >=0.1 && <0.3 - , kubernetes-client-core ==0.4.3.0 + , jsonpath >=0.3 + , kubernetes-client-core ==0.5.0.0 , microlens >=0.4 , mtl >=2.2 , oidc-client >=0.4 @@ -72,16 +72,16 @@ library , safe-exceptions >=0.1.0.0 , stm >=2.4 , streaming-bytestring >=0.1 && <0.3 - , text >=0.11 && <1.3 + , text >=2.0 , time >=1.8 , timerep >=2.0 - , tls >=1.4.1 + , tls >=1.7.0 , typed-process >=0.2 , uri-bytestring >=0.3 - , x509 >=1.7 - , x509-store >=1.6 - , x509-system >=1.6 - , x509-validation >=1.6 + , crypton-x509 >=1.7 + , crypton-x509-store >=1.6 + , crypton-x509-system >=1.6 + , crypton-x509-validation >=1.6 , yaml >=0.8.32 default-language: Haskell2010 @@ -96,7 +96,7 @@ test-suite example hspec-discover:hspec-discover build-depends: aeson >=1.2 && <3 - , attoparsec >=0.13 + , megaparsec >=9.2.2 , base >=4.7 && <5.0 , base64-bytestring , bytestring >=0.10 @@ -105,13 +105,13 @@ test-suite example , data-default-class >=0.1 , either >=5.0 , filepath >=1.4 - , hoauth2 >=1.11 && <=2.3.0 + , hoauth2 >=2.0 , http-client >=0.5 && <0.8 , http-client-tls >=0.3 , jose-jwt >=0.8 - , jsonpath >=0.1 && <0.3 - , kubernetes-client - , kubernetes-client-core ==0.4.3.0 + , jsonpath >=0.3 + , kubernetes-client ==0.5.0.0 + , kubernetes-client-core ==0.5.0.0 , microlens >=0.4 , mtl >=2.2 , oidc-client >=0.4 @@ -119,7 +119,7 @@ test-suite example , safe-exceptions >=0.1.0.0 , stm >=2.4 , streaming-bytestring >=0.1 && <0.3 - , text >=0.11 && <1.3 + , text >=2.0 , time >=1.8 , timerep >=2.0 , tls >=1.4.1 @@ -148,25 +148,25 @@ test-suite spec hspec-discover:hspec-discover build-depends: aeson >=1.2 && <3 - , attoparsec >=0.13 + , megaparsec >=9.2.2 , base >=4.7 && <5.0 , base64-bytestring , bytestring >=0.10 - , connection >=0.2 + , crypton-connection >=0.2 , containers >=0.5 , data-default-class >=0.1 , either >=5.0 , file-embed , filepath >=1.4 - , hoauth2 >=1.11 && <=2.3.0 + , hoauth2 >=2.0 , hspec - , hspec-attoparsec + , hspec-megaparsec >= 2.2.1 , http-client >=0.5 && <0.8 , http-client-tls >=0.3 , jose-jwt >=0.8 - , jsonpath >=0.1 && <0.3 - , kubernetes-client - , kubernetes-client-core ==0.4.3.0 + , jsonpath >=0.3 + , kubernetes-client ==0.5.0.0 + , kubernetes-client-core ==0.5.0.0 , microlens >=0.4 , mtl >=2.2 , oidc-client >=0.4 @@ -174,15 +174,15 @@ test-suite spec , safe-exceptions >=0.1.0.0 , stm >=2.4 , streaming-bytestring >=0.1 && <0.3 - , text >=0.11 && <1.3 + , text >=2.0 , time >=1.8 , timerep >=2.0 , tls >=1.4.1 , typed-process >=0.2 , uri-bytestring >=0.3 - , x509 >=1.7 - , x509-store >=1.6 - , x509-system >=1.6 - , x509-validation >=1.6 + , crypton-x509 >=1.7 + , crypton-x509-store >=1.6 + , crypton-x509-system >=1.6 + , crypton-x509-validation >=1.6 , yaml default-language: Haskell2010 diff --git a/kubernetes-client/package.yaml b/kubernetes-client/package.yaml deleted file mode 100644 index 34b24da5..00000000 --- a/kubernetes-client/package.yaml +++ /dev/null @@ -1,73 +0,0 @@ -name: kubernetes-client -version: 0.4.3.0 -description: | - Client library for interacting with a Kubernetes cluster. - - This package contains hand-written code while kubernetes-client-core contains code auto-generated from the OpenAPI spec. -synopsis: Client library for Kubernetes -maintainer: -- Shimin Guo -- Akshay Mankar -category: Web -license: Apache-2.0 -license-file: LICENSE -library: - source-dirs: src - ghc-options: - - -Wall -build-tools: - - hspec-discover -tested-with: GHC==9.0.2, GHC==8.10.7 -tests: - spec: - main: Spec.hs - source-dirs: test - dependencies: - - kubernetes-client - - hspec - - hspec-attoparsec - - yaml - - file-embed - example: - main: App.hs - source-dirs: example - dependencies: - - kubernetes-client -extra-source-files: - - test/testdata/**/* - - README.md -dependencies: - - base >=4.7 && <5.0 - - base64-bytestring - - bytestring >=0.10 - - aeson >=1.2 && <3 - - attoparsec >=0.13 - - jsonpath >=0.1 && <0.3 - - connection >=0.2 - - containers >= 0.5 - - data-default-class >=0.1 - - either >=5.0 - - filepath >=1.4 - - hoauth2 >=1.11 && <=2.3.0 - - http-client >=0.5 && <0.8 - - http-client-tls >=0.3 - - jose-jwt >=0.8 - - kubernetes-client-core ==0.4.3.0 - - microlens >=0.4 - - mtl >=2.2 - - oidc-client >=0.4 - - pem >=0.2 - - safe-exceptions >=0.1.0.0 - - stm >=2.4 - - streaming-bytestring >= 0.1 && < 0.3 - - text >=0.11 && <1.3 - - time >=1.8 - - timerep >=2.0 - - tls >=1.4.1 - - typed-process >=0.2 - - uri-bytestring >=0.3 - - x509 >=1.7 - - x509-system >=1.6 - - x509-store >=1.6 - - x509-validation >=1.6 - - yaml >=0.8.32 diff --git a/kubernetes-client/src/Kubernetes/Client/Auth/GCP.hs b/kubernetes-client/src/Kubernetes/Client/Auth/GCP.hs index 6766fb98..42ea620f 100644 --- a/kubernetes-client/src/Kubernetes/Client/Auth/GCP.hs +++ b/kubernetes-client/src/Kubernetes/Client/Auth/GCP.hs @@ -6,12 +6,10 @@ where import Control.Concurrent.STM import Control.Exception.Safe (Exception, throwM) -import Data.Attoparsec.Text import Data.Either.Combinators import Data.Function ((&)) import Data.JSONPath import Data.Map (Map) -import Data.Monoid ((<>)) import Data.Text (Text) import Data.Time.Clock import Data.Time.LocalTime @@ -27,6 +25,7 @@ import qualified Data.Map as Map import qualified Data.Text as Text import qualified Data.Text.Encoding as Text import qualified Lens.Micro as L +import qualified Text.Megaparsec as P -- TODO: Add support for scopes based token fetching data GCPAuth = GCPAuth { gcpAccessToken :: TVar(Maybe Text) @@ -126,11 +125,11 @@ parseGCPAuthInfo authInfo = do Just expiryText -> Just <$> parseExpiryTime expiryText lookupEither key = Map.lookup key authInfo & maybeToRight (GCPAuthMissingInformation $ Text.unpack key) - parseK8sJSONPath = parseOnly (k8sJSONPath <* endOfInput) + parseK8sJSONPath = mapLeft P.errorBundlePretty . P.parse (k8sJSONPath <* P.eof) "" readJSONPath key defaultPath = maybe (Right defaultPath) parseK8sJSONPath $ Map.lookup key authInfo parseExpiryTime :: Text -> Either String UTCTime parseExpiryTime expiryText = zonedTimeToUTC <$> parseTimeRFC3339 expiryText - & maybeToRight ("failed to parse token expiry time " <> Text.unpack expiryText) + & maybeToRight ("failed to parse token expiry time " <> Text.unpack expiryText) \ No newline at end of file diff --git a/kubernetes-client/src/Kubernetes/Client/Auth/OIDC.hs b/kubernetes-client/src/Kubernetes/Client/Auth/OIDC.hs index 4c8f23f6..26ca53f6 100644 --- a/kubernetes-client/src/Kubernetes/Client/Auth/OIDC.hs +++ b/kubernetes-client/src/Kubernetes/Client/Auth/OIDC.hs @@ -15,7 +15,6 @@ import Data.Either.Combinators import Data.Function ((&)) import Data.Map (Map) import Data.Maybe -import Data.Monoid ((<>)) import Data.Text import Data.Text.Encoding (encodeUtf8) import Data.Time.Clock.POSIX (getPOSIXTime) @@ -60,7 +59,7 @@ instance AuthMethod OIDCAuth where $ setHeader req [("Authorization", "Bearer " <> (Text.encodeUtf8 token))] & L.set rAuthTypesL [] -data OIDCGetTokenException = OIDCOAuthException (OAuth2Error OAuth2TokenRequest.Errors) +data OIDCGetTokenException = OIDCOAuthException OAuth2TokenRequest.TokenResponseError | OIDCURIException URIParseError | OIDCGetTokenException String deriving Show diff --git a/kubernetes-client/src/Kubernetes/Data/K8sJSONPath.hs b/kubernetes-client/src/Kubernetes/Data/K8sJSONPath.hs index bfa3166c..8bb874fb 100644 --- a/kubernetes-client/src/Kubernetes/Data/K8sJSONPath.hs +++ b/kubernetes-client/src/Kubernetes/Data/K8sJSONPath.hs @@ -1,31 +1,37 @@ {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE BlockArguments #-} module Kubernetes.Data.K8sJSONPath where import Data.Aeson import Data.Aeson.Text import Data.JSONPath -import Data.Monoid ((<>)) import Data.Text as Text import Control.Applicative ((<|>)) -import Data.Attoparsec.Text import Data.Text.Lazy (toStrict) +import Data.Void (Void) +import qualified Text.Megaparsec as P +import qualified Text.Megaparsec.Char as P + data K8sPathElement = PlainText Text | JSONPath [JSONPathElement] deriving (Show, Eq) +type Parser = P.Parsec Void Text + k8sJSONPath :: Parser [K8sPathElement] -k8sJSONPath = many1 pathElementParser +k8sJSONPath = P.some pathElementParser pathElementParser :: Parser K8sPathElement pathElementParser = jsonpathParser <|> plainTextParser plainTextParser :: Parser K8sPathElement -plainTextParser = PlainText <$> takeWhile1 (/= '{') +plainTextParser = PlainText <$> P.takeWhile1P Nothing (/= '{') jsonpathParser :: Parser K8sPathElement -jsonpathParser = JSONPath <$> (char '{' *> jsonPath <* char '}') +jsonpathParser = JSONPath <$> (P.char '{' *> jsonPath (P.char '}') <* P.char '}') runJSONPath :: [K8sPathElement] -> Value -> Either String Text runJSONPath [] _ = pure "" @@ -36,13 +42,14 @@ runJSONPath (e:es) v = do runPathElement :: K8sPathElement -> Value -> Either String Text runPathElement (PlainText t) _ = pure t -runPathElement (JSONPath p) v = encodeResult $ executeJSONPath p v +runPathElement (JSONPath []) _ = Left "empty json path" +runPathElement (JSONPath p) v = Right $ encodeResult $ executeJSONPath p v -encodeResult :: ExecutionResult Value -> Either String Text -encodeResult (ResultValue val) = return $ jsonToText val -encodeResult (ResultList vals) = return $ (intercalate " " $ Prelude.map jsonToText vals) -encodeResult (ResultError err) = Left err +encodeResult :: [Value] -> Text +encodeResult = \case + [val] -> jsonToText val + vals -> (intercalate " " $ Prelude.map jsonToText vals) jsonToText :: Value -> Text jsonToText (String t) = t -jsonToText x = toStrict $ encodeToLazyText x +jsonToText x = toStrict $ encodeToLazyText x \ No newline at end of file diff --git a/kubernetes-client/test/Kubernetes/Data/K8sJSONPathSpec.hs b/kubernetes-client/test/Kubernetes/Data/K8sJSONPathSpec.hs index 7585c54d..73ea0bab 100644 --- a/kubernetes-client/test/Kubernetes/Data/K8sJSONPathSpec.hs +++ b/kubernetes-client/test/Kubernetes/Data/K8sJSONPathSpec.hs @@ -2,12 +2,14 @@ module Kubernetes.Data.K8sJSONPathSpec where import Test.Hspec -import Test.Hspec.Attoparsec +import Test.Hspec.Megaparsec +import qualified Text.Megaparsec as P import Kubernetes.Data.K8sJSONPath import Data.Text import Data.JSONPath import Data.Aeson +import Data.Void spec :: Spec spec = do @@ -31,3 +33,5 @@ spec = do val = (object ["kind" .= ("Pod" :: Text)]) runJSONPath path val `shouldBe` Right "kind is Pod" +(~>) :: Text -> Parser [K8sPathElement] -> Either (P.ParseErrorBundle Text Void) [K8sPathElement] +s ~> p = P.parse p "" s diff --git a/kubernetes/kubernetes-client-core.cabal b/kubernetes/kubernetes-client-core.cabal index 40d395fd..bc797068 100644 --- a/kubernetes/kubernetes-client-core.cabal +++ b/kubernetes/kubernetes-client-core.cabal @@ -1,5 +1,5 @@ name: kubernetes-client-core -version: 0.4.3.0 +version: 0.5.0.0 synopsis: Auto-generated kubernetes-client-core API Client description: . Client library for calling the Kubernetes API based on http-client. @@ -37,7 +37,7 @@ library lib ghc-options: -Wall -funbox-strict-fields build-depends: - aeson >=1.0 && <3.0 + aeson >=2.0 && <3.0 , base >=4.7 && <5.0 , base64-bytestring >1.0 && <2.0 , bytestring >=0.10.0 @@ -56,7 +56,7 @@ library , network >=2.6.2 && <3.9 , random >=1.1 , safe-exceptions <0.2 - , text >=0.11 && <1.3 + , text >=2.0 && <2.1 , time >=1.5 , transformers >=0.4.0.0 , unordered-containers diff --git a/kubernetes/stack.yaml.lock b/kubernetes/stack.yaml.lock index e24dcac6..603b8e2f 100644 --- a/kubernetes/stack.yaml.lock +++ b/kubernetes/stack.yaml.lock @@ -6,7 +6,7 @@ packages: [] snapshots: - completed: - size: 524996 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/14/27.yaml - sha256: 7ea31a280c56bf36ff591a7397cc384d0dff622e7f9e4225b47d8980f019a0f0 - original: lts-14.27 + sha256: fb634b19f31da06684bb07ce02a20c75a3162138f279b388905b03ebd57bb50f + size: 618876 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/19/6.yaml + original: lts-19.6