mirror of https://github.com/databricks/cli.git
Generate JSON schema and Go code from Terraform provider schema
This commit is contained in:
parent
a7701cc8f3
commit
10f4249ed4
|
@ -0,0 +1 @@
|
||||||
|
/tmp
|
|
@ -0,0 +1,52 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/databricks/bricks/experimental/tfprovider"
|
||||||
|
"github.com/databricks/bricks/experimental/tfprovider/golang"
|
||||||
|
"github.com/databricks/bricks/experimental/tfprovider/jsonschema"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
var command = &cobra.Command{
|
||||||
|
Use: "tfprovider",
|
||||||
|
PreRun: func(cmd *cobra.Command, args []string) {
|
||||||
|
log.SetOutput(os.Stderr)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var genCommand = &cobra.Command{
|
||||||
|
Use: "gen",
|
||||||
|
}
|
||||||
|
|
||||||
|
var jsonschemaCommand = &cobra.Command{
|
||||||
|
Use: "jsonschema",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
schema, err := tfprovider.ProduceProviderSchema()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonschema.Generate(schema)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var gostructCommand = &cobra.Command{
|
||||||
|
Use: "golang",
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
schema, err := tfprovider.ProduceProviderSchema()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return golang.Generate(schema)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
genCommand.AddCommand(jsonschemaCommand)
|
||||||
|
genCommand.AddCommand(gostructCommand)
|
||||||
|
command.AddCommand(genCommand)
|
||||||
|
command.Execute()
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module github.com/databricks/bricks/experimental/tfprovider
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/hashicorp/terraform-exec v0.17.3
|
||||||
|
github.com/hashicorp/terraform-json v0.14.0
|
||||||
|
github.com/iancoleman/strcase v0.2.0
|
||||||
|
github.com/spf13/cobra v1.5.0
|
||||||
|
github.com/zclconf/go-cty v1.11.0
|
||||||
|
golang.org/x/exp v0.0.0-20220915210609-840b3808d824
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/hashicorp/go-version v1.6.0 // indirect
|
||||||
|
github.com/hashicorp/hc-install v0.4.0
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
)
|
|
@ -0,0 +1,151 @@
|
||||||
|
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk=
|
||||||
|
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
|
||||||
|
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ=
|
||||||
|
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo=
|
||||||
|
github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
|
||||||
|
github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
|
||||||
|
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
|
||||||
|
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
|
||||||
|
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
|
||||||
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg=
|
||||||
|
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
|
||||||
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
|
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
|
||||||
|
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
|
||||||
|
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
|
||||||
|
github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34=
|
||||||
|
github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||||
|
github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0=
|
||||||
|
github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4=
|
||||||
|
github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc=
|
||||||
|
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
|
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
||||||
|
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
|
github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
|
||||||
|
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||||
|
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
|
||||||
|
github.com/hashicorp/go-version v1.5.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
|
github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek=
|
||||||
|
github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
|
||||||
|
github.com/hashicorp/hc-install v0.4.0 h1:cZkRFr1WVa0Ty6x5fTvL1TuO1flul231rWkGH92oYYk=
|
||||||
|
github.com/hashicorp/hc-install v0.4.0/go.mod h1:5d155H8EC5ewegao9A4PUTMNPZaq+TbOzkJJZ4vrXeI=
|
||||||
|
github.com/hashicorp/terraform-exec v0.17.3 h1:MX14Kvnka/oWGmIkyuyvL6POx25ZmKrjlaclkx3eErU=
|
||||||
|
github.com/hashicorp/terraform-exec v0.17.3/go.mod h1:+NELG0EqQekJzhvikkeQsOAZpsw0cv/03rbeQJqscAI=
|
||||||
|
github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e17dKDpqV7s=
|
||||||
|
github.com/hashicorp/terraform-json v0.14.0/go.mod h1:5A9HIWPkk4e5aeeXIBbkcOvaZbIYnAIkEyqP2pNSckM=
|
||||||
|
github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0=
|
||||||
|
github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
|
||||||
|
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
|
||||||
|
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
|
||||||
|
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||||
|
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck=
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
|
||||||
|
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||||
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
|
||||||
|
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
|
||||||
|
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||||
|
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
|
||||||
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
|
github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4=
|
||||||
|
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
||||||
|
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
||||||
|
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||||
|
github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU=
|
||||||
|
github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM=
|
||||||
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
|
||||||
|
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
|
||||||
|
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI=
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
|
||||||
|
github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8=
|
||||||
|
github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk=
|
||||||
|
github.com/zclconf/go-cty v1.11.0 h1:726SxLdi2SDnjY+BStqB9J1hNp4+2WlzyXLuimibIe0=
|
||||||
|
github.com/zclconf/go-cty v1.11.0/go.mod h1:s9IfD1LK5ccNMSWCVFCE2rJfHiZgi7JijgeWIMfhLvA=
|
||||||
|
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
|
||||||
|
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI=
|
||||||
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
|
golang.org/x/exp v0.0.0-20220915210609-840b3808d824 h1:iRn89vW39OtFmjlBnUXpaiKIPyYGeq2SwquynSjoB/k=
|
||||||
|
golang.org/x/exp v0.0.0-20220915210609-840b3808d824/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
|
||||||
|
golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210326060303-6b1517762897 h1:KrsHThm5nFk34YtATK1LsThyGhGbGe1olrte/HInHvs=
|
||||||
|
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
|
||||||
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
|
||||||
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
|
||||||
|
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
@ -0,0 +1,155 @@
|
||||||
|
package golang
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
tfjson "github.com/hashicorp/terraform-json"
|
||||||
|
"github.com/iancoleman/strcase"
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
"golang.org/x/exp/maps"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
)
|
||||||
|
|
||||||
|
func processAttributeType(typ cty.Type) string {
|
||||||
|
var out string
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case typ.IsPrimitiveType():
|
||||||
|
switch {
|
||||||
|
case typ.Equals(cty.Bool):
|
||||||
|
out = "bool"
|
||||||
|
case typ.Equals(cty.Number):
|
||||||
|
out = "int"
|
||||||
|
case typ.Equals(cty.String):
|
||||||
|
out = "string"
|
||||||
|
default:
|
||||||
|
panic("No idea what to do for: " + typ.FriendlyName())
|
||||||
|
}
|
||||||
|
case typ.IsMapType():
|
||||||
|
out = "map[string]" + processAttributeType(*typ.MapElementType())
|
||||||
|
case typ.IsSetType():
|
||||||
|
out = "[]" + processAttributeType(*typ.SetElementType())
|
||||||
|
case typ.IsListType():
|
||||||
|
out = "[]" + processAttributeType(*typ.ListElementType())
|
||||||
|
default:
|
||||||
|
panic("No idea what to do for: " + typ.FriendlyName())
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func SortedKeys[M ~map[K]V, K string, V any](m M) []K {
|
||||||
|
keys := maps.Keys(m)
|
||||||
|
slices.Sort(keys)
|
||||||
|
return keys
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlock(in *tfjson.SchemaBlock) {
|
||||||
|
fmt.Println("struct {")
|
||||||
|
|
||||||
|
for _, k := range SortedKeys(in.Attributes) {
|
||||||
|
v := in.Attributes[k]
|
||||||
|
if v.Deprecated {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if v.Required {
|
||||||
|
// out.Required = append(out.Required, k)
|
||||||
|
// }
|
||||||
|
|
||||||
|
annotations := []string{k}
|
||||||
|
if !v.Required {
|
||||||
|
annotations = append(annotations, "omitempty")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print(strcase.ToCamel(k))
|
||||||
|
fmt.Print(" ")
|
||||||
|
fmt.Print(processAttributeType(v.AttributeType))
|
||||||
|
fmt.Print(" ")
|
||||||
|
fmt.Print("`")
|
||||||
|
fmt.Print("json:\"")
|
||||||
|
fmt.Print(strings.Join(annotations, ","))
|
||||||
|
fmt.Print("\"`\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print("\n")
|
||||||
|
|
||||||
|
for _, k := range SortedKeys(in.NestedBlocks) {
|
||||||
|
v := in.NestedBlocks[k]
|
||||||
|
annotations := []string{k, "omitempty"}
|
||||||
|
// if v.MinItems == 0 {
|
||||||
|
// annotations = append(annotations, "omitempty")
|
||||||
|
// }
|
||||||
|
|
||||||
|
fmt.Print(strcase.ToCamel(k))
|
||||||
|
fmt.Print(" ")
|
||||||
|
|
||||||
|
switch v.NestingMode {
|
||||||
|
case tfjson.SchemaNestingModeSingle:
|
||||||
|
fmt.Print("*")
|
||||||
|
case tfjson.SchemaNestingModeGroup:
|
||||||
|
fmt.Print("*")
|
||||||
|
case tfjson.SchemaNestingModeList:
|
||||||
|
if v.MaxItems == 1 {
|
||||||
|
fmt.Print("*")
|
||||||
|
} else {
|
||||||
|
fmt.Print("[]")
|
||||||
|
}
|
||||||
|
case tfjson.SchemaNestingModeSet:
|
||||||
|
fmt.Print("[]")
|
||||||
|
case tfjson.SchemaNestingModeMap:
|
||||||
|
panic("map")
|
||||||
|
}
|
||||||
|
|
||||||
|
processBlock(v.Block)
|
||||||
|
|
||||||
|
fmt.Print(" ")
|
||||||
|
fmt.Print("`")
|
||||||
|
fmt.Print("json:\"")
|
||||||
|
fmt.Print(strings.Join(annotations, ","))
|
||||||
|
fmt.Print("\"`\n")
|
||||||
|
fmt.Print("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// out.Description = in.Description
|
||||||
|
// return &out
|
||||||
|
|
||||||
|
fmt.Print("}")
|
||||||
|
// fmt.Println("")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Generate(schema *tfjson.ProviderSchema) error {
|
||||||
|
fmt.Println("package tf")
|
||||||
|
|
||||||
|
for _, k := range SortedKeys(schema.ResourceSchemas) {
|
||||||
|
v := schema.ResourceSchemas[k]
|
||||||
|
k = strcase.ToCamel(strings.TrimPrefix(k, "databricks_"))
|
||||||
|
fmt.Printf("type %s ", k)
|
||||||
|
processBlock(v.Block)
|
||||||
|
fmt.Print("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Union of all of them
|
||||||
|
|
||||||
|
fmt.Println("type Resources struct {")
|
||||||
|
|
||||||
|
for _, k := range SortedKeys(schema.ResourceSchemas) {
|
||||||
|
resource_name := k
|
||||||
|
k = strcase.ToCamel(strings.TrimPrefix(k, "databricks_"))
|
||||||
|
|
||||||
|
fmt.Print(k)
|
||||||
|
fmt.Print(" ")
|
||||||
|
fmt.Print("map[string]" + k)
|
||||||
|
fmt.Print(" ")
|
||||||
|
fmt.Print("`")
|
||||||
|
fmt.Print("json:\"")
|
||||||
|
fmt.Printf("%s,omitempty", resource_name)
|
||||||
|
fmt.Print("\"`\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print("}")
|
||||||
|
fmt.Print("\n")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
package jsonschema
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
tfjson "github.com/hashicorp/terraform-json"
|
||||||
|
"github.com/zclconf/go-cty/cty"
|
||||||
|
)
|
||||||
|
|
||||||
|
func processAttributeType(typ cty.Type) *Schema {
|
||||||
|
var out Schema
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case typ.IsPrimitiveType():
|
||||||
|
switch {
|
||||||
|
case typ.Equals(cty.Bool):
|
||||||
|
out.Type = "boolean"
|
||||||
|
case typ.Equals(cty.Number):
|
||||||
|
out.Type = "integer"
|
||||||
|
case typ.Equals(cty.String):
|
||||||
|
out.Type = "string"
|
||||||
|
default:
|
||||||
|
panic("No idea what to do for: " + typ.FriendlyName())
|
||||||
|
}
|
||||||
|
case typ.IsMapType():
|
||||||
|
out.Type = "object"
|
||||||
|
case typ.IsSetType():
|
||||||
|
out.Type = "array"
|
||||||
|
out.Items = processAttributeType(*typ.SetElementType())
|
||||||
|
case typ.IsListType():
|
||||||
|
out.Type = "array"
|
||||||
|
out.Items = processAttributeType(*typ.ListElementType())
|
||||||
|
default:
|
||||||
|
panic("No idea what to do for: " + typ.FriendlyName())
|
||||||
|
}
|
||||||
|
|
||||||
|
return &out
|
||||||
|
}
|
||||||
|
|
||||||
|
func processSchemaAttribute(in *tfjson.SchemaAttribute) *Schema {
|
||||||
|
out := processAttributeType(in.AttributeType)
|
||||||
|
out.Description = in.Description
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func processBlock(in *tfjson.SchemaBlock) *Schema {
|
||||||
|
var out = Schema{
|
||||||
|
Type: "object",
|
||||||
|
Properties: make(map[string]*Schema),
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range in.Attributes {
|
||||||
|
if v.Deprecated {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if v.Required {
|
||||||
|
out.Required = append(out.Required, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
out.Properties[k] = processSchemaAttribute(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range in.NestedBlocks {
|
||||||
|
out.Properties[k] = processBlock(v.Block)
|
||||||
|
}
|
||||||
|
|
||||||
|
out.Description = in.Description
|
||||||
|
return &out
|
||||||
|
}
|
||||||
|
|
||||||
|
func toObject(in *tfjson.Schema) *Schema {
|
||||||
|
return processBlock(in.Block)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Generate(schema *tfjson.ProviderSchema) error {
|
||||||
|
var resources = Schema{
|
||||||
|
Type: "object",
|
||||||
|
Title: "resources",
|
||||||
|
Properties: make(map[string]*Schema),
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range schema.ResourceSchemas {
|
||||||
|
k = strings.TrimPrefix(k, "databricks_")
|
||||||
|
resources.Properties[k] = &Schema{
|
||||||
|
Type: "object",
|
||||||
|
AdditionalProperties: toObject(v),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var out = Schema{
|
||||||
|
Type: "object",
|
||||||
|
Title: "resource file",
|
||||||
|
|
||||||
|
Properties: map[string]*Schema{
|
||||||
|
"environments": {
|
||||||
|
Type: "object",
|
||||||
|
AdditionalProperties: &Schema{
|
||||||
|
Type: "object",
|
||||||
|
Properties: map[string]*Schema{
|
||||||
|
"resources": &resources,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"resources": &resources,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
raw, err := json.MarshalIndent(out, "", " ")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(string(raw))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package jsonschema
|
||||||
|
|
||||||
|
// Schema represents a JSON Schema object type.
|
||||||
|
type Schema struct {
|
||||||
|
// RFC draft-bhutton-json-schema-00
|
||||||
|
Version string `json:"$schema,omitempty"` // section 8.1.1
|
||||||
|
// ID ID `json:"$id,omitempty"` // section 8.2.1
|
||||||
|
Anchor string `json:"$anchor,omitempty"` // section 8.2.2
|
||||||
|
Ref string `json:"$ref,omitempty"` // section 8.2.3.1
|
||||||
|
DynamicRef string `json:"$dynamicRef,omitempty"` // section 8.2.3.2
|
||||||
|
// Definitions Definitions `json:"$defs,omitempty"` // section 8.2.4
|
||||||
|
Comments string `json:"$comment,omitempty"` // section 8.3
|
||||||
|
// RFC draft-bhutton-json-schema-00 section 10.2.1 (Sub-schemas with logic)
|
||||||
|
AllOf []*Schema `json:"allOf,omitempty"` // section 10.2.1.1
|
||||||
|
AnyOf []*Schema `json:"anyOf,omitempty"` // section 10.2.1.2
|
||||||
|
OneOf []*Schema `json:"oneOf,omitempty"` // section 10.2.1.3
|
||||||
|
Not *Schema `json:"not,omitempty"` // section 10.2.1.4
|
||||||
|
// RFC draft-bhutton-json-schema-00 section 10.2.2 (Apply sub-schemas conditionally)
|
||||||
|
If *Schema `json:"if,omitempty"` // section 10.2.2.1
|
||||||
|
Then *Schema `json:"then,omitempty"` // section 10.2.2.2
|
||||||
|
Else *Schema `json:"else,omitempty"` // section 10.2.2.3
|
||||||
|
DependentSchemas map[string]*Schema `json:"dependentSchemas,omitempty"` // section 10.2.2.4
|
||||||
|
// RFC draft-bhutton-json-schema-00 section 10.3.1 (arrays)
|
||||||
|
PrefixItems []*Schema `json:"prefixItems,omitempty"` // section 10.3.1.1
|
||||||
|
Items *Schema `json:"items,omitempty"` // section 10.3.1.2 (replaces additionalItems)
|
||||||
|
Contains *Schema `json:"contains,omitempty"` // section 10.3.1.3
|
||||||
|
// RFC draft-bhutton-json-schema-00 section 10.3.2 (sub-schemas)
|
||||||
|
Properties map[string]*Schema `json:"properties,omitempty"` // section 10.3.2.1
|
||||||
|
PatternProperties map[string]*Schema `json:"patternProperties,omitempty"` // section 10.3.2.2
|
||||||
|
AdditionalProperties *Schema `json:"additionalProperties,omitempty"` // section 10.3.2.3
|
||||||
|
PropertyNames *Schema `json:"propertyNames,omitempty"` // section 10.3.2.4
|
||||||
|
// RFC draft-bhutton-json-schema-validation-00, section 6
|
||||||
|
Type string `json:"type,omitempty"` // section 6.1.1
|
||||||
|
Enum []interface{} `json:"enum,omitempty"` // section 6.1.2
|
||||||
|
Const interface{} `json:"const,omitempty"` // section 6.1.3
|
||||||
|
MultipleOf int `json:"multipleOf,omitempty"` // section 6.2.1
|
||||||
|
Maximum int `json:"maximum,omitempty"` // section 6.2.2
|
||||||
|
ExclusiveMaximum bool `json:"exclusiveMaximum,omitempty"` // section 6.2.3
|
||||||
|
Minimum int `json:"minimum,omitempty"` // section 6.2.4
|
||||||
|
ExclusiveMinimum bool `json:"exclusiveMinimum,omitempty"` // section 6.2.5
|
||||||
|
MaxLength int `json:"maxLength,omitempty"` // section 6.3.1
|
||||||
|
MinLength int `json:"minLength,omitempty"` // section 6.3.2
|
||||||
|
Pattern string `json:"pattern,omitempty"` // section 6.3.3
|
||||||
|
MaxItems int `json:"maxItems,omitempty"` // section 6.4.1
|
||||||
|
MinItems int `json:"minItems,omitempty"` // section 6.4.2
|
||||||
|
UniqueItems bool `json:"uniqueItems,omitempty"` // section 6.4.3
|
||||||
|
MaxContains uint `json:"maxContains,omitempty"` // section 6.4.4
|
||||||
|
MinContains uint `json:"minContains,omitempty"` // section 6.4.5
|
||||||
|
MaxProperties int `json:"maxProperties,omitempty"` // section 6.5.1
|
||||||
|
MinProperties int `json:"minProperties,omitempty"` // section 6.5.2
|
||||||
|
Required []string `json:"required,omitempty"` // section 6.5.3
|
||||||
|
DependentRequired map[string][]string `json:"dependentRequired,omitempty"` // section 6.5.4
|
||||||
|
// // RFC draft-bhutton-json-schema-validation-00, section 7
|
||||||
|
// Format string `json:"format,omitempty"`
|
||||||
|
// // RFC draft-bhutton-json-schema-validation-00, section 8
|
||||||
|
// ContentEncoding string `json:"contentEncoding,omitempty"` // section 8.3
|
||||||
|
// ContentMediaType string `json:"contentMediaType,omitempty"` // section 8.4
|
||||||
|
// ContentSchema *Schema `json:"contentSchema,omitempty"` // section 8.5
|
||||||
|
// // RFC draft-bhutton-json-schema-validation-00, section 9
|
||||||
|
Title string `json:"title,omitempty"` // section 9.1
|
||||||
|
Description string `json:"description,omitempty"` // section 9.1
|
||||||
|
// Default interface{} `json:"default,omitempty"` // section 9.2
|
||||||
|
// Deprecated bool `json:"deprecated,omitempty"` // section 9.3
|
||||||
|
// ReadOnly bool `json:"readOnly,omitempty"` // section 9.4
|
||||||
|
// WriteOnly bool `json:"writeOnly,omitempty"` // section 9.4
|
||||||
|
// Examples []interface{} `json:"examples,omitempty"` // section 9.5
|
||||||
|
}
|
|
@ -0,0 +1,121 @@
|
||||||
|
package tfprovider
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/hashicorp/hc-install/product"
|
||||||
|
"github.com/hashicorp/hc-install/releases"
|
||||||
|
"github.com/hashicorp/terraform-exec/tfexec"
|
||||||
|
tfjson "github.com/hashicorp/terraform-json"
|
||||||
|
)
|
||||||
|
|
||||||
|
const DatabricksProvider = "registry.terraform.io/databricks/databricks"
|
||||||
|
|
||||||
|
func writeTfJson(path string) error {
|
||||||
|
var body = map[string]interface{}{
|
||||||
|
"terraform": map[string]interface{}{
|
||||||
|
"required_providers": map[string]interface{}{
|
||||||
|
"databricks": map[string]interface{}{
|
||||||
|
"source": "databricks/databricks",
|
||||||
|
"version": ">= 1.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Create(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
enc := json.NewEncoder(f)
|
||||||
|
err = enc.Encode(body)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func ProduceProviderSchema() (*tfjson.ProviderSchema, error) {
|
||||||
|
dir := "./tmp"
|
||||||
|
err := os.Mkdir(dir, 0755)
|
||||||
|
if err != nil && !errors.Is(err, os.ErrExist) {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = writeTfJson(filepath.Join(dir, "main.tf.json"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("writing main.tf.json: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
installer := &releases.LatestVersion{
|
||||||
|
Product: product.Terraform,
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Installing Terraform")
|
||||||
|
execPath, err := installer.Install(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tf, err := tfexec.NewTerraform(dir, execPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Running `terraform init`")
|
||||||
|
err = tf.Init(context.Background(), tfexec.Upgrade(true))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Printf("[INFO] Acquiring provider schema")
|
||||||
|
schemas, err := tf.ProvidersSchema(context.Background())
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the databricks provider definition.
|
||||||
|
schema, ok := schemas.Schemas[DatabricksProvider]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("schema file doesn't include schema for %s", DatabricksProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
return schema, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadSchema(path string) (*tfjson.ProviderSchema, error) {
|
||||||
|
f, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var document tfjson.ProviderSchemas
|
||||||
|
dec := json.NewDecoder(f)
|
||||||
|
err = dec.Decode(&document)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = document.Validate()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("invalid schema: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the databricks provider definition.
|
||||||
|
schema, ok := document.Schemas[DatabricksProvider]
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("schema file doesn't include schema for %s", DatabricksProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
return schema, nil
|
||||||
|
}
|
Loading…
Reference in New Issue