planetscale 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +24 -0
  3. data/.github/workflows/gem-push.yml +38 -0
  4. data/.github/workflows/licensed.yml +43 -0
  5. data/.gitignore +10 -0
  6. data/.licensed.yml +9 -0
  7. data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
  8. data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
  9. data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
  10. data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
  11. data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
  12. data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
  13. data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
  14. data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
  15. data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
  16. data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
  17. data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
  18. data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
  19. data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
  20. data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
  21. data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
  22. data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
  23. data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
  24. data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
  25. data/.ruby_version +1 -0
  26. data/Gemfile +8 -0
  27. data/LICENSE +201 -0
  28. data/README.md +88 -0
  29. data/Rakefile +10 -0
  30. data/bin/console +15 -0
  31. data/bin/setup +17 -0
  32. data/controller.go +255 -0
  33. data/go.mod +16 -0
  34. data/go.sum +428 -0
  35. data/lib/generators/planetscale/install_generator.rb +58 -0
  36. data/lib/planetscale.rb +137 -0
  37. data/lib/planetscale/version.rb +5 -0
  38. data/planetscale.gemspec +44 -0
  39. data/proxy.go +128 -0
  40. data/vendor/github.com/armon/circbuf/.gitignore +22 -0
  41. data/vendor/github.com/armon/circbuf/LICENSE +20 -0
  42. data/vendor/github.com/armon/circbuf/README.md +28 -0
  43. data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
  44. data/vendor/github.com/armon/circbuf/go.mod +1 -0
  45. data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
  46. data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
  47. data/vendor/github.com/golang/protobuf/LICENSE +28 -0
  48. data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
  49. data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
  50. data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
  51. data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
  52. data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
  53. data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
  54. data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
  55. data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
  56. data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
  57. data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
  58. data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
  59. data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
  60. data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
  61. data/vendor/github.com/gorilla/mux/LICENSE +27 -0
  62. data/vendor/github.com/gorilla/mux/README.md +805 -0
  63. data/vendor/github.com/gorilla/mux/doc.go +306 -0
  64. data/vendor/github.com/gorilla/mux/go.mod +3 -0
  65. data/vendor/github.com/gorilla/mux/middleware.go +74 -0
  66. data/vendor/github.com/gorilla/mux/mux.go +606 -0
  67. data/vendor/github.com/gorilla/mux/regexp.go +388 -0
  68. data/vendor/github.com/gorilla/mux/route.go +736 -0
  69. data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
  70. data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
  71. data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
  72. data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
  73. data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
  74. data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
  75. data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
  76. data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
  77. data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
  78. data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
  79. data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
  80. data/vendor/github.com/pkg/errors/.gitignore +24 -0
  81. data/vendor/github.com/pkg/errors/.travis.yml +10 -0
  82. data/vendor/github.com/pkg/errors/LICENSE +23 -0
  83. data/vendor/github.com/pkg/errors/Makefile +44 -0
  84. data/vendor/github.com/pkg/errors/README.md +59 -0
  85. data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
  86. data/vendor/github.com/pkg/errors/errors.go +288 -0
  87. data/vendor/github.com/pkg/errors/go113.go +38 -0
  88. data/vendor/github.com/pkg/errors/stack.go +177 -0
  89. data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
  90. data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
  91. data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
  92. data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
  93. data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
  94. data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
  95. data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
  96. data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
  97. data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
  98. data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
  99. data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
  100. data/vendor/go.uber.org/atomic/.gitignore +12 -0
  101. data/vendor/go.uber.org/atomic/.travis.yml +27 -0
  102. data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
  103. data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
  104. data/vendor/go.uber.org/atomic/Makefile +78 -0
  105. data/vendor/go.uber.org/atomic/README.md +63 -0
  106. data/vendor/go.uber.org/atomic/bool.go +81 -0
  107. data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
  108. data/vendor/go.uber.org/atomic/doc.go +23 -0
  109. data/vendor/go.uber.org/atomic/duration.go +82 -0
  110. data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
  111. data/vendor/go.uber.org/atomic/error.go +51 -0
  112. data/vendor/go.uber.org/atomic/error_ext.go +39 -0
  113. data/vendor/go.uber.org/atomic/float64.go +76 -0
  114. data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
  115. data/vendor/go.uber.org/atomic/gen.go +26 -0
  116. data/vendor/go.uber.org/atomic/go.mod +8 -0
  117. data/vendor/go.uber.org/atomic/go.sum +9 -0
  118. data/vendor/go.uber.org/atomic/int32.go +102 -0
  119. data/vendor/go.uber.org/atomic/int64.go +102 -0
  120. data/vendor/go.uber.org/atomic/nocmp.go +35 -0
  121. data/vendor/go.uber.org/atomic/string.go +54 -0
  122. data/vendor/go.uber.org/atomic/string_ext.go +43 -0
  123. data/vendor/go.uber.org/atomic/uint32.go +102 -0
  124. data/vendor/go.uber.org/atomic/uint64.go +102 -0
  125. data/vendor/go.uber.org/atomic/value.go +31 -0
  126. data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
  127. data/vendor/go.uber.org/multierr/.gitignore +4 -0
  128. data/vendor/go.uber.org/multierr/.travis.yml +23 -0
  129. data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
  130. data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
  131. data/vendor/go.uber.org/multierr/Makefile +42 -0
  132. data/vendor/go.uber.org/multierr/README.md +23 -0
  133. data/vendor/go.uber.org/multierr/error.go +449 -0
  134. data/vendor/go.uber.org/multierr/glide.yaml +8 -0
  135. data/vendor/go.uber.org/multierr/go.mod +8 -0
  136. data/vendor/go.uber.org/multierr/go.sum +11 -0
  137. data/vendor/go.uber.org/multierr/go113.go +52 -0
  138. data/vendor/go.uber.org/zap/.codecov.yml +17 -0
  139. data/vendor/go.uber.org/zap/.gitignore +32 -0
  140. data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
  141. data/vendor/go.uber.org/zap/.travis.yml +23 -0
  142. data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
  143. data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
  144. data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
  145. data/vendor/go.uber.org/zap/FAQ.md +156 -0
  146. data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
  147. data/vendor/go.uber.org/zap/Makefile +63 -0
  148. data/vendor/go.uber.org/zap/README.md +134 -0
  149. data/vendor/go.uber.org/zap/array.go +320 -0
  150. data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
  151. data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
  152. data/vendor/go.uber.org/zap/checklicense.sh +17 -0
  153. data/vendor/go.uber.org/zap/config.go +264 -0
  154. data/vendor/go.uber.org/zap/doc.go +113 -0
  155. data/vendor/go.uber.org/zap/encoder.go +79 -0
  156. data/vendor/go.uber.org/zap/error.go +80 -0
  157. data/vendor/go.uber.org/zap/field.go +539 -0
  158. data/vendor/go.uber.org/zap/flag.go +39 -0
  159. data/vendor/go.uber.org/zap/glide.yaml +34 -0
  160. data/vendor/go.uber.org/zap/global.go +168 -0
  161. data/vendor/go.uber.org/zap/global_go112.go +26 -0
  162. data/vendor/go.uber.org/zap/global_prego112.go +26 -0
  163. data/vendor/go.uber.org/zap/go.mod +13 -0
  164. data/vendor/go.uber.org/zap/go.sum +56 -0
  165. data/vendor/go.uber.org/zap/http_handler.go +81 -0
  166. data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
  167. data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
  168. data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
  169. data/vendor/go.uber.org/zap/level.go +132 -0
  170. data/vendor/go.uber.org/zap/logger.go +344 -0
  171. data/vendor/go.uber.org/zap/options.go +140 -0
  172. data/vendor/go.uber.org/zap/sink.go +161 -0
  173. data/vendor/go.uber.org/zap/stacktrace.go +85 -0
  174. data/vendor/go.uber.org/zap/sugar.go +304 -0
  175. data/vendor/go.uber.org/zap/time.go +27 -0
  176. data/vendor/go.uber.org/zap/writer.go +99 -0
  177. data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
  178. data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
  179. data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
  180. data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
  181. data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
  182. data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
  183. data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
  184. data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
  185. data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
  186. data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
  187. data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
  188. data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
  189. data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
  190. data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
  191. data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
  192. data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
  193. data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
  194. data/vendor/golang.org/x/net/AUTHORS +3 -0
  195. data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
  196. data/vendor/golang.org/x/net/LICENSE +27 -0
  197. data/vendor/golang.org/x/net/PATENTS +22 -0
  198. data/vendor/golang.org/x/net/context/context.go +56 -0
  199. data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
  200. data/vendor/golang.org/x/net/context/go17.go +73 -0
  201. data/vendor/golang.org/x/net/context/go19.go +21 -0
  202. data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
  203. data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
  204. data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
  205. data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
  206. data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
  207. data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
  208. data/vendor/golang.org/x/oauth2/LICENSE +27 -0
  209. data/vendor/golang.org/x/oauth2/README.md +36 -0
  210. data/vendor/golang.org/x/oauth2/go.mod +9 -0
  211. data/vendor/golang.org/x/oauth2/go.sum +361 -0
  212. data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
  213. data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
  214. data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
  215. data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
  216. data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
  217. data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
  218. data/vendor/golang.org/x/oauth2/token.go +178 -0
  219. data/vendor/golang.org/x/oauth2/transport.go +89 -0
  220. data/vendor/google.golang.org/appengine/LICENSE +202 -0
  221. data/vendor/google.golang.org/appengine/internal/api.go +678 -0
  222. data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
  223. data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
  224. data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
  225. data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
  226. data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
  227. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
  228. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
  229. data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
  230. data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
  231. data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
  232. data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
  233. data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
  234. data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
  235. data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
  236. data/vendor/google.golang.org/appengine/internal/main.go +16 -0
  237. data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
  238. data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
  239. data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
  240. data/vendor/google.golang.org/appengine/internal/net.go +56 -0
  241. data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
  242. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
  243. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
  244. data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
  245. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
  246. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
  247. data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
  248. data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
  249. data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
  250. data/vendor/google.golang.org/protobuf/LICENSE +27 -0
  251. data/vendor/google.golang.org/protobuf/PATENTS +22 -0
  252. data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
  253. data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
  254. data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
  255. data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
  256. data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
  257. data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
  258. data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
  259. data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
  260. data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
  261. data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
  262. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
  263. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
  264. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
  265. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
  266. data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
  267. data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
  268. data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
  269. data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
  270. data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
  271. data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
  272. data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
  273. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
  274. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
  275. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
  276. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
  277. data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
  278. data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
  279. data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
  280. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
  281. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
  282. data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
  283. data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
  284. data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
  285. data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
  286. data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
  287. data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
  288. data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
  289. data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
  290. data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
  291. data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
  292. data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
  293. data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
  294. data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
  295. data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
  296. data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
  297. data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
  298. data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
  299. data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
  300. data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
  301. data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
  302. data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
  303. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
  304. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
  305. data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
  306. data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
  307. data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
  308. data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
  309. data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
  310. data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
  311. data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
  312. data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
  313. data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
  314. data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
  315. data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
  316. data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
  317. data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
  318. data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
  319. data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
  320. data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
  321. data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
  322. data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
  323. data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
  324. data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
  325. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
  326. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
  327. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
  328. data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
  329. data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
  330. data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
  331. data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
  332. data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
  333. data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
  334. data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
  335. data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
  336. data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
  337. data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
  338. data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
  339. data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
  340. data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
  341. data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
  342. data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
  343. data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
  344. data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
  345. data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
  346. data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
  347. data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
  348. data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
  349. data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
  350. data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
  351. data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
  352. data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
  353. data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
  354. data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
  355. data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
  356. data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
  357. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
  358. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
  359. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
  360. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
  361. data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
  362. data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
  363. data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
  364. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
  365. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
  366. data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
  367. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
  368. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
  369. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
  370. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
  371. data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
  372. data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
  373. data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
  374. data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
  375. data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
  376. data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
  377. data/vendor/modules.txt +79 -0
  378. metadata +495 -0
