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.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +24 -0
- data/.github/workflows/gem-push.yml +38 -0
- data/.github/workflows/licensed.yml +43 -0
- data/.gitignore +10 -0
- data/.licensed.yml +9 -0
- data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
- data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
- data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
- data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
- data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
- data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
- data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
- data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
- data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
- data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
- data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
- data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
- data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
- data/.ruby_version +1 -0
- data/Gemfile +8 -0
- data/LICENSE +201 -0
- data/README.md +88 -0
- data/Rakefile +10 -0
- data/bin/console +15 -0
- data/bin/setup +17 -0
- data/controller.go +255 -0
- data/go.mod +16 -0
- data/go.sum +428 -0
- data/lib/generators/planetscale/install_generator.rb +58 -0
- data/lib/planetscale.rb +137 -0
- data/lib/planetscale/version.rb +5 -0
- data/planetscale.gemspec +44 -0
- data/proxy.go +128 -0
- data/vendor/github.com/armon/circbuf/.gitignore +22 -0
- data/vendor/github.com/armon/circbuf/LICENSE +20 -0
- data/vendor/github.com/armon/circbuf/README.md +28 -0
- data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
- data/vendor/github.com/armon/circbuf/go.mod +1 -0
- data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
- data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
- data/vendor/github.com/golang/protobuf/LICENSE +28 -0
- data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
- data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
- data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
- data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
- data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
- data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
- data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
- data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
- data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
- data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
- data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
- data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
- data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
- data/vendor/github.com/gorilla/mux/LICENSE +27 -0
- data/vendor/github.com/gorilla/mux/README.md +805 -0
- data/vendor/github.com/gorilla/mux/doc.go +306 -0
- data/vendor/github.com/gorilla/mux/go.mod +3 -0
- data/vendor/github.com/gorilla/mux/middleware.go +74 -0
- data/vendor/github.com/gorilla/mux/mux.go +606 -0
- data/vendor/github.com/gorilla/mux/regexp.go +388 -0
- data/vendor/github.com/gorilla/mux/route.go +736 -0
- data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
- data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
- data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
- data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
- data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
- data/vendor/github.com/pkg/errors/.gitignore +24 -0
- data/vendor/github.com/pkg/errors/.travis.yml +10 -0
- data/vendor/github.com/pkg/errors/LICENSE +23 -0
- data/vendor/github.com/pkg/errors/Makefile +44 -0
- data/vendor/github.com/pkg/errors/README.md +59 -0
- data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
- data/vendor/github.com/pkg/errors/errors.go +288 -0
- data/vendor/github.com/pkg/errors/go113.go +38 -0
- data/vendor/github.com/pkg/errors/stack.go +177 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
- data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
- data/vendor/go.uber.org/atomic/.gitignore +12 -0
- data/vendor/go.uber.org/atomic/.travis.yml +27 -0
- data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
- data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
- data/vendor/go.uber.org/atomic/Makefile +78 -0
- data/vendor/go.uber.org/atomic/README.md +63 -0
- data/vendor/go.uber.org/atomic/bool.go +81 -0
- data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
- data/vendor/go.uber.org/atomic/doc.go +23 -0
- data/vendor/go.uber.org/atomic/duration.go +82 -0
- data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
- data/vendor/go.uber.org/atomic/error.go +51 -0
- data/vendor/go.uber.org/atomic/error_ext.go +39 -0
- data/vendor/go.uber.org/atomic/float64.go +76 -0
- data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
- data/vendor/go.uber.org/atomic/gen.go +26 -0
- data/vendor/go.uber.org/atomic/go.mod +8 -0
- data/vendor/go.uber.org/atomic/go.sum +9 -0
- data/vendor/go.uber.org/atomic/int32.go +102 -0
- data/vendor/go.uber.org/atomic/int64.go +102 -0
- data/vendor/go.uber.org/atomic/nocmp.go +35 -0
- data/vendor/go.uber.org/atomic/string.go +54 -0
- data/vendor/go.uber.org/atomic/string_ext.go +43 -0
- data/vendor/go.uber.org/atomic/uint32.go +102 -0
- data/vendor/go.uber.org/atomic/uint64.go +102 -0
- data/vendor/go.uber.org/atomic/value.go +31 -0
- data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
- data/vendor/go.uber.org/multierr/.gitignore +4 -0
- data/vendor/go.uber.org/multierr/.travis.yml +23 -0
- data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
- data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
- data/vendor/go.uber.org/multierr/Makefile +42 -0
- data/vendor/go.uber.org/multierr/README.md +23 -0
- data/vendor/go.uber.org/multierr/error.go +449 -0
- data/vendor/go.uber.org/multierr/glide.yaml +8 -0
- data/vendor/go.uber.org/multierr/go.mod +8 -0
- data/vendor/go.uber.org/multierr/go.sum +11 -0
- data/vendor/go.uber.org/multierr/go113.go +52 -0
- data/vendor/go.uber.org/zap/.codecov.yml +17 -0
- data/vendor/go.uber.org/zap/.gitignore +32 -0
- data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
- data/vendor/go.uber.org/zap/.travis.yml +23 -0
- data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
- data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
- data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
- data/vendor/go.uber.org/zap/FAQ.md +156 -0
- data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
- data/vendor/go.uber.org/zap/Makefile +63 -0
- data/vendor/go.uber.org/zap/README.md +134 -0
- data/vendor/go.uber.org/zap/array.go +320 -0
- data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
- data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
- data/vendor/go.uber.org/zap/checklicense.sh +17 -0
- data/vendor/go.uber.org/zap/config.go +264 -0
- data/vendor/go.uber.org/zap/doc.go +113 -0
- data/vendor/go.uber.org/zap/encoder.go +79 -0
- data/vendor/go.uber.org/zap/error.go +80 -0
- data/vendor/go.uber.org/zap/field.go +539 -0
- data/vendor/go.uber.org/zap/flag.go +39 -0
- data/vendor/go.uber.org/zap/glide.yaml +34 -0
- data/vendor/go.uber.org/zap/global.go +168 -0
- data/vendor/go.uber.org/zap/global_go112.go +26 -0
- data/vendor/go.uber.org/zap/global_prego112.go +26 -0
- data/vendor/go.uber.org/zap/go.mod +13 -0
- data/vendor/go.uber.org/zap/go.sum +56 -0
- data/vendor/go.uber.org/zap/http_handler.go +81 -0
- data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
- data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
- data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
- data/vendor/go.uber.org/zap/level.go +132 -0
- data/vendor/go.uber.org/zap/logger.go +344 -0
- data/vendor/go.uber.org/zap/options.go +140 -0
- data/vendor/go.uber.org/zap/sink.go +161 -0
- data/vendor/go.uber.org/zap/stacktrace.go +85 -0
- data/vendor/go.uber.org/zap/sugar.go +304 -0
- data/vendor/go.uber.org/zap/time.go +27 -0
- data/vendor/go.uber.org/zap/writer.go +99 -0
- data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
- data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
- data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
- data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
- data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
- data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
- data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
- data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
- data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
- data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
- data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
- data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
- data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
- data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
- data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
- data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
- data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
- data/vendor/golang.org/x/net/AUTHORS +3 -0
- data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/net/LICENSE +27 -0
- data/vendor/golang.org/x/net/PATENTS +22 -0
- data/vendor/golang.org/x/net/context/context.go +56 -0
- data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
- data/vendor/golang.org/x/net/context/go17.go +73 -0
- data/vendor/golang.org/x/net/context/go19.go +21 -0
- data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
- data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
- data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
- data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/oauth2/LICENSE +27 -0
- data/vendor/golang.org/x/oauth2/README.md +36 -0
- data/vendor/golang.org/x/oauth2/go.mod +9 -0
- data/vendor/golang.org/x/oauth2/go.sum +361 -0
- data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
- data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
- data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
- data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
- data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
- data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
- data/vendor/golang.org/x/oauth2/token.go +178 -0
- data/vendor/golang.org/x/oauth2/transport.go +89 -0
- data/vendor/google.golang.org/appengine/LICENSE +202 -0
- data/vendor/google.golang.org/appengine/internal/api.go +678 -0
- data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
- data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
- data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
- data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
- data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
- data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
- data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
- data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
- data/vendor/google.golang.org/appengine/internal/main.go +16 -0
- data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
- data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
- data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
- data/vendor/google.golang.org/appengine/internal/net.go +56 -0
- data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
- data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
- data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
- data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
- data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
- data/vendor/google.golang.org/protobuf/LICENSE +27 -0
- data/vendor/google.golang.org/protobuf/PATENTS +22 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
- data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
- data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
- data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
- data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
- data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
- data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
- data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
- data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
- data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
- data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
- data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
- data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
- data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
- data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
- data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
- data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
- data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
- data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
- data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
- data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
- data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
- data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
- data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
- data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
- data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
- data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
- data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
- data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
- data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
- data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
- data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
- data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
- data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
- data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
- data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
- data/vendor/modules.txt +79 -0
- 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
|
+
}
|