From 64d8b912583fa7a399f7e1e0fa2969bc3eb06923 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Tue, 19 Sep 2023 15:58:16 +0800 Subject: [PATCH] feat/waf --- .changelog/2111.txt | 8 + go.mod | 4 +- go.sum | 460 +++++++++++++++ tencentcloud/extension_waf.go | 217 +++++++ tencentcloud/provider.go | 4 + tencentcloud/resource_tc_waf_clb_instance.go | 490 ++++++++++++++++ .../resource_tc_waf_clb_instance_test.go | 65 +++ tencentcloud/resource_tc_waf_saas_instance.go | 540 ++++++++++++++++++ .../resource_tc_waf_saas_instance_test.go | 67 +++ tencentcloud/service_tencentcloud_waf.go | 38 ++ .../tencentcloud/common/http/request.go | 2 +- .../tencentcloud/waf/v20180125/client.go | 388 ++++++++++++- .../tencentcloud/waf/v20180125/models.go | 488 +++++++++++++++- vendor/modules.txt | 4 +- website/docs/r/waf_clb_instance.html.markdown | 67 +++ .../docs/r/waf_saas_instance.html.markdown | 86 +++ website/tencentcloud.erb | 6 + 17 files changed, 2920 insertions(+), 14 deletions(-) create mode 100644 tencentcloud/resource_tc_waf_clb_instance.go create mode 100644 tencentcloud/resource_tc_waf_clb_instance_test.go create mode 100644 tencentcloud/resource_tc_waf_saas_instance.go create mode 100644 tencentcloud/resource_tc_waf_saas_instance_test.go create mode 100644 website/docs/r/waf_clb_instance.html.markdown create mode 100644 website/docs/r/waf_saas_instance.html.markdown diff --git a/.changelog/2111.txt b/.changelog/2111.txt index 70a92cc646..83e3d9b525 100644 --- a/.changelog/2111.txt +++ b/.changelog/2111.txt @@ -14,6 +14,14 @@ tencentcloud_waf_clb_domain tencentcloud_waf_saas_domain ``` +```release-note:new-resource +tencentcloud_waf_clb_instance +``` + +```release-note:new-resource +tencentcloud_waf_saas_instance +``` + ```release-note:new-data-source tencentcloud_waf_ciphers ``` diff --git a/go.mod b/go.mod index 5e59ff55f0..4c8a1e80a6 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.693 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.711 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.748 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.751 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692 @@ -100,7 +100,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) -require github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.748 +require github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.751 require ( 4d63.com/gocheckcompilerdirectives v1.2.1 // indirect diff --git a/go.sum b/go.sum index d61ffdef56..33a26d5864 100644 --- a/go.sum +++ b/go.sum @@ -860,8 +860,16 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.734/go.mod github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.736/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.737/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.743/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.745/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.746/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.748 h1:QKUyqL7RO9fy20Bk/D0jzbcLboyweT6HGVmWlK6Cgqg= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.748/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.749 h1:zqRnwIFnylN9TF+Rsds8JCLZr/ZugEEJcr7mpClbVS4= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.749/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.750 h1:zATJQLrw+i0NRosWvoAZ4FM+GbloqovVJGxLCdcjr/w= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.750/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.751 h1:sHCCpDtSIT2DlFNm0PHmoWuUL9np0u6XReVkyoXWfc8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.751/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624/go.mod h1:+TXSVyeKwt1IhZRqKPbTREteBcP+K07Q846/ilNzLWA= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589 h1:LZihgirMH0vsaGScYexxwY0fTss9vHaSZs/YOQUVESg= @@ -964,12 +972,20 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.706 h1:qJUOUJ0 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.706/go.mod h1:VWt0lgvRxyTJKjzadc8T+PM+/M7kfQZdNtYHQ7wQsBU= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.748 h1:XkMZ0Z6iQe/AK0jJbL/HD85SW5I2TIv3U6BB/s1+5Eo= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.748/go.mod h1:ZOf17o9XN7dCROXgHNObJGrjDvxtjndzPb1wAJb0kHQ= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.749 h1:xtPn32Ad/giVpTuaSLBdNZFMdfFro3W8X0WSktK/N1w= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.749/go.mod h1:CIyaeX+NrzbNWgSKgtZUIhUd/L4HSQCxWDOrx8ZiSO4= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.750 h1:p3Rrycl0OaYQxifHFx5zv7v5VKUhdQ+yHhnxZsVAriE= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.750/go.mod h1:VwB38MvuzsmurshHy5BYeczoAe/5RV68ZvLiVxpMOe0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.751 h1:lxYqzImVt/gThinz6IkMIGjUSgtU2Y+i5a/ABA008F8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.751/go.mod h1:2lmdLWNsbvkFWF29yfhN7urdm1Zc6CvhiktoVTLrE/A= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.725 h1:ETqP+erlPnDK1zafCmyDYNkZLcY+dAG3143Ihk5vFHk= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.725/go.mod h1:YPB08jHrJ3GJJ09ZTEBLnMvI+lqQEtu17jJjyfq8+sU= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199 h1:hMBLtiJPnZ9GvA677cTB6ELBR6B68wCR2QY1sNoGQc4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199/go.mod h1:nnY91/H3j/Gu7V/oCA6Zeg8T5D3q36EUdBh4EjmHwqY= github.com/tencentyun/cos-go-sdk-v5 v0.7.42-0.20230629101357-7edd77448a0f h1:yTMDoBvFuXjZat10d98DIKbPnN9FQG+drt1SbNfMW5U= github.com/tencentyun/cos-go-sdk-v5 v0.7.42-0.20230629101357-7edd77448a0f/go.mod h1:LUFnaqRmGk6pEHOaRmdn2dCZR2j0cSsM5xowWFPTPao= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/timakin/bodyclose v0.0.0-20221125081123-e39cf3fc478e h1:MV6KaVu/hzByHP0UvJ4HcMGE/8a6A4Rggc/0wx2AvJo= @@ -980,6 +996,7 @@ github.com/tomarrell/wrapcheck/v2 v2.8.1 h1:HxSqDSN0sAt0yJYsrcYVoEeyM4aI9yAm3KQp github.com/tomarrell/wrapcheck/v2 v2.8.1/go.mod h1:/n2Q3NZ4XFT50ho6Hbxg+RV1uyo2Uow/Vdm9NQcl5SE= github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok= github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= @@ -988,26 +1005,48 @@ github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqz github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= +github.com/vmihailenco/msgpack v4.0.1+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1 h1:q6c//IMJug6THoqsseZ+Z/zq53HQvADPh5a66E9hb+I= github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1/go.mod h1:Rl8MvKI/yVRGN91gMEZAIf/92QtFQBSG/QFRHWQZtmo= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= +github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= +github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= +github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= github.com/zclconf/go-cty v1.10.0 h1:mp9ZXQeIcN8kAwuqorjH+Q+njbJKjLrvB2yIh4q7U+0= github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zclconf/go-cty-yaml v1.0.1 h1:up11wlgAaDvlAGENcFDnZgkn0qUJurso7k6EpURKNF8= github.com/zclconf/go-cty-yaml v1.0.1/go.mod h1:IP3Ylp0wQpYm50IHK8OZWKMu6sPJIUgKa8XhiVHura0= gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= @@ -1016,46 +1055,464 @@ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +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-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +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/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2 h1:J74nGeMgeFnYQJN59eFwh06jX/V8g0lB7LWpjSLxtgU= golang.org/x/exp/typeparams v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180811021610-c39426892332/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191009170851-d66e71096ffb/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200214201135-548b770e2dfa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200216192241-b320d3a0f5a2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 h1:khxVcsk/FhnzxMKOyD+TDGwjbEOpcPuIpmafPGFmhMA= google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +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= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +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/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 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= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= mvdan.cc/gofumpt v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= @@ -1064,3 +1521,6 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphD mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d h1:3rvTIIM22r9pvXk+q3swxUQAQOxksVMGK7sml4nG57w= mvdan.cc/unparam v0.0.0-20221223090309-7455f1af531d/go.mod h1:IeHQjmn6TOD+e4Z3RFiZMMsLVL+A96Nvptar8Fj71is= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/tencentcloud/extension_waf.go b/tencentcloud/extension_waf.go index c41181cfe2..44788832f3 100644 --- a/tencentcloud/extension_waf.go +++ b/tencentcloud/extension_waf.go @@ -319,3 +319,220 @@ const ( ORDER_ASC = "asc" ORDER_DESC = "desc" ) + +const ( + WAF_PREMIUM_SAAS = "premium_saas" + WAF_ENTERPRISE_SAAS = "enterprise_saas" + WAF_ULTIMATE_SAAS = "ultimate_saas" +) + +var WAF_CATEGORY_SAAS = []string{ + WAF_PREMIUM_SAAS, + WAF_ENTERPRISE_SAAS, + WAF_ULTIMATE_SAAS, +} + +const ( + WAF_PREMIUM_CLB = "premium_clb" + WAF_ENTERPRISE_CLB = "enterprise_clb" + WAF_ULTIMATE_CLB = "ultimate_clb" +) + +var WAF_CATEGORY_CLB = []string{ + WAF_PREMIUM_CLB, + WAF_ENTERPRISE_CLB, + WAF_ULTIMATE_CLB, +} + +const ( + TIME_UINT_D = "d" + TIME_UINT_M = "m" + TIME_UINT_Y = "y" +) + +var TIME_UNIT = []string{ + TIME_UINT_D, + TIME_UINT_M, + TIME_UINT_Y, +} + +const ( + REGION_ID_MAINLAND = 1 + REGION_ID_NON_MAINLAND = 9 +) + +var WAF_CATEGORY_ID_SAAS = map[string]int{ + WAF_PREMIUM_SAAS: 102375, + WAF_ENTERPRISE_SAAS: 102378, + WAF_ULTIMATE_SAAS: 102369, +} + +var SUB_PRODUCT_CODE_SAAS = map[string]string{ + WAF_PREMIUM_SAAS: "sp_wsm_waf_premium", + WAF_ENTERPRISE_SAAS: "sp_wsm_waf_enterprise", + WAF_ULTIMATE_SAAS: "sp_wsm_waf_ultimate", +} + +var PID_SAAS = map[string]int{ + WAF_PREMIUM_SAAS: 1000827, + WAF_ENTERPRISE_SAAS: 1000830, + WAF_ULTIMATE_SAAS: 1000832, +} + +var PKG_SAAS = map[string]int{ + "DOMAIN": 1000834, + "QPS": 1000481, +} + +var LABEL_TYPES_SAAS = map[string]string{ + WAF_PREMIUM_SAAS: "sv_wsm_waf_package_premium", + WAF_ENTERPRISE_SAAS: "sv_wsm_waf_package_enterprise", + WAF_ULTIMATE_SAAS: "sv_wsm_waf_package_ultimate", +} + +var LABEL_TYPES_CLB = map[string]string{ + WAF_PREMIUM_CLB: "sv_wsm_waf_package_premium_clb", + WAF_ENTERPRISE_CLB: "sv_wsm_waf_package_enterprise_clb", + WAF_ULTIMATE_CLB: "sv_wsm_waf_package_ultimate_clb", +} + +var WAF_CATEGORY_ID_CLB = map[string]int{ + WAF_PREMIUM_CLB: 101198, + WAF_ENTERPRISE_CLB: 101204, + WAF_ULTIMATE_CLB: 101201, +} + +var SUB_PRODUCT_CODE_CLB = map[string]string{ + WAF_PREMIUM_CLB: "sp_wsm_waf_premium_clb", + WAF_ENTERPRISE_CLB: "sp_wsm_waf_enterprise_clb", + WAF_ULTIMATE_CLB: "sp_wsm_waf_ultimate_clb", +} + +var PID_CLB = map[string]int{ + WAF_PREMIUM_CLB: 1001150, + WAF_ENTERPRISE_CLB: 1001152, + WAF_ULTIMATE_CLB: 1001154, +} + +const ( + AUTO_RENEW_FLAG_0 = 0 + AUTO_RENEW_FLAG_1 = 1 +) + +var AUTO_RENEW_FLAG = []int{ + AUTO_RENEW_FLAG_0, + AUTO_RENEW_FLAG_1, +} + +const ( + ELASTIC_MODE_0 = 0 + ELASTIC_MODE_1 = 1 +) + +var ELASTIC_MODE = []int{ + ELASTIC_MODE_0, + ELASTIC_MODE_1, +} + +const ( + MAINLAND_0 = 0 + MAINLAND_1 = 1 +) + +var MAINLAND = []int{ + MAINLAND_0, + MAINLAND_1, +} + +const ( + DOMIAN_CATEGORY_ID_SAAS = 102372 + DOMAIN_SUB_PRODUCT_CODE_SAAS = "sp_wsm_waf_domain" + DOMAIN_PID_SAAS = 1000834 + DOMAIN_LABEL_TYPE_SAAS = "sv_wsm_waf_domain" +) + +const ( + QPS_CATEGORY_ID_SAAS = 101040 + QPS_SUB_PRODUCT_CODE_SAAS = "sp_wsm_waf_qpsep" + QPS_PID_SAAS = 1000481 + QPS_LABEL_TYPE_SAAS = "sv_wsm_waf_qps_ep" +) + +const ( + DOMIAN_CATEGORY_ID_CLB = 101207 + DOMAIN_SUB_PRODUCT_CODE_CLB = "sp_wsm_waf_domain_clb" + DOMAIN_PID_CLB = 1001156 + DOMAIN_LABEL_TYPE_CLB = "sv_wsm_waf_domain_clb" +) + +const ( + QPS_CATEGORY_ID_CLB = 101210 + QPS_SUB_PRODUCT_CODE_CLB = "sp_wsm_waf_qpsep_clb" + QPS_PID_CLB = 1001160 + QPS_LABEL_TYPE_CLB = "sv_wsm_waf_qps_ep_clb" +) + +const ( + SAAS_REAL_REGION_MAINLAND_GZ = "gz" + SAAS_REAL_REGION_MAINLAND_SH = "sh" + SAAS_REAL_REGION_MAINLAND_BJ = "bj" + SAAS_REAL_REGION_MAINLAND_CD = "cd" +) + +var SAAS_REAL_REGION_MAINLAND = []string{ + SAAS_REAL_REGION_MAINLAND_GZ, + SAAS_REAL_REGION_MAINLAND_SH, + SAAS_REAL_REGION_MAINLAND_BJ, + SAAS_REAL_REGION_MAINLAND_CD, +} + +var SAAS_REAL_REGION_MAINLAND_ID_MAP = map[string]int{ + SAAS_REAL_REGION_MAINLAND_GZ: 1, + SAAS_REAL_REGION_MAINLAND_SH: 4, + SAAS_REAL_REGION_MAINLAND_BJ: 8, + SAAS_REAL_REGION_MAINLAND_CD: 16, +} + +const ( + SAAS_REAL_REGION_NON_MAINLAND_HK = "hk" + SAAS_REAL_REGION_NON_MAINLAND_SG = "sg" + SAAS_REAL_REGION_NON_MAINLAND_TH = "th" + SAAS_REAL_REGION_NON_MAINLAND_KR = "kr" + SAAS_REAL_REGION_NON_MAINLAND_IN = "in" + SAAS_REAL_REGION_NON_MAINLAND_DE = "de" + SAAS_REAL_REGION_NON_MAINLAND_CA = "ca" + SAAS_REAL_REGION_NON_MAINLAND_USE = "use" + SAAS_REAL_REGION_NON_MAINLAND_SAO = "sao" + SAAS_REAL_REGION_NON_MAINLAND_USW = "usw" + SAAS_REAL_REGION_NON_MAINLAND_JKT = "jkt" +) + +var SAAS_REAL_REGION_NON_MAINLAND = []string{ + SAAS_REAL_REGION_NON_MAINLAND_HK, + SAAS_REAL_REGION_NON_MAINLAND_SG, + SAAS_REAL_REGION_NON_MAINLAND_TH, + SAAS_REAL_REGION_NON_MAINLAND_KR, + SAAS_REAL_REGION_NON_MAINLAND_IN, + SAAS_REAL_REGION_NON_MAINLAND_DE, + SAAS_REAL_REGION_NON_MAINLAND_CA, + SAAS_REAL_REGION_NON_MAINLAND_USE, + SAAS_REAL_REGION_NON_MAINLAND_SAO, + SAAS_REAL_REGION_NON_MAINLAND_USW, + SAAS_REAL_REGION_NON_MAINLAND_JKT, +} + +var SAAS_REAL_REGION_NON_MAINLAND_ID_MAP = map[string]int{ + SAAS_REAL_REGION_NON_MAINLAND_HK: 5, + SAAS_REAL_REGION_NON_MAINLAND_SG: 9, + SAAS_REAL_REGION_NON_MAINLAND_TH: 23, + SAAS_REAL_REGION_NON_MAINLAND_KR: 18, + SAAS_REAL_REGION_NON_MAINLAND_IN: 21, + SAAS_REAL_REGION_NON_MAINLAND_DE: 17, + SAAS_REAL_REGION_NON_MAINLAND_CA: 6, + SAAS_REAL_REGION_NON_MAINLAND_USE: 22, + SAAS_REAL_REGION_NON_MAINLAND_SAO: 42, + SAAS_REAL_REGION_NON_MAINLAND_USW: 51, + SAAS_REAL_REGION_NON_MAINLAND_JKT: 72, +} + +var SAAS_REAL_REGIONS = append(SAAS_REAL_REGION_MAINLAND, SAAS_REAL_REGION_NON_MAINLAND...) diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 46354c7be2..fdfe4f6d73 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1668,6 +1668,8 @@ Waf tencentcloud_waf_custom_white_rule tencentcloud_waf_clb_domain tencentcloud_waf_saas_domain + tencentcloud_waf_clb_instance + tencentcloud_waf_saas_instance */ package tencentcloud @@ -3076,6 +3078,8 @@ func Provider() *schema.Provider { "tencentcloud_waf_custom_white_rule": resourceTencentCloudWafCustomWhiteRule(), "tencentcloud_waf_clb_domain": resourceTencentCloudWafClbDomain(), "tencentcloud_waf_saas_domain": resourceTencentCloudWafSaasDomain(), + "tencentcloud_waf_clb_instance": resourceTencentCloudWafClbInstance(), + "tencentcloud_waf_saas_instance": resourceTencentCloudWafSaasInstance(), }, ConfigureFunc: providerConfigure, diff --git a/tencentcloud/resource_tc_waf_clb_instance.go b/tencentcloud/resource_tc_waf_clb_instance.go new file mode 100644 index 0000000000..bcb620a2da --- /dev/null +++ b/tencentcloud/resource_tc_waf_clb_instance.go @@ -0,0 +1,490 @@ +/* +Provides a resource to create a waf clb instance + +Example Usage + +Create a basic waf premium clb instance + +```hcl +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "premium_clb" + instance_name = "tf-example-clb-waf" +} +``` + +Create a complete waf ultimate_clb instance + +```hcl +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "ultimate_clb" + instance_name = "tf-example-clb-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` +*/ +package tencentcloud + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + waf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func resourceTencentCloudWafClbInstance() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWafClbInstanceCreate, + Read: resourceTencentCloudWafClbInstanceRead, + Update: resourceTencentCloudWafClbInstanceUpdate, + Delete: resourceTencentCloudWafClbInstanceDelete, + + Schema: map[string]*schema.Schema{ + "goods_category": { + Required: true, + Type: schema.TypeString, + ValidateFunc: validateAllowedStringValue(WAF_CATEGORY_CLB), + Description: "Billing order parameters. support: premium_clb, enterprise_clb, ultimate_clb.", + }, + "time_span": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Default: 1, + Description: "Time interval.", + }, + "time_unit": { + Optional: true, + Type: schema.TypeString, + ValidateFunc: validateAllowedStringValue(TIME_UNIT), + Default: "m", + Description: "Time unit, support d, m, y. d: day, m: month, y: year.", + }, + "instance_name": { + Optional: true, + Computed: true, + Type: schema.TypeString, + Description: "Waf instance name.", + }, + "auto_renew_flag": { + Optional: true, + Type: schema.TypeInt, + Default: AUTO_RENEW_FLAG_0, + ValidateFunc: validateAllowedIntValue(AUTO_RENEW_FLAG), + Description: "Auto renew flag, 1: enable, 0: disable.", + }, + "elastic_mode": { + Optional: true, + Type: schema.TypeInt, + Default: ELASTIC_MODE_0, + ValidateFunc: validateAllowedIntValue(ELASTIC_MODE), + Description: "Is elastic billing enabled, 1: enable, 0: disable.", + }, + "is_cn_mainland": { + Optional: true, + Type: schema.TypeInt, + Default: MAINLAND_1, + ValidateFunc: validateAllowedIntValue(MAINLAND), + Description: "Chinese Mainland or not, 1: Chinese Mainland, 0: Non Chinese Mainland.", + }, + "domain_pkg_count": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Description: "Domain extension package count.", + }, + "qps_pkg_count": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Description: "QPS extension package count.", + }, + // computed + "instance_id": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance id.", + }, + "edition": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance edition, clb or saas.", + }, + "begin_time": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance start time.", + }, + "valid_time": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance valid time.", + }, + "api_security": { + Computed: true, + Type: schema.TypeInt, + Description: "waf instance api security status.", + }, + "status": { + Computed: true, + Type: schema.TypeInt, + Description: "waf instance status.", + }, + }, + } +} + +func resourceTencentCloudWafClbInstanceCreate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_clb_instance.create")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + request = waf.NewGenerateDealsAndPayNewRequest() + response = waf.NewGenerateDealsAndPayNewResponse() + instanceId string + mainlandMode int + ) + + goods := []*waf.GoodNews{} + + // make main instance + instanceGood := new(waf.GoodNews) + instanceGoodDetail := new(waf.GoodsDetailNew) + instanceGood.GoodsNum = helper.IntInt64(1) + if v, ok := d.GetOk("goods_category"); ok { + goodsCategory := v.(string) + goodsCategoryId := int64(WAF_CATEGORY_ID_CLB[goodsCategory]) + subProductCode := SUB_PRODUCT_CODE_CLB[goodsCategory] + labelTypes := LABEL_TYPES_CLB[goodsCategory] + pid := int64(PID_CLB[goodsCategory]) + labelCounts := int64(1) + + instanceGood.GoodsCategoryId = &goodsCategoryId + instanceGoodDetail.SubProductCode = &subProductCode + instanceGoodDetail.Pid = &pid + instanceGoodDetail.LabelTypes = helper.Strings([]string{labelTypes}) + instanceGoodDetail.LabelCounts = []*int64{&labelCounts} + } + + if v, ok := d.GetOkExists("time_span"); ok { + instanceGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + instanceGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOk("instance_name"); ok { + instanceGoodDetail.InstanceName = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + instanceGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOkExists("is_cn_mainland"); ok { + mainlandMode = v.(int) + if mainlandMode == MAINLAND_1 { + instanceGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + } else { + instanceGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + } + } + + instanceGood.GoodsDetail = instanceGoodDetail + goods = append(goods, instanceGood) + + // make domain pkg + if v, ok := d.GetOkExists("domain_pkg_count"); ok { + domainPkgGood := new(waf.GoodNews) + domainPkgGoodDetail := new(waf.GoodsDetailNew) + domainPkgGood.GoodsCategoryId = helper.IntInt64(DOMIAN_CATEGORY_ID_CLB) + domainPkgGood.GoodsNum = helper.IntInt64(1) + domainPkgGoodDetail.SubProductCode = helper.String(DOMAIN_SUB_PRODUCT_CODE_CLB) + domainPkgGoodDetail.Pid = helper.IntInt64(DOMAIN_PID_CLB) + domainPkgGoodDetail.LabelTypes = helper.Strings([]string{DOMAIN_LABEL_TYPE_CLB}) + domainPkgGoodDetail.LabelCounts = []*int64{helper.IntInt64(v.(int))} + + if v, ok := d.GetOkExists("time_span"); ok { + domainPkgGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + domainPkgGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + domainPkgGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if mainlandMode == MAINLAND_1 { + domainPkgGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + } else { + domainPkgGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + } + + domainPkgGood.GoodsDetail = domainPkgGoodDetail + goods = append(goods, domainPkgGood) + } + + // make qps pkg + if v, ok := d.GetOkExists("qps_pkg_count"); ok { + qpsPkgGood := new(waf.GoodNews) + qpsPkgGoodDetail := new(waf.GoodsDetailNew) + qpsPkgGood.GoodsCategoryId = helper.IntInt64(QPS_CATEGORY_ID_CLB) + qpsPkgGood.GoodsNum = helper.IntInt64(1) + qpsPkgGoodDetail.SubProductCode = helper.String(QPS_SUB_PRODUCT_CODE_CLB) + qpsPkgGoodDetail.Pid = helper.IntInt64(QPS_PID_CLB) + qpsPkgGoodDetail.LabelTypes = helper.Strings([]string{QPS_LABEL_TYPE_CLB}) + qpsPkgGoodDetail.LabelCounts = []*int64{helper.IntInt64(v.(int) * 1000)} + + if v, ok := d.GetOkExists("time_span"); ok { + qpsPkgGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + qpsPkgGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + qpsPkgGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if mainlandMode == MAINLAND_1 { + qpsPkgGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + } else { + qpsPkgGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + } + + qpsPkgGood.GoodsDetail = qpsPkgGoodDetail + goods = append(goods, qpsPkgGood) + } + + request.Goods = goods + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().GenerateDealsAndPayNew(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if *result.Response.Status == 0 || *result.Response.InstanceId == "" { + return resource.NonRetryableError(fmt.Errorf("create waf clb instance status error: %s", *result.Response.ReturnMessage)) + } + + response = result + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s create waf clb instance failed, reason:%+v", logId, err) + return err + } + + instanceId = *response.Response.InstanceId + d.SetId(instanceId) + + // set elastic mode + if v, ok := d.GetOkExists("elastic_mode"); ok { + elasticMode := v.(int) + if elasticMode == ELASTIC_MODE_1 { + modifyInstanceElasticModeRequest := waf.NewModifyInstanceElasticModeRequest() + modifyInstanceElasticModeRequest.InstanceId = &instanceId + modifyInstanceElasticModeRequest.Mode = helper.IntInt64(elasticMode) + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceElasticMode(modifyInstanceElasticModeRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceElasticModeRequest.GetAction(), modifyInstanceElasticModeRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf clb instance elastic mode failed, reason:%+v", logId, err) + return err + } + } + } + + return resourceTencentCloudWafClbInstanceRead(d, meta) +} + +func resourceTencentCloudWafClbInstanceRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_clb_instance.read")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + ctx = context.WithValue(context.TODO(), logIdKey, logId) + service = WafService{client: meta.(*TencentCloudClient).apiV3Conn} + instanceId = d.Id() + ) + + instanceInfo, err := service.DescribeWafInstanceById(ctx, instanceId) + if err != nil { + return err + } + + if instanceInfo == nil { + d.SetId("") + log.Printf("[WARN]%s resource `WafInstance` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + if instanceInfo.InstanceId != nil { + _ = d.Set("instance_id", instanceInfo.InstanceId) + } + + if instanceInfo.InstanceName != nil { + _ = d.Set("instance_name", instanceInfo.InstanceName) + } + + if instanceInfo.RenewFlag != nil { + _ = d.Set("auto_renew_flag", instanceInfo.RenewFlag) + } + + if instanceInfo.Mode != nil { + _ = d.Set("elastic_mode", instanceInfo.Mode) + } + + if instanceInfo.DomainPkg != nil { + _ = d.Set("domain_pkg_count", instanceInfo.DomainPkg.Count) + } + + if instanceInfo.QPS != nil { + _ = d.Set("qps_pkg_count", instanceInfo.QPS.Count) + } + + if instanceInfo.Edition != nil { + _ = d.Set("edition", instanceInfo.Edition) + } + + if instanceInfo.BeginTime != nil { + _ = d.Set("begin_time", instanceInfo.BeginTime) + } + + if instanceInfo.ValidTime != nil { + _ = d.Set("valid_time", instanceInfo.ValidTime) + } + + if instanceInfo.APISecurity != nil { + _ = d.Set("api_security", instanceInfo.APISecurity) + } + + if instanceInfo.Status != nil { + _ = d.Set("status", instanceInfo.Status) + } + + return nil +} + +func resourceTencentCloudWafClbInstanceUpdate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_clb_instance.update")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + modifyInstanceNameRequest = waf.NewModifyInstanceNameRequest() + modifyInstanceRenewFlagRequest = waf.NewModifyInstanceRenewFlagRequest() + modifyInstanceElasticModeRequest = waf.NewModifyInstanceElasticModeRequest() + instanceId = d.Id() + ) + + immutableArgs := []string{"goods_category", "time_span", "time_unit", "is_cn_mainland", "domain_pkg_count", "qps_pkg_count"} + + for _, v := range immutableArgs { + if d.HasChange(v) { + return fmt.Errorf("argument `%s` cannot be changed", v) + } + } + + if d.HasChange("instance_name") { + if v, ok := d.GetOkExists("instance_name"); ok { + modifyInstanceNameRequest.InstanceID = &instanceId + modifyInstanceNameRequest.InstanceName = helper.String(v.(string)) + modifyInstanceNameRequest.Edition = helper.String("clb-waf") + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceName(modifyInstanceNameRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceNameRequest.GetAction(), modifyInstanceNameRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf clb instance name failed, reason:%+v", logId, err) + return err + } + } + } + + if d.HasChange("auto_renew_flag") { + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + modifyInstanceRenewFlagRequest.InstanceId = &instanceId + modifyInstanceRenewFlagRequest.RenewFlag = helper.IntInt64(v.(int)) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceRenewFlag(modifyInstanceRenewFlagRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceRenewFlagRequest.GetAction(), modifyInstanceRenewFlagRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf clb instance auto renew flag failed, reason:%+v", logId, err) + return err + } + } + } + + if d.HasChange("elastic_mode") { + if v, ok := d.GetOkExists("elastic_mode"); ok { + modifyInstanceElasticModeRequest.InstanceId = &instanceId + modifyInstanceElasticModeRequest.Mode = helper.IntInt64(v.(int)) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceElasticMode(modifyInstanceElasticModeRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceElasticModeRequest.GetAction(), modifyInstanceElasticModeRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf clb instance elastic mode failed, reason:%+v", logId, err) + return err + } + } + } + + return resourceTencentCloudWafClbInstanceRead(d, meta) +} + +func resourceTencentCloudWafClbInstanceDelete(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_clb_instance.delete")() + defer inconsistentCheck(d, meta)() + + return fmt.Errorf("tencentcloud waf clb instance not supported delete, please contact the work order for processing") +} diff --git a/tencentcloud/resource_tc_waf_clb_instance_test.go b/tencentcloud/resource_tc_waf_clb_instance_test.go new file mode 100644 index 0000000000..a0061690e2 --- /dev/null +++ b/tencentcloud/resource_tc_waf_clb_instance_test.go @@ -0,0 +1,65 @@ +package tencentcloud + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +// go test -i; go test -test.run TestAccTencentCloudNeedFixWafClbInstanceResource_basic -v +func TestAccTencentCloudNeedFixWafClbInstanceResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWafClbInstance, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_clb_instance.example", "id"), + ), + }, + { + ResourceName: "tencentcloud_waf_clb_instance.example", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccWafClbInstanceUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_clb_instance.example", "id"), + ), + }, + }, + }) +} + +const testAccWafClbInstance = ` +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "ultimate_clb" + instance_name = "tf-example-clb-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + domain_pkg_count = 3 + qps_pkg_count = 3 +} +` + +const testAccWafClbInstanceUpdate = ` +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "ultimate_clb" + instance_name = "tf-example-clb-waf-update" + time_span = 1 + time_unit = "m" + auto_renew_flag = 0 + elastic_mode = 0 + is_cn_mainland = 1 + domain_pkg_count = 3 + qps_pkg_count = 3 +} +` diff --git a/tencentcloud/resource_tc_waf_saas_instance.go b/tencentcloud/resource_tc_waf_saas_instance.go new file mode 100644 index 0000000000..3905b95f29 --- /dev/null +++ b/tencentcloud/resource_tc_waf_saas_instance.go @@ -0,0 +1,540 @@ +/* +Provides a resource to create a waf saas instance + +Example Usage + +Create a basic waf premium saas instance + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "premium_saas" + instance_name = "tf-example-saas-waf" +} +``` + +Create a complete waf ultimate_saas instance(Chinese Mainland) + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "ultimate_saas" + instance_name = "tf-example-saas-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + real_region = "gz" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` + +Create a complete waf ultimate_saas instance(Non Chinese Mainland) + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "ultimate_saas" + instance_name = "tf-example-saas-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 0 + real_region = "sg" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` +*/ +package tencentcloud + +import ( + "context" + "fmt" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + waf "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func resourceTencentCloudWafSaasInstance() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudWafSaasInstanceCreate, + Read: resourceTencentCloudWafSaasInstanceRead, + Update: resourceTencentCloudWafSaasInstanceUpdate, + Delete: resourceTencentCloudWafSaasInstanceDelete, + + Schema: map[string]*schema.Schema{ + "goods_category": { + Required: true, + Type: schema.TypeString, + ValidateFunc: validateAllowedStringValue(WAF_CATEGORY_SAAS), + Description: "Billing order parameters. support premium_saas, enterprise_saas, ultimate_saas.", + }, + "time_span": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Default: 1, + Description: "Time interval.", + }, + "time_unit": { + Optional: true, + Type: schema.TypeString, + ValidateFunc: validateAllowedStringValue(TIME_UNIT), + Default: "m", + Description: "Time unit, support d, m, y. d: day, m: month, y: year.", + }, + "instance_name": { + Optional: true, + Computed: true, + Type: schema.TypeString, + Description: "Waf instance name.", + }, + "auto_renew_flag": { + Optional: true, + Type: schema.TypeInt, + Default: AUTO_RENEW_FLAG_0, + ValidateFunc: validateAllowedIntValue(AUTO_RENEW_FLAG), + Description: "Auto renew flag, 1: enable, 0: disable.", + }, + "elastic_mode": { + Optional: true, + Type: schema.TypeInt, + Default: ELASTIC_MODE_0, + ValidateFunc: validateAllowedIntValue(ELASTIC_MODE), + Description: "Is elastic billing enabled, 1: enable, 0: disable.", + }, + "is_cn_mainland": { + Optional: true, + Type: schema.TypeInt, + Default: MAINLAND_1, + ValidateFunc: validateAllowedIntValue(MAINLAND), + Description: "Chinese Mainland or not, 1: Chinese Mainland, 0: Non Chinese Mainland.", + }, + "real_region": { + Optional: true, + Type: schema.TypeString, + Default: SAAS_REAL_REGION_NON_MAINLAND_HK, + ValidateFunc: validateAllowedStringValue(SAAS_REAL_REGIONS), + Description: "region. If `is_cn_mainland` is 1, support: gz, sh, bj, cd (Means: GuangZhou, ShangHai, BeiJing, ChengDu); If `is_cn_mainland` is 0, support: hk, sg, th, kr, in, de, ca, use, sao, usw, jkt (Means: HongKong, Singapore, Bandkok, Seoul, Mumbai, Frankfurt, Toronto, Virginia, SaoPaulo, SiliconValley, Jakarta).", + }, + "domain_pkg_count": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Description: "Domain extension package count.", + }, + "qps_pkg_count": { + Optional: true, + Type: schema.TypeInt, + ValidateFunc: validateIntegerMin(1), + Description: "QPS extension package count.", + }, + // computed + "instance_id": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance id.", + }, + "edition": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance edition, clb or saas.", + }, + "begin_time": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance start time.", + }, + "valid_time": { + Computed: true, + Type: schema.TypeString, + Description: "waf instance valid time.", + }, + "api_security": { + Computed: true, + Type: schema.TypeInt, + Description: "waf instance api security status.", + }, + "status": { + Computed: true, + Type: schema.TypeInt, + Description: "waf instance status.", + }, + }, + } +} + +func resourceTencentCloudWafSaasInstanceCreate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_saas_instance.create")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + request = waf.NewGenerateDealsAndPayNewRequest() + response = waf.NewGenerateDealsAndPayNewResponse() + instanceId string + mainlandMode int + readRegion string + realRegionInt int64 + ) + + goods := []*waf.GoodNews{} + + // make main instance + instanceGood := waf.GoodNews{} + instanceGoodDetail := new(waf.GoodsDetailNew) + instanceGood.GoodsNum = helper.IntInt64(1) + if v, ok := d.GetOk("goods_category"); ok { + goodsCategory := v.(string) + goodsCategoryId := int64(WAF_CATEGORY_ID_SAAS[goodsCategory]) + subProductCode := SUB_PRODUCT_CODE_SAAS[goodsCategory] + labelTypes := LABEL_TYPES_SAAS[goodsCategory] + pid := int64(PID_CLB[goodsCategory]) + labelCounts := int64(1) + + instanceGood.GoodsCategoryId = &goodsCategoryId + instanceGoodDetail.SubProductCode = &subProductCode + instanceGoodDetail.Pid = &pid + instanceGoodDetail.LabelTypes = helper.Strings([]string{labelTypes}) + instanceGoodDetail.LabelCounts = []*int64{&labelCounts} + } + + if v, ok := d.GetOkExists("time_span"); ok { + instanceGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + instanceGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOk("instance_name"); ok { + instanceGoodDetail.InstanceName = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + instanceGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("real_region"); ok { + readRegion = v.(string) + } + + if v, ok := d.GetOkExists("is_cn_mainland"); ok { + mainlandMode = v.(int) + if mainlandMode == MAINLAND_1 { + if !IsContains(SAAS_REAL_REGION_MAINLAND, readRegion) { + return fmt.Errorf("If `is_cn_mainland` is 1, parameter `real_region` is not legal") + } + + instanceGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + realRegionInt = int64(SAAS_REAL_REGION_MAINLAND_ID_MAP[readRegion]) + instanceGoodDetail.RealRegion = &realRegionInt + + } else { + if !IsContains(SAAS_REAL_REGION_NON_MAINLAND, readRegion) { + return fmt.Errorf("If `is_cn_mainland` is 0, parameter `real_region` is not legal") + } + + instanceGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + realRegionInt = int64(SAAS_REAL_REGION_NON_MAINLAND_ID_MAP[readRegion]) + instanceGoodDetail.RealRegion = &realRegionInt + } + } + + instanceGood.GoodsDetail = instanceGoodDetail + goods = append(goods, &instanceGood) + + // make domain pkg + if v, ok := d.GetOkExists("domain_pkg_count"); ok { + domainPkgGood := waf.GoodNews{} + domainPkgGoodDetail := new(waf.GoodsDetailNew) + domainPkgGood.GoodsCategoryId = helper.IntInt64(DOMIAN_CATEGORY_ID_SAAS) + domainPkgGood.GoodsNum = helper.IntInt64(1) + domainPkgGoodDetail.SubProductCode = helper.String(DOMAIN_SUB_PRODUCT_CODE_SAAS) + domainPkgGoodDetail.Pid = helper.IntInt64(DOMAIN_PID_SAAS) + domainPkgGoodDetail.LabelTypes = helper.Strings([]string{DOMAIN_LABEL_TYPE_SAAS}) + domainPkgGoodDetail.LabelCounts = []*int64{helper.IntInt64(v.(int))} + + if v, ok := d.GetOkExists("time_span"); ok { + domainPkgGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + domainPkgGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + domainPkgGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if mainlandMode == MAINLAND_1 { + domainPkgGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + } else { + domainPkgGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + } + + domainPkgGoodDetail.RealRegion = &realRegionInt + domainPkgGood.GoodsDetail = domainPkgGoodDetail + goods = append(goods, &domainPkgGood) + } + + // make qps pkg + if v, ok := d.GetOkExists("qps_pkg_count"); ok { + qpsPkgGood := waf.GoodNews{} + qpsPkgGoodDetail := new(waf.GoodsDetailNew) + qpsPkgGood.GoodsCategoryId = helper.IntInt64(QPS_CATEGORY_ID_SAAS) + qpsPkgGood.GoodsNum = helper.IntInt64(1) + qpsPkgGoodDetail.SubProductCode = helper.String(QPS_SUB_PRODUCT_CODE_SAAS) + qpsPkgGoodDetail.Pid = helper.IntInt64(QPS_PID_SAAS) + qpsPkgGoodDetail.LabelTypes = helper.Strings([]string{QPS_LABEL_TYPE_SAAS}) + qpsPkgGoodDetail.LabelCounts = []*int64{helper.IntInt64(v.(int) * 1000)} + + if v, ok := d.GetOkExists("time_span"); ok { + qpsPkgGoodDetail.TimeSpan = helper.IntInt64(v.(int)) + } + + if v, ok := d.GetOk("time_unit"); ok { + qpsPkgGoodDetail.TimeUnit = helper.String(v.(string)) + } + + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + qpsPkgGoodDetail.AutoRenewFlag = helper.IntInt64(v.(int)) + } + + if mainlandMode == MAINLAND_1 { + qpsPkgGood.RegionId = helper.IntInt64(REGION_ID_MAINLAND) + } else { + qpsPkgGood.RegionId = helper.IntInt64(REGION_ID_NON_MAINLAND) + } + + qpsPkgGoodDetail.RealRegion = &realRegionInt + qpsPkgGood.GoodsDetail = qpsPkgGoodDetail + goods = append(goods, &qpsPkgGood) + } + + request.Goods = goods + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().GenerateDealsAndPayNew(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) + } + + if *result.Response.Status == 0 || *result.Response.InstanceId == "" { + return resource.NonRetryableError(fmt.Errorf("create waf saas instance status error: %s", *result.Response.ReturnMessage)) + } + + response = result + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s create waf saas instance failed, reason:%+v", logId, err) + return err + } + + instanceId = *response.Response.InstanceId + d.SetId(instanceId) + + // set elastic mode + if v, ok := d.GetOkExists("elastic_mode"); ok { + elasticMode := v.(int) + if elasticMode == ELASTIC_MODE_1 { + modifyInstanceElasticModeRequest := waf.NewModifyInstanceElasticModeRequest() + modifyInstanceElasticModeRequest.InstanceId = &instanceId + modifyInstanceElasticModeRequest.Mode = helper.IntInt64(elasticMode) + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceElasticMode(modifyInstanceElasticModeRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceElasticModeRequest.GetAction(), modifyInstanceElasticModeRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf saas instance elastic mode failed, reason:%+v", logId, err) + return err + } + } + } + + return resourceTencentCloudWafClbInstanceRead(d, meta) +} + +func resourceTencentCloudWafSaasInstanceRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_saas_instance.read")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + ctx = context.WithValue(context.TODO(), logIdKey, logId) + service = WafService{client: meta.(*TencentCloudClient).apiV3Conn} + instanceId = d.Id() + ) + + instanceInfo, err := service.DescribeWafInstanceById(ctx, instanceId) + if err != nil { + return err + } + + if instanceInfo == nil { + d.SetId("") + log.Printf("[WARN]%s resource `WafInstance` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) + return nil + } + + if instanceInfo.InstanceId != nil { + _ = d.Set("instance_id", instanceInfo.InstanceId) + } + + if instanceInfo.InstanceName != nil { + _ = d.Set("instance_name", instanceInfo.InstanceName) + } + + if instanceInfo.RenewFlag != nil { + _ = d.Set("auto_renew_flag", instanceInfo.RenewFlag) + } + + if instanceInfo.Mode != nil { + _ = d.Set("elastic_mode", instanceInfo.Mode) + } + + if instanceInfo.Region != nil { + _ = d.Set("real_region", instanceInfo.Region) + } + + if instanceInfo.DomainPkg != nil { + _ = d.Set("domain_pkg_count", instanceInfo.DomainPkg.Count) + } + + if instanceInfo.QPS != nil { + _ = d.Set("qps_pkg_count", instanceInfo.QPS.Count) + } + + if instanceInfo.Edition != nil { + _ = d.Set("edition", instanceInfo.Edition) + } + + if instanceInfo.BeginTime != nil { + _ = d.Set("begin_time", instanceInfo.BeginTime) + } + + if instanceInfo.ValidTime != nil { + _ = d.Set("valid_time", instanceInfo.ValidTime) + } + + if instanceInfo.APISecurity != nil { + _ = d.Set("api_security", instanceInfo.APISecurity) + } + + if instanceInfo.Status != nil { + _ = d.Set("status", instanceInfo.Status) + } + + return nil +} + +func resourceTencentCloudWafSaasInstanceUpdate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_saas_instance.update")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + modifyInstanceNameRequest = waf.NewModifyInstanceNameRequest() + modifyInstanceRenewFlagRequest = waf.NewModifyInstanceRenewFlagRequest() + modifyInstanceElasticModeRequest = waf.NewModifyInstanceElasticModeRequest() + instanceId = d.Id() + ) + + immutableArgs := []string{"goods_category", "time_span", "time_unit", "is_cn_mainland", "domain_pkg_count", "qps_pkg_count"} + + for _, v := range immutableArgs { + if d.HasChange(v) { + return fmt.Errorf("argument `%s` cannot be changed", v) + } + } + + if d.HasChange("instance_name") { + if v, ok := d.GetOkExists("instance_name"); ok { + modifyInstanceNameRequest.InstanceID = &instanceId + modifyInstanceNameRequest.InstanceName = helper.String(v.(string)) + modifyInstanceNameRequest.Edition = helper.String("sparta-waf") + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceName(modifyInstanceNameRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceNameRequest.GetAction(), modifyInstanceNameRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf saas instance name failed, reason:%+v", logId, err) + return err + } + } + } + + if d.HasChange("auto_renew_flag") { + if v, ok := d.GetOkExists("auto_renew_flag"); ok { + modifyInstanceRenewFlagRequest.InstanceId = &instanceId + modifyInstanceRenewFlagRequest.RenewFlag = helper.IntInt64(v.(int)) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceRenewFlag(modifyInstanceRenewFlagRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceRenewFlagRequest.GetAction(), modifyInstanceRenewFlagRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf saas instance auto renew flag failed, reason:%+v", logId, err) + return err + } + } + } + + if d.HasChange("elastic_mode") { + if v, ok := d.GetOkExists("elastic_mode"); ok { + modifyInstanceElasticModeRequest.InstanceId = &instanceId + modifyInstanceElasticModeRequest.Mode = helper.IntInt64(v.(int)) + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + result, e := meta.(*TencentCloudClient).apiV3Conn.UseWafClient().ModifyInstanceElasticMode(modifyInstanceElasticModeRequest) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, modifyInstanceElasticModeRequest.GetAction(), modifyInstanceElasticModeRequest.ToJsonString(), result.ToJsonString()) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s update waf saas instance elastic mode failed, reason:%+v", logId, err) + return err + } + } + } + + return resourceTencentCloudWafSaasInstanceRead(d, meta) +} + +func resourceTencentCloudWafSaasInstanceDelete(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_waf_saas_instance.delete")() + defer inconsistentCheck(d, meta)() + + return fmt.Errorf("tencentcloud waf saas instance not supported delete, please contact the work order for processing") +} diff --git a/tencentcloud/resource_tc_waf_saas_instance_test.go b/tencentcloud/resource_tc_waf_saas_instance_test.go new file mode 100644 index 0000000000..b80d4d657e --- /dev/null +++ b/tencentcloud/resource_tc_waf_saas_instance_test.go @@ -0,0 +1,67 @@ +package tencentcloud + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +// go test -i; go test -test.run TestAccTencentCloudNeedFixWafSaasInstanceResource_basic -v +func TestAccTencentCloudNeedFixWafSaasInstanceResource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + testAccPreCheck(t) + }, + Providers: testAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccWafSaasInstance, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_saas_instance.example", "id"), + ), + }, + { + ResourceName: "tencentcloud_waf_saas_instance.example", + ImportState: true, + ImportStateVerify: true, + }, + { + Config: testAccWafSaasInstanceUpdate, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_waf_saas_instance.example", "id"), + ), + }, + }, + }) +} + +const testAccWafSaasInstance = ` +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "premium_saas" + instance_name = "tf-example-saas-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + real_region = "gz" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +` + +const testAccWafSaasInstanceUpdate = ` +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "premium_saas" + instance_name = "tf-example-saas-waf-update" + time_span = 1 + time_unit = "m" + auto_renew_flag = 0 + elastic_mode = 0 + is_cn_mainland = 1 + real_region = "gz" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +` diff --git a/tencentcloud/service_tencentcloud_waf.go b/tencentcloud/service_tencentcloud_waf.go index a3f968f208..bbf03aa4be 100644 --- a/tencentcloud/service_tencentcloud_waf.go +++ b/tencentcloud/service_tencentcloud_waf.go @@ -598,3 +598,41 @@ func (me *WafService) DescribeWafUserDomainsByFilter(ctx context.Context) (userD userDomains = response.Response.UsersInfo return } + +func (me *WafService) DescribeWafInstanceById(ctx context.Context, instanceId string) (instance *waf.InstanceInfo, errRet error) { + logId := getLogId(ctx) + + request := waf.NewDescribeInstancesRequest() + request.Offset = common.Uint64Ptr(1) + request.Limit = common.Uint64Ptr(20) + request.Filters = []*waf.FiltersItemNew{ + { + Name: common.StringPtr("InstanceId"), + Values: common.StringPtrs([]string{instanceId}), + ExactMatch: common.BoolPtr(true), + }, + } + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + ratelimit.Check(request.GetAction()) + + response, err := me.client.UseWafClient().DescribeInstances(request) + if err != nil { + errRet = err + return + } + + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if len(response.Response.Instances) < 1 { + return + } + + instance = response.Response.Instances[0] + return +} diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go index 6a51b18a1d..8e8d34bcfa 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go @@ -265,7 +265,7 @@ func CompleteCommonParams(request Request, region string, requestClient string) params["Action"] = request.GetAction() params["Timestamp"] = strconv.FormatInt(time.Now().Unix(), 10) params["Nonce"] = strconv.Itoa(rand.Int()) - params["RequestClient"] = "SDK_GO_1.0.748" + params["RequestClient"] = "SDK_GO_1.0.751" if requestClient != "" { params["RequestClient"] += ": " + requestClient } diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go index 7f39fe1461..19570f6d82 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/client.go @@ -1270,7 +1270,7 @@ func NewDeleteSpartaProtectionResponse() (response *DeleteSpartaProtectionRespon } // DeleteSpartaProtection -// waf斯巴达-删除防护域名 +// SAASWAF删除防护域名 // // 可能返回的错误码: // INTERNALERROR = "InternalError" @@ -1282,7 +1282,7 @@ func (c *Client) DeleteSpartaProtection(request *DeleteSpartaProtectionRequest) } // DeleteSpartaProtection -// waf斯巴达-删除防护域名 +// SAASWAF删除防护域名 // // 可能返回的错误码: // INTERNALERROR = "InternalError" @@ -1508,6 +1508,7 @@ func NewDescribeAccessHistogramResponse() (response *DescribeAccessHistogramResp // INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" // INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" // INVALIDPARAMETERVALUE = "InvalidParameterValue" @@ -1540,6 +1541,7 @@ func (c *Client) DescribeAccessHistogram(request *DescribeAccessHistogramRequest // INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" // INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" // INVALIDPARAMETERVALUE = "InvalidParameterValue" @@ -4413,6 +4415,94 @@ func (c *Client) FreshAntiFakeUrlWithContext(ctx context.Context, request *Fresh return } +func NewGenerateDealsAndPayNewRequest() (request *GenerateDealsAndPayNewRequest) { + request = &GenerateDealsAndPayNewRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "GenerateDealsAndPayNew") + + + return +} + +func NewGenerateDealsAndPayNewResponse() (response *GenerateDealsAndPayNewResponse) { + response = &GenerateDealsAndPayNewResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// GenerateDealsAndPayNew +// 计费资源购买、续费下单接口 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// FAILEDOPERATION_CLSINTERNALERROR = "FailedOperation.CLSInternalError" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) GenerateDealsAndPayNew(request *GenerateDealsAndPayNewRequest) (response *GenerateDealsAndPayNewResponse, err error) { + return c.GenerateDealsAndPayNewWithContext(context.Background(), request) +} + +// GenerateDealsAndPayNew +// 计费资源购买、续费下单接口 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// FAILEDOPERATION_CLSINTERNALERROR = "FailedOperation.CLSInternalError" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) GenerateDealsAndPayNewWithContext(ctx context.Context, request *GenerateDealsAndPayNewRequest) (response *GenerateDealsAndPayNewResponse, err error) { + if request == nil { + request = NewGenerateDealsAndPayNewRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("GenerateDealsAndPayNew require credential") + } + + request.SetContext(ctx) + + response = NewGenerateDealsAndPayNewResponse() + err = c.Send(request, response) + return +} + func NewGetAttackDownloadRecordsRequest() (request *GetAttackDownloadRecordsRequest) { request = &GetAttackDownloadRecordsRequest{ BaseRequest: &tchttp.BaseRequest{}, @@ -4495,6 +4585,7 @@ func NewGetAttackHistogramResponse() (response *GetAttackHistogramResponse) { // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetAttackHistogram(request *GetAttackHistogramRequest) (response *GetAttackHistogramResponse, err error) { @@ -4511,6 +4602,7 @@ func (c *Client) GetAttackHistogram(request *GetAttackHistogramRequest) (respons // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetAttackHistogramWithContext(ctx context.Context, request *GetAttackHistogramRequest) (response *GetAttackHistogramResponse, err error) { @@ -4557,6 +4649,7 @@ func NewGetAttackTotalCountResponse() (response *GetAttackTotalCountResponse) { // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetAttackTotalCount(request *GetAttackTotalCountRequest) (response *GetAttackTotalCountResponse, err error) { @@ -4573,6 +4666,7 @@ func (c *Client) GetAttackTotalCount(request *GetAttackTotalCountRequest) (respo // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetAttackTotalCountWithContext(ctx context.Context, request *GetAttackTotalCountRequest) (response *GetAttackTotalCountResponse, err error) { @@ -4619,6 +4713,7 @@ func NewGetInstanceQpsLimitResponse() (response *GetInstanceQpsLimitResponse) { // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetInstanceQpsLimit(request *GetInstanceQpsLimitRequest) (response *GetInstanceQpsLimitResponse, err error) { @@ -4635,6 +4730,7 @@ func (c *Client) GetInstanceQpsLimit(request *GetInstanceQpsLimitRequest) (respo // INTERNALERROR = "InternalError" // INTERNALERROR_UNKNOWNERR = "InternalError.UnknownErr" // INVALIDPARAMETER_LOGICERR = "InvalidParameter.LogicErr" +// INVALIDPARAMETER_QUERYSTRINGSYNTAXERR = "InvalidParameter.QueryStringSyntaxErr" // INVALIDPARAMETER_SQLSYNTAXERR = "InvalidParameter.SQLSyntaxErr" // INVALIDPARAMETER_TYPEMISMATCH = "InvalidParameter.TypeMismatch" func (c *Client) GetInstanceQpsLimitWithContext(ctx context.Context, request *GetInstanceQpsLimitRequest) (response *GetInstanceQpsLimitResponse, err error) { @@ -5841,6 +5937,294 @@ func (c *Client) ModifyHostStatusWithContext(ctx context.Context, request *Modif return } +func NewModifyInstanceElasticModeRequest() (request *ModifyInstanceElasticModeRequest) { + request = &ModifyInstanceElasticModeRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "ModifyInstanceElasticMode") + + + return +} + +func NewModifyInstanceElasticModeResponse() (response *ModifyInstanceElasticModeResponse) { + response = &ModifyInstanceElasticModeResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// ModifyInstanceElasticMode +// 修改实例的QPS弹性计费开关 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) ModifyInstanceElasticMode(request *ModifyInstanceElasticModeRequest) (response *ModifyInstanceElasticModeResponse, err error) { + return c.ModifyInstanceElasticModeWithContext(context.Background(), request) +} + +// ModifyInstanceElasticMode +// 修改实例的QPS弹性计费开关 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) ModifyInstanceElasticModeWithContext(ctx context.Context, request *ModifyInstanceElasticModeRequest) (response *ModifyInstanceElasticModeResponse, err error) { + if request == nil { + request = NewModifyInstanceElasticModeRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ModifyInstanceElasticMode require credential") + } + + request.SetContext(ctx) + + response = NewModifyInstanceElasticModeResponse() + err = c.Send(request, response) + return +} + +func NewModifyInstanceNameRequest() (request *ModifyInstanceNameRequest) { + request = &ModifyInstanceNameRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "ModifyInstanceName") + + + return +} + +func NewModifyInstanceNameResponse() (response *ModifyInstanceNameResponse) { + response = &ModifyInstanceNameResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// ModifyInstanceName +// 修改实例的名称 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +func (c *Client) ModifyInstanceName(request *ModifyInstanceNameRequest) (response *ModifyInstanceNameResponse, err error) { + return c.ModifyInstanceNameWithContext(context.Background(), request) +} + +// ModifyInstanceName +// 修改实例的名称 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +func (c *Client) ModifyInstanceNameWithContext(ctx context.Context, request *ModifyInstanceNameRequest) (response *ModifyInstanceNameResponse, err error) { + if request == nil { + request = NewModifyInstanceNameRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ModifyInstanceName require credential") + } + + request.SetContext(ctx) + + response = NewModifyInstanceNameResponse() + err = c.Send(request, response) + return +} + +func NewModifyInstanceQpsLimitRequest() (request *ModifyInstanceQpsLimitRequest) { + request = &ModifyInstanceQpsLimitRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "ModifyInstanceQpsLimit") + + + return +} + +func NewModifyInstanceQpsLimitResponse() (response *ModifyInstanceQpsLimitResponse) { + response = &ModifyInstanceQpsLimitResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// ModifyInstanceQpsLimit +// 设置套餐实例的弹性qps上限 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +func (c *Client) ModifyInstanceQpsLimit(request *ModifyInstanceQpsLimitRequest) (response *ModifyInstanceQpsLimitResponse, err error) { + return c.ModifyInstanceQpsLimitWithContext(context.Background(), request) +} + +// ModifyInstanceQpsLimit +// 设置套餐实例的弹性qps上限 +// +// 可能返回的错误码: +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +func (c *Client) ModifyInstanceQpsLimitWithContext(ctx context.Context, request *ModifyInstanceQpsLimitRequest) (response *ModifyInstanceQpsLimitResponse, err error) { + if request == nil { + request = NewModifyInstanceQpsLimitRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ModifyInstanceQpsLimit require credential") + } + + request.SetContext(ctx) + + response = NewModifyInstanceQpsLimitResponse() + err = c.Send(request, response) + return +} + +func NewModifyInstanceRenewFlagRequest() (request *ModifyInstanceRenewFlagRequest) { + request = &ModifyInstanceRenewFlagRequest{ + BaseRequest: &tchttp.BaseRequest{}, + } + + request.Init().WithApiInfo("waf", APIVersion, "ModifyInstanceRenewFlag") + + + return +} + +func NewModifyInstanceRenewFlagResponse() (response *ModifyInstanceRenewFlagResponse) { + response = &ModifyInstanceRenewFlagResponse{ + BaseResponse: &tchttp.BaseResponse{}, + } + return +} + +// ModifyInstanceRenewFlag +// 修改实例的自动续费开关 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) ModifyInstanceRenewFlag(request *ModifyInstanceRenewFlagRequest) (response *ModifyInstanceRenewFlagResponse, err error) { + return c.ModifyInstanceRenewFlagWithContext(context.Background(), request) +} + +// ModifyInstanceRenewFlag +// 修改实例的自动续费开关 +// +// 可能返回的错误码: +// AUTHFAILURE = "AuthFailure" +// DRYRUNOPERATION = "DryRunOperation" +// FAILEDOPERATION = "FailedOperation" +// INTERNALERROR = "InternalError" +// INVALIDPARAMETER = "InvalidParameter" +// INVALIDPARAMETER_INVALIDCERTIFICATE = "InvalidParameter.InvalidCertificate" +// INVALIDPARAMETER_QUERYCERTBYSSLIDFAILED = "InvalidParameter.QueryCertBySSLIDFailed" +// INVALIDPARAMETERVALUE = "InvalidParameterValue" +// LIMITEXCEEDED = "LimitExceeded" +// MISSINGPARAMETER = "MissingParameter" +// OPERATIONDENIED = "OperationDenied" +// REQUESTLIMITEXCEEDED = "RequestLimitExceeded" +// RESOURCEINUSE = "ResourceInUse" +// RESOURCEINSUFFICIENT = "ResourceInsufficient" +// RESOURCENOTFOUND = "ResourceNotFound" +// RESOURCEUNAVAILABLE = "ResourceUnavailable" +// RESOURCESSOLDOUT = "ResourcesSoldOut" +// UNAUTHORIZEDOPERATION = "UnauthorizedOperation" +// UNKNOWNPARAMETER = "UnknownParameter" +// UNSUPPORTEDOPERATION = "UnsupportedOperation" +func (c *Client) ModifyInstanceRenewFlagWithContext(ctx context.Context, request *ModifyInstanceRenewFlagRequest) (response *ModifyInstanceRenewFlagResponse, err error) { + if request == nil { + request = NewModifyInstanceRenewFlagRequest() + } + + if c.GetCredential() == nil { + return nil, errors.New("ModifyInstanceRenewFlag require credential") + } + + request.SetContext(ctx) + + response = NewModifyInstanceRenewFlagResponse() + err = c.Send(request, response) + return +} + func NewModifyProtectionStatusRequest() (request *ModifyProtectionStatusRequest) { request = &ModifyProtectionStatusRequest{ BaseRequest: &tchttp.BaseRequest{}, diff --git a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go index d3b15d6bef..a58d9e044d 100644 --- a/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go +++ b/vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125/models.go @@ -1186,6 +1186,10 @@ type ClbDomainsInfo struct { // cdc类型会增加集群信息 // 注意:此字段可能返回 null,表示取不到有效值。 CdcClusters *string `json:"CdcClusters,omitnil" name:"CdcClusters"` + + // 云类型:public:公有云;private:私有云;hybrid:混合云 + // 注意:此字段可能返回 null,表示取不到有效值。 + CloudType *string `json:"CloudType,omitnil" name:"CloudType"` } type ClbHostResult struct { @@ -1379,6 +1383,14 @@ func (r *CreateHostResponse) FromJsonString(s string) error { return json.Unmarshal([]byte(s), &r) } +type DealData struct { + // 订单号列表,元素个数与请求包的goods数组的元素个数一致,商品详情与订单按顺序对应 + DealNames []*string `json:"DealNames,omitnil" name:"DealNames"` + + // 大订单号,一个大订单号下可以有多个子订单,说明是同一次下单[{},{}] + BigDealId *string `json:"BigDealId,omitnil" name:"BigDealId"` +} + // Predefined struct for user type DeleteAccessExportRequestParams struct { // 日志导出ID @@ -6271,6 +6283,75 @@ func (r *FreshAntiFakeUrlResponse) FromJsonString(s string) error { return json.Unmarshal([]byte(s), &r) } +// Predefined struct for user +type GenerateDealsAndPayNewRequestParams struct { + // 计费下单入参 + Goods []*GoodNews `json:"Goods,omitnil" name:"Goods"` +} + +type GenerateDealsAndPayNewRequest struct { + *tchttp.BaseRequest + + // 计费下单入参 + Goods []*GoodNews `json:"Goods,omitnil" name:"Goods"` +} + +func (r *GenerateDealsAndPayNewRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *GenerateDealsAndPayNewRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "Goods") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "GenerateDealsAndPayNewRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type GenerateDealsAndPayNewResponseParams struct { + // 计费下单响应结构体 + // 注意:此字段可能返回 null,表示取不到有效值。 + Data *DealData `json:"Data,omitnil" name:"Data"` + + // 1:成功,0:失败 + Status *int64 `json:"Status,omitnil" name:"Status"` + + // 返回message + // 注意:此字段可能返回 null,表示取不到有效值。 + ReturnMessage *string `json:"ReturnMessage,omitnil" name:"ReturnMessage"` + + // 购买的实例ID + // 注意:此字段可能返回 null,表示取不到有效值。 + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil" name:"RequestId"` +} + +type GenerateDealsAndPayNewResponse struct { + *tchttp.BaseResponse + Response *GenerateDealsAndPayNewResponseParams `json:"Response"` +} + +func (r *GenerateDealsAndPayNewResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *GenerateDealsAndPayNewResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + // Predefined struct for user type GetAttackDownloadRecordsRequestParams struct { @@ -6551,6 +6632,124 @@ func (r *GetInstanceQpsLimitResponse) FromJsonString(s string) error { return json.Unmarshal([]byte(s), &r) } +type GoodNews struct { + // 商品数量 + GoodsNum *int64 `json:"GoodsNum,omitnil" name:"GoodsNum"` + + // 商品明细 + GoodsDetail *GoodsDetailNew `json:"GoodsDetail,omitnil" name:"GoodsDetail"` + + // 订单类型ID,用来唯一标识一个业务的一种场景(总共三种场景:新购、配置变更、续费) + // 高级版: 102375(新购),102376(续费),102377(变配) + // 企业版 : 102378(新购),102379(续费),102380(变配) + // 旗舰版 : 102369(新购),102370(续费),102371(变配) + // 域名包 : 102372(新购),102373(续费),102374(变配) + // 业务扩展包 : 101040(新购),101041(续费),101042(变配) + // + // 高级版-CLB: 新购 101198 续费 101199 变配 101200 + // 企业版-CLB 101204(新购),101205(续费),101206(变配) + // 旗舰版-CLB : 101201(新购),101202(续费),101203(变配) + // 域名包-CLB: 101207(新购),101208(续费),101209(变配) + // 业务扩展包-CLB: 101210(新购),101211(续费),101212(变配) + // + // 注意:此字段可能返回 null,表示取不到有效值。 + GoodsCategoryId *int64 `json:"GoodsCategoryId,omitnil" name:"GoodsCategoryId"` + + // 购买waf实例区域ID + // 1 表示购买大陆资源; + // 9表示购买非中国大陆资源 + // 注意:此字段可能返回 null,表示取不到有效值。 + RegionId *int64 `json:"RegionId,omitnil" name:"RegionId"` +} + +type GoodsDetailNew struct { + // 时间间隔 + // 注意:此字段可能返回 null,表示取不到有效值。 + TimeSpan *int64 `json:"TimeSpan,omitnil" name:"TimeSpan"` + + // 单位,支持购买d、m、y 即(日、月、年) + // 注意:此字段可能返回 null,表示取不到有效值。 + TimeUnit *string `json:"TimeUnit,omitnil" name:"TimeUnit"` + + // 子产品标签,。新购,续费必传,变配时放在oldConfig newConfig里面 + // + // Saas 高级版 :sp_wsm_waf_premium + // Saas企业版 :sp_wsm_waf_enterprise + // Saas旗舰版 :sp_wsm_waf_ultimate + // Saas 业务扩展包:sp_wsm_waf_qpsep + // Saas 域名扩展包:sp_wsm_waf_domain + // + // 高级版-CLB:sp_wsm_waf_premium_clb + // 企业版-CLB : sp_wsm_waf_enterprise_clb + // 旗舰版-CLB:sp_wsm_waf_ultimate_clb + // 业务扩展包-CLB:sp_wsm_waf_qpsep_clb + // 域名扩展包-CLB:sp_wsm_waf_domain_clb + // + // 注意:此字段可能返回 null,表示取不到有效值。 + SubProductCode *string `json:"SubProductCode,omitnil" name:"SubProductCode"` + + // 业务产品申请的pid(对应一个定价公式),通过pid计费查询到定价模型 + // 高级版 :1000827 + // 企业版 :1000830 + // 旗舰版 :1000832 + // 域名包 : 1000834 + // 业务扩展包 : 1000481 + // 高级版-CLB:1001150 + // 企业版-CLB : 1001152 + // 旗舰版-CLB:1001154 + // 域名包-CLB: 1001156 + // 业务扩展包-CLB : 1001160 + // + // 注意:此字段可能返回 null,表示取不到有效值。 + Pid *int64 `json:"Pid,omitnil" name:"Pid"` + + // waf实例名 + // 注意:此字段可能返回 null,表示取不到有效值。 + InstanceName *string `json:"InstanceName,omitnil" name:"InstanceName"` + + // 1:自动续费,0:不自动续费 + // 注意:此字段可能返回 null,表示取不到有效值。 + AutoRenewFlag *int64 `json:"AutoRenewFlag,omitnil" name:"AutoRenewFlag"` + + // waf购买的实际地域信息 + // 注意:此字段可能返回 null,表示取不到有效值。 + RealRegion *int64 `json:"RealRegion,omitnil" name:"RealRegion"` + + // 计费细项标签数组 + // Saas 高级版 sv_wsm_waf_package_premium + // Saas 企业版 sv_wsm_waf_package_enterprise + // Saas 旗舰版 sv_wsm_waf_package_ultimate + // Saas 非中国大陆高级版 sv_wsm_waf_package_premium_intl + // Saas 非中国大陆企业版 sv_wsm_waf_package_enterprise_intl + // Saas 非中国大陆旗舰版 sv_wsm_waf_package_ultimate _intl + // Saas 业务扩展包 sv_wsm_waf_qps_ep + // Saas 域名扩展包 sv_wsm_waf_domain + // + // 高级版CLB sv_wsm_waf_package_premium_clb + // 企业版CLB sv_wsm_waf_package_enterprise_clb + // 旗舰版CLB sv_wsm_waf_package_ultimate_clb + // 非中国大陆高级版 CLB sv_wsm_waf_package_premium_clb_intl + // 非中国大陆企业版CLB sv_wsm_waf_package_premium_clb_intl + // 非中国大陆旗舰版CLB sv_wsm_waf_package_ultimate_clb _intl + // 业务扩展包CLB sv_wsm_waf_qps_ep_clb + // 域名扩展包CLB sv_wsm_waf_domain_clb + // + // 注意:此字段可能返回 null,表示取不到有效值。 + LabelTypes []*string `json:"LabelTypes,omitnil" name:"LabelTypes"` + + // 计费细项标签数量,一般和SvLabelType一一对应 + // 注意:此字段可能返回 null,表示取不到有效值。 + LabelCounts []*int64 `json:"LabelCounts,omitnil" name:"LabelCounts"` + + // 变配使用,实例到期时间 + // 注意:此字段可能返回 null,表示取不到有效值。 + CurDeadline *string `json:"CurDeadline,omitnil" name:"CurDeadline"` + + // 对存在的实例购买bot 或api 安全 + // 注意:此字段可能返回 null,表示取不到有效值。 + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` +} + type HostDel struct { // 域名 Domain *string `json:"Domain,omitnil" name:"Domain"` @@ -6572,7 +6771,7 @@ type HostRecord struct { // 主域名,入参时为空 MainDomain *string `json:"MainDomain,omitnil" name:"MainDomain"` - // waf模式,同saas waf保持一致 + // 规则引擎防护模式,0 观察模式,1拦截模式 Mode *uint64 `json:"Mode,omitnil" name:"Mode"` // waf和LD的绑定,0:没有绑定,1:绑定 @@ -6581,7 +6780,7 @@ type HostRecord struct { // 域名状态,0:正常,1:未检测到流量,2:即将过期,3:过期 State *uint64 `json:"State,omitnil" name:"State"` - // 使用的规则,同saas waf保持一致 + // 规则引擎和AI引擎防护模式联合状态,10规则引擎观察&&AI引擎关闭模式 11规则引擎观察&&AI引擎观察模式 12规则引擎观察&&AI引擎拦截模式 20规则引擎拦截&&AI引擎关闭模式 21规则引擎拦截&&AI引擎观察模式 22规则引擎拦截&&AI引擎拦截模式 Engine *uint64 `json:"Engine,omitnil" name:"Engine"` // 是否开启代理,0:不开启,1:开启 @@ -6621,6 +6820,10 @@ type HostRecord struct { // 规则引擎类型, 1: menshen, 2:tiga // 注意:此字段可能返回 null,表示取不到有效值。 EngineType *int64 `json:"EngineType,omitnil" name:"EngineType"` + + // 云类型:public:公有云;private:私有云;hybrid:混合云 + // 注意:此字段可能返回 null,表示取不到有效值。 + CloudType *string `json:"CloudType,omitnil" name:"CloudType"` } type HostStatus struct { @@ -6836,6 +7039,10 @@ type LoadBalancer struct { // 负载均衡的网络类型 // 注意:此字段可能返回 null,表示取不到有效值。 LoadBalancerType *string `json:"LoadBalancerType,omitnil" name:"LoadBalancerType"` + + // 负载均衡的域名 + // 注意:此字段可能返回 null,表示取不到有效值。 + LoadBalancerDomain *string `json:"LoadBalancerDomain,omitnil" name:"LoadBalancerDomain"` } type LoadBalancerPackageNew struct { @@ -6882,6 +7089,10 @@ type LoadBalancerPackageNew struct { // CLB类型 // 注意:此字段可能返回 null,表示取不到有效值。 LoadBalancerType *string `json:"LoadBalancerType,omitnil" name:"LoadBalancerType"` + + // 负载均衡器的域名 + // 注意:此字段可能返回 null,表示取不到有效值。 + LoadBalancerDomain *string `json:"LoadBalancerDomain,omitnil" name:"LoadBalancerDomain"` } type LogHistogramInfo struct { @@ -8385,6 +8596,260 @@ func (r *ModifyHostStatusResponse) FromJsonString(s string) error { return json.Unmarshal([]byte(s), &r) } +// Predefined struct for user +type ModifyInstanceElasticModeRequestParams struct { + // 实例ID + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // 弹性计费开关 + Mode *int64 `json:"Mode,omitnil" name:"Mode"` +} + +type ModifyInstanceElasticModeRequest struct { + *tchttp.BaseRequest + + // 实例ID + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // 弹性计费开关 + Mode *int64 `json:"Mode,omitnil" name:"Mode"` +} + +func (r *ModifyInstanceElasticModeRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceElasticModeRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "InstanceId") + delete(f, "Mode") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ModifyInstanceElasticModeRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceElasticModeResponseParams struct { + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil" name:"RequestId"` +} + +type ModifyInstanceElasticModeResponse struct { + *tchttp.BaseResponse + Response *ModifyInstanceElasticModeResponseParams `json:"Response"` +} + +func (r *ModifyInstanceElasticModeResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceElasticModeResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceNameRequestParams struct { + // 新名称 + InstanceName *string `json:"InstanceName,omitnil" name:"InstanceName"` + + // 实例id + InstanceID *string `json:"InstanceID,omitnil" name:"InstanceID"` + + // 版本 + Edition *string `json:"Edition,omitnil" name:"Edition"` +} + +type ModifyInstanceNameRequest struct { + *tchttp.BaseRequest + + // 新名称 + InstanceName *string `json:"InstanceName,omitnil" name:"InstanceName"` + + // 实例id + InstanceID *string `json:"InstanceID,omitnil" name:"InstanceID"` + + // 版本 + Edition *string `json:"Edition,omitnil" name:"Edition"` +} + +func (r *ModifyInstanceNameRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceNameRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "InstanceName") + delete(f, "InstanceID") + delete(f, "Edition") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ModifyInstanceNameRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceNameResponseParams struct { + // 修改状态:0为成功 + ModifyCode *int64 `json:"ModifyCode,omitnil" name:"ModifyCode"` + + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil" name:"RequestId"` +} + +type ModifyInstanceNameResponse struct { + *tchttp.BaseResponse + Response *ModifyInstanceNameResponseParams `json:"Response"` +} + +func (r *ModifyInstanceNameResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceNameResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceQpsLimitRequestParams struct { + // 套餐实例id + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // qps上限 + QpsLimit *int64 `json:"QpsLimit,omitnil" name:"QpsLimit"` +} + +type ModifyInstanceQpsLimitRequest struct { + *tchttp.BaseRequest + + // 套餐实例id + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // qps上限 + QpsLimit *int64 `json:"QpsLimit,omitnil" name:"QpsLimit"` +} + +func (r *ModifyInstanceQpsLimitRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceQpsLimitRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "InstanceId") + delete(f, "QpsLimit") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ModifyInstanceQpsLimitRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceQpsLimitResponseParams struct { + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil" name:"RequestId"` +} + +type ModifyInstanceQpsLimitResponse struct { + *tchttp.BaseResponse + Response *ModifyInstanceQpsLimitResponseParams `json:"Response"` +} + +func (r *ModifyInstanceQpsLimitResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceQpsLimitResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceRenewFlagRequestParams struct { + // 实例ID + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // 续费开关 + RenewFlag *int64 `json:"RenewFlag,omitnil" name:"RenewFlag"` +} + +type ModifyInstanceRenewFlagRequest struct { + *tchttp.BaseRequest + + // 实例ID + InstanceId *string `json:"InstanceId,omitnil" name:"InstanceId"` + + // 续费开关 + RenewFlag *int64 `json:"RenewFlag,omitnil" name:"RenewFlag"` +} + +func (r *ModifyInstanceRenewFlagRequest) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceRenewFlagRequest) FromJsonString(s string) error { + f := make(map[string]interface{}) + if err := json.Unmarshal([]byte(s), &f); err != nil { + return err + } + delete(f, "InstanceId") + delete(f, "RenewFlag") + if len(f) > 0 { + return tcerr.NewTencentCloudSDKError("ClientError.BuildRequestError", "ModifyInstanceRenewFlagRequest has unknown keys!", "") + } + return json.Unmarshal([]byte(s), &r) +} + +// Predefined struct for user +type ModifyInstanceRenewFlagResponseParams struct { + // 唯一请求 ID,每次请求都会返回。定位问题时需要提供该次请求的 RequestId。 + RequestId *string `json:"RequestId,omitnil" name:"RequestId"` +} + +type ModifyInstanceRenewFlagResponse struct { + *tchttp.BaseResponse + Response *ModifyInstanceRenewFlagResponseParams `json:"Response"` +} + +func (r *ModifyInstanceRenewFlagResponse) ToJsonString() string { + b, _ := json.Marshal(r) + return string(b) +} + +// FromJsonString It is highly **NOT** recommended to use this function +// because it has no param check, nor strict type check +func (r *ModifyInstanceRenewFlagResponse) FromJsonString(s string) error { + return json.Unmarshal([]byte(s), &r) +} + // Predefined struct for user type ModifyProtectionStatusRequestParams struct { // 域名 @@ -8630,7 +9095,7 @@ type ModifySpartaProtectionRequestParams struct { // IsCdn=3时,需要填此参数,表示自定义header IpHeaders []*string `json:"IpHeaders,omitnil" name:"IpHeaders"` - // 0:关闭xff重置;1:开启xff重置 + // 0:关闭xff重置;1:开启xff重置,只有在IsCdn=0时可以开启 XFFReset *int64 `json:"XFFReset,omitnil" name:"XFFReset"` } @@ -8733,7 +9198,7 @@ type ModifySpartaProtectionRequest struct { // IsCdn=3时,需要填此参数,表示自定义header IpHeaders []*string `json:"IpHeaders,omitnil" name:"IpHeaders"` - // 0:关闭xff重置;1:开启xff重置 + // 0:关闭xff重置;1:开启xff重置,只有在IsCdn=0时可以开启 XFFReset *int64 `json:"XFFReset,omitnil" name:"XFFReset"` } @@ -9687,13 +10152,18 @@ type Strategy struct { } type StrategyForAntiInfoLeak struct { - // 匹配字段 + // 匹配条件,returncode(响应码)、keywords(关键字)、information(敏感信息) Field *string `json:"Field,omitnil" name:"Field"` - // 逻辑符号 + // 逻辑符号,固定取值为contains CompareFunc *string `json:"CompareFunc,omitnil" name:"CompareFunc"` - // 匹配内容 + // 匹配内容。 + // 以下三个对应Field为information时可取的匹配内容: + // idcard(身份证)、phone(手机号)、bankcard(银行卡)。 + // 以下为对应Field为returncode时可取的匹配内容: + // 400(状态码400)、403(状态码403)、404(状态码404)、4xx(其它4xx状态码)、500(状态码500)、501(状态码501)、502(状态码502)、504(状态码504)、5xx(其它5xx状态码)。 + // 当对应Field为keywords时由用户自己输入匹配内容。 Content *string `json:"Content,omitnil" name:"Content"` } @@ -10182,6 +10652,10 @@ type UserDomainInfo struct { // 指定域名是否写cls的开关 1:写 0:不写 // 注意:此字段可能返回 null,表示取不到有效值。 Cls *uint64 `json:"Cls,omitnil" name:"Cls"` + + // 标记是否是混合云接入。hybrid表示混合云接入域名 + // 注意:此字段可能返回 null,表示取不到有效值。 + CloudType *string `json:"CloudType,omitnil" name:"CloudType"` } type VipInfo struct { diff --git a/vendor/modules.txt b/vendor/modules.txt index 41ad1c331f..0b5570dc39 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1094,7 +1094,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit/v20190319 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.711 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.748 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.751 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors @@ -1252,7 +1252,7 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod/v20180717 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.706 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312 -# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.748 +# github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.751 ## explicit; go 1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf/v20180125 # github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.725 diff --git a/website/docs/r/waf_clb_instance.html.markdown b/website/docs/r/waf_clb_instance.html.markdown new file mode 100644 index 0000000000..e464611074 --- /dev/null +++ b/website/docs/r/waf_clb_instance.html.markdown @@ -0,0 +1,67 @@ +--- +subcategory: "Waf" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_waf_clb_instance" +sidebar_current: "docs-tencentcloud-resource-waf_clb_instance" +description: |- + Provides a resource to create a waf clb instance +--- + +# tencentcloud_waf_clb_instance + +Provides a resource to create a waf clb instance + +## Example Usage + +### Create a basic waf premium clb instance + +```hcl +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "premium_clb" + instance_name = "tf-example-clb-waf" +} +``` + +### Create a complete waf ultimate_clb instance + +```hcl +resource "tencentcloud_waf_clb_instance" "example" { + goods_category = "ultimate_clb" + instance_name = "tf-example-clb-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `goods_category` - (Required, String) Billing order parameters. support: premium_clb, enterprise_clb, ultimate_clb. +* `auto_renew_flag` - (Optional, Int) Auto renew flag, 1: enable, 0: disable. +* `domain_pkg_count` - (Optional, Int) Domain extension package count. +* `elastic_mode` - (Optional, Int) Is elastic billing enabled, 1: enable, 0: disable. +* `instance_name` - (Optional, String) Waf instance name. +* `is_cn_mainland` - (Optional, Int) Chinese Mainland or not, 1: Chinese Mainland, 0: Non Chinese Mainland. +* `qps_pkg_count` - (Optional, Int) QPS extension package count. +* `time_span` - (Optional, Int) Time interval. +* `time_unit` - (Optional, String) Time unit, support d, m, y. d: day, m: month, y: year. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `api_security` - waf instance api security status. +* `begin_time` - waf instance start time. +* `edition` - waf instance edition, clb or saas. +* `instance_id` - waf instance id. +* `status` - waf instance status. +* `valid_time` - waf instance valid time. + + diff --git a/website/docs/r/waf_saas_instance.html.markdown b/website/docs/r/waf_saas_instance.html.markdown new file mode 100644 index 0000000000..77363c7435 --- /dev/null +++ b/website/docs/r/waf_saas_instance.html.markdown @@ -0,0 +1,86 @@ +--- +subcategory: "Waf" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_waf_saas_instance" +sidebar_current: "docs-tencentcloud-resource-waf_saas_instance" +description: |- + Provides a resource to create a waf saas instance +--- + +# tencentcloud_waf_saas_instance + +Provides a resource to create a waf saas instance + +## Example Usage + +### Create a basic waf premium saas instance + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "premium_saas" + instance_name = "tf-example-saas-waf" +} +``` + +### Create a complete waf ultimate_saas instance(Chinese Mainland) + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "ultimate_saas" + instance_name = "tf-example-saas-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 1 + real_region = "gz" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` + +### Create a complete waf ultimate_saas instance(Non Chinese Mainland) + +```hcl +resource "tencentcloud_waf_saas_instance" "example" { + goods_category = "ultimate_saas" + instance_name = "tf-example-saas-waf" + time_span = 1 + time_unit = "m" + auto_renew_flag = 1 + elastic_mode = 1 + is_cn_mainland = 0 + real_region = "sg" + domain_pkg_count = 3 + qps_pkg_count = 3 +} +``` + +## Argument Reference + +The following arguments are supported: + +* `goods_category` - (Required, String) Billing order parameters. support premium_saas, enterprise_saas, ultimate_saas. +* `auto_renew_flag` - (Optional, Int) Auto renew flag, 1: enable, 0: disable. +* `domain_pkg_count` - (Optional, Int) Domain extension package count. +* `elastic_mode` - (Optional, Int) Is elastic billing enabled, 1: enable, 0: disable. +* `instance_name` - (Optional, String) Waf instance name. +* `is_cn_mainland` - (Optional, Int) Chinese Mainland or not, 1: Chinese Mainland, 0: Non Chinese Mainland. +* `qps_pkg_count` - (Optional, Int) QPS extension package count. +* `real_region` - (Optional, String) region. If `is_cn_mainland` is 1, support: gz, sh, bj, cd (Means: GuangZhou, ShangHai, BeiJing, ChengDu); If `is_cn_mainland` is 0, support: hk, sg, th, kr, in, de, ca, use, sao, usw, jkt (Means: HongKong, Singapore, Bandkok, Seoul, Mumbai, Frankfurt, Toronto, Virginia, SaoPaulo, SiliconValley, Jakarta). +* `time_span` - (Optional, Int) Time interval. +* `time_unit` - (Optional, String) Time unit, support d, m, y. d: day, m: month, y: year. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `api_security` - waf instance api security status. +* `begin_time` - waf instance start time. +* `edition` - waf instance edition, clb or saas. +* `instance_id` - waf instance id. +* `status` - waf instance status. +* `valid_time` - waf instance valid time. + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index 6018aa2cc3..d47cb7a755 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -4930,6 +4930,12 @@
  • tencentcloud_waf_saas_domain
  • +
  • + tencentcloud_waf_clb_instance +
  • +
  • + tencentcloud_waf_saas_instance +