diff --git a/go.mod b/go.mod index d6dedf50e1..6ab9a23fb5 100644 --- a/go.mod +++ b/go.mod @@ -15,9 +15,9 @@ require ( github.com/hashicorp/terraform-json v0.25.0 github.com/hashicorp/terraform-plugin-docs v0.16.0 github.com/hashicorp/terraform-plugin-framework v1.15.0 - github.com/hashicorp/terraform-plugin-go v0.27.0 + github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1 github.com/hashicorp/terraform-plugin-log v0.9.0 - github.com/hashicorp/terraform-plugin-mux v0.19.0 + github.com/hashicorp/terraform-plugin-mux v0.21.0-alpha.1 github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0 github.com/hashicorp/terraform-plugin-testing v1.13.0 github.com/jinzhu/copier v0.3.5 @@ -25,7 +25,7 @@ require ( github.com/mitchellh/hashstructure v1.1.0 github.com/robfig/cron v1.2.0 github.com/stretchr/testify v1.8.3 - golang.org/x/mod v0.24.0 + golang.org/x/mod v0.25.0 k8s.io/api v0.28.6 k8s.io/apiextensions-apiserver v0.28.6 k8s.io/apimachinery v0.28.6 @@ -60,9 +60,9 @@ require ( github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819 // indirect - golang.org/x/sync v0.14.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/tools v0.33.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect ) require ( @@ -76,7 +76,7 @@ require ( github.com/fatih/camelcase v1.0.0 // indirect github.com/fatih/color v1.16.0 // indirect github.com/go-errors/errors v1.4.2 // indirect - github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.22.3 // indirect @@ -94,7 +94,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/logutils v1.0.0 // indirect - github.com/hashicorp/terraform-registry-address v0.2.5 // indirect + github.com/hashicorp/terraform-registry-address v0.3.0 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/imdario/mergo v0.3.15 // indirect @@ -126,15 +126,15 @@ require ( github.com/xlab/treeprint v1.2.0 // indirect github.com/zclconf/go-cty v1.16.2 go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/net v0.39.0 // indirect - golang.org/x/oauth2 v0.26.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.25.0 // indirect + golang.org/x/text v0.26.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/grpc v1.72.1 + google.golang.org/grpc v1.74.2 google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index c084860636..10a45a1e20 100644 --- a/go.sum +++ b/go.sum @@ -83,6 +83,8 @@ github.com/go-git/go-git/v5 v5.14.0/go.mod h1:Z5Xhoia5PcWA3NF8vRLURn9E5FRhSl7dGj github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -185,16 +187,22 @@ github.com/hashicorp/terraform-plugin-framework v1.15.0 h1:LQ2rsOfmDLxcn5EeIwdXF github.com/hashicorp/terraform-plugin-framework v1.15.0/go.mod h1:hxrNI/GY32KPISpWqlCoTLM9JZsGH3CyYlir09bD/fI= github.com/hashicorp/terraform-plugin-go v0.27.0 h1:ujykws/fWIdsi6oTUT5Or4ukvEan4aN9lY+LOxVP8EE= github.com/hashicorp/terraform-plugin-go v0.27.0/go.mod h1:FDa2Bb3uumkTGSkTFpWSOwWJDwA7bf3vdP3ltLDTH6o= +github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1 h1:xeHlRQYev3iMXwX2W7+D1bSfLRBs9jojZXqE6hmNxMI= +github.com/hashicorp/terraform-plugin-go v0.29.0-beta.1/go.mod h1:5pww/UULn9C2tItq6o5sbScEkJxBUt9X9kI4DkeRsIw= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= github.com/hashicorp/terraform-plugin-mux v0.19.0 h1:F2QxnHfsvdoWbF7EWeEHA+sfmBetlW5pipq+zWnVdIc= github.com/hashicorp/terraform-plugin-mux v0.19.0/go.mod h1:MO+7zYzrMz2Ohc5r8m7sM6YT+F8ET4lgYKe2GhiYW0g= +github.com/hashicorp/terraform-plugin-mux v0.21.0-alpha.1 h1:2v959uebw7YnCsJ8eAgGkmDuwaotbwKw9mTg7ddzM0I= +github.com/hashicorp/terraform-plugin-mux v0.21.0-alpha.1/go.mod h1:ZGuUsqp+MPihZ7ZpUbsUQ5+oPBWt0dd7ET/cPcxZyxQ= github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0 h1:NFPMacTrY/IdcIcnUB+7hsore1ZaRWU9cnB6jFoBnIM= github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0/go.mod h1:QYmYnLfsosrxjCnGY1p9c7Zj6n9thnEE+7RObeYs3fA= github.com/hashicorp/terraform-plugin-testing v1.13.0 h1:vTELm6x3Z4H9VO3fbz71wbJhbs/5dr5DXfIwi3GMmPY= github.com/hashicorp/terraform-plugin-testing v1.13.0/go.mod h1:b/hl6YZLm9fjeud/3goqh/gdqhZXbRfbHMkEiY9dZwc= github.com/hashicorp/terraform-registry-address v0.2.5 h1:2GTftHqmUhVOeuu9CW3kwDkRe4pcBDq0uuK5VJngU1M= github.com/hashicorp/terraform-registry-address v0.2.5/go.mod h1:PpzXWINwB5kuVS5CA7m1+eO2f1jKb5ZDIxrOPfpnGkg= +github.com/hashicorp/terraform-registry-address v0.3.0 h1:HMpK3nqaGFPS9VmgRXrJL/dzHNdheGVKk5k7VlFxzCo= +github.com/hashicorp/terraform-registry-address v0.3.0/go.mod h1:jRGCMiLaY9zii3GLC7hqpSnwhfnCN5yzvY0hh4iCGbM= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= @@ -380,6 +388,7 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819 h1:EDuYyU/MkFXllv9QF9819VlI9a4tzGuCbhG0ExK9o1U= golang.org/x/exp v0.0.0-20230809150735-7b3493d9a819/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -391,6 +400,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -404,9 +415,13 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE= golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -415,6 +430,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -448,6 +465,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -461,6 +480,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -474,11 +495,15 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4= google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= +google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/manifest/provider/datasource.go b/manifest/provider/datasource.go index a4331018da..3ee0712ab2 100644 --- a/manifest/provider/datasource.go +++ b/manifest/provider/datasource.go @@ -37,7 +37,6 @@ func (s *RawProviderServer) ReadDataSource(ctx context.Context, req *tfprotov5.R } func (s *RawProviderServer) ReadPluralDataSource(ctx context.Context, req *tfprotov5.ReadDataSourceRequest) (*tfprotov5.ReadDataSourceResponse, error) { - s.logger.Trace("[ReadDataSource][Request]\n%s\n", dump(*req)) resp := &tfprotov5.ReadDataSourceResponse{} @@ -49,7 +48,6 @@ func (s *RawProviderServer) ReadPluralDataSource(ctx context.Context, req *tfpro } rt, err := GetDataSourceType(req.TypeName) - if err != nil { resp.Diagnostics = append(resp.Diagnostics, &tfprotov5.Diagnostic{ Severity: tfprotov5.DiagnosticSeverityError, @@ -244,7 +242,6 @@ func (s *RawProviderServer) ReadSingularDataSource(ctx context.Context, req *tfp } rt, err := GetDataSourceType(req.TypeName) - if err != nil { resp.Diagnostics = append(resp.Diagnostics, &tfprotov5.Diagnostic{ Severity: tfprotov5.DiagnosticSeverityError, diff --git a/manifest/provider/getproviderschema.go b/manifest/provider/getproviderschema.go index a0445aa4f8..5dba854d57 100644 --- a/manifest/provider/getproviderschema.go +++ b/manifest/provider/getproviderschema.go @@ -14,10 +14,12 @@ func (s *RawProviderServer) GetProviderSchema(ctx context.Context, req *tfprotov cfgSchema := GetProviderConfigSchema() resSchema := GetProviderResourceSchema() dsSchema := GetProviderDataSourceSchema() + listSchema := GetProviderListSchema() return &tfprotov5.GetProviderSchemaResponse{ - Provider: cfgSchema, - ResourceSchemas: resSchema, - DataSourceSchemas: dsSchema, + Provider: cfgSchema, + ResourceSchemas: resSchema, + DataSourceSchemas: dsSchema, + ListResourceSchemas: listSchema, }, nil } diff --git a/manifest/provider/list.go b/manifest/provider/list.go new file mode 100644 index 0000000000..546fe83da8 --- /dev/null +++ b/manifest/provider/list.go @@ -0,0 +1,201 @@ +// Copyright (c) HashiCorp, Inc. +// SPDX-License-Identifier: MPL-2.0 + +package provider + +import ( + "context" + "math/big" + + "github.com/hashicorp/terraform-plugin-go/tfprotov5" + "github.com/hashicorp/terraform-plugin-go/tftypes" + "github.com/hashicorp/terraform-provider-kubernetes/manifest/payload" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" +) + +func (s *RawProviderServer) ValidateListResourceConfig(ctx context.Context, req *tfprotov5.ValidateListResourceConfigRequest) (*tfprotov5.ValidateListResourceConfigResponse, error) { + return &tfprotov5.ValidateListResourceConfigResponse{}, nil +} + +func (s *RawProviderServer) ListResource(ctx context.Context, req *tfprotov5.ListResourceRequest) (*tfprotov5.ListResourceServerStream, error) { + rt, err := GetListResourceType(req.TypeName) + if err != nil { + return nil, err + } + + config, err := req.Config.Unmarshal(rt) + if err != nil { + return nil, err + } + + var listConfig map[string]tftypes.Value + err = config.As(&listConfig) + if err != nil { + return nil, err + } + + rm, err := s.getRestMapper() + if err != nil { + return nil, err + } + + client, err := s.getDynamicClient() + if err != nil { + return nil, err + } + + var apiVersion, kind string + listConfig["api_version"].As(&apiVersion) + listConfig["kind"].As(&kind) + + gvr, err := getGVR(apiVersion, kind, rm) + if err != nil { + return nil, err + } + + gvk := gvr.GroupVersion().WithKind(kind) + ns, err := IsResourceNamespaced(gvk, rm) + if err != nil { + return nil, err + } + rcl := client.Resource(gvr) + + objectType, th, err := s.TFTypeFromOpenAPI(ctx, gvk, true) + if err != nil { + return nil, err + } + + var labelSelector, fieldSelector string + listConfig["label_selector"].As(&labelSelector) + listConfig["field_selector"].As(&fieldSelector) + var limit big.Float + listConfig["limit"].As(&limit) + lim, _ := limit.Int64() + listOptions := metav1.ListOptions{ + LabelSelector: labelSelector, + FieldSelector: fieldSelector, + Limit: lim, + } + + var res *unstructured.UnstructuredList + + if ns { + var namespace string + listConfig["namespace"].As(&namespace) + if namespace == "" { + namespace = "default" + } + res, err = rcl.Namespace(namespace).List(ctx, listOptions) + } else { + res, err = rcl.List(ctx, listOptions) + } + if err != nil { + if apierrors.IsNotFound(err) { + return nil, nil + } + return nil, err + } + + resourceType, err := GetResourceType(req.TypeName) + if err != nil { + return nil, err + } + + results := func(push func(tfprotov5.ListResourceResult) bool) { + for _, item := range res.Items { + nobj, err := payload.ToTFValue(item.Object, objectType, th, tftypes.NewAttributePath()) + if err != nil { + pushDiagFromError(push, err, "Error converting Kubernetes API resource to Terraform object") + return + } + + dv, err := createListResource(resourceType, nobj) + if err != nil { + pushDiagFromError(push, err, "Error converting Kubernetes API resource to Terraform object") + return + } + + id, err := createIdentityData(&item) + if err != nil { + pushDiagFromError(push, err, "Error creating resource identity for list result") + return + } + + if !push(tfprotov5.ListResourceResult{ + DisplayName: kind, + Identity: &tfprotov5.ResourceIdentityData{IdentityData: &id}, + Resource: &dv, + }) { + return + } + } + } + + return &tfprotov5.ListResourceServerStream{Results: results}, nil +} + +func createListResource(resourceType tftypes.Type, obj tftypes.Value) (tfprotov5.DynamicValue, error) { + result := tftypes.NewValue(resourceType, map[string]tftypes.Value{ + "object": obj, + "manifest": tftypes.NewValue(tftypes.String, ""), + "wait_for": tftypes.NewValue(tftypes.Object{ + AttributeTypes: map[string]tftypes.Type{ + "fields": tftypes.Map{ + ElementType: tftypes.String, + }, + }, + }, nil), + "wait": tftypes.NewValue(tftypes.List{ + ElementType: tftypes.Object{ + AttributeTypes: map[string]tftypes.Type{ + "rollout": tftypes.Bool, + "fields": tftypes.Map{ElementType: tftypes.String}, + "condition": tftypes.List{ + ElementType: tftypes.Object{ + AttributeTypes: map[string]tftypes.Type{ + "status": tftypes.String, + "type": tftypes.String, + }, + }, + }, + }, + }, + }, nil), + "timeouts": tftypes.NewValue(tftypes.List{ + ElementType: tftypes.Object{ + AttributeTypes: map[string]tftypes.Type{ + "create": tftypes.String, + "delete": tftypes.String, + "update": tftypes.String, + }, + }, + }, nil), + "computed_fields": tftypes.NewValue(tftypes.List{ElementType: tftypes.String}, []tftypes.Value{}), + "field_manager": tftypes.NewValue(tftypes.List{ + ElementType: tftypes.Object{ + AttributeTypes: map[string]tftypes.Type{ + "force_conflicts": tftypes.Bool, + "name": tftypes.String, + }, + }, + }, nil), + }) + dv, err := tfprotov5.NewDynamicValue(result.Type(), result) + if err != nil { + return tfprotov5.DynamicValue{}, err + } + return dv, nil +} + +func pushDiagFromError(push func(tfprotov5.ListResourceResult) bool, err error, summary string) { + d := tfprotov5.Diagnostic{ + Detail: err.Error(), + Summary: summary, + Severity: tfprotov5.DiagnosticSeverityError, + } + push(tfprotov5.ListResourceResult{ + Diagnostics: []*tfprotov5.Diagnostic{&d}, + }) +} diff --git a/manifest/provider/provider.go b/manifest/provider/provider.go index 50f0c4224a..26ce85acc6 100644 --- a/manifest/provider/provider.go +++ b/manifest/provider/provider.go @@ -63,6 +63,16 @@ func GetDataSourceType(name string) (tftypes.Type, error) { return GetObjectTypeFromSchema(rsch), nil } +// GetListResourceType returns the tftypes.Type of a datasource of type 'name' +func GetListResourceType(name string) (tftypes.Type, error) { + sch := GetProviderListSchema() + rsch, ok := sch[name] + if !ok { + return tftypes.DynamicPseudoType, fmt.Errorf("unknown list resource %q: cannot find schema", name) + } + return GetObjectTypeFromSchema(rsch), nil +} + // GetProviderResourceSchema contains the definitions of all supported resources func GetProviderResourceSchema() map[string]*tfprotov5.Schema { return map[string]*tfprotov5.Schema{ @@ -322,3 +332,52 @@ func GetProviderDataSourceSchema() map[string]*tfprotov5.Schema { }, } } + +// GetProviderDataSourceSchema contains the definitions of all supported data sources +func GetProviderListSchema() map[string]*tfprotov5.Schema { + return map[string]*tfprotov5.Schema{ + "kubernetes_manifest": { + Version: 1, + Block: &tfprotov5.SchemaBlock{ + Attributes: []*tfprotov5.SchemaAttribute{ + { + Name: "api_version", + Type: tftypes.String, + Required: true, + Description: "The resource apiVersion.", + }, + { + Name: "kind", + Type: tftypes.String, + Required: true, + Description: "The resource kind.", + }, + { + Name: "namespace", + Type: tftypes.String, + Optional: true, + Description: "The resource namespace.", + }, + { + Name: "field_selector", + Type: tftypes.String, + Optional: true, + Description: "A selector to restrict the list of returned objects by their fields.", + }, + { + Name: "label_selector", + Type: tftypes.String, + Optional: true, + Description: "A selector to restrict the list of returned objects by their labels.", + }, + { + Name: "limit", + Type: tftypes.Number, + Optional: true, + Description: "Limit is a maximum number of responses to return for a list call.", + }, + }, + }, + }, + } +} diff --git a/manifest/provider/server.go b/manifest/provider/server.go index 131ace818c..1f66a01a2e 100644 --- a/manifest/provider/server.go +++ b/manifest/provider/server.go @@ -25,9 +25,10 @@ func init() { } var ( - _ tfprotov5.ProviderServer = &RawProviderServer{} - _ tfprotov5.ResourceServer = &RawProviderServer{} - _ tfprotov5.DataSourceServer = &RawProviderServer{} + _ tfprotov5.ProviderServer = &RawProviderServer{} + _ tfprotov5.ResourceServer = &RawProviderServer{} + _ tfprotov5.DataSourceServer = &RawProviderServer{} + _ tfprotov5.ListResourceServer = &RawProviderServer{} ) // RawProviderServer implements the ProviderServer interface as exported from ProtoBuf. @@ -76,9 +77,16 @@ func (s *RawProviderServer) GetMetadata(ctx context.Context, req *tfprotov5.GetM ds = append(ds, tfprotov5.DataSourceMetadata{TypeName: k}) } + sch = GetProviderListSchema() + lss := make([]tfprotov5.ListResourceMetadata, 0, len(sch)) + for k := range sch { + lss = append(lss, tfprotov5.ListResourceMetadata{TypeName: k}) + } + resp := &tfprotov5.GetMetadataResponse{ - Resources: rs, - DataSources: ds, + Resources: rs, + DataSources: ds, + ListResources: lss, } return resp, nil }