@@ -0,0 +1,305 @@
1
+ package planetscale
2
+
3
+ import (
4
+ "bytes"
5
+ "context"
6
+ "encoding/json"
7
+ "errors"
8
+ "io/ioutil"
9
+ "net/http"
10
+ "net/url"
11
+
12
+ "github.com/hashicorp/go-cleanhttp"
13
+ "golang.org/x/oauth2"
14
+ )
15
+
16
+ const (
17
+ DefaultBaseURL = "https://api.planetscale.com/"
18
+ jsonMediaType = "application/json"
19
+ )
20
+
21
+ // ErrorCode defines the code of an error.
22
+ type ErrorCode string
23
+
24
+ const (
25
+ ErrInternal ErrorCode = "internal" // Internal error.
26
+ ErrInvalid ErrorCode = "invalid" // Invalid operation, e.g wrong params
27
+ ErrPermission ErrorCode = "permission" // Permission denied.
28
+ ErrNotFound ErrorCode = "not_found" // Resource not found.
29
+ ErrRetry ErrorCode = "retry" // Operation should be retried.
30
+ ErrResponseMalformed ErrorCode = "response_malformed" // Response body is malformed.
31
+ )
32
+
33
+ // Client encapsulates a client that talks to the PlanetScale API
34
+ type Client struct {
35
+ // client represents the HTTP client used for making HTTP requests.
36
+ client *http.Client
37
+
38
+ // base URL for the API
39
+ baseURL *url.URL
40
+
41
+ Backups BackupsService
42
+ Databases DatabasesService
43
+ Certificates CertificatesService
44
+ DatabaseBranches DatabaseBranchesService
45
+ Organizations OrganizationsService
46
+ DeployRequests DeployRequestsService
47
+ ServiceTokens ServiceTokenService
48
+ }
49
+
50
+ // ClientOption provides a variadic option for configuring the client
51
+ type ClientOption func(c *Client) error
52
+
53
+ // WithBaseURL overrides the base URL for the API.
54
+ func WithBaseURL(baseURL string) ClientOption {
55
+ return func(c *Client) error {
56
+ parsedURL, err := url.Parse(baseURL)
57
+ if err != nil {
58
+ return err
59
+ }
60
+
61
+ c.baseURL = parsedURL
62
+ return nil
63
+ }
64
+ }
65
+
66
+ // WithAccessToken configures a client with the given PlanetScale access token.
67
+ func WithAccessToken(token string) ClientOption {
68
+ return func(c *Client) error {
69
+ if token == "" {
70
+ return errors.New("missing access token")
71
+ }
72
+
73
+ tokenSource := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
74
+
75
+ // make sure we use our own HTTP client
76
+ ctx := context.WithValue(context.Background(), oauth2.HTTPClient, c.client)
77
+ oauthClient := oauth2.NewClient(ctx, tokenSource)
78
+
79
+ c.client = oauthClient
80
+ return nil
81
+ }
82
+ }
83
+
84
+ // WithServiceToken configures a client with the given PlanetScale Service Token
85
+ func WithServiceToken(name, token string) ClientOption {
86
+ return func(c *Client) error {
87
+ if token == "" || name == "" {
88
+ return errors.New("missing token name and string")
89
+ }
90
+
91
+ transport := serviceTokenTransport{
92
+ rt: c.client.Transport,
93
+ token: token,
94
+ tokenName: name,
95
+ }
96
+
97
+ c.client.Transport = &transport
98
+ return nil
99
+ }
100
+ }
101
+
102
+ // WithHTTPClient configures the PLanetScale client with the given HTTP client.
103
+ func WithHTTPClient(client *http.Client) ClientOption {
104
+ return func(c *Client) error {
105
+ if client == nil {
106
+ client = cleanhttp.DefaultClient()
107
+ }
108
+
109
+ c.client = client
110
+ return nil
111
+ }
112
+ }
113
+
114
+ // NewClient instantiates an instance of the PlanetScale API client.
115
+ func NewClient(opts ...ClientOption) (*Client, error) {
116
+ baseURL, err := url.Parse(DefaultBaseURL)
117
+ if err != nil {
118
+ return nil, err
119
+ }
120
+
121
+ c := &Client{
122
+ client: cleanhttp.DefaultClient(),
123
+ baseURL: baseURL,
124
+ }
125
+
126
+ for _, opt := range opts {
127
+ err := opt(c)
128
+ if err != nil {
129
+ return nil, err
130
+ }
131
+ }
132
+
133
+ c.Backups = &backupsService{client: c}
134
+ c.Databases = &databasesService{client: c}
135
+ c.Certificates = &certificatesService{client: c}
136
+ c.DatabaseBranches = &databaseBranchesService{client: c}
137
+ c.Organizations = &organizationsService{client: c}
138
+ c.DeployRequests = &deployRequestsService{client: c}
139
+ c.ServiceTokens = &serviceTokenService{client: c}
140
+
141
+ return c, nil
142
+ }
143
+
144
+ // do makes an HTTP request and populates the given struct v from the response.
145
+ func (c *Client) do(ctx context.Context, req *http.Request, v interface{}) error {
146
+ req = req.WithContext(ctx)
147
+ res, err := c.client.Do(req)
148
+ if err != nil {
149
+ return err
150
+ }
151
+ defer res.Body.Close()
152
+
153
+ return c.handleResponse(ctx, res, v)
154
+ }
155
+
156
+ // handleResponse makes an HTTP request and populates the given struct v from
157
+ // the response. This is meant for internal testing and shouldn't be used
158
+ // directly. Instead please use `Client.do`.
159
+ func (c *Client) handleResponse(ctx context.Context, res *http.Response, v interface{}) error {
160
+ out, err := ioutil.ReadAll(res.Body)
161
+ if err != nil {
162
+ return err
163
+ }
164
+
165
+ if res.StatusCode >= 400 {
166
+ // errorResponse represents an error response from the API
167
+ type errorResponse struct {
168
+ Code string `json:"code"`
169
+ Message string `json:"message"`
170
+ }
171
+
172
+ errorRes := &errorResponse{}
173
+ err = json.Unmarshal(out, errorRes)
174
+ if err != nil {
175
+ if _, ok := err.(*json.SyntaxError); ok {
176
+ return &Error{
177
+ msg: "malformed response body received",
178
+ Code: ErrResponseMalformed,
179
+ Meta: map[string]string{
180
+ "body": string(out),
181
+ "err": err.Error(),
182
+ },
183
+ }
184
+ }
185
+ return err
186
+ }
187
+
188
+ // json.Unmarshal doesn't return an error if the response
189
+ // body has a different protocol then "ErrorResponse". We
190
+ // check here to make sure that errorRes is populated. If
191
+ // not, we return the full response back to the user, so
192
+ // they can debug the issue.
193
+ // TODO(fatih): fix the behavior on the API side
194
+ if *errorRes == (errorResponse{}) {
195
+ return &Error{
196
+ msg: "internal error, please open an issue to github.com/planetscale/planetscale-go",
197
+ Code: ErrInternal,
198
+ Meta: map[string]string{
199
+ "body": string(out),
200
+ },
201
+ }
202
+ }
203
+
204
+ var errCode ErrorCode
205
+ switch errorRes.Code {
206
+ case "not_found":
207
+ errCode = ErrNotFound
208
+ case "unauthorized":
209
+ errCode = ErrPermission
210
+ case "invalid_params":
211
+ errCode = ErrInvalid
212
+ case "unprocessable":
213
+ errCode = ErrRetry
214
+ }
215
+
216
+ return &Error{
217
+ msg: errorRes.Message,
218
+ Code: errCode,
219
+ }
220
+ }
221
+
222
+ // this means we don't care about unmrarshaling the response body into v
223
+ if v == nil {
224
+ return nil
225
+ }
226
+
227
+ err = json.Unmarshal(out, &v)
228
+ if err != nil {
229
+ if _, ok := err.(*json.SyntaxError); ok {
230
+ return &Error{
231
+ msg: "malformed response body received",
232
+ Code: ErrResponseMalformed,
233
+ Meta: map[string]string{
234
+ "body": string(out),
235
+ },
236
+ }
237
+ }
238
+ return err
239
+ }
240
+
241
+ return nil
242
+ }
243
+
244
+ func (c *Client) newRequest(method string, path string, body interface{}) (*http.Request, error) {
245
+ u, err := c.baseURL.Parse(path)
246
+ if err != nil {
247
+ return nil, err
248
+ }
249
+
250
+ var req *http.Request
251
+ switch method {
252
+ case http.MethodGet:
253
+ req, err = http.NewRequest(method, u.String(), nil)
254
+ if err != nil {
255
+ return nil, err
256
+ }
257
+ default:
258
+ buf := new(bytes.Buffer)
259
+ if body != nil {
260
+ err = json.NewEncoder(buf).Encode(body)
261
+ if err != nil {
262
+ return nil, err
263
+ }
264
+ }
265
+
266
+ req, err = http.NewRequest(method, u.String(), buf)
267
+ if err != nil {
268
+ return nil, err
269
+ }
270
+
271
+ req.Header.Set("Content-Type", jsonMediaType)
272
+ }
273
+
274
+ req.Header.Set("Accept", jsonMediaType)
275
+
276
+ return req, nil
277
+ }
278
+
279
+ type serviceTokenTransport struct {
280
+ rt http.RoundTripper
281
+ token string
282
+ tokenName string
283
+ }
284
+
285
+ func (t *serviceTokenTransport) RoundTrip(req *http.Request) (*http.Response, error) {
286
+ req.Header.Add("Authorization", t.tokenName+":"+t.token)
287
+ return t.rt.RoundTrip(req)
288
+ }
289
+
290
+ // Error represents common errors originating from the Client.
291
+ type Error struct {
292
+ // msg contains the human readable string
293
+ msg string
294
+
295
+ // Code specifies the error code. i.e; NotFound, RateLimited, etc...
296
+ Code ErrorCode
297
+
298
+ // Meta contains additional information depending on the error code. As an
299
+ // example, if the Code is "ErrResponseMalformed", the map will be: ["body"]
300
+ // = "body of the response"
301
+ Meta map[string]string
302
+ }
303
+
304
+ // Error returns the string representation of the error.
305
+ func (e *Error) Error() string { return e.msg }
@@ -0,0 +1,131 @@
1
+ package planetscale
2
+
3
+ import (
4
+ "context"
5
+ "fmt"
6
+ "net/http"
7
+ "time"
8
+
9
+ "github.com/pkg/errors"
10
+ )
11
+
12
+ // CreateDatabaseRequest encapsulates the request for creating a new database.
13
+ type CreateDatabaseRequest struct {
14
+ Organization string
15
+ Name string `json:"name"`
16
+ Notes string `json:"notes"`
17
+ }
18
+
19
+ // DatabaseRequest encapsulates the request for getting a single database.
20
+ type GetDatabaseRequest struct {
21
+ Organization string
22
+ Database string
23
+ }
24
+
25
+ // ListDatabasesRequest encapsulates the request for listing all databases in an
26
+ // organization.
27
+ type ListDatabasesRequest struct {
28
+ Organization string
29
+ }
30
+
31
+ // DeleteDatabaseRequest encapsulates the request for deleting a database from
32
+ // an organization.
33
+ type DeleteDatabaseRequest struct {
34
+ Organization string
35
+ Database string
36
+ }
37
+
38
+ // DatabaseService is an interface for communicating with the PlanetScale
39
+ // Databases API endpoint.
40
+ type DatabasesService interface {
41
+ Create(context.Context, *CreateDatabaseRequest) (*Database, error)
42
+ Get(context.Context, *GetDatabaseRequest) (*Database, error)
43
+ List(context.Context, *ListDatabasesRequest) ([]*Database, error)
44
+ Delete(context.Context, *DeleteDatabaseRequest) error
45
+ }
46
+
47
+ // Database represents a PlanetScale database
48
+ type Database struct {
49
+ Name string `json:"name"`
50
+ Notes string `json:"notes"`
51
+ CreatedAt time.Time `json:"created_at"`
52
+ UpdatedAt time.Time `json:"updated_at"`
53
+ }
54
+
55
+ // Database represents a list of PlanetScale databases
56
+ type databasesResponse struct {
57
+ Databases []*Database `json:"data"`
58
+ }
59
+
60
+ type databasesService struct {
61
+ client *Client
62
+ }
63
+
64
+ var _ DatabasesService = &databasesService{}
65
+
66
+ func NewDatabasesService(client *Client) *databasesService {
67
+ return &databasesService{
68
+ client: client,
69
+ }
70
+ }
71
+
72
+ func (ds *databasesService) List(ctx context.Context, listReq *ListDatabasesRequest) ([]*Database, error) {
73
+ req, err := ds.client.newRequest(http.MethodGet, databasesAPIPath(listReq.Organization), nil)
74
+ if err != nil {
75
+ return nil, errors.Wrap(err, "error creating http request")
76
+ }
77
+
78
+ dbResponse := databasesResponse{}
79
+ err = ds.client.do(ctx, req, &dbResponse)
80
+ if err != nil {
81
+ return nil, err
82
+ }
83
+
84
+ return dbResponse.Databases, nil
85
+ }
86
+
87
+ func (ds *databasesService) Create(ctx context.Context, createReq *CreateDatabaseRequest) (*Database, error) {
88
+ req, err := ds.client.newRequest(http.MethodPost, databasesAPIPath(createReq.Organization), createReq)
89
+ if err != nil {
90
+ return nil, errors.Wrap(err, "error creating request for create database")
91
+ }
92
+
93
+ db := &Database{}
94
+ err = ds.client.do(ctx, req, &db)
95
+ if err != nil {
96
+ return nil, err
97
+ }
98
+
99
+ return db, nil
100
+ }
101
+
102
+ func (ds *databasesService) Get(ctx context.Context, getReq *GetDatabaseRequest) (*Database, error) {
103
+ path := fmt.Sprintf("%s/%s", databasesAPIPath(getReq.Organization), getReq.Database)
104
+ req, err := ds.client.newRequest(http.MethodGet, path, nil)
105
+ if err != nil {
106
+ return nil, errors.Wrap(err, "error creating request for get database")
107
+ }
108
+
109
+ db := &Database{}
110
+ err = ds.client.do(ctx, req, &db)
111
+ if err != nil {
112
+ return nil, err
113
+ }
114
+
115
+ return db, nil
116
+ }
117
+
118
+ func (ds *databasesService) Delete(ctx context.Context, deleteReq *DeleteDatabaseRequest) error {
119
+ path := fmt.Sprintf("%s/%s", databasesAPIPath(deleteReq.Organization), deleteReq.Database)
120
+ req, err := ds.client.newRequest(http.MethodDelete, path, nil)
121
+ if err != nil {
122
+ return errors.Wrap(err, "error creating request for delete database")
123
+ }
124
+
125
+ err = ds.client.do(ctx, req, nil)
126
+ return err
127
+ }
128
+
129
+ func databasesAPIPath(org string) string {
130
+ return fmt.Sprintf("v1/organizations/%s/databases", org)
131
+ }
@@ -0,0 +1,368 @@
1
+ package planetscale
2
+
3
+ import (
4
+ "context"
5
+ "fmt"
6
+ "net/http"
7
+ "time"
8
+
9
+ "github.com/pkg/errors"
10
+ )
11
+
12
+ type deployRequestsService struct {
13
+ client *Client
14
+ }
15
+
16
+ var _ DeployRequestsService = (*deployRequestsService)(nil)
17
+
18
+ // DeployRequestsService is an interface for communicating with the PlanetScale
19
+ // deploy requests API.
20
+ type DeployRequestsService interface {
21
+ CancelDeploy(context.Context, *CancelDeployRequestRequest) (*DeployRequest, error)
22
+ CloseDeploy(context.Context, *CloseDeployRequestRequest) (*DeployRequest, error)
23
+ Create(context.Context, *CreateDeployRequestRequest) (*DeployRequest, error)
24
+ CreateReview(context.Context, *ReviewDeployRequestRequest) (*DeployRequestReview, error)
25
+ Deploy(context.Context, *PerformDeployRequest) (*DeployRequest, error)
26
+ Diff(ctx context.Context, diffReq *DiffRequest) ([]*Diff, error)
27
+ Get(context.Context, *GetDeployRequestRequest) (*DeployRequest, error)
28
+ List(context.Context, *ListDeployRequestsRequest) ([]*DeployRequest, error)
29
+ }
30
+
31
+ // DeployRequestReview posts a review to a deploy request.
32
+ type DeployRequestReview struct {
33
+ ID string `json:"id"`
34
+ Body string `json:"body"`
35
+ State string `json:"state"`
36
+ CreatedAt time.Time `json:"created_at"`
37
+ UpdatedAt time.Time `json:"updated_at"`
38
+ }
39
+
40
+ // PerformDeployRequest is a request for approving and deploying a deploy request.
41
+ // NOTE: We deviate from naming convention here because we have a data model
42
+ // named DeployRequest already.
43
+ type PerformDeployRequest struct {
44
+ Organization string `json:"-"`
45
+ Database string `json:"-"`
46
+ Number uint64 `json:"-"`
47
+ }
48
+
49
+ // GetDeployRequest encapsulates the request for getting a single deploy
50
+ // request.
51
+ type GetDeployRequestRequest struct {
52
+ Organization string `json:"-"`
53
+ Database string `json:"-"`
54
+ Number uint64 `json:"-"`
55
+ }
56
+
57
+ // ListDeployRequestsRequest gets the deploy requests for a specific database
58
+ // branch.
59
+ type ListDeployRequestsRequest struct {
60
+ Organization string
61
+ Database string
62
+ }
63
+
64
+ // DeployOperation encapsulates a deploy operation within a deployment from the
65
+ // PlanetScale API.
66
+ type DeployOperation struct {
67
+ ID string `json:"id"`
68
+ State string `json:"state"`
69
+ Table string `json:"table_name"`
70
+ Keyspace string `json:"keyspace_name"`
71
+ Operation string `json:"operation_name"`
72
+ ETASeconds int64 `json:"eta_seconds"`
73
+ ProgressPercentage uint64 `json:"progress_percentage"`
74
+ CreatedAt time.Time `json:"created_at"`
75
+ UpdatedAt time.Time `json:"updated_at"`
76
+ }
77
+
78
+ // QueuedDeployment encapsulates a deployment that is in the queue.
79
+ type QueuedDeployment struct {
80
+ ID string `json:"id"`
81
+ State string `json:"state"`
82
+ DeployRequestNumber uint64 `json:"deploy_request_number"`
83
+ IntoBranch string `json:"into_branch"`
84
+
85
+ CreatedAt time.Time `json:"created_at"`
86
+ UpdatedAt time.Time `json:"updated_at"`
87
+ StartedAt *time.Time `json:"started_at"`
88
+ QueuedAt *time.Time `json:"queued_at"`
89
+ FinishedAt *time.Time `json:"finished_at"`
90
+ }
91
+
92
+ // Deployment encapsulates a deployment for a deploy request.
93
+ type Deployment struct {
94
+ ID string `json:"id"`
95
+ State string `json:"state"`
96
+ Deployable bool `json:"deployable"`
97
+ DeployRequestNumber uint64 `json:"deploy_request_number"`
98
+ IntoBranch string `json:"into_branch"`
99
+ PrecedingDeployments []*QueuedDeployment `json:"preceding_deployments"`
100
+
101
+ CreatedAt time.Time `json:"created_at"`
102
+ UpdatedAt time.Time `json:"updated_at"`
103
+ StartedAt *time.Time `json:"started_at"`
104
+ QueuedAt *time.Time `json:"queued_at"`
105
+ FinishedAt *time.Time `json:"finished_at"`
106
+ }
107
+
108
+ // DeployRequest encapsulates the request to deploy a database branch's schema
109
+ // to a production branch
110
+ type DeployRequest struct {
111
+ ID string `json:"id"`
112
+
113
+ Branch string `json:"branch"`
114
+ IntoBranch string `json:"into_branch"`
115
+
116
+ Number uint64 `json:"number"`
117
+
118
+ State string `json:"state"`
119
+
120
+ Approved bool `json:"approved"`
121
+
122
+ Notes string `json:"notes"`
123
+
124
+ Deployment *Deployment `json:"deployment"`
125
+
126
+ CreatedAt time.Time `json:"created_at"`
127
+ UpdatedAt time.Time `json:"updated_at"`
128
+ ClosedAt *time.Time `json:"closed_at"`
129
+ }
130
+
131
+ type CancelDeployRequestRequest struct {
132
+ Organization string `json:"-"`
133
+ Database string `json:"-"`
134
+ Number uint64 `json:"-"`
135
+ }
136
+
137
+ type CreateDeployRequestRequest struct {
138
+ Organization string `json:"-"`
139
+ Database string `json:"-"`
140
+ Branch string `json:"branch"`
141
+ IntoBranch string `json:"into_branch"`
142
+ Notes string `json:"notes"`
143
+ }
144
+
145
+ type ReviewDeployRequestRequest struct {
146
+ Organization string `json:"-"`
147
+ Database string `json:"-"`
148
+ Number uint64 `json:"-"`
149
+
150
+ // CommentText represents the comment body to be posted
151
+ CommentText string `json:"-"`
152
+
153
+ // ReviewAction defines the action for an individual review.
154
+ ReviewAction ReviewAction `json:"-"`
155
+ }
156
+
157
+ // ReviewAction defines the action for an individual review.
158
+ type ReviewAction int
159
+
160
+ const (
161
+ // Comment is used to comment a Review with a custom text.
162
+ ReviewComment ReviewAction = iota
163
+
164
+ // Approve is used to approve a Review.
165
+ ReviewApprove
166
+ )
167
+
168
+ func (r ReviewAction) String() string {
169
+ switch r {
170
+ case ReviewApprove:
171
+ return "approved"
172
+ case ReviewComment:
173
+ fallthrough
174
+ default:
175
+ return "commented"
176
+ }
177
+ }
178
+
179
+ type CloseDeployRequestRequest struct {
180
+ Organization string `json:"-"`
181
+ Database string `json:"-"`
182
+ Number uint64 `json:"-"`
183
+ }
184
+
185
+ func NewDeployRequestsService(client *Client) *deployRequestsService {
186
+ return &deployRequestsService{
187
+ client: client,
188
+ }
189
+ }
190
+
191
+ // Get fetches a single deploy request.
192
+ func (d *deployRequestsService) Get(ctx context.Context, getReq *GetDeployRequestRequest) (*DeployRequest, error) {
193
+ req, err := d.client.newRequest(http.MethodGet, deployRequestAPIPath(getReq.Organization, getReq.Database, getReq.Number), nil)
194
+ if err != nil {
195
+ return nil, errors.Wrap(err, "error creating http request")
196
+ }
197
+
198
+ dr := &DeployRequest{}
199
+ if err := d.client.do(ctx, req, &dr); err != nil {
200
+ return nil, err
201
+ }
202
+
203
+ return dr, nil
204
+ }
205
+
206
+ type CloseRequest struct {
207
+ State string `json:"state"`
208
+ }
209
+
210
+ // CloseDeploy closes a deploy request
211
+ func (d *deployRequestsService) CloseDeploy(ctx context.Context, closeReq *CloseDeployRequestRequest) (*DeployRequest, error) {
212
+ updateReq := &CloseRequest{
213
+ State: "closed",
214
+ }
215
+
216
+ req, err := d.client.newRequest(http.MethodPatch, deployRequestAPIPath(closeReq.Organization, closeReq.Database, closeReq.Number), updateReq)
217
+ if err != nil {
218
+ return nil, errors.Wrap(err, "error creating http request")
219
+ }
220
+
221
+ dr := &DeployRequest{}
222
+ if err := d.client.do(ctx, req, &dr); err != nil {
223
+ return nil, err
224
+ }
225
+
226
+ return dr, nil
227
+ }
228
+
229
+ // Deploy approves and executes a specific deploy request.
230
+ func (d *deployRequestsService) Deploy(ctx context.Context, deployReq *PerformDeployRequest) (*DeployRequest, error) {
231
+ path := deployRequestActionAPIPath(deployReq.Organization, deployReq.Database, deployReq.Number, "deploy")
232
+ req, err := d.client.newRequest(http.MethodPost, path, deployReq)
233
+ if err != nil {
234
+ return nil, errors.Wrap(err, "error creating http request")
235
+ }
236
+
237
+ dr := &DeployRequest{}
238
+ if err := d.client.do(ctx, req, &dr); err != nil {
239
+ return nil, err
240
+ }
241
+
242
+ return dr, nil
243
+ }
244
+
245
+ type deployRequestsResponse struct {
246
+ DeployRequests []*DeployRequest `json:"data"`
247
+ }
248
+
249
+ func (d *deployRequestsService) Create(ctx context.Context, createReq *CreateDeployRequestRequest) (*DeployRequest, error) {
250
+ path := deployRequestsAPIPath(createReq.Organization, createReq.Database)
251
+ req, err := d.client.newRequest(http.MethodPost, path, createReq)
252
+ if err != nil {
253
+ return nil, err
254
+ }
255
+
256
+ dr := &DeployRequest{}
257
+ if err := d.client.do(ctx, req, &dr); err != nil {
258
+ return nil, err
259
+ }
260
+ return dr, nil
261
+ }
262
+
263
+ // CancelDeploy cancels a queued deploy request.
264
+ func (d *deployRequestsService) CancelDeploy(ctx context.Context, deployReq *CancelDeployRequestRequest) (*DeployRequest, error) {
265
+ path := deployRequestActionAPIPath(deployReq.Organization, deployReq.Database, deployReq.Number, "cancel")
266
+ req, err := d.client.newRequest(http.MethodPost, path, deployReq)
267
+ if err != nil {
268
+ return nil, errors.Wrap(err, "error creating http request")
269
+ }
270
+
271
+ dr := &DeployRequest{}
272
+ if err := d.client.do(ctx, req, &dr); err != nil {
273
+ return nil, err
274
+ }
275
+
276
+ return dr, nil
277
+ }
278
+
279
+ // Diff returns the diff for a database deploy request
280
+ type Diff struct {
281
+ Name string `json:"name"`
282
+ Raw string `json:"raw"`
283
+ HTML string `json:"html"`
284
+ }
285
+
286
+ type diffResponse struct {
287
+ Diffs []*Diff `json:"data"`
288
+ }
289
+
290
+ type DiffRequest struct {
291
+ Organization string `json:"-"`
292
+ Database string `json:"-"`
293
+ Number uint64 `json:"-"`
294
+ }
295
+
296
+ // Diff returns a diff
297
+ func (d *deployRequestsService) Diff(ctx context.Context, diffReq *DiffRequest) ([]*Diff, error) {
298
+ req, err := d.client.newRequest(
299
+ http.MethodGet,
300
+ deployRequestActionAPIPath(diffReq.Organization, diffReq.Database, diffReq.Number, "diff"),
301
+ nil,
302
+ )
303
+ if err != nil {
304
+ return nil, errors.Wrap(err, "error creating http request")
305
+ }
306
+
307
+ diffs := &diffResponse{}
308
+ if err := d.client.do(ctx, req, &diffs); err != nil {
309
+ return nil, err
310
+ }
311
+
312
+ return diffs.Diffs, nil
313
+ }
314
+
315
+ func (d *deployRequestsService) List(ctx context.Context, listReq *ListDeployRequestsRequest) ([]*DeployRequest, error) {
316
+ req, err := d.client.newRequest(http.MethodGet, deployRequestsAPIPath(listReq.Organization, listReq.Database), nil)
317
+ if err != nil {
318
+ return nil, errors.Wrap(err, "error creating http request")
319
+ }
320
+
321
+ drReq := &deployRequestsResponse{}
322
+ if err := d.client.do(ctx, req, &drReq); err != nil {
323
+ return nil, err
324
+ }
325
+
326
+ return drReq.DeployRequests, nil
327
+ }
328
+
329
+ func (d *deployRequestsService) CreateReview(ctx context.Context, reviewReq *ReviewDeployRequestRequest) (*DeployRequestReview, error) {
330
+ var reqBody = struct {
331
+ State string `json:"state"`
332
+ Body string `json:"body"`
333
+ }{
334
+ State: reviewReq.ReviewAction.String(),
335
+ Body: reviewReq.CommentText,
336
+ }
337
+
338
+ req, err := d.client.newRequest(http.MethodPost,
339
+ deployRequestActionAPIPath(
340
+ reviewReq.Organization,
341
+ reviewReq.Database,
342
+ reviewReq.Number,
343
+ "reviews",
344
+ ), reqBody)
345
+ if err != nil {
346
+ return nil, errors.Wrap(err, "error creating http request")
347
+ }
348
+
349
+ drr := &DeployRequestReview{}
350
+ if err := d.client.do(ctx, req, &drr); err != nil {
351
+ return nil, err
352
+ }
353
+
354
+ return drr, nil
355
+ }
356
+
357
+ func deployRequestsAPIPath(org, db string) string {
358
+ return fmt.Sprintf("%s/%s/deploy-requests", databasesAPIPath(org), db)
359
+ }
360
+
361
+ // deployRequestAPIPath gets the base path for accessing a single deploy request
362
+ func deployRequestAPIPath(org string, db string, number uint64) string {
363
+ return fmt.Sprintf("%s/%s/deploy-requests/%d", databasesAPIPath(org), db, number)
364
+ }
365
+
366
+ func deployRequestActionAPIPath(org string, db string, number uint64, path string) string {
367
+ return fmt.Sprintf("%s/%s", deployRequestAPIPath(org, db, number), path)
368
+ }